📄 cpuops.s
字号:
addl $6, CYCLES#endif movb AL, %al PushByte PHA jmp MainAsmLoopOp48M0:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw AA, %ax PushWord PHA jmp MainAsmLoop/* PHB */Op8B:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb DB, %al PushByte PHB jmp MainAsmLoop/* PHD */Op0B:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw DD, %ax PushWord PHD jmp MainAsmLoop/* PHK */Op4B:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb PB, %al PushByte PHK jmp MainAsmLoop/* PHP */Op08:#ifdef VAR_CYCLES addl $6, CYCLES#endif S9xPackStatus PHP movb FLAGS, %al PushByte PHP jmp MainAsmLoop/* PHX */OpDAX1:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb XL, %al PushByte PHX jmp MainAsmLoopOpDAX0:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw XX, %ax PushWord PHX jmp MainAsmLoop/* PHY */Op5AX1:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb YL, %al PushByte PHY jmp MainAsmLoopOp5AX0:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw YY, %ax PushWord PHY jmp MainAsmLoop/* PLA */Op68M1:#ifdef VAR_CYCLES addl $12, CYCLES#endif PullByte PLA movb %al, AL SetZN jmp MainAsmLoopOp68M0:#ifdef VAR_CYCLES addl $12, CYCLES#endif PullWord PLA movw %ax, AA testw %ax, %ax Set16ZN jmp MainAsmLoop/* PLB */OpAB:#ifdef VAR_CYCLES addl $12, CYCLES#endif PullByte PLB movb %al, DB SetZN andl $0xff, %eax sall $16, %eax movl %eax, ShiftedDB jmp MainAsmLoop/* PLD */Op2B:#ifdef VAR_CYCLES addl $12, CYCLES#endif PullWord PLD movw %ax, DD testw %ax, %ax Set16ZN jmp MainAsmLoop /* PLP */Op28:#ifdef VAR_CYCLES addl $12, CYCLES#endif PullByte PLP movb %al, FLAGS testb $IndexFlag, FLAGS jz .PLP16 xorb %al, %al movb %al, XH movb %al, YH.PLP16: S9xUnpackStatus PLP S9xFixCycles PLP CheckForIrq PLP jmp MainAsmLoop/* PLX */OpFAX1:#ifdef VAR_CYCLES addl $12, CYCLES#endif PullByte PLX movb %al, XL SetZN jmp MainAsmLoopOpFAX0:#ifdef VAR_CYCLES addl $12, CYCLES#endif PullWord PLX movw %ax, XX testw %ax, %ax Set16ZN jmp MainAsmLoop/* PLY */Op7AX1:#ifdef VAR_CYCLES addl $12, CYCLES#endif PullByte PLY movb %al, YL SetZN jmp MainAsmLoopOp7AX0:#ifdef VAR_CYCLES addl $12, CYCLES#endif PullWord PLY movw %ax, YY testw %ax, %ax Set16ZN jmp MainAsmLoop/* SEC */Op38: movb $1, _Carry#ifdef VAR_CYCLES addl $6, CYCLES#endif jmp MainAsmLoop/* SED */OpF8: orb $Decimal, FLAGS#ifdef VAR_CYCLES addl $6, CYCLES#endif jmp MainAsmLoop/* SEI */Op78: orb $IRQ, FLAGS#ifdef VAR_CYCLES addl $6, CYCLES#endif jmp MainAsmLoop/* TAX */OpAAX1:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb AL, %al movb %al, XL SetZN jmp MainAsmLoopOpAAX0:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw AA, %ax movw %ax, XX testw %ax, %ax Set16ZN jmp MainAsmLoop/* TAY */OpA8X1:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb AL, %al movb %al, YL SetZN jmp MainAsmLoopOpA8X0:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw AA, %ax movw %ax, YY testw %ax, %ax Set16ZN jmp MainAsmLoop/* TCD */Op5B:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw AA, %ax movw %ax, DD testw %ax, %ax Set16ZN jmp MainAsmLoop/* TCS */Op1B:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw AA, %ax movw %ax, SS testw $Emulation, FLAGS16 jz .TCS_EXIT movb $1, SH.TCS_EXIT: jmp MainAsmLoop/* TDC */Op7B:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw DD, %ax movw %ax, AA testw %ax, %ax Set16ZN jmp MainAsmLoop/* TSC */Op3B:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw SS, %ax movw %ax, AA testw %ax, %ax Set16ZN jmp MainAsmLoop/* TSX */OpBAX1:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb SL, %al movb %al, XL SetZN jmp MainAsmLoopOpBAX0:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw SS, %ax movw %ax, XX testw %ax, %ax Set16ZN jmp MainAsmLoop/* TXA */Op8AM1:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb XL, %al movb %al, AL SetZN jmp MainAsmLoopOp8AM0:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw XX, %ax movw %ax, AA testw %ax, %ax Set16ZN jmp MainAsmLoop/* TXS */Op9A:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw XX, %ax movw %ax, SS testw $Emulation, FLAGS16 jz .TXS_EXIT movb $1, SH.TXS_EXIT: jmp MainAsmLoop/* TXY */Op9BX1:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb XL, %al movb %al, YL SetZN jmp MainAsmLoopOp9BX0:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw XX, %ax movw %ax, YY testw %ax, %ax Set16ZN jmp MainAsmLoop/* TYA */Op98M1:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb YL, %al movb %al, AL SetZN jmp MainAsmLoopOp98M0:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw YY, %ax movw %ax, AA testw %ax, %ax Set16ZN jmp MainAsmLoop/* TYX */OpBBX1:#ifdef VAR_CYCLES addl $6, CYCLES#endif movb YL, %al movb %al, XL SetZN jmp MainAsmLoopOpBBX0:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw YY, %ax movw %ax, XX testw %ax, %ax Set16ZN jmp MainAsmLoop/* XCE */OpFB:#ifdef VAR_CYCLES addl $6, CYCLES#endif movw FLAGS16, %ax andw $~(Emulation | Carry), FLAGS16 GetCarry jnc .XCE_NO_CARRY orw $Emulation, FLAGS16.XCE_NO_CARRY: testw $Emulation, %ax setnz _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: S9xFixCycles XCE jmp MainAsmLoop .data.LC0: .string "*** BRK".textOp00:#ifdef DEBUGGER testb $TRACE_FLAG, Flags je .BRK_NO_TRACE pushl $.LC0 ccall S9xTraceMessage addl $4,%esp.BRK_NO_TRACE:#endif movb $1, BRKTriggered testw $Emulation, FLAGS16 jnz .BRK_EMULATION movb PB, %al PushByte BRK1 movl PC, %eax subl PCBase, %eax incl %eax PushWord BRK2 S9xPackStatus BRK movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte BRK3 xorl %ecx, %ecx movl %ecx, ShiftedPB movb %cl, PB#ifdef VAR_CYCLES addl $12, CYCLES#else addl $8, CYCLES#endif movl $0xFFE6, %edx call S9xGetWord movl %eax, %edx andl $0xffff, %edx call S9xSetPCBase jmp MainAsmLoop.BRK_EMULATION: movl PC, %eax subl PCBase, %eax incl %eax PushWord BRK2 S9xPackStatus BRK2 movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte BRK3 xorl %ecx, %ecx movl %ecx, ShiftedPB movb %cl, PB#ifdef VAR_CYCLES addl $6, CYCLES#else addl $6, CYCLES#endif movl $0xFFFE, %edx call S9xGetWord movl %eax, %edx andl $0xffff, %edx call S9xSetPCBase jmp MainAsmLoop.data.LC1: .string "*** IRQ".text.globl S9xOpcode_IRQS9xOpcode_IRQ:#ifdef DEBUGGER testb $TRACE_FLAG, Flags 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 PCBase, %eax PushWord IRQ2 S9xPackStatus IRQ movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte IRQ3 xorl %ecx, %ecx movl %ecx, ShiftedPB movb %cl, PB#ifdef VAR_CYCLES addl $12, CYCLES#else addl $8, CYCLES#endif testb $0xff, SA1Enabled jz .noirqsa1vector movl FillRAM, %eax movb 0x2209(%eax), %dl testb $0x40, %dl jz .noirqsa1vector xorl %edx, %edx movw 0x220e(%eax), %dx jmp S9xSetPCBase.noirqsa1vector: movl $0xFFEE, %edx call S9xGetWord movl %eax, %edx andl $0xffff, %edx jmp S9xSetPCBase.IRQ_EMULATION: movl PC, %eax subl PCBase, %eax PushWord IRQ4 S9xPackStatus IRQ2 movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte IRQ5 xorl %ecx, %ecx movl %ecx, ShiftedPB movb %cl, PB#ifdef VAR_CYCLES addl $6, CYCLES#else addl $6, CYCLES#endif movl $0xFFFE, %edx call S9xGetWord movl %eax, %edx andl $0xffff, %edx jmp S9xSetPCBase.data.LC2: .string "*** NMI".text.globl S9xOpcode_NMIS9xOpcode_NMI:#ifdef DEBUGGER testb $TRACE_FLAG, Flags 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 PCBase, %eax PushWord NMI2 S9xPackStatus NMI movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte NMI3 xorl %ecx, %ecx movl %ecx, ShiftedPB movb %cl, PB#ifdef VAR_CYCLES addl $12, CYCLES#else addl $8, CYCLES#endif movl $0xFFEA, %edx call S9xGetWord movl %eax, %edx andl $0xffff, %edx jmp S9xSetPCBase.NMI_EMULATION: movl PC, %eax subl PCBase, %eax PushWord NMI4 S9xPackStatus NMI2 movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte NMI5 xorl %ecx, %ecx movl %ecx, ShiftedPB movb %cl, PB#ifdef VAR_CYCLES addl $6, CYCLES#else addl $6, CYCLES#endif movl $0xFFFA, %edx call S9xGetWord movl %eax, %edx andl $0xffff, %edx jmp S9xSetPCBase.data.LC3: .string "*** COP".textOp02:#ifdef DEBUGGER testb $TRACE_FLAG, Flags 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 PCBase, %eax incl %eax PushWord COP2 S9xPackStatus COP movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte COP3 xorl %ecx, %ecx movl %ecx, ShiftedPB movb %cl, PB#ifdef VAR_CYCLES addl $12, CYCLES#else addl $8, CYCLES#endif movl $0xFFE4, %edx call S9xGetWord movl %eax, %edx andl $0xffff, %edx call S9xSetPCBase jmp MainAsmLoop.COP_EMULATION: movl PC, %eax subl PCBase, %eax incl %eax PushWord COP4 S9xPackStatus COP2 movb FLAGS, %al andb $~Decimal, FLAGS orb $IRQ, FLAGS PushByte COP5 xorl %ecx, %ecx movl %ecx, ShiftedPB movb %cl, PB#ifdef VAR_CYCLES addl $6, CYCLES#else addl $6, CYCLES#endif movl $0xFFF4, %edx call S9xGetWord movl %eax, %edx andl $0xffff, %edx call S9xSetPCBase jmp MainAsmLoop/* JML */OpDC: AbsoluteIndirectLong8 JML movl %edx, %ecx andl $0xff0000, %ecx movl %ecx, ShiftedPB sarl $16, %ecx movb %cl, PB#ifdef VAR_CYCLES addl $12, CYCLES#endif call S9xSetPCBase jmp MainAsmLoopOp5C: AbsoluteLong8 JML movl %edx, %ecx andl $0xff0000, %ecx movl %ecx, ShiftedPB sarl $16, %ecx movb %cl, PB call S9xSetPCBase jmp MainAsmLoop/* JMP */Op4C: Absolute8 JMP andl $0xffff, %edx orl ShiftedPB, %edx call S9xSetPCBase jmp MainAsmLoopOp6C: AbsoluteIndirect8 JMP andl $0xffff, %edx orl ShiftedPB, %edx call S9xSetPCBase jmp MainAsmLoopOp7C: AbsoluteIndexedIndirect8 JMP#ifdef VAR_CYCLES addl $6, CYCLES#endif andl $0xffff, %edx orl ShiftedPB, %edx call S9xSetPCBase jmp MainAsmLoop/* JSL */Op22: movb PB, %al PushByte JSL_ABSL movl PC, %eax subl PCBase, %eax addl $2, %eax PushWord JSL_ABSL AbsoluteLong8 JSL movl %edx, %ecx andl $0xff0000, %ecx movl %ecx, ShiftedPB sarl $16, %ecx movb %cl, PB call S9xSetPCBase jmp MainAsmLoop/* RTL */Op6B:#ifdef VAR_CYCLES addl $12, CYCLES#endif PullWord RTL pushl %eax PullByte RTL popl %edx movb %al, PB incw %dx andl $0xff, %eax andl $0xffff, %edx sall $16, %eax movl %eax, ShiftedPB orl %eax, %edx call S9xSetPCBase jmp MainAsmLoop/* JSR ABS */Op20:#ifdef VAR_CYCLES addl $6, CYCLES#endif movl PC, %eax subl PCBase, %eax incl %eax PushWord JSR_ABS Absolute8 JSR_ABS andl $0xffff, %edx orl ShiftedPB, %edx call S9xSetPCBase jmp MainAsmLoop/* JSR ABS INDEXED INDIRECT */OpFC:#ifdef VAR_CYCLES addl $6, CYCLES#endif movl PC, %eax subl PCBase, %eax incl %eax PushWord JSR_AII AbsoluteIndexedIndirect8 JSR andl $0xffff, %edx orl ShiftedPB, %edx call S9xSetPCBase jmp MainAsmLoop/* RTS */Op60:#ifdef VAR_CYCLES addl $6 * 3, CYCLES#endif PullWord RTS incl %eax movl %eax, %edx andl $0xffff, %edx orl ShiftedPB, %edx call S9xSetPCBase jmp MainAsmLoop/* MVN */Op54X1:#ifdef VAR_CYCLES addl MemSpeedx2, CYCLES addl $12, CYCLES#endif xorl %edx, %edx movb (PC), %dl movb %dl, DB sall $16, %edx movl %edx, ShiftedDB movb 1(PC), %dl sall $16, %edx movw XX, %dx call S9xGetByte movl ShiftedDB, %edx movw YY, %dx call S9xSetByte incb XL incb YL movw AA, %ax decw %ax movw %ax, AA cmpw $0xffff, %ax je .MVN_EXIT8 decl PC jmp MainAsmLoop.MVN_EXIT8: addl $2, PC jmp MainAsmLoopOp54X0:#ifdef VAR_CYCLES addl MemSpeedx2, CYCLES addl $12, CYCLES#endif xorl %edx, %edx movb (PC), %dl movb %dl, DB sall $16, %edx movl %edx, ShiftedDB movb 1(PC), %dl sall $16, %edx movw XX, %dx call S9xGetByte movl ShiftedDB, %edx movw YY, %dx call S9xSetByte incw XX incw YY movw AA, %ax decw %ax movw %ax, AA cmpw $0xffff, %ax je .MVN_EXIT16 decl PC jmp MainAsmLoop.MVN_EXIT16: addl $2, PC jmp MainAsmLoop/* MVP */Op44X1:#ifdef VAR_CYCLES addl MemSpeedx2, CYCLES addl $12, CYCLES#endif xorl %edx, %edx movb (PC), %dl movb %dl, DB sall $16, %edx movl %edx, ShiftedDB movb 1(PC), %dl sall $16, %edx movw XX, %dx call S9xGetByte movl ShiftedDB, %edx movw YY, %dx call S9xSetByte decb XL decb YL movw AA, %ax decw %ax movw %ax, AA cmpw $0xffff, %ax je .MVP_EXIT8 decl PC jmp MainAsmLoop.MVP_EXIT8: addl $2, PC jmp MainAsmLoopOp44X0:#ifdef VAR_CYCLES addl MemSpeedx2, CYCLES addl $12, CYCLES#endif xorl %edx, %edx movb (PC), %dl movb %dl, DB sall $16, %edx movl %edx, ShiftedDB movb 1(PC), %dl sall $16, %edx movw XX, %dx call S9xGetByte movl ShiftedDB, %edx movw YY, %dx call S9xSetByte decw XX decw YY movw AA, %ax decw %ax movw %ax, AA cmpw $0xffff, %ax je .MVP_EXIT16 decl PC jmp MainAsmLoop.MVP_EXIT16: addl $2, PC jmp MainAsmLoop/* REP */OpC2:#ifdef VAR_CYCLES addl MemSpeed, CYCLES addl $6, CYCLES#endif movb (PC), %al incl PC notb %al andb %al, FLAGS andb %al, _Negative andb %al, _Carry testb $Zero, %al setz %ah orb %ah, _Zero shrb $6, %al andb %al, _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: S9xFixCycles REP CheckForIrq REP jmp MainAsmLoop/* SEP */OpE2:#ifdef VAR_CYCLES addl MemSpeed, CYCLES addl $6, CYCLES#endif movb (PC), %al incl PC orb %al, FLAGS orb %al, _Negative movb %al, %ah shrb $6, %ah andb $1, %ah orb %ah, _Overflow test $Zero, %al jz .SEP_NO_ZERO movb $0, _Zero.SEP_NO_ZERO: andb $1, %al orb %al, _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: S9xFixCycles SEP jmp MainAsmLoop/* XBA */OpEB:#ifdef VAR_CYCLES addl $12, CYCLES#endif movb AL, %ah movb AH, %al movb %ah, AH movb %al, AL SetZN jmp MainAsmLoop/* RTI */Op40:#ifdef VAR_CYCLES addl $12, CYCLES#endif 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 ShiftedPB, %eax sarl $16, %eax.RTI_SKIP_EMU: movb %al, PB popl %edx sall $16, %eax orl %eax, %edx movl %eax, ShiftedPB call S9xSetPCBase testb $IndexFlag, FLAGS jz .RTI16 xorb %al, %al movb %al, XH movb %al, YH.RTI16: S9xUnpackStatus RTI S9xFixCycles RTI CheckForIrq RTI jmp MainAsmLoop/* WAI */OpCB:#if 0 cmpb $0, IRQActive je .L5334#ifdef VAR_CYCLES addl $12, CYCLES#else addl $2, CYCLES
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -