home *** CD-ROM | disk | FTP | other *** search
- /*
- cOMMODORE 64 eMULATOR V0.4 eARLE f. pHILHOWER iii
- cOPYRIGHT (c) 1993-4 (ST916W9R@DUNX1.OCS.DREXEL.EDU)
-
- tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
- IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
- THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2 OF THE lICENSE, OR
- (AT YOUR OPTION) ANY LATER VERSION.
-
- tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
- BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
- merchantability OR fitness for a particular purpose. sEE THE
- gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
-
- yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
- ALONG WITH THIS PROGRAM; IF NOT, WRITE TO THE fREE sOFTWARE
- fOUNDATION, iNC., 675 mASS aVE, cAMBRIDGE, ma 02139, usa.
- */
-
- #INCLUDE "pROCESSOR.H"
- #INCLUDE "nEWiNSTRUCTIONS.H"
- #INCLUDE "sTACK.H"
- #INCLUDE "mODES.H"
- #INCLUDE "eRROR.H"
-
- EXTERN BYTE BCD2DEC[], DEC2BCD[], CYCLETIME[], SCANcODE[];
-
- /*
- tHIS IS MY iNSTRUCTIONS.C FILE CONDENSED INTO ONE SINGLE ROUTINE.
- */
- VOID iNTEGRATEDpROCESSOR(BYTE *gA, BYTE *gX, BYTE *gY, BYTE *gFLAGS, BYTE *gSP, WORD *gPC,
- BYTE **gMEMORY, BYTE *gram)
- {$7b}
- /*
- fIRST WE MAKE LOCAL COPIES OF THE GLOBAL VARIABLES. tHESE *SHOULD* BE STORED
- WITHIN A REGISTER VARIABLE, BUT WITH tc, WHO KNOWS!
- */
- REGISTER BYTE A, X, Y, FLAGS, SP;
- REGISTER WORD PC;
- REGISTER BYTE **MEMORY, **MEMORYP1, *ram;
-
- REGISTER BYTE TBYTE;
- REGISTER WORD ADDR;
-
- INT CYCLES, LINES;
- BYTE OLDmEMORYmAP;
-
- A=*gA; X=*gX; Y=*gY; FLAGS=*gFLAGS; SP=*gSP; PC=*gPC;
- MEMORY=gMEMORY; MEMORYP1=MEMORY+1; ram=gram;
-
- OLDmEMORYmAP=*ramP1;
-
- LINES=0;
- WHILE (++LINES<350)
- {$7b}
- CYCLES=0;
- WHILE (CYCLES<35)
- {$7b}
- TBYTE=iMMEDIATEbYTE(); PC++;
- CYCLES+=CYCLETIME[TBYTE];
- SWITCH (TBYTE)
- {$7b}
- CASE 0X00:
- pUSHwORD(PC);
- FLAGS {$7c}= bkc;
- pUSH(FLAGS{$7c}bkc);
- PC=wORDaT(iRQtO);
- BREAK;
- CASE 0X01:
- ora(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0X02:
- crs();
- BREAK;
- CASE 0X03:
- lor(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0X04:
- skp(1);
- BREAK;
- CASE 0X05:
- ora(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X06:
- asl(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X07:
- lor(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X08:
- pUSH(FLAGS);
- BREAK;
- CASE 0X09:
- A {$7c}= iMMEDIATEbYTE(); fLAGSnz(A); PC++;
- BREAK;
- CASE 0X0A:
- IF (A&128) FLAGS {$7c}= car;
- ELSE FLAGS &= {$7e}car;
- A=A<<1;
- fLAGSnz(A);
- BREAK;
- CASE 0X0B:
- ana(); PC++;
- BREAK;
- CASE 0X0C:
- skp(2);
- BREAK;
- CASE 0X0D:
- ora(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X0E:
- asl(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X0F:
- lor(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X10:
- bcl(neg);
- BREAK;
- CASE 0X11:
- ora(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0X12:
- crs();
- BREAK;
- CASE 0X13:
- lor(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0X14:
- skp(1);
- BREAK;
- CASE 0X15:
- ora(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X16:
- asl(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X17:
- lor(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X18:
- clr(car);
- BREAK;
- CASE 0X19:
- ora(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X1A:
- PC++;
- BREAK;
- CASE 0X1B:
- lor(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X1C:
- skp(2);
- BREAK;
- CASE 0X1D:
- ora(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X1E:
- asl(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X1F:
- lor(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X20:
- pUSHwORD(PC+1); PC=wORDaT(PC);
- BREAK;
- CASE 0X21:
- and(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0X22:
- crs();
- BREAK;
- CASE 0X23:
- lan(iNDIRECTxaDDR); PC+=2;
- BREAK;
- CASE 0X24:
- bit(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X25:
- and(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X26:
- rol(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X27:
- lan(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X28:
- FLAGS = pOP();
- BREAK;
- CASE 0X29:
- A &= iMMEDIATEbYTE(); fLAGSnz(A); PC++;
- BREAK;
- CASE 0X2A:
- IF (FLAGS&car) {$7b}
- IF ((A&128)==0) FLAGS &={$7e}car;
- A=(A<<1){$7c}1; {$7d}
- ELSE {$7b}
- IF(A&128)FLAGS{$7c}=car;
- A=A<<1; {$7d}
- fLAGSnz(A);
- BREAK;
- CASE 0X2B:
- ana(); PC++;
- BREAK;
- CASE 0X2C:
- bit(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X2D:
- and(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X2E:
- rol(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X2F:
- lan(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X30:
- bst(neg);
- BREAK;
- CASE 0X31:
- and(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0X32:
- crs();
- BREAK;
- CASE 0X33:
- lan(iNDIRECTyaDDR); PC+=2;
- BREAK;
- CASE 0X34:
- skp(1);
- BREAK;
- CASE 0X35:
- and(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X36:
- rol(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X37:
- lan(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X38:
- set(car);
- BREAK;
- CASE 0X39:
- and(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X3A:
- PC++;
- BREAK;
- CASE 0X3B:
- lan(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X3C:
- skp(2);
- BREAK;
- CASE 0X3D:
- and(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X3E:
- rol(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X3F:
- lan(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X40:
- FLAGS=pOP(); pOPwORD(PC);
- BREAK;
- CASE 0X41:
- eor(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0X42:
- crs();
- BREAK;
- CASE 0X43:
- reo(iNDIRECTxaDDR); PC+=2;
- BREAK;
- CASE 0X44:
- skp(1);
- BREAK;
- CASE 0X45:
- eor(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X46:
- lsr(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X47:
- reo(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X48:
- pUSH(A);
- BREAK;
- CASE 0X49:
- A ^= iMMEDIATEbYTE(); fLAGSnz(A); PC++;
- BREAK;
- CASE 0X4A:
- FLAGS &={$7e}(car+neg+zer);
- IF (A&1) FLAGS {$7c}=car;
- IF (A=A>>1); ELSE FLAGS {$7c}=zer;
- BREAK;
- CASE 0X4B:
- rbm(); PC++;
- BREAK;
- CASE 0X4C:
- PC=wORDaT(PC);
- BREAK;
- CASE 0X4D:
- eor(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X4E:
- lsr(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X4F:
- reo(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X50:
- bcl(ovf);
- BREAK;
- CASE 0X51:
- eor(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0X52:
- crs();
- BREAK;
- CASE 0X53:
- reo(iNDIRECTyaDDR); PC+=2;
- BREAK;
- CASE 0X54:
- skp(1);
- BREAK;
- CASE 0X55:
- eor(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X56:
- lsr(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X57:
- reo(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X58:
- clr(int);
- BREAK;
- CASE 0X59:
- eor(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X5A:
- PC++;
- BREAK;
- CASE 0X5B:
- reo(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X5C:
- skp(2);
- BREAK;
- CASE 0X5D:
- eor(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X5E:
- lsr(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X5F:
- reo(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X60:
- pOPwORD(PC); PC++;
- BREAK;
- CASE 0X61:
- adc(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0X62:
- crs();
- BREAK;
- CASE 0X63:
- rad(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0X64:
- skp(1);
- BREAK;
- CASE 0X65:
- adc(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X66:
- ror(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X67:
- rad(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X68:
- A=pOP(); fLAGSnz(A);
- BREAK;
- CASE 0X69:
- ADDR=iMMEDIATEbYTE();
- IF (FLAGS&dec) {$7b}
- ADDR = BCD2DEC[ADDR]+BCD2DEC[A]+((FLAGS&car)?1:0);
- FLAGS &= {$7e}(car+ovf+neg+zer);
- IF (ADDR>99) {$7b}
- FLAGS{$7c}=car+ovf;
- ADDR -=100; {$7d}
- IF (ADDR==0) FLAGS {$7c}= zer;
- ELSE FLAGS {$7c}= ADDR&128;
- A=DEC2BCD[ADDR];{$7d}
- ELSE {$7b}
- ADDR += A+((FLAGS&car)?1:0);
- FLAGS &= {$7e}(car+ovf+neg+zer);
- IF (ADDR>255) {$7b}
- FLAGS{$7c}=ovf+car;
- ADDR &=255; {$7d}
- IF (ADDR==0) FLAGS {$7c}= zer;
- ELSE FLAGS {$7c}= ADDR&128;
- A=ADDR; {$7d}
- PC++;
- BREAK;
- CASE 0X6A:
- IF (FLAGS&car) {$7b}
- IF ((A&1)==0) FLAGS &={$7e}car;
- A=(A>>1){$7c}128; {$7d}
- ELSE {$7b}
- IF(A&1) FLAGS{$7c}=car;
- A=A>>1; {$7d}
- fLAGSnz(A);
- BREAK;
- CASE 0X6B:
- rmam(); PC++;
- BREAK;
- CASE 0X6C:
- ADDR=wORDaT(PC); PC=wORDaT(ADDR);
- BREAK;
- CASE 0X6D:
- adc(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X6E:
- ror(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X6F:
- rad(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X70:
- bst(ovf);
- BREAK;
- CASE 0X71:
- adc(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0X72:
- crs();
- BREAK;
- CASE 0X73:
- rad(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0X74:
- skp(1);
- BREAK;
- CASE 0X75:
- adc(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X76:
- ror(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X77:
- rad(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X78:
- set(int);
- BREAK;
- CASE 0X79:
- adc(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X7A:
- PC++;
- BREAK;
- CASE 0X7B:
- rad(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X7C:
- skp(2);
- BREAK;
- CASE 0X7D:
- adc(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X7E:
- ror(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X7F:
- rad(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X80:
- skp(1);
- BREAK;
- CASE 0X81:
- sta(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0X82:
- skp(1);
- BREAK;
- CASE 0X83:
- aax(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0X84:
- sty(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X85:
- sta(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X86:
- stx(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0X87:
- aax(zEROpAGEaDDR); PC+=1;
- BREAK;
- CASE 0X88:
- Y--; fLAGSnz(Y);
- BREAK;
- CASE 0X89:
- skp(1);
- BREAK;
- CASE 0X8A:
- A=X; fLAGSnz(A);
- BREAK;
- CASE 0X8B:
- xma(); PC++;
- BREAK;
- CASE 0X8C:
- sty(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X8D:
- sta(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X8E:
- stx(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X8F:
- aax(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0X90:
- bcl(car);
- BREAK;
- CASE 0X91:
- sta(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0X92:
- crs();
- BREAK;
- CASE 0X93:
- aax(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0X94:
- sty(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X95:
- sta(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0X96:
- stx(zEROpAGEyaDDR); PC++;
- BREAK;
- CASE 0X97:
- aax(zEROpAGEyaDDR); PC++;
- BREAK;
- CASE 0X98:
- A=Y; fLAGSnz(A);
- BREAK;
- CASE 0X99:
- sta(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X9A:
- SP=X;
- BREAK;
- CASE 0X9B:
- axs(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X9C:
- tey(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X9D:
- sta(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0X9E:
- tex(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0X9F:
- tea(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0XA0:
- Y=iMMEDIATEbYTE(); fLAGSnz(Y); PC++;
- BREAK;
- CASE 0XA1:
- lda(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0XA2:
- X=iMMEDIATEbYTE(); fLAGSnz(X); PC++;
- BREAK;
- CASE 0XA3:
- lax(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0XA4:
- ldy(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XA5:
- lda(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XA6:
- ldx(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XA7:
- lax(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XA8:
- Y=A; fLAGSnz(Y);
- BREAK;
- CASE 0XA9:
- A=iMMEDIATEbYTE(); fLAGSnz(A); PC++;
- BREAK;
- CASE 0XAA:
- X=A; fLAGSnz(X);
- BREAK;
- CASE 0XAB:
- ama(); PC++;
- BREAK;
- CASE 0XAC:
- ldy(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XAD:
- lda(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XAE:
- ldx(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XAF:
- lax(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XB0:
- bst(car);
- BREAK;
- CASE 0XB1:
- lda(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0XB2:
- crs();
- BREAK;
- CASE 0XB3:
- lax(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0XB4:
- ldy(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0XB5:
- lda(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0XB6:
- ldx(zEROpAGEyaDDR); PC++;
- BREAK;
- CASE 0XB7:
- lax(zEROpAGEyaDDR); PC++;
- BREAK;
- CASE 0XB8:
- clr(ovf);
- BREAK;
- CASE 0XB9:
- lda(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0XBA:
- X=SP;
- BREAK;
- CASE 0XBB:
- las(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0XBC:
- ldy(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0XBD:
- lda(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0XBE:
- ldx(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0XBF:
- lax(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0XC0:
- TBYTE=iMMEDIATEbYTE();
- FLAGS &={$7e}(car+zer+neg);
- IF (Y==TBYTE) FLAGS {$7c}=car+zer;
- ELSE IF (Y>TBYTE) FLAGS {$7c}=car;
- ELSE FLAGS {$7c}=neg;
- PC++;
- BREAK;
- CASE 0XC1:
- cmp(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0XC2:
- skp(1);
- BREAK;
- CASE 0XC3:
- dcp(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0XC4:
- cpy(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XC5:
- cmp(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XC6:
- decr(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XC7:
- dcp(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XC8:
- Y++; fLAGSnz(Y);
- BREAK;
- CASE 0XC9:
- TBYTE=iMMEDIATEbYTE();
- FLAGS &={$7e}(car+zer+neg);
- IF (A==TBYTE) FLAGS {$7c}=car+zer;
- ELSE IF (A>TBYTE) FLAGS {$7c}=car;
- ELSE FLAGS {$7c}=neg;
- PC++;
- BREAK;
- CASE 0XCA:
- X--; fLAGSnz(X);
- BREAK;
- CASE 0XCB:
- axm(); PC++;
- BREAK;
- CASE 0XCC:
- cpy(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XCD:
- cmp(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XCE:
- decr(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XCF:
- dcp(aBSOLUTEaDDR); PC++;
- BREAK;
- CASE 0XD0:
- bcl(zer);
- BREAK;
- CASE 0XD1:
- cmp(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0XD2:
- crs();
- BREAK;
- CASE 0XD3:
- dcp(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0XD4:
- skp(1);
- BREAK;
- CASE 0XD5:
- cmp(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0XD6:
- decr(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0XD7:
- dcp(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0XD8:
- clr(dec);
- BREAK;
- CASE 0XD9:
- cmp(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0XDA:
- PC++;
- BREAK;
- CASE 0XDB:
- dcp(aBSOLUTEyaDDR); PC++;
- BREAK;
- CASE 0XDC:
- skp(2);
- BREAK;
- CASE 0XDD:
- cmp(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0XDE:
- decr(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0XDF:
- dcp(aBSOLUTExaDDR); PC++;
- BREAK;
- CASE 0XE0:
- TBYTE=iMMEDIATEbYTE();
- FLAGS &={$7e}(car+zer+neg);
- IF (X==TBYTE) FLAGS {$7c}=car+zer;
- ELSE IF (X>TBYTE) FLAGS {$7c}=car;
- ELSE FLAGS {$7c}=neg;
- PC++;
- BREAK;
- CASE 0XE1:
- sbc(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0XE2:
- skp(1);
- BREAK;
- CASE 0XE3:
- isb(iNDIRECTxaDDR); PC++;
- BREAK;
- CASE 0XE4:
- cpx(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XE5:
- sbc(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XE6:
- incr(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XE7:
- isb(zEROpAGEaDDR); PC++;
- BREAK;
- CASE 0XE8:
- X++; fLAGSnz(X);
- BREAK;
- CASE 0XE9:
- ADDR=iMMEDIATEbYTE();
- IF (FLAGS&dec) {$7b}
- ADDR = BCD2DEC[A]-BCD2DEC[ADDR]-((FLAGS&car)?0:1);
- FLAGS &= {$7e}(car+zer+neg+ovf);
- IF (ADDR==0) FLAGS {$7c}=zer+car;
- ELSE IF (((INT)ADDR)>0) FLAGS {$7c}=car;
- ELSE {$7b}
- FLAGS{$7c}=neg;
- ADDR +=100; {$7d}
- A=DEC2BCD[ADDR]; {$7d}
- ELSE {$7b}
- ADDR = A-ADDR-((FLAGS&car)?0:1);
- FLAGS &={$7e}(car+zer+ovf+neg);
- IF (ADDR==0) FLAGS {$7c}= zer+car;
- ELSE IF (((INT)ADDR)>0) FLAGS {$7c}= car;
- ELSE FLAGS{$7c}=ovf;
- ADDR &= 255;
- FLAGS {$7c}= ADDR&128;
- A=ADDR; {$7d}
- PC++;
- BREAK;
- CASE 0XEA:
- BREAK;
- CASE 0XEB:
- ADDR=iMMEDIATEbYTE();
- IF (FLAGS&dec) {$7b}
- ADDR = BCD2DEC[A]-BCD2DEC[ADDR]-((FLAGS&car)?0:1);
- FLAGS &= {$7e}(car+zer+neg+ovf);
- IF (ADDR==0) FLAGS {$7c}=zer+car;
- ELSE IF (((INT)ADDR)>0) FLAGS {$7c}=car;
- ELSE {$7b}
- FLAGS{$7c}=neg;
- ADDR +=100; {$7d}
- A=DEC2BCD[ADDR]; {$7d}
- ELSE {$7b}
- ADDR = A-ADDR-((FLAGS&car)?0:1);
- FLAGS &={$7e}(car+zer+ovf+neg);
- IF (ADDR==0) FLAGS {$7c}= zer+car;
- ELSE IF (((INT)ADDR)>0) FLAGS {$7c}= car;
- ELSE FLAGS{$7c}=ovf;
- ADDR &= 255;
- FLAGS {$7c}= ADDR&128;
- A=ADDR; {$7d}
- PC++;
- BREAK;
- CASE 0XEC:
- cpx(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XED:
- sbc(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XEE:
- incr(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XEF:
- isb(aBSOLUTEaDDR); PC+=2;
- BREAK;
- CASE 0XF0:
- bst(zer);
- BREAK;
- CASE 0XF1:
- sbc(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0XF2:
- crs();
- BREAK;
- CASE 0XF3:
- isb(iNDIRECTyaDDR); PC++;
- BREAK;
- CASE 0XF4:
- skp(1);
- BREAK;
- CASE 0XF5:
- sbc(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0XF6:
- incr(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0XF7:
- isb(zEROpAGExaDDR); PC++;
- BREAK;
- CASE 0XF8:
- set(dec);
- BREAK;
- CASE 0XF9:
- sbc(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0XFA:
- PC++;
- BREAK;
- CASE 0XFB:
- isb(aBSOLUTEyaDDR); PC+=2;
- BREAK;
- CASE 0XFC:
- skp(2);
- BREAK;
- CASE 0XFD:
- sbc(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0XFE:
- incr(aBSOLUTExaDDR); PC+=2;
- BREAK;
- CASE 0XFF:
-
- /*
- tHIS IS OUT trap COMMAND FOR PATCHING THE romS. fIRST MAKE SURE
- THE GLOBAL REGISTERS ARE SET PROPERLY
- */
- *gA=A; *gX=X; *gY=Y; *gFLAGS=FLAGS; *gSP=SP; *gPC=PC;
- tRAPeXECUTE();
- A=*gA; X=*gX; Y=*gY; FLAGS=*gFLAGS; SP=*gSP; PC=*gPC;
- BREAK;
- {$7d}
- /* sET UP THE KEYBOARD REGISTER ACCORDING TO PRECOMPUTED VALUES */
- ram[0XDC01]=SCANcODE[ram[0XDC00]];
- {$7d}
- IF (++ram[0XD012]==0) ram[0XD011] ^= 128;
- ram[0XD018] {$7c}=1;
- {$7d}
- *gA=A; *gX=X; *gY=Y; *gFLAGS=FLAGS; *gSP=SP; *gPC=PC;
- {$7d}
-
-