home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2076 < prev    next >
Encoding:
Internet Message Format  |  1990-12-28  |  21.3 KB

  1. From: darcy@druid.uucp (D'Arcy J.M. Cain)
  2. Newsgroups: alt.sources
  3. Subject: Yet another CP/M emulator part 3 of 3
  4. Message-ID: <1990Nov15.205201.10787@druid.uucp>
  5. Date: 15 Nov 90 20:52:01 GMT
  6. >from: darcy@druid.uucp (D'Arcy J.M. Cain)
  7.  
  8. #!/bin/sh
  9. # this is cpm.03 (part 3 of a multipart archive)
  10. # do not concatenate these parts, unpack them in order with /bin/sh
  11. # file decode.c continued
  12. #
  13. if test ! -r _shar_seq_.tmp; then
  14.     echo 'Please unpack part 1 first!'
  15.     exit 1
  16. fi
  17. (read Scheck
  18.  if test "$Scheck" != 3; then
  19.     echo Please unpack part "$Scheck" next!
  20.     exit 1
  21.  else
  22.     exit 0
  23.  fi
  24. ) < _shar_seq_.tmp || exit 1
  25. sed 's/^X//' << 'SHAR_EOF' >> 'decode.c' &&
  26. X        s = ram[HL];
  27. X        goto or;
  28. X    case 183:        /* b7 OR A */
  29. X        s = A;
  30. X
  31. or:
  32. X        a = A & 0x0f;
  33. X        s1 = s & 0x0f;
  34. X
  35. X        s |= A;
  36. X        A = s;
  37. X        a |= s;
  38. X        goto set_flags;
  39. X
  40. X    when 184:        /* b8 CP B */
  41. X        s = B;
  42. X        goto cp;
  43. X    when 185:        /* b9 CP C */
  44. X        s = C;
  45. X        goto cp;
  46. X    when 186:        /* ba CP D */
  47. X        s = D;
  48. X        goto cp;
  49. X    when 187:        /* bb CP E */
  50. X        s = E;
  51. X        goto cp;
  52. X    when 188:        /* bc CP H */
  53. X        s = H;
  54. X        goto cp;
  55. X    when 189:        /* bd CP L */
  56. X        s = L;
  57. X        goto cp;
  58. X    when 190:        /* be CP (HL) */
  59. X        s = A;
  60. X        goto cp;
  61. X    when 191:        /* bf CP A */
  62. X        s = ram[HL];
  63. X
  64. cp:
  65. X        a = A & 0x0f;
  66. X        s1 = s & 0x0f;
  67. X        s = A - s;
  68. X        a -= s1;
  69. X        BCD = 1;
  70. X        goto set_flags;
  71. X
  72. X    when 192:        /* c0 RET NZ */
  73. X        if (!ZERO) PC = pop();
  74. X    when 193:        /* c1 POP BC */
  75. X        BC = pop();
  76. X    when 194:        /* c2 JP NZ,nn */
  77. X        if (ZERO) { PC += 2; break;}
  78. X    case 195:        /* c3 JP nn */
  79. X        TEMPL = ram[PC++];
  80. X        TEMPH = ram[PC++];
  81. X        PC = TEMP;
  82. X    when 196:        /* c4 CALL NZ,nn */
  83. X        if (ZERO) PC += 2;
  84. X        else
  85. X        {
  86. X            TEMPL = ram[PC++];
  87. X            TEMPH = ram[PC++];
  88. X            push(PC);
  89. X            PC = TEMP;
  90. X        }
  91. X    when 197:        /* c5 PUSH BC */
  92. X        push(BC);
  93. X    when 198:        /* c6 ADD A,n */
  94. X        s = ram[PC++];
  95. X        goto add;
  96. X    case 199:        /* c7 RST 0 */
  97. X        push(PC);
  98. X        PC = 0;
  99. X    when 200:        /* c8 RET Z */
  100. X        if (!ZERO) break;
  101. X    case 201:        /* c9 RET */
  102. X        PC = pop();
  103. X    when 202:        /* ca JP Z,nn */
  104. X        if (ZERO)
  105. X        {
  106. X            TEMPL = ram[PC++];
  107. X            TEMPH = ram[PC++];
  108. X            PC = TEMP;
  109. X        }
  110. X        else PC += 2;
  111. X    when 203:        /* cb oh boy */
  112. X        switch (ram[PC] & 0x03)
  113. X        {
  114. X            case 0: ptr = &B;
  115. X            case 1: ptr = &C;
  116. X            case 2: ptr = &D;
  117. X            case 3: ptr = &E;
  118. X            case 4: ptr = &H;
  119. X            case 5: ptr = &L;
  120. X            case 6: ptr = ram + HL;
  121. X            case 7: ptr = &A;
  122. X            default: ptr = (void *)(0);
  123. X        }
  124. X
  125. cb_stuff:
  126. X        if ((s1 = ((s = ram[PC++]) & 0xc0)) != 0)
  127. X        {
  128. X            a = 1 << ((s & 0x3f) >> 3);
  129. X
  130. X            switch (s1)
  131. X            {
  132. X                case 0x40:        /* BIT */
  133. X                    ZERO = *ptr & a;
  134. X                    HALF_CARRY = 1;
  135. X                    BCD = 0;
  136. X                when 0x80:        /* RES */
  137. X                    *ptr &= ~a;
  138. X                when 0xb0:        /* SET */
  139. X                    *ptr |= a;
  140. X            }
  141. X        }
  142. X        else
  143. X        {
  144. X            switch (s & 0xf8)
  145. X            {
  146. X                case 0x00:            /* RLC */
  147. X                    CARRY= *ptr >> 7;
  148. X                    *ptr <<= 1;
  149. X                    if (CARRY) ++*ptr;
  150. X                when 0x08:            /* RRC */
  151. X                    CARRY = *ptr;
  152. X                    *ptr >>= 1;
  153. X                    if (CARRY) *ptr |= 0x80;
  154. X                when 0x10:            /* RL */
  155. X                    a = CARRY;
  156. X                    CARRY = *ptr >> 7;
  157. X                    *ptr <<= 1;
  158. X                    *ptr += a;
  159. X                when 0x18:            /* RR */
  160. X                    a = CARRY;
  161. X                    CARRY = *ptr;
  162. X                    *ptr >>= 1;
  163. X                    if (a) *ptr |= 0x80;
  164. X                when 0x20:            /* SLA */
  165. X                    CARRY = *ptr >> 7;
  166. X                    *ptr <<= 1;
  167. X                when 0x28:            /* SRA */
  168. X                    CARRY = *ptr;
  169. X                    *ptr >>= 1;
  170. X                    if (*ptr & 0x40) *ptr |= 0x80;
  171. X                when 0x30:            /* SLL ???? Oh well.  It fits */
  172. X                    CARRY = *ptr >> 7;
  173. X                    *ptr <<= 1;
  174. X                    *ptr |= 1;
  175. X                when 0x38:            /* SRL */
  176. X                    CARRY = *ptr;
  177. X                    *ptr >>= 1;
  178. X            }
  179. X
  180. X            SIGN = *ptr >> 7;
  181. X            ZERO = *ptr == 0;
  182. X            HALF_CARRY = BCD = 0;
  183. X            PARITY = partab[*ptr];
  184. X        }
  185. X    when 204:        /* cc CALL Z,nn */
  186. X        if (ZERO)
  187. X        {
  188. X            TEMPL = ram[PC++];
  189. X            TEMPH = ram[PC++];
  190. X            push(PC);
  191. X            PC = TEMP;
  192. X        }
  193. X        else PC += 2;
  194. X    when 205:        /* cd CALL nn */
  195. X        TEMPL = ram[PC++];
  196. X        TEMPH = ram[PC++];
  197. X        push(PC);
  198. X        PC = TEMP;
  199. X    when 206:        /* ce ADC A,n */
  200. X        s = ram[PC++];
  201. X        goto adc;
  202. X    when 207:        /* cf RST 08 */
  203. X        push(PC);
  204. X        PC = 8;
  205. X    when 208:        /* d0 RET NC */
  206. X        if (!CARRY)
  207. X            PC = pop();
  208. X    when 209:        /* d1 POP DE */
  209. X        DE = pop();
  210. X    when 210:        /* d2 JP NC,nn */
  211. X        if (CARRY) PC += 2;
  212. X        else
  213. X        {
  214. X            TEMPL = ram[PC++];
  215. X            TEMPH = ram[PC++];
  216. X            PC = TEMP;
  217. X        }
  218. X    when 211:        /* d3 OUT (n),A */
  219. X        return(211);
  220. X    when 212:        /* d4 CALL NC,nn */
  221. X        if (CARRY) PC += 2;
  222. X        else
  223. X        {
  224. X            TEMPL = ram[PC++];
  225. X            TEMPH = ram[PC++];
  226. X            push(PC);
  227. X            PC = TEMP;
  228. X        }
  229. X    when 213:        /* d5 PUSH DE */
  230. X        push(DE);
  231. X    when 214:        /* d6 SUB N */
  232. X        s = ram[PC++];
  233. X        goto sub;
  234. X    when 215:        /* d7 RST 10 */
  235. X        push(PC);
  236. X        PC = 16;
  237. X    when 216:        /* d8 RET C */
  238. X        if (CARRY)
  239. X            PC = pop();
  240. X    when 217:        /* d9 EXX */
  241. X        gr_bank = gr_bank ? 0 : 1;
  242. X    when 218:        /* da JP C,nn */
  243. X        if (CARRY)
  244. X        {
  245. X            TEMPL = ram[PC++];
  246. X            TEMPH = ram[PC++];
  247. X            PC = TEMP;
  248. X        }
  249. X        else PC += 2;
  250. X    when 219:        /* db IN A,(n) */
  251. X        return(219);
  252. X    when 220:        /* dc CALL C,nn */
  253. X        if (CARRY)
  254. X        {
  255. X            TEMPL = ram[PC++];
  256. X            TEMPH = ram[PC++];
  257. X            push(PC);
  258. X            PC = TEMP;
  259. X        }
  260. X        else PC += 2;
  261. X    when 221:        /* DD instructions - use IX register */
  262. X        opcode = ram[PC++];
  263. X        switch (opcode)
  264. X        {
  265. X            case 0x09:        /* 09 ADD IX,BC */
  266. X                s = BC;
  267. X                a = (IX & 0xfff) + (s & 0xfff);
  268. X                s += IX;
  269. X                IX = s;
  270. X                BCD = 0;
  271. X                CARRY = s >> 16;
  272. X                HALF_CARRY = a >> 12;
  273. X            when 0x19:        /* ADD IX, DE */
  274. X                s = DE;
  275. X                a = (IX & 0xfff) + (s & 0xfff);
  276. X                s += IX;
  277. X                IX = s;
  278. X                BCD = 0;
  279. X                CARRY = s >> 16;
  280. X                HALF_CARRY = a >> 12;
  281. X            when 0x21:        /* LD IX, nn */
  282. X                IXL = ram[PC++];
  283. X                IXH = ram[PC++];
  284. X            when 0x22:        /* LD (nn), IX) */
  285. X                TEMPL = ram[PC++];
  286. X                TEMPH = ram[PC++];
  287. X                ram[TEMP] = IXL;
  288. X                ram[TEMP + 1] = IXH;
  289. X            when 0x23:        /* INC IX */
  290. X                IX++;
  291. X            when 0x29:        /* ADD IX, IX */
  292. X                s = IX;
  293. X                a = (IX & 0xfff) + (s & 0xfff);
  294. X                s += IX;
  295. X                IX = s;
  296. X                BCD = 0;
  297. X                CARRY = s >> 16;
  298. X                HALF_CARRY = a >> 12;
  299. X            when 0x2a:        /* LD IX, (nn) */
  300. X                TEMPL = ram[PC++];
  301. X                TEMPH = ram[PC++];
  302. X                IXL = ram[TEMP];
  303. X                IXH = ram[TEMP + 1];
  304. X            when 0x2b:        /* DEC IX */
  305. X                IX--;
  306. X            when 0x34:        /* INC (IX + d) */
  307. X                ptr = ram + IX + ram[PC++];
  308. X                HALF_CARRY = lonyb(*ptr) == 0xf;
  309. X                ++(*ptr);
  310. X                SIGN = *ptr >> 7;
  311. X                ZERO = *ptr == 0;
  312. X                PARITY = *ptr == 0x80;
  313. X                BCD = 0;
  314. X            when 0x35:        /* DEC (IX + d) */
  315. X                ptr = ram + IX + ram[PC++];
  316. X                HALF_CARRY = lonyb(*ptr) != 0;
  317. X                --(*ptr);
  318. X                SIGN = *ptr >> 7;
  319. X                ZERO = *ptr == 0;
  320. X                PARITY = *ptr == 0x7f;
  321. X                BCD = 1;
  322. X            when 0x36:        /* LD (IX + d), n */
  323. X                TEMP = IX + ram[PC++];
  324. X                ram[TEMP] = ram[PC++];
  325. X            when 0x39:        /* ADD IX, SP */
  326. X                s = SP;
  327. X                a = (IX & 0xfff) + (s & 0xfff);
  328. X                s += IX;
  329. X                IX = s;
  330. X                BCD = 0;
  331. X                CARRY = s >> 16;
  332. X                HALF_CARRY = a >> 12;
  333. X            when 0x46:        /* LD B, (IX + d) */
  334. X                B = ram[IX + ram[PC++]];
  335. X            when 0x4e:        /* LD C, (IX + d) */
  336. X                C = ram[IX + ram[PC++]];
  337. X            when 0x56:        /* LD D, (IX + d) */
  338. X                D = ram[IX + ram[PC++]];
  339. X            when 0x5e:        /* LD E, (IX + d) */
  340. X                E = ram[IX + ram[PC++]];
  341. X            when 0x66:        /* LD H, (IX + d) */
  342. X                H = ram[IX + ram[PC++]];
  343. X            when 0x6e:        /* LD L, (IX + d) */
  344. X                L = ram[IX + ram[PC++]];
  345. X            when 0x70:        /* LD (IX + d, B */
  346. X                ram[IX + ram[PC++]] = B;
  347. X            when 0x71:        /* LD (IX + d, C */
  348. X                ram[IX + ram[PC++]] = C;
  349. X            when 0x72:        /* LD (IX + d, D */
  350. X                ram[IX + ram[PC++]] = D;
  351. X            when 0x73:        /* LD (IX + d, E */
  352. X                ram[IX + ram[PC++]] = E;
  353. X            when 0x74:        /* LD (IX + d, H */
  354. X                ram[IX + ram[PC++]] = H;
  355. X            when 0x75:        /* LD (IX + d, L */
  356. X                ram[IX + ram[PC++]] = L;
  357. X            when 0x77:        /* LD (IX + d, A */
  358. X                ram[IX + ram[PC++]] = A;
  359. X            when 0x7e:        /* LD A, (IX + d) */
  360. X                A = ram[IX + ram[PC++]];
  361. X            when 0x86:        /* ADD A, (IX + d) */
  362. X                s = ram[IX + ram[PC++]];
  363. X                goto add;
  364. X            when 0x8e:        /* ADC A, (IX + d) */
  365. X                s = ram[IX + ram[PC++]];
  366. X                goto adc;
  367. X            when 0x96:        /* SUB A, (IX + d) */
  368. X                s = ram[IX + ram[PC++]];
  369. X                goto sub;
  370. X            when 0x9e:        /* SBC A, (IX + d) */
  371. X                s = ram[IX + ram[PC++]];
  372. X                goto sbc;
  373. X            when 0xa6:        /* AND A, (IX + d) */
  374. X                s = ram[IX + ram[PC++]];
  375. X                goto and;
  376. X            when 0xae:        /* XOR A, (IX + d) */
  377. X                s = ram[IX + ram[PC++]];
  378. X                goto xor;
  379. X            when 0xb6:        /* OR A, (IX + d) */
  380. X                s = ram[IX + ram[PC++]];
  381. X                goto or;
  382. X            when 0xbe:        /* CP A, (IX + d) */
  383. X                s = ram[IX + ram[PC++]];
  384. X                goto cp;
  385. X            when 0xcb:
  386. X                ptr = ram + IX + ram[PC++];
  387. X                goto cb_stuff;
  388. X            when 0xe1:        /* POP IX */
  389. X                IX = pop();
  390. X            when 0xe3:        /* EX (SP), IX */
  391. X                s = IX;
  392. X                IX = pop();
  393. X                push(s);
  394. X            when 0xe5:        /* PUSH IX */
  395. X                push(IX);
  396. X            when 0xe9:        /* JP (IX) */
  397. X                PC = IX;
  398. X            when 0xf9:        /* LD SP, IX */
  399. X                SP = IX;
  400. X            break; default: return(-1);
  401. X        }
  402. X    when 222:        /* de SBC A,n */
  403. X        s = ram[PC++];
  404. X        goto sbc;
  405. X    when 223:        /* df RST 18 */
  406. X        push(PC);
  407. X        PC = 0x18;
  408. X    when 224:        /* e0 RET PO */
  409. X        if (!PARITY)
  410. X            PC = pop();
  411. X    when 225:        /* e1 POP HL */
  412. X        HL = pop();
  413. X    when 226:        /* e2 JP PO,nn */
  414. X        if (PARITY) PC += 2;
  415. X        else
  416. X        {
  417. X            TEMPL = ram[PC++];
  418. X            TEMPH = ram[PC++];
  419. X            PC = TEMP;
  420. X        }
  421. X    when 227:        /* e3 EX (SP),HL */
  422. X        s = HL;
  423. X        HL = pop();
  424. X        push(s);
  425. X    when 228:        /* e4 CALL PO,nn */
  426. X        if (PARITY) PC += 2;
  427. X        else
  428. X        {
  429. X            TEMPL = ram[PC++];
  430. X            TEMPH = ram[PC++];
  431. X            push(PC);
  432. X            PC = TEMP;
  433. X        }
  434. X    when 229:        /* e5 PUSH HL */
  435. X        push(HL);
  436. X    when 230:        /* e6 AND n */
  437. X        s = ram[PC++];
  438. X        goto and;
  439. X    when 231:        /* e7 RST 20 */
  440. X        push(PC);
  441. X        PC = 0x20;
  442. X    when 232:        /* e8 RET PE */
  443. X        if (PARITY)
  444. X            PC = pop();
  445. X    when 233:        /* e9 JP (HL) */
  446. X        PC = HL;
  447. X    when 234:        /* ea JP PE,nn */
  448. X        if (PARITY)
  449. X        {
  450. X            TEMPL = ram[PC++];
  451. X            TEMPH = ram[PC++];
  452. X            PC = TEMP;
  453. X        }
  454. X        else PC += 2;
  455. X    when 235:        /* eb EX DE,HL */
  456. X        s = HL;
  457. X        HL = DE;
  458. X        DE = s;
  459. X    when 236:        /* ec CALL PE,nn */
  460. X        if (PARITY)
  461. X        {
  462. X            TEMPL = ram[PC++];
  463. X            TEMPH = ram[PC++];
  464. X            push(PC);
  465. X            PC = TEMP;
  466. X        }
  467. X    when 237:        /* ed oh boy */
  468. X        a = ram[PC++];
  469. X        switch(a)
  470. X        {
  471. X        case 0x40:        /* IN B,(C) */
  472. X        case 0x41:        /* OUT (C),B */
  473. X        case 0x48:        /* IN C,(C) */
  474. X        case 0x49:        /* OUT (C),C */
  475. X        case 0x50:        /* IN D,(C) */
  476. X        case 0x51:        /* OUT (C),D */
  477. X        case 0x58:        /* IN E,(C) */
  478. X        case 0x59:        /* OUT (C),E */
  479. X        case 0x60:        /* IN H,(C) */
  480. X        case 0x61:        /* OUT (C),H */
  481. X        case 0x68:        /* IN L,(C) */
  482. X        case 0x69:        /* OUT (C),L */
  483. X        when 0x78:        /* IN A,(C) */
  484. X        when 0x79:        /* OUT (C),A */
  485. X        case 0xa2:        /* INI */
  486. X        case 0xa3:        /* OUTI */
  487. X        case 0xaa:        /* IND */
  488. X        case 0xab:        /* OUTD */
  489. X        case 0xb2:        /* INIR */
  490. X        case 0xb3:        /* OTIR */
  491. X        case 0xba:        /* INDR */
  492. X        case 0xbb:        /* OTDR */
  493. X            return(0xed00 + a);
  494. X        when 0x42:        /* SBC HL,BC */
  495. X            TEMP = BC;
  496. X            goto edsbc;
  497. X        when 0x43:        /* LD (nn),BC */
  498. X            TEMPL = ram[PC++];
  499. X            TEMPH = ram[PC++];
  500. X            ram[TEMP] = C;
  501. X            ram[TEMP + 1] = B;
  502. X        when 0x44:        /* NEG */
  503. X            HALF_CARRY = lonyb(A) != 0;
  504. X            CARRY = A!= 0;
  505. X            PARITY = A == 0x80;
  506. X            A = 0 - A;
  507. X            SIGN = A >> 7;
  508. X            ZERO = A == 0;
  509. X            BCD = 1;
  510. X        when 0x45:        /* RETN */
  511. X
  512. X            /*
  513. X             * INTERRUPT: Add restore IFF states
  514. X             */
  515. X
  516. X            PC = pop();
  517. X        when 0x46:        /* IM 0 */
  518. X
  519. X            /*
  520. X             * INTERRUPT: Set IM 0
  521. X             */
  522. X            ;
  523. X        when 0x47:        /* LD I,A */
  524. X
  525. X            /*
  526. X             * INTERRUPT: Load I from A
  527. X             */
  528. X            ;
  529. X        when 0x4a:        /* ADC HL,BC */
  530. X            TEMP = BC;
  531. X            goto edadc;
  532. X        when 0x4b:        /* LD BC,(nn) */
  533. X            TEMPL = ram[PC++];
  534. X            TEMPH = ram[PC++];
  535. X            C = ram[TEMP];
  536. X            B = ram[TEMP + 1];
  537. X        when 0x4d:        /* RETI */
  538. X            PC = pop();
  539. X        when 0x4f:        /* LD R,A */
  540. X            R = A + 1;
  541. X        when 0x52:        /* SBC HL,DE */
  542. X            TEMP = DE;
  543. X            goto edsbc;
  544. X        when 0x53:        /* LD (nn),DE */
  545. X            TEMPL = ram[PC++];
  546. X            TEMPH = ram[PC++];
  547. X            ram[TEMP] = E;
  548. X            ram[TEMP + 1] = D;
  549. X        when 0x56:        /* IM 1 */
  550. X
  551. X            /*
  552. X             * INTERRUPT: Set IM 1
  553. X             */
  554. X            ;
  555. X        when 0x57:        /* LD A,I */
  556. X
  557. X            /*
  558. X             * INTERRUPT: A=I
  559. X             */
  560. X            ;
  561. X        when 0x5a:        /* ADC HL,DE */
  562. X            TEMP = DE;
  563. X            goto edadc;
  564. X        when 0x5b:        /* LD DE,(nn) */
  565. X            TEMPL = ram[PC++];
  566. X            TEMPH = ram[PC++];
  567. X            E = ram[TEMP];
  568. X            D = ram[TEMP + 1];
  569. X        when 0x5e:        /* IM 2 */
  570. X
  571. X            /*
  572. X             * INTERRUPT: Set IM 2
  573. X             */
  574. X            ;
  575. X        when 0x5f:        /* LD A,R */
  576. X            A = ++R;
  577. X            SIGN = A >> 7;
  578. X            ZERO = A == 0;
  579. X            HALF_CARRY = BCD = 0;
  580. X
  581. X            /*
  582. X             * INTERRUPT: Copy IFF2 into PARITY
  583. X             */
  584. X
  585. X            PARITY = 0;
  586. X        when 0x62:        /* SBC HL,HL */
  587. X            TEMP = HL;
  588. X            goto edsbc;
  589. X        when 0x63:        /* LD (nn),HL */
  590. X            TEMPL = ram[PC++];
  591. X            TEMPH = ram[PC++];
  592. X            ram[TEMP] = L;
  593. X            ram[TEMP + 1] = H;
  594. X        when 0x67:        /* RRD */
  595. X            s = lonyb(ram[HL]);
  596. X            HL = (ram[HL] >> 4) | (lonyb(A) << 4);
  597. X            A = (A & 0xf0) | s;
  598. X            SIGN = A >> 7;
  599. X            ZERO = A == 0;
  600. X            PARITY = partab[A];
  601. X            HALF_CARRY = BCD = 0;
  602. X        when 0x6a:        /* ADC HL,HL */
  603. X            TEMP = HL;
  604. X            goto edadc;
  605. X        when 0x6b:        /* LD HL,(nn) */
  606. X            TEMPL = ram[PC++];
  607. X            TEMPH = ram[PC++];
  608. X            L = ram[TEMP];
  609. X            H = ram[TEMP + 1];
  610. X        when 0x6f:        /* RLD */
  611. X            s = hinyb(ram[HL]);
  612. X            ram[HL] = (ram[HL] << 4) | lonyb(A);
  613. X            A = ( A & 0xf0) | s;
  614. X            SIGN = A >> 7;
  615. X            ZERO = A == 0;
  616. X            PARITY = partab[A];
  617. X            HALF_CARRY = BCD = 0;
  618. X        when 0x72:        /* SBC HL,SP */
  619. X            TEMP = SP;
  620. edsbc:
  621. X            s = (HL & 0xfff) - (TEMP & 0xfff);
  622. X            if (CARRY) --s;
  623. X            HALF_CARRY = s < 0;
  624. X            s = (int)(HL - TEMP);
  625. X            if (CARRY) --s;
  626. X            PARITY = s < -32768 || s > 32767;
  627. X            s = (int)(HL - TEMP);
  628. X            if (CARRY) --s;
  629. X            CARRY = s < 0;
  630. X            HL = s;
  631. X            SIGN =HL >> 15;
  632. X            ZERO = HL == 0;
  633. X            BCD = 1;
  634. X        when 0x73:        /* LD (nn),SP */
  635. X            TEMPL = ram[PC++];
  636. X            TEMPH = ram[PC++];
  637. X            ram[TEMP] = SPL;
  638. X            ram[TEMP + 1] = SPH;
  639. X        when 0x7a:        /* ADC HL,SP */
  640. X            TEMP = SP;
  641. edadc:
  642. X            s = (HL & 0xfff) + (TEMP & 0xfff);
  643. X            if (CARRY) ++s;
  644. X            HALF_CARRY = s > 0xfff;
  645. X            s = (int)(HL + TEMP);
  646. X            if (CARRY) ++s;
  647. X            s1 = s > 0xffff;
  648. X            s = (int)(HL + TEMP);
  649. X            if (CARRY) ++s;
  650. X            PARITY = s < -32768 || s > 32767;
  651. X            HL = s;
  652. X            CARRY = s1;
  653. X            SIGN = HL >> 15;
  654. X            ZERO = HL == 0;
  655. X            BCD = 0;
  656. X        when 0x7b:        /* LD SP,(nn) */
  657. X            TEMPL = ram[PC++];
  658. X            TEMPH = ram[PC++];
  659. X            SPL = ram[TEMP];
  660. X            SPH = ram[TEMP + 1];
  661. X        when 0xa0:        /* LDI */
  662. X            ram[DE++] = ram[HL++];
  663. X            PARITY = --BC != 0;
  664. X            HALF_CARRY = BCD = 0;
  665. X        when 0xa1:        /* CPI */
  666. X            s = ram[HL++];
  667. X            PARITY= --BC!=0;
  668. X            ZERO = A == s;
  669. X            HALF_CARRY = (int)((A & 0xf) - (s & 0xf)) < 0;
  670. X            s = A - s;
  671. X            SIGN = s >> 7;
  672. X            BCD = 0;
  673. X        when 0xa8:        /* LDD */
  674. X            ram[DE--] = ram[HL--];
  675. X            PARITY = --BC != 0;
  676. X            HALF_CARRY = BCD = 0;
  677. X        when 0xa9:        /* CPD */
  678. X            s = ram[HL--];
  679. X            PARITY = --BC != 0;
  680. X            ZERO = A == s;
  681. X            HALF_CARRY = (int)((A & 0xf) - (s & 0xf)) < 0;
  682. X            s = A - s;
  683. X            SIGN = s >> 7;
  684. X            BCD = 0;
  685. X        when 0xb0:        /* LDIR */
  686. X            do
  687. X                ram[DE++] = ram[HL++];
  688. X            while (--BC);
  689. X            HALF_CARRY = BCD = PARITY = 0;
  690. X
  691. X            /*
  692. X             * INTERRUPT: Convert for PC-=2
  693. X             * Also conv CPIR,INIR,OTIR,LDDR,CPDR, etc
  694. X             */
  695. X
  696. X        when 0xb1:        /* CPIR */
  697. X            do
  698. X            {
  699. X                s = ram[HL++];
  700. X                PARITY = --BC != 0;
  701. X                ZERO = A == s;
  702. X            } while(!ZERO && PARITY);
  703. X            HALF_CARRY = (int)((A & 0xf) - (s & 0xf)) < 0;
  704. X            s = A - s;
  705. X            SIGN = s >> 7;
  706. X            BCD = 0;
  707. X        when 0xb8:        /* LDDR */
  708. X            do
  709. X                ram[DE--] = ram[HL--];
  710. X            while (--BC);
  711. X            HALF_CARRY = BCD = PARITY = 0;
  712. X        when 0xb9:        /* CPDR */
  713. X            do
  714. X            {
  715. X                s = ram[HL--];
  716. X                PARITY = --BC != 0;
  717. X                ZERO = A == s;
  718. X            } while(!ZERO && PARITY);
  719. X            HALF_CARRY = (int)((A & 0xf) - (s & 0xf)) < 0;
  720. X            s = A - s;
  721. X            SIGN = s >> 7;
  722. X            BCD = 0;
  723. X        }
  724. X    when 238:        /* ee XOR n */
  725. X        s = ram[PC++];
  726. X        goto xor;
  727. X    when 239:        /* ef RST 28 */
  728. X        push(PC);
  729. X        PC = 0x28;
  730. X    when 240:        /* f0 RET P */
  731. X        if (!SIGN)
  732. X            PC = pop();
  733. X    when 241:        /* f1 POP AF */
  734. X        AF = pop();
  735. X    when 242:        /* f2 JP P,nn */
  736. X        if (SIGN) PC += 2;
  737. X        else
  738. X        {
  739. X            TEMPL = ram[PC++];
  740. X            TEMPH = ram[PC++];
  741. X            PC = TEMP;
  742. X        }
  743. X    when 243:        /* f3 DI */
  744. X
  745. X        /*
  746. X         * INTERRUPT: Disable
  747. X         */
  748. X        ;
  749. X    when 244:        /* f4 CALL P,nn */
  750. X        if (SIGN) PC += 2;
  751. X        else
  752. X        {
  753. X            TEMPL = ram[PC++];
  754. X            TEMPH = ram[PC++];
  755. X            push(PC);
  756. X            PC = TEMP;
  757. X        }
  758. X    when 245:        /* f5 PUSH AF */
  759. X        push(AF);
  760. X    when 246:        /* f6 OR n */
  761. X        s = ram[PC++];
  762. X        goto or;
  763. X    when 247:        /* f7 RST 30 */
  764. X        push(PC);
  765. X        PC = 0x30;
  766. X    when 248:        /* f8 RET M */
  767. X        if (SIGN)
  768. X            PC = pop();
  769. X    when 249:        /* f9 LD SP,HL */
  770. X        SP = HL;
  771. X    when 250:        /* fa JP M,nn */
  772. X        if (SIGN)
  773. X        {
  774. X            TEMPL = ram[PC++];
  775. X            TEMPH = ram[PC++];
  776. X            PC = TEMP;
  777. X        }
  778. X        else PC += 2;
  779. X    when 251:        /* fb EI */
  780. X
  781. X        /*
  782. X         * INTERRUPT: Enable
  783. X         */
  784. X        ;
  785. X    when 252:        /* fc CALL M,nn */
  786. X        if (SIGN)
  787. X        {
  788. X            TEMPL = ram[PC++];
  789. X            TEMPH = ram[PC++];
  790. X            push(PC);
  791. X            PC = TEMP;
  792. X        }
  793. X        else PC += 2;
  794. X    when 253:        /* FD instructions - use IY register */
  795. X        opcode = ram[PC++];
  796. X        switch (opcode)
  797. X        {
  798. X            case 0x09:        /* 09 ADD IY,BC */
  799. X                s = BC;
  800. X                a = (IY & 0xfff) + (s & 0xfff);
  801. X                s += IY;
  802. X                IY = s;
  803. X                BCD = 0;
  804. X                CARRY = s >> 16;
  805. X                HALF_CARRY = a >> 12;
  806. X            when 0x19:        /* ADD IY, DE */
  807. X                s = DE;
  808. X                a = (IY & 0xfff) + (s & 0xfff);
  809. X                s += IY;
  810. X                IY = s;
  811. X                BCD = 0;
  812. X                CARRY = s >> 16;
  813. X                HALF_CARRY = a >> 12;
  814. X            when 0x21:        /* LD IY, nn */
  815. X                IYL = ram[PC++];
  816. X                IYH = ram[PC++];
  817. X            when 0x22:        /* LD (nn), IY) */
  818. X                TEMPL = ram[PC++];
  819. X                TEMPH = ram[PC++];
  820. X                ram[TEMP] = IYL;
  821. X                ram[TEMP + 1] = IYH;
  822. X            when 0x23:        /* INC IY */
  823. X                IY++;
  824. X            when 0x29:        /* ADD IY, IY */
  825. X                s = IY;
  826. X                a = (IY & 0xfff) + (s & 0xfff);
  827. X                s += IY;
  828. X                IY = s;
  829. X                BCD = 0;
  830. X                CARRY = s >> 16;
  831. X                HALF_CARRY = a >> 12;
  832. X            when 0x2a:        /* LD IY, (nn) */
  833. X                TEMPL = ram[PC++];
  834. X                TEMPH = ram[PC++];
  835. X                IYL = ram[TEMP];
  836. X                IYH = ram[TEMP + 1];
  837. X            when 0x2b:        /* DEC IY */
  838. X                IY--;
  839. X            when 0x34:        /* INC (IY + d) */
  840. X                ptr = ram + IY + ram[PC++];
  841. X                HALF_CARRY = lonyb(*ptr) == 0xf;
  842. X                ++(*ptr);
  843. X                SIGN = *ptr >> 7;
  844. X                ZERO = *ptr == 0;
  845. X                PARITY = *ptr == 0x80;
  846. X                BCD = 0;
  847. X            when 0x35:        /* DEC (IY + d) */
  848. X                ptr = ram + IY + ram[PC++];
  849. X                HALF_CARRY = lonyb(*ptr) != 0;
  850. X                --(*ptr);
  851. X                SIGN = *ptr >> 7;
  852. X                ZERO = *ptr == 0;
  853. X                PARITY = *ptr == 0x7f;
  854. X                BCD = 1;
  855. X            when 0x36:        /* LD (IY + d), n */
  856. X                TEMP = IY + ram[PC++];
  857. X                ram[TEMP] = ram[PC++];
  858. X            when 0x39:        /* ADD IY, SP */
  859. X                s = SP;
  860. X                a = (IY & 0xfff) + (s & 0xfff);
  861. X                s += IY;
  862. X                IY = s;
  863. X                BCD = 0;
  864. X                CARRY = s >> 16;
  865. X                HALF_CARRY = a >> 12;
  866. X            when 0x46:        /* LD B, (IY + d) */
  867. X                B = ram[IY + ram[PC++]];
  868. X            when 0x4e:        /* LD C, (IY + d) */
  869. X                C = ram[IY + ram[PC++]];
  870. X            when 0x56:        /* LD D, (IY + d) */
  871. X                D = ram[IY + ram[PC++]];
  872. X            when 0x5e:        /* LD E, (IY + d) */
  873. X                E = ram[IY + ram[PC++]];
  874. X            when 0x66:        /* LD H, (IY + d) */
  875. X                H = ram[IY + ram[PC++]];
  876. X            when 0x6e:        /* LD L, (IY + d) */
  877. X                L = ram[IY + ram[PC++]];
  878. X            when 0x70:        /* LD (IY + d, B */
  879. X                ram[IY + ram[PC++]] = B;
  880. X            when 0x71:        /* LD (IY + d, C */
  881. X                ram[IY + ram[PC++]] = C;
  882. X            when 0x72:        /* LD (IY + d, D */
  883. X                ram[IY + ram[PC++]] = D;
  884. X            when 0x73:        /* LD (IY + d, E */
  885. X                ram[IY + ram[PC++]] = E;
  886. X            when 0x74:        /* LD (IY + d, H */
  887. X                ram[IY + ram[PC++]] = H;
  888. X            when 0x75:        /* LD (IY + d, L */
  889. X                ram[IY + ram[PC++]] = L;
  890. X            when 0x77:        /* LD (IY + d, A */
  891. X                ram[IY + ram[PC++]] = A;
  892. X            when 0x7e:        /* LD A, (IY + d) */
  893. X                A = ram[IY + ram[PC++]];
  894. X            when 0x86:        /* ADD A, (IY + d) */
  895. X                s = ram[IY + ram[PC++]];
  896. X                goto add;
  897. X            when 0x8e:        /* ADC A, (IY + d) */
  898. X                s = ram[IY + ram[PC++]];
  899. X                goto adc;
  900. X            when 0x96:        /* SUB A, (IY + d) */
  901. X                s = ram[IY + ram[PC++]];
  902. X                goto sub;
  903. X            when 0x9e:        /* SBC A, (IY + d) */
  904. X                s = ram[IY + ram[PC++]];
  905. X                goto sbc;
  906. X            when 0xa6:        /* AND A, (IY + d) */
  907. X                s = ram[IY + ram[PC++]];
  908. X                goto and;
  909. X            when 0xae:        /* XOR A, (IY + d) */
  910. X                s = ram[IY + ram[PC++]];
  911. X                goto xor;
  912. X            when 0xb6:        /* OR A, (IY + d) */
  913. X                s = ram[IY + ram[PC++]];
  914. X                goto or;
  915. X            when 0xbe:        /* CP A, (IY + d) */
  916. X                s = ram[IY + ram[PC++]];
  917. X                goto cp;
  918. X            when 0xcb:
  919. X                ptr = ram + IY + ram[PC++];
  920. X                goto cb_stuff;
  921. X            when 0xe1:        /* POP IY */
  922. X                IY = pop();
  923. X            when 0xe3:        /* EX (SP), IY */
  924. X                s = IY;
  925. X                IY = pop();
  926. X                push(s);
  927. X            when 0xe5:        /* PUSH IY */
  928. X                push(IY);
  929. X            when 0xe9:        /* JP (IY) */
  930. X                PC = IY;
  931. X            when 0xf9:        /* LD SP, IY */
  932. X                SP = IY;
  933. X            break; default: return(-1);
  934. X        }
  935. X    when 254:        /* fe CP n */
  936. X        s = ram[PC++];
  937. X        goto cp;
  938. X    when 255:        /* ff RST 38 */
  939. X        push(PC);
  940. X        PC = 0x38;
  941. X    default: return(-1);
  942. X    }
  943. X
  944. X    return(0);
  945. }
  946. SHAR_EOF
  947. chmod 0640 decode.c ||
  948. echo 'restore of decode.c failed'
  949. Wc_c="`wc -c < 'decode.c'`"
  950. test 32025 -eq "$Wc_c" ||
  951.     echo 'decode.c: original size 32025, current size' "$Wc_c"
  952. # ============= mk_tests.c ==============
  953. sed 's/^X//' << 'SHAR_EOF' > 'mk_tests.c' &&
  954. #include    <stdio.h>
  955. #include    <unistd.h>
  956. X
  957. unsigned char    prg[] = { 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00 };
  958. X
  959. void    main(void)
  960. {
  961. X    int        k;
  962. X    char    fn[16];
  963. X    FILE    *fp;
  964. X
  965. X    for (k = 0; k < 256; k++)
  966. X    {
  967. X        sprintf(fn, "%02.2X.COM", k);
  968. X
  969. X        if ((fp = fopen(fn, "wb")) == NULL)
  970. X        {
  971. X            perror("Can't open file");
  972. X            exit(0);
  973. X        }
  974. X
  975. X        *prg = k;
  976. X        fwrite(prg, sizeof(prg), 1, fp);
  977. X        fclose(fp);
  978. X    }
  979. }
  980. X
  981. SHAR_EOF
  982. chmod 0640 mk_tests.c ||
  983. echo 'restore of mk_tests.c failed'
  984. Wc_c="`wc -c < 'mk_tests.c'`"
  985. test 381 -eq "$Wc_c" ||
  986.     echo 'mk_tests.c: original size 381, current size' "$Wc_c"
  987. # ============= mkbin.c ==============
  988. sed 's/^X//' << 'SHAR_EOF' > 'mkbin.c' &&
  989. #include    <stdio.h>
  990. #include    <unistd.h>
  991. X
  992. main()
  993. {
  994. X    char    entry[32];
  995. X
  996. X    while (*gets(entry))
  997. X        putchar(strtol(entry, NULL, 0));
  998. }
  999. X
  1000. SHAR_EOF
  1001. chmod 0640 mkbin.c ||
  1002. echo 'restore of mkbin.c failed'
  1003. Wc_c="`wc -c < 'mkbin.c'`"
  1004. test 127 -eq "$Wc_c" ||
  1005.     echo 'mkbin.c: original size 127, current size' "$Wc_c"
  1006. rm -f _shar_seq_.tmp
  1007. echo You have unpacked the last part
  1008. exit 0
  1009.  
  1010. -- 
  1011. D'Arcy J.M. Cain (darcy@druid)     |
  1012. D'Arcy Cain Consulting             |   I support gun control.
  1013. West Hill, Ontario, Canada         |   Let's start with the government!
  1014. + 416 281 6094                     |
  1015.