;Not sure if this file is actually compilable lorom ;Multiplication optimization: ;80:82D6 ;DA8CEB05E2108C0242A88C03428DE9059CF305ACEA05AD16428C03428DF105ACEC05ADF205186D16428C0242ACE9058C0342ACEA05EAEA6D16428C03428DF205C230ADF305186D16428DF305FA6B ;Was ;DA8DE9058CEB059CF1059CF305E210ACEB058C0242ACE9058C0342EAEAEAAD16428DF105ACEA058C0342EAADF205186D16428DF205ACEC058C0242ACE9058C0342EAADF205186D16428DF205ACEA058C0342EAEAADF305186D16428DF305C230FA6B ;Even newer version: ;77 bytes, 110+ cycles PHX STY $05EB ;5 SEP #$10 ;3 STY $4202 ;4 STA $4203 ;5 ;lo-lo STA $05E9 ;5 TAX ;2 STZ $05F3 ;5 LDY $05EA ;4 LDA $4216 ;5 STY $4203 ;4 ;hi-lo STA $05F1 ;5 LDY $05EC ;4 LDA $4216 ;5 STY $4202 ;4 STX $4203 ;4 ;lo-hi CLC ;2 ADC $05F2 ;5 LDY $05EA ;4 ADC $4216 ;5 STY $4203 ;4 ;hi-hi STA $05F2 ;5 REP #$10 ;3 LDA $05F3 ;5 BCC + ADC #$00FF ;3 + ADC $4216 ;5 STA $05F3 ;5 PLX RTL ;Free up some debug ram ;xkas code start: org $80802F PHP PHB SEP #$20 LDA #$FF STA $002140 LDY $00 LDA $02 PHA PLB REP #$30 JSR $8059 PLB PLP RTS ;padbyte $00 : pad $808059 ;xkas code end ;I will improve the RNG with MADNESS! ;Take 2. Now with carry trickery to prevent probable 0's org $808111 LDA $05E5 ADC $05B6 STA $4202 ;FEDCBA98 76543210 ROR ROR ROR ROR ;210XFEDC BA987654 3 XBA ;BA987654 210XFEDC 3 BCC + ADC #$000F + ADC $4216 ROR ROR ROR ROR ;EDC3BA98 7654210X F BCC + ADC #$0FFF + STA $05E5 RTL ;Mad enough it seems. :D ;org $808111 ; ADC $05E5 ; ADC $05B6 ; ADC #$12B4 ; STA $4202 ; ROR ; ROR ; ROR ; ROR ; XBA ; ADC $4216 ; ROR ; ROR ; ROR ; ROR ; ADC #$0011 ; STA $05E5 ; RTL ;OAM Optimization. Might as well do it now. org $80896E PHP LDA $0590 CMP $07FD BPL + ;If minus, carry will be cleared. Yay LDA #$8001 STA $4303 STA $4300 LDA $07FD ADC #$0009 ;Assuming 2 page breaks and skipping SEC SBC $0590 ;Originally 4 bytes per sprite LSR ;2 bytes DMAed per sprite ; LSR ;1 word DMAed per sprite. Or not? STA $4305 ;Total bytes to DMA LDA $0590 ADC #$0371 STA $2181 SBC #$0300 XBA AND #$000F ;Number of page breaks to skip ASL ;2 bytes skipped per page break STA $12 LDA $0590 LSR ;2 bytes skipped per 4 bytes of sprites ADC $12 ADC #OamClearTable ;start of OAM Clearing table STA $4302 SEP #$20 STZ $2183 LDA #$01 STA $420B REP #$20 LDA $0590 + STA $07FD STZ $0590 PLP RTL ;Code length: < $60. It'll fit. macro OamVClearA(pos) { db $F0, +$5, $F0, +$9, $F0, +$D } endmacro macro OamVClearB(pos) { db $F0, +$1, $F0, +$5, $F0, +$9, $F0, +$D } endmacro OamClearTable: %OamVClearA($70) %OamVClearB($80) %OamVClearB($90) %OamVClearB($A0) %OamVClearB($B0) %OamVClearB($C0) %OamVClearB($D0) %OamVClearB($E0) %OamVClearB($F0) db $F0, $FF %OamVClearB($00) %OamVClearB($10) %OamVClearB($20) %OamVClearB($30) %OamVClearB($40) %OamVClearB($50) %OamVClearB($60) %OamVClearB($70) %OamVClearB($80) %OamVClearB($90) %OamVClearB($A0) %OamVClearB($B0) %OamVClearB($C0) %OamVClearB($D0) %OamVClearB($E0) %OamVClearB($F0) db $F0, $FF %OamVClearB($00) %OamVClearB($10) %OamVClearB($20) %OamVClearB($30) %OamVClearB($40) %OamVClearB($50) %OamVClearB($60) db $F0, $6D, $F0, $6D, $F0, $6D, $F0 ;Table size: $10B org $80875D ; LDA #$01 ; STA $4200 ; STA $84 ; STZ $4201 ; STZ $4202 ; STZ $4203 ; STZ $4204 ; STZ $4205 ; STZ $4206 ; STZ $4207 ; STZ $4208 ; STZ $4209 ; STZ $420A ; STZ $420B ; STZ $420C ; STZ $85 ; LDA #$01 ; STA $420D ; STA $86 ; RTS LDA #$01 STA $4200 STA $84 REP #$20 STZ $4201 STZ $4203 STZ $4205 STZ $4207 STZ $4209 STZ $420B LDA #$0200 STA $07FD SEP #$20 STZ $85 LDA #$01 STA $420D STA $86 RTS