@includefrom superfx.asm 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 BNE + LDY.W $75EA,X RTS + PLA PLA RTS 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 LDB (R1) ; | INC R1 ; | INC R1 ; | TO R4 ; | LDB (R1) ;/ FROM R3 ;\ Do Unsigned Multiplication UMULT R4 ;/ STW (R2) ; Save Product INC R1 ;\ Set Multiplicands and Multipliers TO R5 ; | LDB (R1) ;/ FROM R3 ;\ Do Signed Multiplication MULT R5 ;/ INC R2 ;\ Save Product (on register) TO R6 ; | LDB (R2) ; | WITH R6 ; | ADD R0 ;/ WITH R1 ;\ Set Multiplicands and Multipliers ROR ; | TO R3 ; | LDB (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 ; | BNE INVALID ; |<> (Use a trick to get out a NOP) STW (R1) ; / 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 NOP IWT R3,#$190F ;\ LDA $190F,x : AND #$20 WITH R3 ; | ADD R9 ; | LDB (R3) ; | AND R2 ;/ BEQ CODE_01A3A6 CACHE INC R12 ; CODE_01A3A6: ; Loopback MOVE R13,R15 IWT R14,#$A360 WITH R14 ADD R12 IBT R2,#$00 IBT R3,#$00 IWT R1,#$D8 WITH R1 ADD R9 LDB (R1) MOVE R5,R0 TO R1 GETB ADD R1 WITH R2 ROL IBT R1,#$1C TO R4 LDB (R1) CMP R4 LDB (R3) TO R8 ROL IWT R2,#$14D4 WITH R2 ADD R9 LDB (R2) TO R2 ADC R3 FROM R8 LSR STB (R3) INC R1 TO R1 LDB (R1) FROM R2 SBC R1 BEQ CODE_01A3C6 INC R14 ;\ LDA $186C,x : ORA DATA_01A362,y : STA $186C,x INC R14 ; | IWT R1,#$186C ; | WITH R1 ; | ADD R9 ; | LDB (R1) ; | TO R2 ; | GETB ; | OR R2 ; | STB (R1) ;/ CODE_01A3C6: LOOP CACHE CODE_01A3CD: IBT R1,#$00 FROM R7 SUB R10 STB (R1) FROM R5 SUB R4 INC R1 STB (R1) INVALID: STOP base off arch 65816