📄 cpuexec.s
字号:
#endif /* ARMAPU */.S9xSyncSpeed: .long _S9xSyncSpeed.globl _S9xDoHBlankProcessing_S9xDoHBlankProcessing: mov.l r14,@-r15 mov.l r13,@-r15 sts.l pr,@-r15 mov.l r12,@-r15 mov.l r11,@-r15 SETUP_PREDEF bsr S9xDoHBlankProcessing nop mov.l @r15+,r11 mov.l @r15+,r12 lds.l @r15+,pr mov.l @r15+,r13 rts mov.l @r15+,r14 MISC S9xDoHBlankProcessing:#if 0 sts.l pr,@-r15 mov.l .hbtrace,r0 mov r11,r4 jsr @r0 mov r12,r5 bsr 6f nop mov.l .hbtrace,r0 mov r11,r4 jsr @r0 mov r12,r5 lds.l @r15+,pr rts nop .align 2.hbtrace: .long __Z8hb_traceP10SRegistersP9SCPUState 6: #endif sts.l pr,@-r15#ifdef CPU_SHUTDOWN mov.l WaitCounter,r1#endif mov.b WhichEvent,r0#ifdef CPU_SHUTDOWN add #1,r1#endif tst r0,r0#ifdef CPU_SHUTDOWN mov.l r1,WaitCounter#endif bt/s .hblank_start cmp/eq #1,r0 bt/s .hblank_end mov #3,r1 cmp/hi r1,r0 bt .reschedule.htimer_trigger: mov.l PPU,r1 mov.b HTimerEnabled,r0 tst r0,r0 bt .reschedule mov.b VTimerEnabled,r0 tst r0,r0 bt .L191 mov.w IRQVBeamPos,r0 mov.l V_Counter,r3 extu.w r0,r0 cmp/eq r0,r3 bf .reschedule.L191: // CHANGED: 20/11/00 bsr _S9xSetIRQ mov #1,r4 bra .reschedule nop.hblank_start: mov.l IPPU,r1 mov.b HDMA,r0 mov r0,r4 tst r0,r0 bt .reschedule mov.l PPU,r1 mov.w ScreenHeight,r0 mov.l V_Counter,r1 cmp/hi r0,r1 bt .reschedule mov.l .S9xDoHDMA,r3 jsr @r3 extu.b r4,r4 mov.l IPPU,r1 mov.b r0,HDMA.reschedule: mov.b WhichEvent,r0 tst r0,r0 bt/s .next_is_hblank_end mov.l Settings,r1 cmp/eq #3,r0 bf .next_is_hblank_start.next_is_hblank_end: mov #1,r4 bra .skip mov.l H_Max,r5.next_is_hblank_start: mov #0,r4 mov.l HBlankStart,r5.skip: mov.l PPU,r1 mov.b HTimerEnabled,r0 tst r0,r0 bt .not_enabled mov.w HTimerPosition,r0 cmp/ge r5,r0 bt .not_enabled mov.l NextEvent,r3 mov r0,r6 cmp/gt r3,r0 bf .not_enabled mov.b VTimerEnabled,r0 tst r0,r0 bt .enabled mov.w IRQVBeamPos,r0 mov.l V_Counter,r2 extu.w r0,r0 cmp/eq r0,r2 bf .not_enabled.enabled: mov.l Settings,r1 mov #2,r4 mov.l HBlankStart,r0 cmp/gt r6,r0 bt/s .before mov r6,r5 mov #3,r4.before:.not_enabled: mov r4,r0 mov.l r5,NextEvent lds.l @r15+,pr rts mov.b r0,WhichEvent.hblank_end: mov.l .S9xSuperFXExec,r3 jsr @r3 nop/* testb $0xff, SoundSync jz .nosoundsync */ mov.l .S9xGenerateSound,r3 jsr @r3 nop.nosoundsync: mov.l Settings,r1 mov.l Cycles,r0 mov.l H_Max,r2 sub r2,r0 mov.l r0,Cycles#ifndef ARMAPU mov.l IAPU,r1 mov.b APUExecuting,r0 tst r0,r0 bt/s .apunotrunning mov.l APU,r1 mov.l APUCycles,r0 sub r2,r0/* bra .apucycleskip mov.l r0,APUCycles */.apunotrunning: mov.l r0,APUCycles.apucycleskip: #endif /* ARMAPU */ mov.l PPU,r1 mov.l V_Counter,r0 add #1,r0 mov.l ICPU,r1 mov.l Scanline,r2 add #1,r2 mov.l r2,Scanline mov #-1,r2 mov.l r2,NextEvent mov.l PPU,r1 mov.l r0,V_Counter mov.w .n262,r3 cmp/hi r3,r0 bf .L161 mov.w .n312,r3 cmp/hi r3,r0 mov.l Settings,r1 bt .ntsc_tv mov.b PAL,r0 tst r0,r0 bf .L161.ntsc_tv: mov.l PPU,r1 mov.w SavedOAMAddr,r0 mov #0,r4 mov.l Flags,r3 mov.w r0,OAMAddr mov r4,r0 mov.b r0,OAMFlip mov.b r0,NMIActive mov #16,r0 or r0,r3 mov.l r4,V_Counter mov r4,r0 mov.l .S9xStartHDMA,r2 mov.b r0,HVBeamCounterLatched jsr @r2 mov.l r3,Flags.L161: mov.l PPU,r1 mov.b VTimerEnabled,r0 tst r0,r0 bt .L162 mov.b HTimerEnabled,r0 tst r0,r0 bf .L162 mov.w IRQVBeamPos,r0 mov.l V_Counter,r2 extu.w r0,r0 cmp/eq r0,r2 bf .L162 mov.b IRQActive,r0 or #2,r0 mov.b r0,IRQActive mov.b WaitingForInterrupt,r0 tst r0,r0 bt .L163 mov.l PCS,r0 add #1,r0 mov.l r0,PCS mov #0,r0 mov.b r0,WaitingForInterrupt.L163:/* movb DisableIRQ,%al testb %al,%al jne .L162*/#if 0 mov.b PP,r0 tst #4,r0 bf .L162 mov.l S9xOpcode_IRQ,r3 /* PUSH_REGISTERS */ LOAD_REGISTERS IRQ jsr @r3 nop STORE_REGISTERS IRQ /* POP_REGISTERS */#endif bsr _S9xSetIRQ mov #2,r4.L162: mov.l PPU,r1 mov.w ScreenHeight,r0 mov.l V_Counter,r2 add #1,r0 cmp/eq r0,r2 bf .L165 mov.l .S9xEndScreenRefresh,r0 jsr @r0 nop mov.l PPU,r1 mov #0,r0 mov.b r0,FirstSprite mov.b Brightness,r0 mov.l IPPU,r1 mov.b r0,MaxBrightness mov #0,r0 mov.b r0,HDMA mov.l .FillRAM0,r0 mov.w .nx2100,r2 mov.l @r0,r0 mov.b @(r0,r2),r3 shll r2 shll r3 mov.l PPU,r1 shlr8 r3 mov #1,r0 and r3,r0 mov.b r0,ForcedBlanking mov.l .FillRAM0,r0 mov.l @r0,r0 mov.b @(r0,r2),r3 add #0x10,r2 cmp/pz r3 mov #0x80,r3 bt/s .L165 mov.b r3,@(r0,r2) mov.l Flags,r0 or #NMI_FLAG,r0 mov.l r0,Flags mov #NMITriggerPoint_offs,r0 mov.l @(r0,r12),r2 mov #1,r0 mov.l r2,NMICycleCount mov.b r0,NMIActive.L165: mov.w ScreenHeight,r0 add #3,r0 mov.l V_Counter,r2 cmp/eq r0,r2 bf .NoJoypadUpdate mov.l .S9xUpdateJoypads,r3 jsr @r3 nop.NoJoypadUpdate: mov.l V_Counter,r0 cmp/eq #1,r0 bf .L177 mov.l .FillRAM0,r3 mov #0,r2 mov.l @r3,r3 mov.w .n4210,r1 mov.l Flags,r0 add r1,r3 mov.b r2,@r3 or #NMI_FLAG,r0 mov.l .S9xStartScreenRefresh,r3 add #-NMI_FLAG,r0 jsr @r3 mov.l r0,Flags.L177: mov.l V_Counter,r3 mov.l PPU,r1 tst r3,r3 bt .L178 mov.w ScreenHeight,r0 extu.w r0,r0 add #1,r0 cmp/ge r0,r3 bt .L178 mov.l V_Counter,r0 mov.l .RenderLine,r3 add #-1,r0 jsr @r3 extu.b r0,r4.L178:#ifndef ARMAPU#if 0 movl APUTimerErrorCounter,%eax incl %eax movl %eax,APUTimerErrorCounter andl $31,%eax jz .reschedule#endif mov.l .APUTimer_ptr,r2 mov.l IAPU,r1 mov.b @(APUTimerEnabled - APUTimer + 2,r2),r0 tst r0,r0 bt .L179 mov.w @(4,r2),r0 add #4,r0 mov.w r0,@(4,r2) extu.w r0,r3 mov.w @(APUTimerTarget - APUTimer + 4,r2),r0 extu.w r0,r0 cmp/hs r0,r3 bf .L179.L182: mov.w .n255,r0 mov.l APURAM,r3 add r0,r3 mov.b @r3,r0 add #1,r0 and #15,r0 mov.b r0,@r3 mov.w @(APUTimerTarget - APUTimer + 4,r2),r0 extu.w r0,r3 mov.w @(4,r2),r0#ifdef SPC700_SHUTDOWN mov.l APUWaitCounter,r4 sub r3,r0 add #1,r4 mov.w r0,@(4,r2) extu.w r0,r0 mov.l r4,APUWaitCounter cmp/hs r3,r0 mov #1,r0 bt/s .L182 mov.b r0,APUExecuting#else sub r3,r0 mov.w r0,@(4,r2) extu.w r0,r0 cmp/hs r3,r0 bt .L182#endif.L179: mov.l V_Counter,r0 tst #1,r0 bt 1f mov.b @(APUTimerEnabled - APUTimer,r2),r0 tst r0,r0 bt .L185 mov.w @r2,r0 add #1,r0 mov.w r0,@r2 extu.w r0,r3 mov.w @(APUTimerTarget - APUTimer,r2),r0 extu.w r0,r0 cmp/hs r0,r3 bf .L185 mov.w .n253,r0 mov.l APURAM,r3 add r0,r3 mov.b @r3,r0 add #1,r0 and #15,r0 mov.b r0,@r3#ifdef SPC700_SHUTDOWN mov.l APUWaitCounter,r3 mov #0,r0 add #1,r3 mov.w r0,@r2 add #1,r0 mov.l r3,APUWaitCounter mov.b r0,APUExecuting#else mov #0,r0 mov.w r0,@r2#endif.L185: mov.b @(APUTimerEnabled - APUTimer + 1,r2),r0 tst r0,r0 bt 1f mov.w @(2, r2),r0 add #1,r0 mov.w r0,@(2, r2) extu.w r0,r3 mov.w @(APUTimerTarget - APUTimer + 2,r2),r0 extu.w r0,r0 cmp/hs r0,r3 bf 1f mov.w .n254,r0 mov.l APURAM,r3 add r0,r3 mov.b @r3,r0 add #1,r0 and #15,r0 mov.b r0,@r3#ifdef SPC700_SHUTDOWN mov.l APUWaitCounter,r3 mov #0,r0 add #1,r3 mov.w r0,@(2,r2) add #1,r0 mov.l r3,APUWaitCounter bra .reschedule mov.b r0,APUExecuting#else mov #0,r0 bra .reschedule mov.w r0,@(2,r2)#endif#endif /* ARMAPU */1: bra .reschedule nop .align 2.S9xDoHDMA: .long _S9xDoHDMA.S9xSuperFXExec: .long _S9xSuperFXExec .S9xGenerateSound: .long _S9xGenerateSound #ifndef ARMAPU.APUTimer_ptr: .long _APU+APUTimer#endif /* ARMAPU */.S9xStartHDMA: .long _S9xStartHDMA.S9xEndScreenRefresh: .long _S9xEndScreenRefresh.FillRAM0: .long FillRAM.S9xUpdateJoypads: .long _S9xUpdateJoypads.S9xStartScreenRefresh: .long _S9xStartScreenRefresh.RenderLine: .long _RenderLine.n4210: .word 0x4210.nx2100: .word 0x2100.n253: .word 253.n254: .word 254.n255: .word 255.n262: .word 262.n312: .word 312.text .align 4.globl _S9xSetIRQ_S9xSetIRQ: mov.l r12,@-r15 mov.l ._CPU,r12 mov.b IRQActive,r0 // CHANGED: 20/11/00 mov #3,r1 or r4,r0 mov.l r1,IRQCycleCount mov.b r0,IRQActive mov.l Flags,r2 mov.w .pIRQ_PENDING_FLAG2,r0 or r0,r2 mov.l r2,Flags mov.b WaitingForInterrupt,r0 tst r0,r0 bt .NoIncPC mov #0,r0 mov.b r0,WaitingForInterrupt // IRQ must trigger immediately after a WAI instruction - // Final Fantasy Mystic Quest requires this. mov.l PCS,r1 mov.l r0,IRQCycleCount add #1,r1 mov.l r1,PCS.NoIncPC: rts mov.l @r15+,r12.globl _S9xClearIRQ_S9xClearIRQ: mov.l r12,@-r15 mov.l ._CPU,r12 not r4,r3 mov.b IRQActive,r0 and r3,r0 mov.b r0,IRQActive tst r0,r0 bf .irqsstillpending mov.w .nIRQ_PENDING_FLAG2,r0 mov.l Flags,r2 and r0,r2 mov.l r2,Flags.irqsstillpending: rts mov.l @r15+,r12 .align 2._CPU: .long _CPU.pIRQ_PENDING_FLAG2: .word IRQ_PENDING_FLAG.nIRQ_PENDING_FLAG2: .word ~IRQ_PENDING_FLAG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -