📄 sa1ops.s
字号:
movb %al, XL SetZN jmp S9xSA1MainAsmLoopOpCAX0: decw XX setnz SA1_Zero movb XH, %al movb %al, SA1_Negative jmp S9xSA1MainAsmLoop/* DEY */Op88X1: movb YL, %al decb %al movb %al, YL SetZN jmp S9xSA1MainAsmLoopOp88X0: decw YY setnz SA1_Zero movb YH, %al movb %al, SA1_Negative jmp S9xSA1MainAsmLoop/* INX */OpE8X1: movb XL, %al incb %al movb %al, XL SetZN jmp S9xSA1MainAsmLoopOpE8X0: incw XX setnz SA1_Zero movb XH, %al movb %al, SA1_Negative jmp S9xSA1MainAsmLoop/* INY */OpC8X1: movb YL, %al incb %al movb %al, YL SetZN jmp S9xSA1MainAsmLoopOpC8X0: incw YY setnz SA1_Zero movb YH, %al movb %al, SA1_Negative jmp S9xSA1MainAsmLoop/* NOP */OpEA: jmp S9xSA1MainAsmLoop/* PEA */OpF4: Immediate16 PEA PushWord PEA jmp S9xSA1MainAsmLoop/* PEI */OpD4: DirectIndirect8 PEI movl %edx, %eax PushWord PEI jmp S9xSA1MainAsmLoop/* PER */Op62: RelativeLong PER movl %edx, %eax PushWord PER jmp S9xSA1MainAsmLoop /* PHA */Op48M1: movb AL, %al PushByte PHA jmp S9xSA1MainAsmLoopOp48M0: movw AA, %ax PushWord PHA jmp S9xSA1MainAsmLoop/* PHB */Op8B: movb DB, %al PushByte PHB jmp S9xSA1MainAsmLoop/* PHD */Op0B: movw DD, %ax PushWord PHD jmp S9xSA1MainAsmLoop/* PHK */Op4B: movb PB, %al PushByte PHK jmp S9xSA1MainAsmLoop/* PHP */Op08: S9xSA1PackStatus PHP movb FLAGS, %al PushByte PHP jmp S9xSA1MainAsmLoop/* PHX */OpDAX1: movb XL, %al PushByte PHX jmp S9xSA1MainAsmLoopOpDAX0: movw XX, %ax PushWord PHX jmp S9xSA1MainAsmLoop/* PHY */Op5AX1: movb YL, %al PushByte PHY jmp S9xSA1MainAsmLoopOp5AX0: movw YY, %ax PushWord PHY jmp S9xSA1MainAsmLoop/* PLA */Op68M1: PullByte PLA movb %al, AL SetZN jmp S9xSA1MainAsmLoopOp68M0: PullWord PLA movw %ax, AA testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* PLB */OpAB: PullByte PLB movb %al, DB SetZN andl $0xff, %eax sall $16, %eax movl %eax, SA1ShiftedDB jmp S9xSA1MainAsmLoop/* PLD */Op2B: PullWord PLD movw %ax, DD testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop /* PLP */Op28: PullByte PLP movb %al, FLAGS testb $IndexFlag, FLAGS jz .PLP16 xorb %al, %al movb %al, XH movb %al, YH.PLP16: S9xSA1UnpackStatus PLP S9xSA1FixCycles PLP CheckForIrq PLP jmp S9xSA1MainAsmLoop/* PLX */OpFAX1: PullByte PLX movb %al, XL SetZN jmp S9xSA1MainAsmLoopOpFAX0: PullWord PLX movw %ax, XX testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* PLY */Op7AX1: PullByte PLY movb %al, YL SetZN jmp S9xSA1MainAsmLoopOp7AX0: PullWord PLY movw %ax, YY testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* SEC */Op38: movb $1, SA1_Carry jmp S9xSA1MainAsmLoop/* SED */OpF8: orb $Decimal, FLAGS jmp S9xSA1MainAsmLoop/* SEI */Op78: orb $IRQ, FLAGS jmp S9xSA1MainAsmLoop/* TAX */OpAAX1: movb AL, %al movb %al, XL SetZN jmp S9xSA1MainAsmLoopOpAAX0: movw AA, %ax movw %ax, XX testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* TAY */OpA8X1: movb AL, %al movb %al, YL SetZN jmp S9xSA1MainAsmLoopOpA8X0: movw AA, %ax movw %ax, YY testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* TCD */Op5B: movw AA, %ax movw %ax, DD testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* TCS */Op1B: movw AA, %ax movw %ax, SS testw $Emulation, FLAGS16 jz .TCS_EXIT movb $1, SH.TCS_EXIT: jmp S9xSA1MainAsmLoop/* TDC */Op7B: movw DD, %ax movw %ax, AA testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* TSC */Op3B: movw SS, %ax movw %ax, AA testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* TSX */OpBAX1: movb SL, %al movb %al, XL SetZN jmp S9xSA1MainAsmLoopOpBAX0: movw SS, %ax movw %ax, XX testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* TXA */Op8AM1: movb XL, %al movb %al, AL SetZN jmp S9xSA1MainAsmLoopOp8AM0: movw XX, %ax movw %ax, AA testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* TXS */Op9A: movw XX, %ax movw %ax, SS testw $Emulation, FLAGS16 jz .TXS_EXIT movb $1, SH.TXS_EXIT: jmp S9xSA1MainAsmLoop/* TXY */Op9BX1: movb XL, %al movb %al, YL SetZN jmp S9xSA1MainAsmLoopOp9BX0: movw XX, %ax movw %ax, YY testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* TYA */Op98M1: movb YL, %al movb %al, AL SetZN jmp S9xSA1MainAsmLoopOp98M0: movw YY, %ax movw %ax, AA testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* TYX */OpBBX1: movb YL, %al movb %al, XL SetZN jmp S9xSA1MainAsmLoopOpBBX0: movw YY, %ax movw %ax, XX testw %ax, %ax Set16ZN jmp S9xSA1MainAsmLoop/* XCE */OpFB: movw FLAGS16, %ax andw $~(Emulation | Carry), FLAGS16 GetCarry jnc .XCE_NO_CARRY orw $Emulation, FLAGS16.XCE_NO_CARRY: testw $Emulation, %ax setnz SA1_Carry testw $Emulation, FLAGS16 jz .XCE_NO_EMULATION2 orw $(MemoryFlag | IndexFlag), FLAGS16 movb $1, SH.XCE_NO_EMULATION2: testw $IndexFlag, FLAGS16 jz .XCE_NO_INDEX xorl %eax, %eax movb %al, XH movb %al, YH.XCE_NO_INDEX: S9xSA1FixCycles XCE jmp S9xSA1MainAsmLoop .data.LC0: .string "*** BRK".textOp00:#ifdef DEBUGGER testb $TRACE_FLAG, SA1Flags je .BRK_NO_TRACE pushl $.LC0 ccall S9xTraceMessage addl $4,%esp.BRK_NO_TRACE:#endif testw $Emulation, FLAGS16 jnz .BRK_EMULATION movb PB, %al PushByte BRK1 movl PC, %eax subl SA1PCBase, %eax incl %eax PushWord BRK2 S9xSA1PackStatus BRK movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte BRK3 xorl %ecx, %ecx movl %ecx, SA1ShiftedPB movb %cl, PB movl $0xFFE6, %edx call S9xSA1GetWord movl %eax, %edx andl $0xffff, %edx call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop.BRK_EMULATION: movl PC, %eax subl SA1PCBase, %eax incl %eax PushWord BRK2 S9xSA1PackStatus BRK2 movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte BRK3 xorl %ecx, %ecx movl %ecx, SA1ShiftedPB movb %cl, PB movl $0xFFFE, %edx call S9xSA1GetWord movl %eax, %edx andl $0xffff, %edx call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop.data.LC1: .string "*** IRQ".text.globl S9xSA1Opcode_IRQS9xSA1Opcode_IRQ:#ifdef DEBUGGER testb $TRACE_FLAG, SA1Flags je .IRQ_NO_TRACE pushl $.LC1 ccall S9xTraceMessage addl $4, %esp.IRQ_NO_TRACE:#endif testw $Emulation, FLAGS16 jnz .IRQ_EMULATION movb PB, %al PushByte IRQ1 movl PC, %eax subl SA1PCBase, %eax PushWord IRQ2 S9xSA1PackStatus IRQ movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte IRQ3 xorl %ecx, %ecx movl %ecx, SA1ShiftedPB movb %cl, PB// XXX: FIXME: wrong vector xorl %edx, %edx movl FillRAM, %eax movw 0x2207(%eax), %dx jmp S9xSA1SetPCBase.IRQ_EMULATION: movl PC, %eax subl SA1PCBase, %eax PushWord IRQ4 S9xSA1PackStatus IRQ2 movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte IRQ5 xorl %ecx, %ecx movl %ecx, SA1ShiftedPB movb %cl, PB// XXX: FIXME: wrong vector xorl %edx, %edx movl FillRAM, %eax movw 0x2207(%eax), %dx jmp S9xSA1SetPCBase.data.LC2: .string "*** NMI".text.globl S9xSA1Opcode_NMIS9xSA1Opcode_NMI:#ifdef DEBUGGER testb $TRACE_FLAG, SA1Flags je .NMI_NO_TRACE pushl $.LC2 ccall S9xTraceMessage addl $4, %esp.NMI_NO_TRACE:#endif testw $Emulation, FLAGS16 jnz .NMI_EMULATION movb PB, %al PushByte NMI1 movl PC, %eax subl SA1PCBase, %eax PushWord NMI2 S9xSA1PackStatus NMI movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte NMI3 xorl %ecx, %ecx movl %ecx, SA1ShiftedPB movb %cl, PB// XXX: FIXME: wrong vector xorl %edx, %edx movl FillRAM, %eax movw 0x2205(%eax), %dx jmp S9xSA1SetPCBase.NMI_EMULATION: movl PC, %eax subl SA1PCBase, %eax PushWord NMI4 S9xSA1PackStatus NMI2 movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte NMI5 xorl %ecx, %ecx movl %ecx, SA1ShiftedPB movb %cl, PB// XXX: FIXME: wrong vector xorl %edx, %edx movl FillRAM, %eax movw 0x2205(%eax), %dx jmp S9xSA1SetPCBase.data.LC3: .string "*** COP".textOp02:#ifdef DEBUGGER testb $TRACE_FLAG, SA1Flags je .COP_NO_TRACE pushl $.LC3 ccall S9xTraceMessage addl $4,%esp.COP_NO_TRACE:#endif testw $Emulation, FLAGS16 jnz .COP_EMULATION movb PB, %al PushByte COP1 movl PC, %eax subl SA1PCBase, %eax incl %eax PushWord COP2 S9xSA1PackStatus COP movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte COP3 xorl %ecx, %ecx movl %ecx, SA1ShiftedPB movb %cl, PB movl $0xFFE4, %edx call S9xSA1GetWord movl %eax, %edx andl $0xffff, %edx call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop.COP_EMULATION: movl PC, %eax subl SA1PCBase, %eax incl %eax PushWord COP4 S9xSA1PackStatus COP2 movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte COP5 xorl %ecx, %ecx movl %ecx, SA1ShiftedPB movb %cl, PB movl $0xFFF4, %edx call S9xSA1GetWord movl %eax, %edx andl $0xffff, %edx call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop/* JML */OpDC: AbsoluteIndirectLong8 JML movl %edx, %ecx andl $0xff0000, %ecx movl %ecx, SA1ShiftedPB sarl $16, %ecx movb %cl, PB call S9xSA1SetPCBase jmp S9xSA1MainAsmLoopOp5C: AbsoluteLong8 JML movl %edx, %ecx andl $0xff0000, %ecx movl %ecx, SA1ShiftedPB sarl $16, %ecx movb %cl, PB call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop/* JMP */Op4C: Absolute8 JMP andl $0xffff, %edx orl SA1ShiftedPB, %edx call S9xSA1SetPCBase CPUShutdown JMP jmp S9xSA1MainAsmLoopOp6C: AbsoluteIndirect8 JMP andl $0xffff, %edx orl SA1ShiftedPB, %edx call S9xSA1SetPCBase jmp S9xSA1MainAsmLoopOp7C: AbsoluteIndexedIndirect8 JMP andl $0xffff, %edx orl SA1ShiftedPB, %edx call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop/* JSL */Op22: movb PB, %al PushByte JSL_ABSL movl PC, %eax subl SA1PCBase, %eax addl $2, %eax PushWord JSL_ABSL AbsoluteLong8 JSL movl %edx, %ecx andl $0xff0000, %ecx movl %ecx, SA1ShiftedPB sarl $16, %ecx movb %cl, PB call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop/* RTL */Op6B: PullWord RTL pushl %eax PullByte RTL popl %edx movb %al, PB incw %dx andl $0xff, %eax andl $0xffff, %edx sall $16, %eax movl %eax, SA1ShiftedPB orl %eax, %edx call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop/* JSR ABS */Op20: movl PC, %eax subl SA1PCBase, %eax incl %eax PushWord JSR_ABS Absolute8 JSR_ABS andl $0xffff, %edx orl SA1ShiftedPB, %edx call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop/* JSR ABS INDEXED INDIRECT */OpFC: movl PC, %eax subl SA1PCBase, %eax incl %eax PushWord JSR_AII AbsoluteIndexedIndirect8 JSR andl $0xffff, %edx orl SA1ShiftedPB, %edx call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop/* RTS */Op60: PullWord RTS incl %eax movl %eax, %edx andl $0xffff, %edx orl SA1ShiftedPB, %edx call S9xSA1SetPCBase jmp S9xSA1MainAsmLoop/* MVN */Op54X1: xorl %edx, %edx movb (PC), %dl movb %dl, DB sall $16, %edx movl %edx, SA1ShiftedDB movb 1(PC), %dl sall $16, %edx movw XX, %dx call S9xSA1GetByte movl SA1ShiftedDB, %edx movw YY, %dx call S9xSA1SetByte incb XL incb YL movw AA, %ax decw %ax movw %ax, AA cmpw $0xffff, %ax je .MVN_EXIT8 decl PC jmp S9xSA1MainAsmLoop.MVN_EXIT8: addl $2, PC jmp S9xSA1MainAsmLoopOp54X0: xorl %edx, %edx movb (PC), %dl movb %dl, DB sall $16, %edx movl %edx, SA1ShiftedDB movb 1(PC), %dl sall $16, %edx movw XX, %dx call S9xSA1GetByte movl SA1ShiftedDB, %edx movw YY, %dx call S9xSA1SetByte incw XX incw YY movw AA, %ax decw %ax movw %ax, AA cmpw $0xffff, %ax je .MVN_EXIT16 decl PC jmp S9xSA1MainAsmLoop.MVN_EXIT16: addl $2, PC jmp S9xSA1MainAsmLoop/* MVP */Op44X1: xorl %edx, %edx movb (PC), %dl movb %dl, DB sall $16, %edx movl %edx, SA1ShiftedDB movb 1(PC), %dl sall $16, %edx movw XX, %dx call S9xSA1GetByte movl SA1ShiftedDB, %edx movw YY, %dx call S9xSA1SetByte decb XL decb YL movw AA, %ax decw %ax movw %ax, AA cmpw $0xffff, %ax je .MVP_EXIT8 decl PC jmp S9xSA1MainAsmLoop.MVP_EXIT8: addl $2, PC jmp S9xSA1MainAsmLoopOp44X0: xorl %edx, %edx movb (PC), %dl movb %dl, DB sall $16, %edx movl %edx, SA1ShiftedDB movb 1(PC), %dl sall $16, %edx movw XX, %dx call S9xSA1GetByte movl SA1ShiftedDB, %edx movw YY, %dx call S9xSA1SetByte decw XX decw YY movw AA, %ax decw %ax movw %ax, AA cmpw $0xffff, %ax je .MVP_EXIT16 decl PC jmp S9xSA1MainAsmLoop.MVP_EXIT16: addl $2, PC jmp S9xSA1MainAsmLoop/* REP */OpC2: movb (PC), %al incl PC notb %al andb %al, FLAGS andb %al, SA1_Negative andb %al, SA1_Carry testb $Zero, %al setz %ah orb %ah, SA1_Zero shrb $6, %al andb %al, SA1_Overflow testw $Emulation, FLAGS16 jz .REP_NO_EMU orb $(MemoryFlag | IndexFlag), FLAGS .REP_NO_EMU: testb $IndexFlag, FLAGS jz .REP16 xorb %al, %al movb %al, XH movb %al, YH.REP16: S9xSA1FixCycles REP CheckForIrq REP jmp S9xSA1MainAsmLoop/* SEP */OpE2: movb (PC), %al incl PC orb %al, FLAGS orb %al, SA1_Negative movb %al, %ah shrb $6, %ah andb $1, %ah orb %ah, SA1_Overflow test $Zero, %al jz .SEP_NO_ZERO movb $0, SA1_Zero.SEP_NO_ZERO: andb $1, %al orb %al, SA1_Carry testw $Emulation, FLAGS16 jz .SEP_NO_EMU orb $(MemoryFlag | IndexFlag), FLAGS .SEP_NO_EMU: testb $IndexFlag, FLAGS jz .SEP16 xorb %al, %al movb %al, XH movb %al, YH.SEP16: S9xSA1FixCycles SEP jmp S9xSA1MainAsmLoop/* XBA */OpEB: movb AL, %ah movb AH, %al movb %ah, AH movb %al, AL SetZN jmp S9xSA1MainAsmLoop/* RTI */Op40: PullByte RTI movb %al, FLAGS PullWord RTI andl $0xffff, %eax pushl %eax testw $Emulation, FLAGS16 jnz .RTI_EMU PullByte RTI2 andl $0xff, %eax jmp .RTI_SKIP_EMU.RTI_EMU: orb $(MemoryFlag | IndexFlag), FLAGS /*XXX: HERE xorl %eax, %eax*/ movl SA1ShiftedPB, %eax sarl $16, %eax.RTI_SKIP_EMU: movb %al, PB popl %edx sall $16, %eax orl %eax, %edx movl %eax, SA1ShiftedPB call S9xSA1SetPCBase testb $IndexFlag, FLAGS jz .RTI16 xorb %al, %al movb %al, XH movb %al, YH.RTI16: S9xSA1UnpackStatus RTI S9xSA1FixCycles RTI CheckForIrq RTI jmp S9xSA1MainAsmLoop/* WAI */OpCB: movb $1, SA1WaitingForInterrupt decl PC#if 0// XXX: FIXME movb Shutdown, %al testb %al, %al je .NoShutdown movl NextEvent, CYCLES cmpb $0, APUExecuting je S9xSA1MainAsmLoop movb $0, CPUExecuting.WAITExecAPU:#ifdef DEBUGGER testb $2,APUFlags je .WAITNoAPUS9xSA1Trace STORE_REGISTERS ccall S9xSA1TraceAPU LOAD_REGISTERS.WAITNoAPUS9xSA1Trace:#endif xorl %eax,%eax#ifdef SPC700_C movl APUPC,%edx SAVE_CYCLES movb (%edx),%al#else movb (APUPC),%al#endif movl S9xAPUCycles(,%eax,4), %edx movl S9xApuOpcodes(,%eax,4),%eax addl %edx, APUCycles call *%eax#ifdef SPC700_C LOAD_CYCLES#endif movl NextEvent, %eax cmpl %eax, APUCycles jl .WAITExecAPU movb $1, CPUExecuting jmp S9xSA1MainAsmLoop#endif.NoShutdown: jmp S9xSA1MainAsmLoop/* ??? */OpDB: decl PC orb $DEBUG_MODE_FLAG, SA1Flags jmp S9xSA1MainAsmLoopOp42: jmp S9xSA1MainAsmLoop.globl S9xSA1OpcodesM1X1.data .align 4S9xSA1OpcodesM1X1: .long Op00 .long Op01M1 .long Op02 .long Op03M1 .long Op04M1 .long Op05M1 .long Op06M1 .long Op07M1 .long Op08 .long Op09M1 .long Op0AM1 .long Op0B .long Op0CM1 .long Op0DM1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -