home *** CD-ROM | disk | FTP | other *** search
Text File | 1988-10-29 | 66.1 KB | 2,115 lines |
-
- /***************************************************************************
-
- V_M_OPS.INC
-
- All 6502 simulation code is in this file
-
- December 31, 1986 0:00
-
- ***************************************************************************/
-
-
- /* format of the mnemonics: 3 ascii codes of th opcode and the addressing mode:
- 00 - implied 01 - immediate 02 - zero page 03 - zero page,x
- 04 - zero page,y 05 - (zero page,x) 06 - (zero page),y
- 07 - absolute 08 - absolute,x 09 - absolute,y 0A - accumulator
- 0B - relative 0C - indirect 0D - absolute indirect
- */
-
- long mnemonics[256] = {
-
- 0x42524B00L, 0x4F524105L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524102L,
- 0x41534C02L, 0x3F3F3F00L, 0x50485000L, 0x4F524101L, 0x41534C0AL, 0x3F3F3F00L,
- 0x3F3F3F00L, 0x4F524107L, 0x41534C07L, 0x3F3F3F00L, 0x42504C0BL, 0x4F524106L,
- 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524103L, 0x41534C03L, 0x3F3F3F00L,
- 0x434C4300L, 0x4F524109L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524108L,
- 0x41534C08L, 0x3F3F3F00L, 0x4A535207L, 0x414E4405L, 0x3F3F3F00L, 0x3F3F3F00L,
- 0x42495402L, 0x414E4402L, 0x524F4C02L, 0x3F3F3F00L, 0x504C5000L, 0x414E4401L,
- 0x524F4C0AL, 0x3F3F3F00L, 0x42495407L, 0x414E4407L, 0x524F4C07L, 0x3F3F3F00L,
- 0x424D490BL, 0x414E4406L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x414E4403L,
- 0x524F4C03L, 0x3F3F3F00L, 0x53454300L, 0x414E4409L, 0x3F3F3F00L, 0x3F3F3F00L,
- 0x3F3F3F00L, 0x414E4408L, 0x524F4C08L, 0x3F3F3F00L, 0x52544900L, 0x454F5205L,
- 0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5202L, 0x4C535202L, 0x3F3F3F00L,
- 0x50484100L, 0x454F5201L, 0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5207L,
- 0x4C535207L, 0x3F3F3F00L, 0x4256430BL, 0x454F5206L, 0x3F3F3F00L, 0x3F3F3F00L,
- 0x3F3F3F00L, 0x454F5203L, 0x4C535203L, 0x3F3F3F00L, 0x434C4900L, 0x454F5209L,
- 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x454F5208L, 0x4C535208L, 0x3F3F3F00L,
- 0x52545300L, 0x41444305L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444302L,
- 0x524F5202L, 0x3F3F3F00L, 0x504C4100L, 0x41444301L, 0x524F520AL, 0x3F3F3F00L,
- 0x4A4D500CL, 0x41444307L, 0x524F5207L, 0x3F3F3F00L, 0x4256530BL, 0x41444306L,
- 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444303L, 0x524F5203L, 0x3F3F3F00L,
- 0x53454900L, 0x41444309L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444308L,
- 0x524F5208L, 0x3F3F3F00L, 0X3F3F3F00L, 0X53544105L, 0X3F3F3F00L, 0X3F3F3F00L,
- 0X53545902L, 0X53544102L, 0X53545802L, 0X3F3F3F00L, 0X44455900L, 0X3F3F3F00L,
- 0X54584100L, 0X3F3F3F00L, 0X53545907L, 0X53544107L, 0X53545807L, 0X3F3F3F00L,
- 0X4243430BL, 0X53544106L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53545903L, 0X53544103L,
- 0X53545804L, 0X3F3F3F00L, 0X54594100L, 0X53544109L, 0X54585300L, 0X3F3F3F00L,
- 0X3F3F3F00L, 0X53544108L, 0X3F3F3F00L, 0X3F3F3F00L, 0X4C445901L, 0X4C444105L,
- 0X4C445801L, 0X3F3F3F00L, 0X4C445902L, 0X4C444102L, 0X4C445802L, 0X3F3F3F00L,
- 0X54415900L, 0X4C444101L, 0X54415800L, 0X3F3F3F00L, 0X4C445907L, 0X4C444107L,
- 0X4C445807L, 0X3F3F3F00L, 0X4243530BL, 0X4C444106L, 0X3F3F3F00L, 0X3F3F3F00L,
- 0X4C445903L, 0X4C444103L, 0X4C445804L, 0X3F3F3F00L, 0X434C5600L, 0X4C444109L,
- 0X54535800L, 0X3F3F3F00L, 0X4C445908L, 0X4C444108L, 0X4C445809L, 0X3F3F3F00L,
- 0X43505901L, 0X434D5005L, 0X3F3F3F00L, 0X3F3F3F00L, 0X43505902L, 0X434d5002L,
- 0X44454302L, 0X3F3F3F00L, 0X494E5900L, 0X434D5001L, 0X44455800L, 0X3F3F3F00L,
- 0X43505907L, 0X434D5007L, 0X44454307L, 0X3F3F3F00L, 0X424E450BL, 0X434D5006L,
- 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5003L, 0X44454303L, 0X3F3F3F00L,
- 0X434C4400L, 0X434D5009L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5008L,
- 0X44454308L, 0X3F3F3F00L, 0X43505801L, 0X53424305L, 0X3F3F3F00L, 0X3F3F3F00L,
- 0X43505802L, 0X53424302L, 0X494E4302L, 0X3F3F3F00L, 0X494E5800L, 0X53424301L,
- 0X4E4F5000L, 0X3F3F3F00L, 0X43505807L, 0X53424307L, 0X494E4307L, 0X3F3F3F00L,
- 0X4245510BL, 0X53424306L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53424303L,
- 0X494E4303L, 0X3F3F3F00L, 0X53454400L, 0X53424309L, 0X3F3F3F00L, 0X3F3F3F00L,
- 0X3F3F3F00L, 0X53424308L, 0X494E4308L, 0X3F3F3F00L
- } ;
-
-
- /* tell Megamax that the emulation routines will be found in inline code: */
-
- extern
- op00(), op01(), op02(), op03(), op04(), op05(), op06(), op07(), op08(),
- op09(),op0A(),op0B(), op0C(), op0D(), op0E(), op0F(), op10(), op11(), op12(),
- op13(), op14(), op15(), op16(), op17(), op18(), op19(), op1A(), op1B(),
- op1C(), op1D(), op1E(), op1F(), op20(), op21(), op22(), op23(), op24(),
- op25(), op26(), op27(), op28(), op29(), op2A(), op2B(), op2C(), op2D(),
- op2E(), op2F(), op30(), op31(), op32(), op33(), op34(), op35(), op36(),
- op37(), op38(), op39(), op3A(), op3B(), op3C(), op3D(), op3E(), op3F(),
- op40(), op41(), op42(), op43(), op44(), op45(), op46(), op47(), op48(),
- op49(), op4A(), op4B(), op4C(), op4D(), op4E(), op4F(), op50(), op51(),
- op52(), op53(), op54(), op55(), op56(), op57(), op58(), op59(), op5A(),
- op5B(), op5C(), op5D(), op5E(), op5F(), op60(), op61(), op62(), op63(),
- op64(), op65(), op66(), op67(), op68(), op69(), op6A(), op6B(), op6C(),
- op6D(), op6E(), op6F(), op70(), op71(), op72(), op73(), op74(), op75(),
- op76(), op77(), op78(), op79(), op7A(), op7B(), op7C(), op7D(), op7E(),
- op7F(), op80(), op81(), op82(), op83(), op84(), op85(), op86(), op87(),
- op88(), op89(), op8A(), op8B(), op8C(), op8D(), op8E(), op8F(), op90(),
- op91(), op92(), op93(), op94(), op95(), op96(), op97(), op98(), op99(),
- op9A(), op9B(), op9C(), op9D(), op9E(), op9F(), opA0(), opA1(), opA2(),
- opA3(), opA4(), opA5(), opA6(), opA7(), opA8(), opA9(), opAA(), opAB(),
- opAC(), opAD(), opAE(), opAF(), opB0(), opB1(), opB2(), opB3(), opB4(),
- opB5(), opB6(), opB7(), opB8(), opB9(), opBA(), opBB(), opBC(), opBD(),
- opBE(), opBF(), opC0(), opC1(), opC2(), opC3(), opC4(), opC5(), opC6(),
- opC7(), opC8(), opC9(), opCA(), opCB(), opCC(), opCD(), opCE(), opCF(),
- opD0(), opD1(), opD2(), opD3(), opD4(), opD5(), opD6(), opD7(), opD8(),
- opD9(), opDA(), opDB(), opDC(), opDD(), opDE(), opDF(), opE0(), opE1(),
- opE2(), opE3(), opE4(), opE5(), opE6(), opE7(), opE8(), opE9(), opEA(),
- opEB(), opEC(), opED(), opEE(), opEF(), opF0(), opF1(), opF2(), opF3(),
- opF4(), opF5(), opF6(), opF7(), opF8(), opF9(), opFA(), opFB(), opFC(),
- opFD(), opFE(), opFF() ;
-
-
- int (*vec_6502[256])() = { /* create an array of pointers to 256 functions */
-
- op00, op01, op02, op03, op04, op05, op06, op07, op08,
- op09, op0A, op0B, op0C, op0D, op0E, op0F, op10, op11, op12,
- op13, op14, op15, op16, op17, op18, op19, op1A, op1B,
- op1C, op1D, op1E, op1F, op20, op21, op22, op23, op24,
- op25, op26, op27, op28, op29, op2A, op2B, op2C, op2D,
- op2E, op2F, op30, op31, op32, op33, op34, op35, op36,
- op37, op38, op39, op3A, op3B, op3C, op3D, op3E, op3F,
- op40, op41, op42, op43, op44, op45, op46, op47, op48,
- op49, op4A, op4B, op4C, op4D, op4E, op4F, op50, op51,
- op52, op53, op54, op55, op56, op57, op58, op59, op5A,
- op5B, op5C, op5D, op5E, op5F, op60, op61, op62, op63,
- op64, op65, op66, op67, op68, op69, op6A, op6B, op6C,
- op6D, op6E, op6F, op70, op71, op72, op73, op74, op75,
- op76, op77, op78, op79, op7A, op7B, op7C, op7D, op7E,
- op7F, op80, op81, op82, op83, op84, op85, op86, op87,
- op88, op89, op8A, op8B, op8C, op8D, op8E, op8F, op90,
- op91, op92, op93, op94, op95, op96, op97, op98, op99,
- op9A, op9B, op9C, op9D, op9E, op9F, opA0, opA1, opA2,
- opA3, opA4, opA5, opA6, opA7, opA8, opA9, opAA, opAB,
- opAC, opAD, opAE, opAF, opB0, opB1, opB2, opB3, opB4,
- opB5, opB6, opB7, opB8, opB9, opBA, opBB, opBC, opBD,
- opBE, opBF, opC0, opC1, opC2, opC3, opC4, opC5, opC6,
- opC7, opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF,
- opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7, opD8,
- opD9, opDA, opDB, opDC, opDD, opDE, opDF, opE0, opE1,
- opE2, opE3, opE4, opE5, opE6, opE7, opE8, opE9, opEA,
- opEB, opEC, opED, opEE, opEF, opF0, opF1, opF2, opF3,
- opF4, opF5, opF6, opF7, opF8, opF9, opFA, opFB, opFC,
- opFD, opFE, opFF } ;
-
-
- execute() {
-
- asm {
- MOVEM.L D0-D7/A0-A3/A5,-(SP) /* save enviornment */
-
- CLR.L D0 /* clear everything just to be safe */
- CLR.L D1
- CLR.L D2
- CLR.L D3
- CLR.L D4
- CLR.L D5
- CLR.L D6
- CLR.L D7
- /* convert P register NV_BDIZC
- to CCR register BDIXNZVC */
- MOVE.B p(GLOBAL),REGST
- MOVE.B REGST,DBUS /* BDI */
- MOVE.B REGST,REGA /* N */
- MOVE.B REGST,REGX /* V */
- MOVE.B REGST,REGY /* Z */
- MOVE.B REGST,REGEA /* set X equal to C */
-
- ASL.B #3,DBUS
- AND.B #0xE0,DBUS /* BDI_____ */
- ASL.B #4,REGEA
- AND.B #BITX,REGEA /* ___X____ */
- ASL.B #1,REGY
- AND.B #BITZ,REGY /* _____Z__ */
- ASR.B #4,REGA
- AND.B #BITN,REGA /* ____N___ */
- ASR.B #5,REGX
- AND.B #BITV,REGX /* ______V_ */
-
- MOVE.B REGEA,REGST
- OR.B REGX,REGST
- OR.B REGY,REGST
- OR.B REGA,REGST
- OR.B DBUS,REGST /* that gets BDIXNZVC !!! */
-
- MOVE.B a(GLOBAL),REGA /* load 6502 registers */
- MOVE.B x(GLOBAL),REGX
- MOVE.B y(GLOBAL),REGY
- MOVE.W #0x100,REGSP
- MOVE.B sp(GLOBAL),REGSP /* stack is on page 1 */
- MOVE.W pc(GLOBAL),REGPC
-
- LEA exit_emul,REGEMUL
- MOVE.L REGEMUL,exitptr(GLOBAL) /* pointer to exit_emul */
- LEA emul,REGEMUL /* pointer to emulator */
- TST.B trace(GLOBAL)
- BEQ notrace /* if trace bit set... */
- LEA exit_emul,REGEMUL /* divert to exit routine */
- notrace:
- LEA vec_6502(GLOBAL),REGOPS /* pointer to table */
- MOVE.L mem(GLOBAL),REGMEA /* pointer to mem[ea] */
- MOVE.L stat(GLOBAL),REGSTAT
- MOVE.L REGMEA,REGEA
- ADD.L REGMEA,REGPC /* pointer to mem[pc] */
- MOVE.L REGPC,REGMPC
-
- } /* fall through into emulator */
-
- emul:
-
- asm {
- CLR.W IR /* 4 clock cycles */
- MOVE.B (REGMPC)+,IR /* 8 clock cycles */
- ADD.W IR,IR /* 4 clock cycles */
- ADD.W IR,IR /* 4 clock cycles */
- MOVE.L 0(REGOPS,IR.W),REGMEA /* 15-20 clock cycles */
- JMP (REGMEA) /* 8 clock cycles */
- }
-
- exit_emul:
-
- asm {
-
- MOVE.B REGA,a(GLOBAL) /* save 6502 registers */
- MOVE.B REGX,x(GLOBAL)
- MOVE.B REGY,y(GLOBAL)
- MOVE.B REGSP,sp(GLOBAL)
- MOVE.W REGMPC,pc(GLOBAL)
- MOVE.W REGMEA,ea(GLOBAL)
-
- /* convert CCR register BDIXNZVC
- to P register NV_BDIZC */
- MOVE.B REGST,DBUS /* BDI */
- MOVE.B REGST,REGA /* N */
- MOVE.B REGST,REGX /* V */
- MOVE.B REGST,REGY /* Z */
- MOVE.B REGST,REGEA /* C */
-
- ASR.B #3,DBUS
- AND.B #0x1C,DBUS /* ___BDI__ */
- ASR.B #4,REGEA
- AND.B #CBIT,REGEA /* _______C */
- ASR.B #1,REGY
- AND.B #ZBIT,REGY /* ______Z_ */
- ASL.B #4,REGA
- AND.B #NBIT,REGA /* N_______ */
- ASL.B #5,REGX
- AND.B #VBIT,REGX /* _V______ */
-
- MOVE.B REGEA,REGST
- OR.B REGX,REGST
- OR.B REGY,REGST
- OR.B REGA,REGST
- OR.B DBUS,REGST /* that gets NV_BDIZC !!! */
-
- MOVE.B REGST,p(GLOBAL)
-
- MOVEM.L (SP)+,D0-D7/A0-A3/A5 /* restore enviornment */
- }
- return(0) ; /* and get outta here! */
-
-
- asm { /* 256 emulation routines go here */
- /* but first, some common code: */
-
- /* at entry, all common routines have REGEA loaded */
- doOR:
- MOVE.B 0(REGSTAT,REGEA.W),IR /* get status byte */
- BPL ORread /* if OK to read memory do so */
- SETREAD /* else set read flag */
- BSR emul_serv /* and call service routine */
- ORread:
- MOVE.L REGEA,REGMEA
- OR.B (REGMEA),REGA
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doAND: /* ditto */
- MOVE.B 0(REGSTAT,REGEA.W),IR
- BPL ANDread
- SETREAD
- BSR emul_serv
- ANDread:
- MOVE.L REGEA,REGMEA
- AND.B (REGMEA),REGA
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doEOR:
- MOVE.B 0(REGSTAT,REGEA.W),IR
- BPL EORread
- SETREAD
- BSR emul_serv
- EORread:
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS /* stupid 68000 limitation */
- EOR.B DBUS,REGA /* makes you do it in 2 steps */
- MOVE.W SR,DBUS /* argghhhhh!!! */
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doINC:
- MOVE.L REGEA,REGMEA
- ADDQ.B #1,(REGMEA)
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doDEC:
- MOVE.L REGEA,REGMEA
- SUBQ.B #1,(REGMEA)
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doLDA:
- MOVE.B 0(REGSTAT,REGEA.W),IR
- BPL LDAread
- SETREAD
- BSR emul_serv
- LDAread:
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),REGA
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doLDX:
- MOVE.B 0(REGSTAT,REGEA.W),IR
- BPL LDXread
- SETREAD
- BSR emul_serv
- LDXread:
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),REGX
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doLDY:
- MOVE.B 0(REGSTAT,REGEA.W),IR
- BPL LDYread
- SETREAD
- BSR emul_serv
- LDYread:
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),REGY
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doSTA:
- MOVE.B 0(REGSTAT,REGEA.W),IR
- BEQ STAwrite
- SETWRITE
- SWAP DBUS
- MOVE.B REGA,DBUS
- SWAP DBUS
- BRA emul_serv
- STAwrite:
- MOVE.L REGEA,REGMEA
- MOVE.B REGA,(REGMEA)
- JMP (REGEMUL)
-
- doSTX:
- MOVE.B 0(REGSTAT,REGEA.W),IR
- BEQ STXwrite
- SETWRITE
- SWAP DBUS
- MOVE.B REGX,DBUS
- SWAP DBUS
- BRA emul_serv
- STXwrite:
- MOVE.L REGEA,REGMEA
- MOVE.B REGX,(REGMEA)
- JMP (REGEMUL)
-
- doSTY:
- MOVE.B 0(REGSTAT,REGEA.W),IR
- BEQ STYwrite
- SETWRITE
- SWAP DBUS
- MOVE.B REGY,DBUS
- SWAP DBUS
- BRA emul_serv
- STYwrite:
- MOVE.L REGEA,REGMEA
- MOVE.B REGY,(REGMEA)
- JMP (REGEMUL)
-
- doADC:
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- ORI.B #BITZ,REGST /* ADDX doesn't set Z flag */
- MOVE.B REGST,CCR /* so prepare C bit */
- ADDX.B DBUS,REGA /* BUG!! BUG!! no decimal mode yet!! */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITV|BITX),DBUS
- AND.B #~(BITN|BITZ|BITV|BITX),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doSBC:
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- EORI.B #BITX,REGST /* different than 6502 */
- ORI.B #BITZ,REGST /* SUBX doesn't set Z flag */
- MOVE.B REGST,CCR
- SUBX.B DBUS,REGA
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX|BITV),DBUS
- EORI.B #BITX,DBUS
- AND.B #~(BITN|BITZ|BITX|BITV),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
-
- doROL:
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),IR /* get byte */
- MOVE.B REGST,CCR
- ROXL.B #1,IR /* shift it */
- MOVE.B IR,(REGMEA) /* save in memory */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS /* update flags N Z C */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doROR:
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),IR
- MOVE.B REGST,CCR
- ROXR.B #1,IR
- MOVE.B IR,(REGMEA)
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doASL:
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),IR
- ASL.B #1,IR
- MOVE.B IR,(REGMEA)
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- doLSR:
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),IR
- LSR.B #1,IR
- MOVE.B IR,(REGMEA)
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
-
- /* here are the actual 256 emulation routines: */
-
- op00: OR.B #BITB,REGST
- BRA exit_emul
-
- op01: CLR.W REGEA /* ORA (zp,X) */
- MOVE.B (REGMPC)+,REGEA /* get zero page address */
- ADD.B REGX,REGEA /* wraparound to zero page again */
- MOVE.L REGEA,REGMEA /* effective address calculated */
- MOVE.B 1(REGMEA),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 (neat huh?) */
- MOVE.B (REGMEA),REGEA /* get lo byte */
- BRA doOR /* go to common ORing routine */
-
- op02: JMP (REGEMUL)
-
- op03: JMP (REGEMUL)
-
- op04: JMP (REGEMUL)
-
- op05: CLR.W REGEA /* ORA zp */
- MOVE.B (REGMPC)+,REGEA /* ditto */
- BRA ORread
-
- op06: CLR.W REGEA /* ASL zp */
- MOVE.B (REGMPC)+,REGEA
- BRA doASL
-
- op07: JMP (REGEMUL)
-
- op08: /* PHP */
- MOVE.W REGSP,REGEA
- MOVE.L REGEA,REGMEA
- MOVEM.L DBUS/REGST/REGA/REGX/REGY/REGEA,-(SP)
- /* convert CCR register BDIXNZVC
- to P register NV_BDIZC */
- MOVE.B REGST,DBUS /* BDI */
- MOVE.B REGST,REGA /* N */
- MOVE.B REGST,REGX /* V */
- MOVE.B REGST,REGY /* Z */
- MOVE.B REGST,REGEA /* C */
- ASR.B #3,DBUS
- AND.B #0x1C,DBUS /* ___BDI__ */
- ASR.B #4,REGEA
- AND.B #CBIT,REGEA /* _______C */
- ASR.B #1,REGY
- AND.B #ZBIT,REGY /* ______Z_ */
- ASL.B #4,REGA
- AND.B #NBIT,REGA /* N_______ */
- ASL.B #5,REGX
- AND.B #VBIT,REGX /* _V______ */
- MOVE.B REGEA,REGST
- OR.B REGX,REGST
- OR.B REGY,REGST
- OR.B REGA,REGST
- OR.B DBUS,REGST /* that gets NV_BDIZC !!! */
- ORI.B #0x20,REGST /* and then NV1BDIZC */
- MOVE.B REGST,(REGMEA) /* push processor */
- MOVEM.L (SP)+,DBUS/REGST/REGA/REGX/REGY/REGEA
- SUBQ.B #1,REGSP
- JMP (REGEMUL)
-
-
- op09: OR.B (REGMPC)+,REGA /* ORA # */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op0A: /* ASL A */
- ASL.B #1,REGA /* shift it */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS /* update flags N Z C */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op0B: JMP (REGEMUL)
-
- op0C: JMP (REGEMUL)
-
- op0D: /* ORA abs */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADDQ.W #2,REGMPC
- BRA doOR
-
- op0E: /* ASL abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doASL
-
- op0F: JMP (REGEMUL)
-
- op10: BTST #3,REGST /* BPL */
- BNE nobpl /* BITN = 0x08 = bit #3 */
- MOVE.B (REGMPC)+,DBUS
- EXT.W DBUS
- ADDA.W DBUS,REGMPC
- JMP (REGEMUL)
- nobpl:
- ADDQ.L #1,REGMPC
- JMP (REGEMUL)
-
- op11: CLR.W REGEA /* ORA (zp),Y */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMEA),REGEA /* get lo byte */
- ADD.W REGY,REGEA
- BRA doOR
-
- op12: JMP (REGEMUL)
-
- op13: JMP (REGEMUL)
-
- op14: JMP (REGEMUL)
-
- op15: CLR.W REGEA /* ORA zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA /* wraparpund */
- BRA ORread
-
- op16: CLR.W REGEA /* ASL zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA doASL
-
- op17: JMP (REGEMUL)
-
- op18: ANDI.B #~BITX,REGST /* CLC */
- JMP (REGEMUL)
-
- op19: /* ORA abs,Y */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGY,REGEA
- ADDQ.W #2,REGMPC
- BRA doOR
-
- op1A: JMP (REGEMUL)
-
- op1B: JMP (REGEMUL)
-
- op1C: JMP (REGEMUL)
-
- op1D: /* ORA abs,X */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doOR
-
- op1E: /* ASL abs,X */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doASL
-
- op1F: JMP (REGEMUL)
-
- op20: SUBQ.B #2,REGSP /* JSR abs */
- MOVE.W REGSP,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.W REGMPC,REGPC
- ADDQ.W #1,REGPC
- MOVE.B REGPC,1(REGMEA) /* push PClo */
- MOVE.W REGPC,-(SP)
- MOVE.B (SP)+,2(REGMEA) /* push PChi */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGPC
- MOVE.B (REGMPC),REGPC
- MOVE.L REGPC,REGMPC
- JMP (REGEMUL)
-
- op21: CLR.W REGEA /* AND (zp,X) */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- BRA doAND
-
- op22: JMP (REGEMUL)
-
- op23: JMP (REGEMUL)
-
- op24: CLR.W REGEA /* BIT zp */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- TST.B (REGMEA) /* V bit not set!!!! */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ|BITV),REGST
- OR.B DBUS,REGST
- MOVE.B (REGMEA),DBUS
- LSR.B #5,DBUS /* shift V bit into position */
- AND.B #(BITV),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op25: CLR.W REGEA /* AND zp */
- MOVE.B (REGMPC)+,REGEA
- BRA ANDread
-
- op26: CLR.W REGEA /* ROL zp */
- MOVE.B (REGMPC)+,REGEA
- BRA doROL
-
- op27: JMP (REGEMUL)
-
- op28: /* PLP */
- ADDQ.B #1,REGSP
- MOVE.W REGSP,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),REGST
- MOVEM.L DBUS/REGA/REGX/REGY/REGEA,-(SP)
- /* convert P register NV_BDIZC
- to CCR register BDIXNZVC */
- MOVE.B REGST,DBUS /* BDI */
- MOVE.B REGST,REGA /* N */
- MOVE.B REGST,REGX /* V */
- MOVE.B REGST,REGY /* Z */
- MOVE.B REGST,REGEA /* set X equal to C */
- ASL.B #3,DBUS
- AND.B #0xE0,DBUS /* BDI_____ */
- ASL.B #4,REGEA
- AND.B #BITX,REGEA /* ___X____ */
- ASL.B #1,REGY
- AND.B #BITZ,REGY /* _____Z__ */
- ASR.B #4,REGA
- AND.B #BITN,REGA /* ____N___ */
- ASR.B #5,REGX
- AND.B #BITV,REGX /* ______V_ */
- MOVE.B REGEA,REGST
- OR.B REGX,REGST
- OR.B REGY,REGST
- OR.B REGA,REGST
- OR.B DBUS,REGST /* that gets BDIXNZVC !!! */
- MOVEM.L (SP)+,DBUS/REGA/REGX/REGY/REGEA
- JMP (REGEMUL)
-
- op29: AND.B (REGMPC)+,REGA /* AND # */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op2A: /* ROL A */
- MOVE.B REGST,CCR /* prepare X bit */
- ROXL.B #1,REGA
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS /* update flags N Z C */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op2B: JMP (REGEMUL)
-
- op2C: /* BIT abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- MOVE.B 0(REGSTAT,REGEA.W),IR
- BPL BITread
- SETREAD
- BSR emul_serv
- BITread:
- MOVE.L REGEA,REGMEA
- TST.B (REGMEA) /* BUG!! BUG!!! V bit not set!!!! */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op2D: /* AND abs */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADDQ.W #2,REGMPC
- BRA doAND
-
- op2E: /* ROL abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doROL
-
- op2F: JMP (REGEMUL)
-
- op30: BTST #3,REGST /* BMI */
- BEQ nobmi /* BITN = 0x08 = bit #3 */
- MOVE.B (REGMPC)+,DBUS
- EXT.W DBUS
- ADDA.W DBUS,REGMPC
- JMP (REGEMUL)
- nobmi:
- ADDQ.L #1,REGMPC
- JMP (REGEMUL)
-
- op31: CLR.W REGEA /* AND (zp),Y */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- ADD.W REGY,REGEA
- BRA doAND
-
- op32: JMP (REGEMUL)
-
- op33: JMP (REGEMUL)
-
- op34: JMP (REGEMUL)
-
- op35: CLR.W REGEA /* AND zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA ANDread
-
- op36: CLR.W REGEA /* ROL zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA doROL
-
- op37: JMP (REGEMUL)
-
- op38: ORI.B #BITX,REGST /* SEC */
- JMP (REGEMUL)
-
- op39: /* AND abs,Y */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGY,REGEA
- ADDQ.W #2,REGMPC
- BRA doAND
-
- op3A: JMP (REGEMUL)
-
- op3B: JMP (REGEMUL)
-
- op3C: JMP (REGEMUL)
-
- op3D: /* AND abs,X */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doAND
-
- op3E: /* ROL abs,X */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doROL
-
- op3F: JMP (REGEMUL)
-
- op40: /* RTI */
- MOVE.W REGSP,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),REGPC /* pull PClo */
- MOVE.B 2(REGMEA),-(SP) /* pull PChi */
- MOVE.W (SP)+,REGPC
- MOVE.B 3(REGMEA),REGST /* pull processor */
- ADDQ.B #3,REGSP
- ADDQ.W #1,REGPC
- MOVE.L REGPC,REGMPC
- JMP (REGEMUL)
-
- op41: CLR.W REGEA /* EOR (zp,X) */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- BRA doEOR
-
- op42: JMP (REGEMUL)
-
- op43: JMP (REGEMUL)
-
- op44: JMP (REGEMUL)
-
- op45: CLR.W REGEA /* EOR zp */
- MOVE.B (REGMPC)+,REGEA
- BRA EORread
-
- op46: CLR.W REGEA /* LSR zp */
- MOVE.B (REGMPC)+,REGEA
- BRA doLSR
-
- op47: JMP (REGEMUL)
-
- op48: /* PHA */
- MOVE.W REGSP,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B REGA,(REGMEA) /* push acc */
- SUBQ.B #1,REGSP
- JMP (REGEMUL)
-
- op49: MOVE.B (REGMPC)+,DBUS /* EOR # */
- EOR.B DBUS,REGA
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op4A: /* LSR A */
- LSR.B #1,REGA /* shift it */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS /* update flags N Z C */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op4B: JMP (REGEMUL)
-
- op4C: /* JMP abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGPC
- MOVE.B (REGMPC),REGPC
- MOVE.L REGPC,REGMPC
- JMP (REGEMUL)
-
- op4D: /* EOR abs */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADDQ.W #2,REGMPC
- BRA doEOR
-
- op4E: /* LSR abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doLSR
-
- op4F: JMP (REGEMUL)
-
- op50: BTST #1,REGST /* BVC */
- BNE nobvc /* BITV = 0x02 = bit #1 */
- MOVE.B (REGMPC)+,DBUS
- EXT.W DBUS
- ADDA.W DBUS,REGMPC
- JMP (REGEMUL)
- nobvc:
- ADDQ.L #1,REGMPC
- JMP (REGEMUL)
-
- op51: CLR.W REGEA /* EOR (zp),Y */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMEA),REGEA /* get lo byte */
- ADD.W REGY,REGEA
- BRA doEOR
-
- op52: JMP (REGEMUL)
-
- op53: JMP (REGEMUL)
-
- op54: JMP (REGEMUL)
-
- op55: CLR.W REGEA /* EOR zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA EORread
-
- op56: CLR.W REGEA /* LSR zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA doLSR
-
- op57: JMP (REGEMUL)
-
- op58: ANDI.B #~BITI,REGST /* CLI */
- JMP (REGEMUL)
-
- op59: /* EOR abs,Y */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGY,REGEA
- ADDQ.W #2,REGMPC
- BRA doEOR
-
- op5A: JMP (REGEMUL)
-
- op5B: JMP (REGEMUL)
-
- op5C: JMP (REGEMUL)
-
- op5D: /* EOR abs,X */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doEOR
-
- op5E: /* LSR abs,X */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doLSR
-
- op5F: JMP (REGEMUL)
-
- op60: /* RTS */
- MOVE.W REGSP,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 2(REGMEA),-(SP) /* pull PChi */
- MOVE.W (SP)+,REGPC
- MOVE.B 1(REGMEA),REGPC /* pull PClo */
- ADDQ.B #2,REGSP
- ADDQ.W #1,REGPC
- MOVE.L REGPC,REGMPC
- JMP (REGEMUL)
-
- op61: CLR.W REGEA /* ADC (zp,X) */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- BRA doADC
-
- op62: JMP (REGEMUL)
-
- op63: JMP (REGEMUL)
-
- op64: JMP (REGEMUL)
-
- op65: CLR.W REGEA /* ADC zp */
- MOVE.B (REGMPC)+,REGEA
- BRA doADC
-
- op66: CLR.W REGEA /* ROR zp */
- MOVE.B (REGMPC)+,REGEA
- BRA doROR
-
- op67: JMP (REGEMUL)
-
- op68: /* PLA */
- ADDQ.B #1,REGSP
- MOVE.W REGSP,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),REGA
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op69: MOVE.B (REGMPC)+,DBUS /* ADC # */
- ORI.B #BITZ,REGST /* SUBX doesn't set Z flag */
- MOVE.B REGST,CCR
- ADDX.B DBUS,REGA
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX|BITV),DBUS
- AND.B #~(BITN|BITZ|BITX|BITV),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op6A: /* ROR A */
- MOVE.B REGST,CCR /* prepare carry bit */
- ROXR.B #1,REGA
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS /* update flags N Z C */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op6B: JMP (REGEMUL)
-
- op6C: /* JMP (abs) */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGPC
- MOVE.B (REGMPC),REGPC
- MOVE.W REGPC,REGEA /* get vector */
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGPC
- MOVE.B (REGMEA),REGPC
- MOVE.L REGPC,REGMPC
- JMP (REGEMUL)
-
- op6D: /* ADC abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doADC
-
- op6E: /* ROR abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doROR
-
- op6F: JMP (REGEMUL)
-
- op70: BTST #1,REGST /* BVS */
- BEQ nobvs /* BITV = 0x02 = bit #1 */
- MOVE.B (REGMPC)+,DBUS
- EXT.W DBUS
- ADDA.W DBUS,REGMPC
- JMP (REGEMUL)
- nobvs:
- ADDQ.L #1,REGMPC
- JMP (REGEMUL)
-
- op71: CLR.W REGEA /* ADC (zp),Y */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- ADD.W REGY,REGEA
- BRA doADC
-
- op72: JMP (REGEMUL)
-
- op73: JMP (REGEMUL)
-
- op74: JMP (REGEMUL)
-
- op75: CLR.W REGEA /* ADC zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA doADC
-
- op76: CLR.W REGEA /* ROR zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA doROR
-
- op77: JMP (REGEMUL)
-
- op78: ORI.B #BITX,REGST /* SEC */
- JMP (REGEMUL)
-
- op79: /* ADC abs,Y */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGY,REGEA
- ADDQ.W #2,REGMPC
- BRA doADC
-
- op7A: JMP (REGEMUL)
-
- op7B: JMP (REGEMUL)
-
- op7C: JMP (REGEMUL)
-
- op7D: /* ADC abs,X */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doADC
-
- op7E: /* ROR abs,X */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doROR
-
- op7F: JMP (REGEMUL)
-
- op80: JMP (REGEMUL)
-
- op81: CLR.W REGEA /* STA (zp,X) */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- BRA doSTA
-
- op82: JMP (REGEMUL)
-
- op83: JMP (REGEMUL)
-
- op84: CLR.W REGEA /* STY zp */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B REGY,(REGMEA)
- JMP (REGEMUL)
-
- op85: CLR.W REGEA /* STA zp */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B REGA,(REGMEA)
- JMP (REGEMUL)
-
- op86: CLR.W REGEA /* STX zp */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B REGX,(REGMEA)
- JMP (REGEMUL)
-
- op87: JMP (REGEMUL)
-
- op88: SUBQ.B #1,REGY /* DEY */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op89: JMP (REGEMUL)
-
- op8A: MOVE.B REGX,REGA /* TXA */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op8B: JMP (REGEMUL)
-
- op8C: /* STY abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doSTY
-
- op8D: /* STA abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doSTA
-
- op8E: /* STX abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doSTX
-
- op8F: JMP (REGEMUL)
-
- op90: BTST #4,REGST /* BCC */
- BNE nobcc /* BITX = 0x10 = bit #4 */
- MOVE.B (REGMPC)+,DBUS
- EXT.W DBUS
- ADDA.W DBUS,REGMPC
- JMP (REGEMUL)
- nobcc:
- ADDQ.L #1,REGMPC
- JMP (REGEMUL)
-
- op91: CLR.W REGEA /* STA (zp),Y */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- ADD.W REGY,REGEA
- BRA doSTA
-
- op92: JMP (REGEMUL)
-
- op93: JMP (REGEMUL)
-
- op94: CLR.W REGEA /* STY zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B REGY,(REGMEA)
- JMP (REGEMUL)
-
- op95: CLR.W REGEA /* STA zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B REGA,(REGMEA)
- JMP (REGEMUL)
-
- op96: CLR.W REGEA /* STX zp,Y */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGY,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B REGX,(REGMEA)
- JMP (REGEMUL)
-
- op97: JMP (REGEMUL)
-
- op98: MOVE.B REGY,REGA /* TYA */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- op99: /* STA abs,Y */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGY,REGEA
- ADDQ.W #2,REGMPC
- BRA doSTA
-
- op9A: MOVE.B REGX,REGSP /* TXS */
- JMP (REGEMUL)
-
- op9B: JMP (REGEMUL)
-
- op9C: JMP (REGEMUL)
-
- op9D: /* STA abs,X */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doSTA
-
- op9E: JMP (REGEMUL)
-
- op9F: JMP (REGEMUL)
-
- opA0: MOVE.B (REGMPC)+,REGY /* LDY # */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opA1: CLR.W REGEA /* LDA (zp,X) */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- BRA doLDA
-
- opA2: MOVE.B (REGMPC)+,REGX /* LDX # */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opA3: JMP (REGEMUL)
-
- opA4: CLR.W REGEA /* LDY zp */
- MOVE.B (REGMPC)+,REGEA
- BRA LDYread
-
- opA5: CLR.W REGEA /* LDA zp */
- MOVE.B (REGMPC)+,REGEA
- BRA LDAread
-
- opA6: CLR.W REGEA /* LDX zp */
- MOVE.B (REGMPC)+,REGEA
- BRA LDXread
-
- opA7: JMP (REGEMUL)
-
- opA8: MOVE.B REGA,REGY /* TAY */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opA9: MOVE.B (REGMPC)+,REGA /* LDA # */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opAA: MOVE.B REGA,REGX /* TAX */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opAB: JMP (REGEMUL)
-
- opAC: /* LDY abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doLDY
-
- opAD: /* LDA abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doLDA
-
- opAE: /* LDX abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doLDX
-
- opAF: JMP (REGEMUL)
-
- opB0: BTST #4,REGST /* BCS */
- BEQ nobcs /* BITX= 0x10 = bit #4 */
- MOVE.B (REGMPC)+,DBUS
- EXT.W DBUS
- ADDA.W DBUS,REGMPC
- JMP (REGEMUL)
- nobcs:
- ADDQ.L #1,REGMPC
- JMP (REGEMUL)
-
- opB1: CLR.W REGEA /* LDA (zp),Y */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- ADD.W REGY,REGEA
- BRA doLDA
-
- opB2: JMP (REGEMUL)
-
- opB3: JMP (REGEMUL)
-
- opB4: CLR.W REGEA /* LDY zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA LDYread
-
- opB5: CLR.W REGEA /* LDA zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA LDAread
-
- opB6: CLR.W REGEA /* LDX zp,Y */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGY,REGEA
- BRA LDXread
-
- opB7: JMP (REGEMUL)
-
- opB8: ANDI.B #~BITV,REGST /* CLV */
- JMP (REGEMUL)
-
- opB9: /* LDA abs,Y */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGY,REGEA
- ADDQ.W #2,REGMPC
- BRA doLDA
-
- opBA: MOVE.B REGSP,REGX /* TAX */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opBB: JMP (REGEMUL)
-
- opBC: /* LDY abs,X */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doLDY
-
- opBD: /* LDA abs,X */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doLDA
-
- opBE: /* LDX abs,Y */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGY,REGEA
- ADDQ.W #2,REGMPC
- BRA doLDX
-
- opBF: JMP (REGEMUL)
-
- opC0: /* CPY # */
- MOVE.B (REGMPC)+,DBUS
- SUB.B REGY,DBUS
- BEQ opC02
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opC02:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opC1: CLR.W REGEA /* CMP (zp,X) */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMEA),REGEA /* get lo byte */
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGA,DBUS
- BEQ opC12
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opC12:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opC2: JMP (REGEMUL)
-
- opC3: JMP (REGEMUL)
-
- opC4: CLR.W REGEA /* CPY zp */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGY,DBUS
- BEQ opC42
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opC42:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opC5: CLR.W REGEA /* CMP zp */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGA,DBUS
- BEQ opC52
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opC52:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opC6: CLR.W REGEA /* DEC zp */
- MOVE.B (REGMPC)+,REGEA
- BRA doDEC
-
- opC7: JMP (REGEMUL)
-
- opC8: ADDQ.B #1,REGY /* INY */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opC9: /* CMP # */
- MOVE.B (REGMPC)+,DBUS
- SUB.B REGA,DBUS
- BEQ opC92
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opC92:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opCA: SUBQ.B #1,REGX /* DEX */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opCB: JMP (REGEMUL)
-
- opCC: /* CPY abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGY,DBUS
- BEQ opCC2
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opCC2:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opCD: /* CMP abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGA,DBUS
- BEQ opCD2
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
- opCD2:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opCE: /* DEC abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doDEC
-
- opCF: JMP (REGEMUL)
-
- opD0: BTST #2,REGST /* BNE */
- BNE nobne /* BITZ = 0x04 = bit #2 */
- MOVE.B (REGMPC)+,DBUS
- EXT.W DBUS
- ADDA.W DBUS,REGMPC
- JMP (REGEMUL)
- nobne:
- ADDQ.L #1,REGMPC
- JMP (REGEMUL)
-
- opD1: CLR.W REGEA /* CMP (zp),Y */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- ADD.W REGY,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGA,DBUS
- BEQ opD12
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
- opD12:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opD2: JMP (REGEMUL)
-
- opD3: JMP (REGEMUL)
-
- opD4: JMP (REGEMUL)
-
- opD5: CLR.W REGEA /* CMP zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGA,DBUS
- BEQ opD52
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opD52:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opD6: CLR.W REGEA /* DEC zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA doDEC
-
- opD7: JMP (REGEMUL)
-
- opD8: ANDI.B #~BITD,REGST /* CLD */
- JMP (REGEMUL)
-
- opD9: /* CMP abs,Y */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGY,REGEA
- ADDQ.W #2,REGMPC
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGA,DBUS
- BEQ opD92
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opD92:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opDA: JMP (REGEMUL)
-
- opDB: JMP (REGEMUL)
-
- opDC: JMP (REGEMUL)
-
- opDD: /* CMP abs,X */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGA,DBUS
- BEQ opDD2
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
- opDD2:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opDE: /* DEC abs,X */
- MOVE.B 1(REGMPC),-(SP) /* get hi byte */
- MOVE.W (SP)+,REGEA /* and shift by 8 */
- MOVE.B (REGMPC),REGEA /* get lo byte */
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doDEC
-
- opDF: JMP (REGEMUL)
-
- opE0: /* CPX # */
- MOVE.B (REGMPC)+,DBUS
- SUB.B REGX,DBUS
- BEQ opE02
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opE02:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opE1: CLR.W REGEA /* SBC (zp,X) */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- BRA doSBC
-
- opE2: JMP (REGEMUL)
-
- opE3: JMP (REGEMUL)
-
- opE4: CLR.W REGEA /* CPX zp */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGX,DBUS
- BEQ opE42
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opE42:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opE5: CLR.W REGEA /* SBC zp */
- MOVE.B (REGMPC)+,REGEA
- BRA doSBC
-
- opE6: CLR.W REGEA /* INC zp */
- MOVE.B (REGMPC)+,REGEA
- BRA doINC
-
- opE7: JMP (REGEMUL)
-
- opE8: ADDQ.B #1,REGX /* INX */
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ),DBUS
- AND.B #~(BITN|BITZ),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opE9: /* SBC # */
- MOVE.B (REGMPC)+,DBUS
- EORI.B #BITX,REGST
- ORI.B #BITZ,REGST /* SUBX doesn't set Z flag */
- MOVE.B REGST,CCR
- SUBX.B DBUS,REGA
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX|BITV),DBUS
- EORI.B #BITX,DBUS
- AND.B #~(BITN|BITZ|BITX|BITV),REGST
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opEA: JMP (REGEMUL)
-
- opEB: JMP (REGEMUL)
-
- opEC: /* CPX abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- MOVE.L REGEA,REGMEA
- MOVE.B (REGMEA),DBUS
- SUB.B REGX,DBUS
- BEQ opEC2
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- EORI.B #BITN,DBUS /* why?? why?? */
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- ADD.B DBUS,DBUS /* Shift BITZ into BITX */
- AND.B #(BITX),DBUS /* if result of compare was zero */
- OR.B DBUS,REGST /* carry flag must be set */
- JMP (REGEMUL)
- opEC2:
- MOVE.W SR,DBUS
- AND.B #(BITN|BITZ|BITX),DBUS
- AND.B #~(BITN|BITZ|BITX),REGST
- OR.B DBUS,REGST
- ADD.B DBUS,DBUS
- ADD.B DBUS,DBUS
- AND.B #(BITX),DBUS
- OR.B DBUS,REGST
- JMP (REGEMUL)
-
- opED: /* SBC abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doSBC
-
- opEE: /* INC abs */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADDQ.W #2,REGMPC
- BRA doINC
-
- opEF: JMP (REGEMUL)
-
- opF0: BTST #2,REGST /* BEQ */
- BEQ nobeq /* BITZ = 0x04 = bit #2 */
- MOVE.B (REGMPC)+,DBUS
- EXT.W DBUS
- ADDA.W DBUS,REGMPC
- JMP (REGEMUL)
- nobeq:
- ADDQ.L #1,REGMPC
- JMP (REGEMUL)
-
- opF1: CLR.W REGEA /* SBC (zp),Y */
- MOVE.B (REGMPC)+,REGEA
- MOVE.L REGEA,REGMEA
- MOVE.B 1(REGMEA),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMEA),REGEA
- ADD.W REGY,REGEA
- BRA doSBC
-
- opF2: JMP (REGEMUL)
-
- opF3: JMP (REGEMUL)
-
- opF4: JMP (REGEMUL)
-
- opF5: CLR.W REGEA /* SBC zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA doSBC
-
- opF6: CLR.W REGEA /* INC zp,X */
- MOVE.B (REGMPC)+,REGEA
- ADD.B REGX,REGEA
- BRA doINC
-
- opF7: JMP (REGEMUL)
-
- opF8: ORI.B #BITD,REGST /* SED */
- JMP (REGEMUL)
-
- opF9: /* SBC abs,Y */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGY,REGEA
- ADDQ.W #2,REGMPC
- BRA doSBC
-
- opFA: JMP (REGEMUL)
-
- opFB: JMP (REGEMUL)
-
- opFC: JMP (REGEMUL)
-
- opFD: /* SBC abs,X */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doSBC
-
- opFE: /* INC abs,X */
- MOVE.B 1(REGMPC),-(SP)
- MOVE.W (SP)+,REGEA
- MOVE.B (REGMPC),REGEA
- ADD.W REGX,REGEA
- ADDQ.W #2,REGMPC
- BRA doINC
-
- opFF: JMP (REGEMUL)
-
- }
-
- }
-
-