@includefrom superfx.asm ;CODE_05BB39 - Animation ;CODE_019211 - Sprite <-> Layer Interaction (EXTREMELY IMPORTANT) ;Note for above - The routine seems to reduce the toll taken on processing pushpc org $01CC28 PHX REP #$20 LDY.b #SpriteCode1_GSU>>16 ;\ LDA.w #SpriteCode1_GSU ;/This code will load the SuperFX code in ROM JSR $1E80 PLX RTS org $01A365 GetDrawInfoBnk1: REP #$20 STX !R9 LDY.b #GetDrawInfoBnk1_GSU>>16 ;\ LDA.w #GetDrawInfoBnk1_GSU ;/This code will load the SuperFX code in ROM JSR $1E80 LDX !R9 LDA $75C4,x ;\ This is a RAM related to off-screen... BNE + ;/ If this isn't zero, pull A and return to new routine? LDY $75EA,x ;RAM_SprOAMIndex ; Y = Index into sprite OAM RTS + PLA ;\ I don't understand much, from what I know... PLA ; | This pulls A two times and returns to original routine. RTS ;/ Without OAM Index. This saves a BIT of time, the original didn't had this. pullpc arch superfx SpriteCode1_GSU: CACHE ; Put code in C-RAM IBT R1,#$00 ;\ Set up variables IBT R2,#$04 ;/ TO R3 ;\ Set Multiplicands and Multipliers LDW (R1) ; | INC R1 ; | INC R1 ; | TO R4 ; | LDW (R1) ;/ FROM R3 ;\ Do Unsigned Multiplication UMULT R4 ;/ STW (R2) ; Save Product INC R1 ;\ Set Multiplicands and Multipliers TO R5 ; | LDW (R1) ;/ FROM R3 ;\ Do Signed Multiplication MULT R5 ;/ INC R2 ;\ Save Product (on register) TO R6 ; | LDW (R2) ; | WITH R6 ; | ADD R0 ;/ WITH R1 ;\ Set Multiplicands and Multipliers ROR ; | TO R3 ; | LDW (R1) ;/ FROM R3 ;\ Do Signed Multiplication MULT R4 ;/ FROM R6 ;\ Save Product (for real) ADD R0 ; | STB (R2) ;/ FROM R3 ;\ Multiplicands and Multipliers already set... MULT R5 ;/ Multiply directly! INC R2 ;\ Store Product STB (R2) ;/ STOP GetDrawInfoBnk1_GSU: base $0000 CACHE ; Cache WITH R9 ;\ Fix Data LOB ;/ IBT R0,#$01 ;\ Set for later operations ^^ ROMB ;/ SUB R0 ;\ STZ.w $186C,x IWT R1,#$186C ; | WITH R1 ; | ADD R9 ; | STB (R1) ;/ IWT R1,#$15A0 ;\ STZ.w $15A0,x WITH R1 ; | ADD R9 ; | STB (R1) ;/ MOVE R10,R0 ; Data = $00 -> Copy MOVE R8,R1 ; Address = $15A0+X -> Copy IWT R3,#$14E0 WITH R3 ADD R9 IWT R1,#$E4 ;\ LDA $E4,x WITH R1 ; | ADD R9 ; | LDB (R1) ;/ MOVE R7,R0 ; Copy data IBT R1,#$1A ;\ CMP $1A TO R2 ; | LDB (R1) ; | CMP R2 ;/ ;\ LDA $14E0,x ; | ; | LDB (R3) ;/ MOVE R6,R0 ; Address = $14E0+X -> Copy INC R1 ;\ SBC $1B TO R3 ; | LDB (R1) ; | SBC R3 ;/ BEQ CODE_01A379 INC R10 ;\ INC $15A0 FROM R10 ; | STB (R8) ;/ CODE_01A379: MOVE R10,R2 LMS R2,($1A/2) ;<> Fix an ANNOYING bug FROM R6 ; LDA $14E0,x SWAP ; XBA ;\ LDA $E4,x ADD R7 ;/ Note: Merge data by doing R0+R3 with data on R0 being on high byte and R3 on low byte ;\ REP #$20 : SEC : SBC $1A SUB R2 ;/ IBT R3,#$40 ;\ CLC : ADC #$0040 : CMP #$0180 IWT R4,#$0180 ; | ADD R3 ; | ;/ IWT R1,#$15C4 ;\ STA $15C4,x WITH R1 ; | ADD R9 ; | CMP R4 ; | ROL ; | AND #1 ; | ALT1 ; | INVALID will be always a STOP. Store/ALT operations affects nothing. BNE INVALID ; |<> (Use a trick to get out a NOP) STW (R1) ;/ But this is needed, basically a sanity check. IBT R12,#$01 ; <"LDY #$00"> IBT R1,#$09 ;\ LDA $14C8,x : CMP #$09 IBT R2,#$20 ; | IWT R3,#$14C8 ; | WITH R3 ; | ADD R9 ; | LDB (R3) ; | CMP R1 ;/ BEQ CODE_01A3A6 CACHE IWT R3,#$190F ;\ LDA $190F,x : AND #$20 WITH R3 ; | ADD R9 ; | LDB (R3) ; | AND R2 ;/ BEQ CODE_01A3A6 CACHE INC R12 ; CACHE ;\ If LOOP instruction is executed CODE_01A3A6: ; | (Each branch contains CACHE RAM opcode. Don't waste with NOPs.) MOVE R13,R15 ;/ Run data from cache rather than ROM/SRAM IBT R2,#$00 ;\ Zero Registers IBT R3,#$00 ;/ IWT R1,#$D8 ;\ LDA $D8,x WITH R1 ; | ADD R9 ; | LDB (R1) ;/ MOVE R5,R0 ;<> Load $D8,x data on Temporary register R5 SEX ;<> Make able to have corrected result using extended sign bit IWT R14,#$A360 ;\ ADC DATA_01A361,y WITH R14 ; | ADD R12 ; | TO R1 ; | GETBS ; | ADD R1 ;/ LOB ;| Fix an issue where the CMP weren't being properly done WITH R2 ;\ PHP ROL ;/ IBT R1,#$1C ;\ CMP $1C TO R4 ; | LDB (R1) ; | CMP R4 ;/ TO R6 ;\ ROL $00 LDB (R3) ; | WITH R6 ; | ROL ;/ PLP would be here but to fix some issues... IWT R11,#$14D4 ;\ LDA $14D4,x : ADC #$00 WITH R11 ; | LSR $00 : SBC $1D ADD R9 ; | LDB (R11) ; | WITH R2 ;\ PLP ROR ;/ ADC #0 ; | WITH R6 ; | LSR ; | INC R1 ; | WITH R2 ; | LDB (R1) ; | SBC R2 ;/ BEQ CODE_01A3C6 INC R14 ;\ (Get correct data) INC R14 ; | IWT R1,#$186C ; | LDA $186C,x : ORA DATA_01A362,y : STA $186C,x WITH R1 ; | ADD R9 ; | LDB (R1) ; | TO R2 ; | GETB ; | OR R2 ; | STB (R1) ;/ CODE_01A3C6: LOOP ; Go back! FROM R7 ;\ LDA $E4,x : SUB $1A : STA $00 SUB R10 ; | STB (R3) ;/ FROM R5 ;\ LDA $D8,x : SUB $1C : STA $01 SUB R4 ; | INC R3 ; | STB (R3) ;/ INVALID: STOP base off arch 65816