📄 sa1ops.s
字号:
mov #~IRQ,r2 mov.b SA1IRQActive,r0 tst r0,r0 bt .CLI_EXIT /* XXX: test for Settings.DisableIRQ */ mov.l S9xSA1Opcode_IRQ,r3 and r2,FLAGS Xlink.CLI_EXIT: jmp @r13 and r2,FLAGS/* CLV */OpB8: mov #~Overflow,r0 jmp @r13 and r0,FLAGS/* DEX */OpCAX1: mov.b XL,r0 add #-1,r0 mov.b r0,XL SetZNjmp r0OpCAX0: mov.w XX,r0 add #-1,r0 mov.w r0,XX Set16ZNjmp r0/* DEY */Op88X1: mov.b YL,r0 add #-1,r0 mov.b r0,YL SetZNjmp r0Op88X0: mov.w YY,r0 add #-1,r0 mov.w r0,YY Set16ZNjmp r0/* INX */OpE8X1: mov.b XL,r0 add #1,r0 mov.b r0, XL SetZNjmp r0OpE8X0: mov.w XX,r0 add #1,r0 mov.w r0, XX Set16ZNjmp r0/* INY */OpC8X1: mov.b YL,r0 add #1,r0 mov.b r0, YL SetZNjmp r0OpC8X0: mov.w YY,r0 add #1,r0 mov.w r0,YY Set16ZNjmp r0/* NOP */OpEA: jmp @r13 nop/* PEA */OpF4: Immediate16 PEA PushWordjmp PEA/* PEI */OpD4: DirectIndirect8 PEI extu.w r4,r0 PushWordjmp PEI/* PER */Op62: RelativeLong PER extu.w r4,r0 PushWordjmp PER/* PHA */Op48M1: extu.b A,r0 PushBytejmp PHAOp48M0: extu.w A,r0 PushWordjmp PHA/* PHB */Op8B: mov.b DB, r0 PushBytejmp PHB/* PHD */Op0B: mov.w DD, r0 PushWordjmp PHD/* PHK */Op4B: mov.b PB, r0 PushBytejmp PHK/* PHP */Op08: S9xSA1PackStatus PHP extu.b FLAGS, r0 PushBytejmp PHP/* PHX */OpDAX1: mov.b XL, r0 PushBytejmp PHXOpDAX0: mov.w XX, r0 PushWordjmp PHX/* PHY */Op5AX1: mov.b YL, r0 PushBytejmp PHYOp5AX0: mov.w YY, r0 PushWordjmp PHY/* PLA */Op68M1: PullByte PLA extu.b A,r1 add r0,A sub r1,A SetZNjmp AOp68M0: PullWord PLA extu.w r0,A Set16ZNjmp A/* PLB */OpAB: PullByte PLB mov.b r0, DB extu.b r0,r1 shll16 r1 mov.l r1,SA1ShiftedDB SetZNjmp r0/* PLD */Op2B: PullWord PLD mov.w r0 DD Set16ZNjmp r0 /* PLP */Op28: PullByte PLP extu.b FLAGS,r1 add r0,FLAGS mov #IndexFlag,r2 sub r1,FLAGS tst r2,r0 bt .PLP16 mov #0,r0 mov.b r0,XH mov.b r0,YH.PLP16: S9xSA1UnpackStatus PLP S9xSA1FixCycles PLP CheckForIrqjmp PLP/* PLX */OpFAX1: PullByte PLX mov.b r0, XL SetZNjmp r0OpFAX0: PullWord PLX mov.w r0, XX Set16ZNjmp r0/* PLY */Op7AX1: PullByte PLY mov.b r0, YL SetZNjmp r0Op7AX0: PullWord PLY mov.w r0, YY Set16ZNjmp r0/* SEC */Op38: mov #Carry,r0 jmp @r13 or r0,FLAGS/* SED */OpF8: mov #Decimal,r0 jmp @r13 or r0,FLAGS/* SEI */Op78: mov #IRQ,r0 jmp @r13 or r0,FLAGS/* TAX */OpAAX1: extu.b A,r0 mov.b r0, XL SetZNjmp r0OpAAX0: extu.w A,r0 mov.w r0, XX Set16ZNjmp r0/* TAY */OpA8X1: extu.b A,r0 mov.b r0, YL SetZNjmp r0OpA8X0: extu.w A,r0 mov.w r0, YY Set16ZNjmp r0/* TCD */Op5B: extu.w A,r0 mov.w r0, DD Set16ZNjmp r0/* TCS */Op1B: extu.w A,r0 mov #Emulation/4,r1 mov.w r0, SS shll2 r1 tst r1,FLAGS16 bt .TCS_EXIT mov #1,r0 mov.b r0,SH.TCS_EXIT: jmp @r13 nop/* TDC */Op7B: mov.w DD, r0 extu.w r0,A Set16ZNjmp A/* TSC */Op3B: mov.w SS, r0 extu.w r0,A Set16ZNjmp A/* TSX */OpBAX1: mov.b SL, r0 mov.b r0, XL SetZNjmp r0OpBAX0: mov.w SS, r0 mov.w r0, XX Set16ZNjmp r0/* TXA */Op8AM1: mov.b XL, r0 extu.b A,r1 extu.b r0,r0 sub r1,A add r0,A SetZNjmp AOp8AM0: mov.w XX, r0 extu.w r0,A Set16ZNjmp A/* TXS */Op9A: mov.w XX, r0 mov #Emulation/4,r1 mov.w r0, SS shll2 r1 tst r1,FLAGS16 bt .TXS_EXIT mov #1,r0 mov.b r0,SH.TXS_EXIT: jmp @r13 nop/* TXY */Op9BX1: mov.b XL, r0 mov.b r0, YL SetZNjmp r0Op9BX0: mov.w XX, r0 mov.w r0, YY Set16ZNjmp r0/* TYA */Op98M1: mov.b YL, r0 extu.b A,r1 extu.b r0,r0 sub r1,A add r0,A SetZNjmp AOp98M0: mov.w YY, r0 extu.w r0,A Set16ZNjmp A/* TYX */OpBBX1: mov.b YL, r0 mov.b r0, XL SetZNjmp r0OpBBX0: mov.w YY, r0 mov.w r0, XX Set16ZNjmp r0/* XCE */OpFB: mov FLAGS16, r0 mov.w .notemcymask,r1 and r1,FLAGS16 tst #Carry,r0 mov.w .emflag0,r1 bt .XCE_NO_CARRY or r1,FLAGS16.XCE_NO_CARRY: tst r1,r0 bt/s .XCE_NO_EMU tst r1,FLAGS add #Carry,FLAGS.XCE_NO_EMU: bt/s .XCE_NO_EMULATION2 mov #IndexFlag,r1 mov #MemoryFlag|IndexFlag,r0 or r0,FLAGS mov #1,r0 mov.b r0,SH.XCE_NO_EMULATION2: tst r1,FLAGS bt .XCE_NO_INDEX mov #0,r0 mov.b r0, XH mov.b r0, YH.XCE_NO_INDEX: S9xSA1FixCycles XCE jmp @r13 nop.emflag0: .word EmulationOp00:#ifdef DEBUGGER testb $TRACE_FLAG, Flags je .BRK_NO_TRACE pushl $.LC0 ccall S9xTraceMessage addl $4,%esp.BRK_NO_TRACE:#endif mov.w .emflag,r0 tst r0,FLAGS16 bf .BRK_EMULATION mov.b PB, r0 PushByte BRK1 mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 add #1,r0 PushWord BRK2 S9xSA1PackStatus BRK extu.b FLAGS, r0 mov #Decimal|IRQ,r1 or r1,FLAGS add #-Decimal, FLAGS PushByte BRK3 mov #0,r0 mov.l r0,SA1ShiftedPB mov.b r0,PB mov.l S9xGetWord,r3 mov #-0x1a,r4 jsr @r3 extu.w r4,r4 mov.l S9xSetPCBase,r3 extu.w r0,r4 Xlink.BRK_EMULATION: mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 add #1,r0 PushWord BRK2 S9xSA1PackStatus BRK2 extu.b FLAGS, r0 mov #Decimal|IRQ,r1 or r1,FLAGS add #-Decimal, FLAGS PushByte BRK3 mov #0,r0 mov.l r0,SA1ShiftedPB mov.b r0,PB mov.l S9xGetWord,r3 mov #-2,r4 jsr @r3 extu.w r4,r4 mov.l S9xSetPCBase,r3 extu.w r0,r4 Xlink.notemcymask: .word ~(Emulation|Carry).emflag: .word Emulation#ifdef DEBUGGER .align 4.LC0: .ascii "*** BRK" .byte 0#endif .globl S9xSA1Opcode_IRQ_rS9xSA1Opcode_IRQ_r:#ifdef DEBUGGER testb $TRACE_FLAG, Flags je .IRQ_NO_TRACE pushl $.LC1 ccall S9xTraceMessage addl $4, %esp.IRQ_NO_TRACE:#endif mov.w .emflag1,r0 sts.l pr,@-r15 tst r0,FLAGS16 bf .IRQ_EMULATION mov.b PB, r0 PushByte IRQ1 mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 PushWord IRQ2 S9xSA1PackStatus IRQ extu.b FLAGS, r0 mov #Decimal|IRQ,r1 or r1,FLAGS add #-Decimal, FLAGS PushByte IRQ3 mov #0,r0 mov.l r0,SA1ShiftedPB mov.b r0,PB// XXX: FIXME: wrong vector mov.l .FillRAM2,r3 mov.w .n2207,r0 mov.l @r3,r3 mov.b @(r0,r3),r1 add #1,r0 extu.b r1,r1 mov.b @(r0,r3),r4 shll8 r4 mov.l S9xSetPCBase,r3 or r1,r4 jmp @r3 extu.w r4,r4.IRQ_EMULATION: mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 PushWord IRQ4 S9xSA1PackStatus IRQ2 extu.b FLAGS, r0 mov #Decimal|IRQ,r1 or r1,FLAGS add #-Decimal, FLAGS PushByte IRQ5 mov #0,r0 mov.l r0,SA1ShiftedPB mov.b r0,PB// XXX: FIXME: wrong vector mov.l .FillRAM2,r3 mov.w .n2207,r0 mov.l @r3,r3 mov.b @(r0,r3),r1 add #1,r0 extu.b r1,r1 mov.b @(r0,r3),r4 shll8 r4 mov.l S9xSetPCBase,r3 or r1,r4 jmp @r3 extu.w r4,r4.emflag1: .word Emulation#ifdef DEBUGGER .align 4.LC1: .ascii "*** IRQ" .byte 0#endif .align 2.FillRAM2: .long FillRAM.n2207: .word 0x2207.globl S9xSA1Opcode_NMI_rS9xSA1Opcode_NMI_r:#ifdef DEBUGGER testb $TRACE_FLAG, SA1Flags je .NMI_NO_TRACE pushl $.LC2 ccall S9xTraceMessage addl $4, %esp.NMI_NO_TRACE:#endif mov.w .emflag2,r0 sts.l pr,@-r15 tst r0,FLAGS16 bf .NMI_EMULATION mov.b PB, r0 PushByte NMI1 mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 PushWord NMI2 S9xSA1PackStatus NMI extu.b FLAGS, r0 mov #Decimal|IRQ,r1 or r1,FLAGS add #-Decimal, FLAGS PushByte NMI3 mov #0,r0 mov.l r0,SA1ShiftedPB mov.b r0,PB// XXX: FIXME: wrong vector mov.l .FillRAM3,r3 mov.w .n2205,r0 mov.l @r3,r3 mov.b @(r0,r3),r1 add #1,r0 extu.b r1,r1 mov.b @(r0,r3),r4 shll8 r4 mov.l S9xSetPCBase,r3 or r1,r4 jmp @r3 extu.w r4,r4.NMI_EMULATION: mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 PushWord NMI4 S9xSA1PackStatus NMI2 extu.b FLAGS, r0 mov #Decimal|IRQ,r1 or r1,FLAGS add #-Decimal, FLAGS PushByte NMI5 mov #0,r0 mov.l r0,SA1ShiftedPB mov.b r0,PB// XXX: FIXME: wrong vector mov.l .FillRAM3,r3 mov.w .n2205,r0 mov.l @r3,r3 mov.b @(r0,r3),r1 add #1,r0 extu.b r1,r1 mov.b @(r0,r3),r4 shll8 r4 mov.l S9xSetPCBase,r3 or r1,r4 jmp @r3 extu.w r4,r4 .align 2.FillRAM3: .long FillRAM.emflag2: .word Emulation.n2205: .word 0x2205#ifdef DEBUGGER .align 4.LC2: .ascii "*** NMI" .byte 0#endifOp02:#ifdef DEBUGGER testb $TRACE_FLAG, SA1Flags je .COP_NO_TRACE pushl $.LC3 ccall S9xTraceMessage addl $4,%esp.COP_NO_TRACE:#endif mov.w .emflag25,r0 tst r0,FLAGS16 bf .COP_EMULATION mov.b PB, r0 PushByte COP1 mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 add #1,r0 PushWord COP2 S9xSA1PackStatus COP extu.b FLAGS, r0 mov #Decimal|IRQ,r1 or r1,FLAGS add #-Decimal, FLAGS PushByte COP3 mov #0,r0 mov.l r0,SA1ShiftedPB mov.b r0,PB mov.l S9xGetWord,r3 mov #-0x1c,r4 jsr @r3 extu.w r4,r4 mov.l S9xSetPCBase,r3 extu.w r0,r4 Xlink.COP_EMULATION: mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 add #1,r0 PushWord COP4 S9xSA1PackStatus COP2 extu.b FLAGS, r0 mov #Decimal|IRQ,r1 or r1,FLAGS add #-Decimal, FLAGS PushByte COP5 mov #0,r0 mov.l r0,SA1ShiftedPB mov.b r0,PB mov.l S9xGetWord,r3 mov #-0xc,r4 jsr @r3 extu.w r4,r4 mov.l S9xSetPCBase,r3 extu.w r0,r4 Xlink.emflag25: .word Emulation #ifdef DEBUGGER .align 4.LC3: .ascii "*** COP" .byte 0#endif/* JML */OpDC: AbsoluteIndirectLong8 JML mov.l r0,SA1ShiftedPB shlr16 r0 mov.l S9xSetPCBase,r3 mov.b r0,PB XlinkOp5C: AbsoluteLong8 JML mov.l r0,SA1ShiftedPB shlr16 r0 mov.l S9xSetPCBase,r3 mov.b r0,PB Xlink/* JMP */Op4C: Absolute8 JMP extu.w r4,r4 mov.l SA1ShiftedPB,r0 mov.l S9xSetPCBase,r3 or r0,r4 XlinkOp6C: AbsoluteIndirect8 JMP extu.w r4,r4 mov.l SA1ShiftedPB,r0 mov.l S9xSetPCBase,r3 or r0,r4 XlinkOp7C: AbsoluteIndexedIndirect8 JMP extu.w r4,r4 mov.l SA1ShiftedPB,r0 mov.l S9xSetPCBase,r3 or r0,r4 Xlink/* JSL */Op22: mov.b PB, r0 PushByte JSL_ABSL mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 add #2,r0 PushWord JSL_ABSL AbsoluteLong8 JSL mov.l r0,SA1ShiftedPB shlr16 r0 mov.l S9xSetPCBase,r3 mov.b r0,PB Xlink/* RTL */Op6B: PullWord RTL mov.l r0,@-r15 PullByte RTL mov.l @r15+,r4 mov.b r0, PB add #1,r4 shll16 r0 extu.w r4,r4 mov.l r0,SA1ShiftedPB mov.l S9xSetPCBase,r3 or r0,r4 Xlink/* JSR ABS */Op20: mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 add #1,r0 PushWord JSR_ABS Absolute8 JSR_ABS extu.w r4,r4 mov.l SA1ShiftedPB,r0 mov.l S9xSetPCBase,r3 or r0,r4 Xlink/* JSR ABS INDEXED INDIRECT */OpFC: mov.l SA1PCBase,r0 neg r0,r0 add PC, r0 add #1,r0 PushWord JSR_AII AbsoluteIndexedIndirect8 JSR extu.w r4,r4 mov.l SA1ShiftedPB,r0 mov.l S9xSetPCBase,r3 or r0,r4 Xlink/* RTS */Op60: PullWord RTS add #1,r0 extu.w r0,r4 mov.l SA1ShiftedPB,r0 mov.l S9xSetPCBase,r3 or r0,r4 Xlink/* MVN */Op54X1: mov.b @PC+,r0 mov.b r0,DB extu.b r0,r0 shll16 r0 mov.l r0,SA1ShiftedDB mov.l r0,@-r15 mov.b @PC+,r4 mov.l S9xGetByte,r3 extu.b r4,r4 mov.w XX,r0 shll16 r4 extu.w r0,r0 jsr @r3 add r0,r4 mov r0,r5 mov.w YY,r0 mov.l S9xSetByte,r3 mov.l @r15+,r4 extu.w r0,r1 mov r5,r0 jsr @r3 add r1,r4 mov.b XL,r0 add #1,r0 mov.b r0,XL mov.b YL,r0 add #1,r0 mov.b r0,YL add #-1,A cmp/pz A bf/s .MVN_EXIT8 extu.w A,A jmp @r13 add #-3,PC.MVN_EXIT8: jmp @r13 nopOp54X0: mov.b @PC+,r0 mov.b r0,DB extu.b r0,r0 shll16 r0 mov.l r0,SA1ShiftedDB mov.l r0,@-r15 mov.b @PC+,r4 mov.l S9xGetByte,r3 extu.b r4,r4 mov.w XX,r0 shll16 r4 extu.w r0,r1 add #1,r0 add r1,r4 jsr @r3 mov.w r0,XX mov r0,r5 mov.w YY,r0 mov.l S9xSetByte,r3 mov.l @r15+,r4 extu.w r0,r1 add #1,r0 add r1,r4 mov.w r0,YY jsr @r3 mov r5,r0 add #-1,A cmp/pz A bf/s .MVN_EXIT16 extu.w A,A jmp @r13 add #-3,PC.MVN_EXIT16: jmp @r13 nop/* MVP */Op44X1: mov.b @PC+,r0 mov.b r0,DB extu.b r0,r0 shll16 r0 mov.l r0,SA1ShiftedDB mov.l r0,@-r15 mov.b @PC+,r4 mov.l S9xGetByte,r3 extu.b r4,r4 mov.w XX,r0 shll16 r4 extu.w r0,r0 jsr @r3 add r0,r4 mov r0,r5 mov.w YY,r0 mov.l S9xSetByte,r3 mov.l @r15+,r4 extu.w r0,r1 mov r5,r0 jsr @r3 add r1,r4 mov.b XL,r0 add #-1,r0 mov.b r0,XL mov.b YL,r0 add #-1,r0 mov.b r0,YL add #-1,A cmp/pz A bf/s .MVP_EXIT8 extu.w A,A jmp @r13 add #-3,PC.MVP_EXIT8: jmp @r13 nopOp44X0: mov.b @PC+,r0 mov.b r0,DB extu.b r0,r0 shll16 r0 mov.l r0,SA1ShiftedDB mov.l r0,@-r15 mov.b @PC+,r4 mov.l S9xGetByte,r3 extu.b r4,r4 mov.w XX,r0 shll16 r4 extu.w r0,r1 add #-1,r0 add r1,r4 jsr @r3 mov.w r0,XX mov r0,r5 mov.w YY,r0 mov.l S9xSetByte,r3 mov.l @r15+,r4 extu.w r0,r1 add #-1,r0 add r1,r4 mov.w r0,YY jsr @r3 mov r5,r0 add #-1,A cmp/pz A bf/s .MVP_EXIT16 extu.w A,A jmp @r13 add #-3,PC.MVP_EXIT16: jmp @r13 nop/* REP */OpC2: mov.b @PC+,r0 mov #Zero,r1 extu.b r0,r0 mov #-1,r2 and r0,r1 not r0,r0 or r1,r7 and r0,FLAGS extu.w r2,r2 exts.b r0,r1 mov.w .emflag3,r0 or r2,r1 tst r0,FLAGS16 bt/s .REP_NO_EMU and r1,r7 mov #(MemoryFlag | IndexFlag), r0 or r0, FLAGS .REP_NO_EMU: mov #IndexFlag,r0 tst r0,FLAGS bt .REP16 mov #0,r0 mov.b r0,XH mov.b r0,YH.REP16: S9xSA1FixCycles REP CheckForIrqjmp REP/* SEP */OpE2: mov.b @PC+,r0 mov #Zero,r1 extu.b r0,r0 and r0,r1 exts.b r0,r2 shll8 r1 or r0,FLAGS shlr2 r1 extu.w r2,r0 exts.b r1,r1 sub r0,r2 shlr16 r1 or r2,r7 mov.w .emflag3,r0 not r1,r1 tst r0,FLAGS16 bt/s .SEP_NO_EMU and r1,r7 mov #(MemoryFlag | IndexFlag), r0 or r0, FLAGS .SEP_NO_EMU: mov #IndexFlag,r0 tst r0,FLAGS bt .SEP16 mov #0,r0 mov.b r0,XH mov.b r0,YH.SEP16: S9xSA1FixCycles SEP jmp @r13 nop/* XBA */OpEB: swap.b A,A SetZNjmp A/* RTI */Op40: PullByte RTI extu.b FLAGS,r1 add r0,FLAGS sub r1,FLAGS PullWord RTI mov.w .emflag3,r1 mov.l r0,@-r15 tst r1, FLAGS16 bf .RTI_EMU PullByte RTI2 bra .RTI_SKIP_EMU extu.b r0,r0.RTI_EMU: mov #(MemoryFlag | IndexFlag), r0 or r0,FLAGS /*XXX: HERE xorl %eax, %eax*/ mov.l SA1ShiftedPB,r0 shlr16 r0.RTI_SKIP_EMU: mov.b r0,PB mov.l @r15+,r4 shll16 r0 mov.l r0,SA1ShiftedPB mov.l S9xSetPCBase,r3 jsr @r3 or r0,r4 mov #IndexFlag,r0 tst r0,FLAGS bt .RTI16 mov #0,r0 mov.b r0,XH mov.b r0,YH.RTI16: S9xSA1UnpackStatus RTI S9xSA1FixCycles RTI CheckForIrqjmp RTI.emflag3: .word Emulation
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -