908000 animates Samus 9085E2: draws Samus PHP PHB SEP #$20 LDA #$92 PHA PLB ;Bank Register = $92 REP #$30 LDA $18AA ;check Hurt Timer BNE ALPHA LDA $18A8 ;Check invincibility timer when hurt BEQ ALPHA LDA $0A68 BNE ALPHA ;Check Health Warning (heavy breathing) LDA $05B6 ;frame counter BIT #$0001 ;this actually makes samus flicker when hurt BEQ ALPHA JMP BETA ALPHA: LDA $0A1C ;Samus' current position/state ASL A TAX PHX LDA $929263,x ;index for Tileset to use for Samus' Top Half CLC ADC $0A96 ;current animation frame, STA $0AC8 ;never used PHA JSR $8C1F ;take $0A1F as index and execute code from table PLA JSL $8189AE ;Determine sprite offsets (with A), prepare stuff for DMA ($0370) PLX STX $24 LDA $0A1F ;Samus' Movement type AND #$00FF ASL A TAX JSR ($864E,x) ;Jump to code BCC BETA ;clears when bottom graphics are not needed ;for instance: morph ball LDX $24 ;Samus' current position/state LDA $92945D,x ;source offset table for DMA to VRAM (bottom) CLC ADC $0A96 ;current animation frame; varies between states, of course STA $0ACA ;Which tileset to use for Samus' Bottom half LDX $0B04 ;Samus' X position on screen LDY $0B06 ;Samus' Y position on screen JSL $8189AE ;Determine sprite offsets (with A), prepare stuff for DMA ($0370) BETA: JSL $928000 ;see below PLB PLP RTS 929263 + pose *2 >> 929355: Example: v Morph Ball + Springball on floor R (pose 71) v $90/8618 20 1F 8C JSR $8C1F [$90:8C1F] A:0739 X:00F2 $90/8C1F AD 3F 09 LDA $093F [$92:093F] A:0739 X:00F2 Y:FFFE $90/8C22 10 2B BPL $2B [$8C4F] A:0000 X:00F2 Y:FFFE $90/8C4F 9B TXY A:0000 X:00F2 Y:FFFE $90/8C50 AD 1F 0A LDA $0A1F [$92:0A1F] A:0000 X:00F2 Y:00F2 $90/8C53 29 FF 00 AND #$00FF A:7911 X:00F2 Y:00F2 $90/8C56 0A ASL A A:0011 X:00F2 Y:00F2 $90/8C57 AA TAX A:0022 X:00F2 Y:00F2 $90/8C58 FC 5C 8C JSR ($8C5C,x)[$90:8C94] A:0022 X:0022 Y:00F2 $90/8C94 98 TYA A:0022 X:0022 Y:00F2 $90/8C95 0A ASL A A:00F2 X:0022 Y:00F2 $90/8C96 0A ASL A A:01E4 X:0022 Y:00F2 $90/8C97 AA TAX A:03C8 X:0022 Y:00F2 $90/8C98 BF 2D B6 91 LDA $91B62D,x[$91:B9F5] A:03C8 X:03C8 Y:00F2 $90/8C9C 29 FF 00 AND #$00FF A:0000 X:03C8 Y:00F2 $90/8C9F 89 80 00 BIT #$0080 A:0000 X:03C8 Y:00F2 $90/8CA2 F0 03 BEQ $03 [$8CA7] A:0000 X:03C8 Y:00F2 $90/8CA7 85 12 STA $12 [$00:0012] A:0000 X:03C8 Y:00F2 $90/8CA9 AD FA 0A LDA $0AFA [$92:0AFA] A:0000 X:03C8 Y:00F2 $90/8CAC 38 SEC A:04C9 X:03C8 Y:00F2 $90/8CAD E5 12 SBC $12 [$00:0012] A:04C9 X:03C8 Y:00F2 $90/8CAF 38 SEC A:04C9 X:03C8 Y:00F2 $90/8CB0 ED 15 09 SBC $0915 [$92:0915] A:04C9 X:03C8 Y:00F2 $90/8CB3 8D 06 0B STA $0B06 [$92:0B06] A:00C9 X:03C8 Y:00F2 $90/8CB6 A8 TAY A:00C9 X:03C8 Y:00F2 $90/8CB7 AD F6 0A LDA $0AF6 [$92:0AF6] A:00C9 X:03C8 Y:00C9 $90/8CBA 38 SEC A:02A9 X:03C8 Y:00C9 $90/8CBB ED 11 09 SBC $0911 [$92:0911] A:02A9 X:03C8 Y:00C9 $90/8CBE 8D 04 0B STA $0B04 [$92:0B04] A:009E X:03C8 Y:00C9 $90/8CC1 AA TAX A:009E X:03C8 Y:00C9 $90/8CC2 60 RTS A:009E X:009E Y:00C9 $90/8C5B 60 RTS A:009E X:009E Y:00C9 $90/861B 68 PLA A:009E X:009E Y:00C9 $90/861C 22 AE 89 81 JSL $8189AE[$81:89AE] A:0739 X:009E Y:00C9 $81/89AE 8B PHB A:0739 X:009E Y:00C9 $81/89AF F4 00 92 PEA $9200 A:0739 X:009E Y:00C9 $81/89B2 AB PLB A:0739 X:009E Y:00C9 $81/89B3 AB PLB A:0739 X:009E Y:00C9 $81/89B4 84 12 STY $12 [$00:0012] A:0739 X:009E Y:00C9 $81/89B6 86 14 STX $14 [$00:0014] A:0739 X:009E Y:00C9 $81/89B8 0A ASL A A:0739 X:009E Y:00C9 $81/89B9 AA TAX A:0E72 X:009E Y:00C9 $81/89BA BC 8D 80 LDY $808D,x[$92:8EFF] A:0E72 X:0E72 Y:00C9 Table for Sprite offsets $81/89BD B9 00 00 LDA $0000,y[$92:BAE3] A:0E72 X:0E72 Y:BAE3 Current Sprite offset $81/89C0 F0 73 BEQ $73 [$8A35] A:0005 X:0E72 Y:BAE3 $81/89C2 85 18 STA $18 928000: Has todo with Samus' gfx offsets 7E:071D Flag - Samus's top sprites need to be loaded to VRAM. 7E:071E Flag - Samus's bottom sprites need to be loaded to VRAM. 7E:071F - 7E:0720 Pointer to DMA data (bank 92) for Samus's top sprites (3 byte address, 2 byte part 1 size, 2 byte part 2 size) 7E:0721 - 7E:0722 Pointer to DMA data (bank 92) for Samus's bottom sprites (3 byte address, 2 byte part 1 size, 2 byte part 2 size) $92:8000 The interesting stuff (values in AXY for morphball with Springball R): LDA $0A96 [$92:0A96] A:0022 X:0022 Y:BB0A ;Current Animation Frame (8 total for morphball) ;current frame: 3 ASL A A:0003 X:0022 Y:BB0A ASL A A:0006 X:0022 Y:BB0A STA $12 [$00:0012] A:000C X:0022 Y:BB0A ;AF*4 >> $12 INC A A:000C X:0022 Y:BB0A INC A A:000D X:0022 Y:BB0A STA $14 [$00:0014] A:000E X:0022 Y:BB0A ;AF*4+2 >> $14 Size of Current animation frame bottom LDA $0A1C [$92:0A1C] A:000E X:0022 Y:BB0A ;current pose ASL A A:0079 X:0022 Y:BB0A TAX A:00F2 X:0022 Y:BB0A LDA $D94E,x[$92:DA40] A:00F2 X:00F2 Y:BB0A ;Table for DMA source pointer (7 bytes: 3 source, 2 part 1 size, 2 part 2 size) CLC A:E5A8 X:00F2 Y:BB0A ADC $12 [$00:0012] A:E5A8 X:00F2 Y:BB0A ;Offset from table + AF*4 >> size of 4 bytes per AF TAX A:E5B4 X:00F2 Y:BB0A LDA $0000,x[$92:E5B4] A:E5B4 X:E5B4 Y:BB0A AND #$00FF A:050A X:E5B4 Y:BB0A STA $16 [$00:0016] A:000A X:E5B4 Y:BB0A ASL A A:000A X:E5B4 Y:BB0A TAY A:0014 X:E5B4 Y:BB0A ; Y = first byte * 2 INX A:0014 X:E5B4 Y:0014 LDA $0000,x[$92:E5B5] A:0014 X:E5B5 Y:0014 AND #$00FF A:0005 X:E5B5 Y:0014 STA $0B24 [$92:0B24] A:0005 X:E5B5 Y:0014 ;Temp value, used during Samus's graphics calculations ASL A A:0005 X:E5B5 Y:0014 5 * 7 = 35 = 0x23 ASL A A:000A X:E5B5 Y:0014 ASL A A:0014 X:E5B5 Y:0014 SEC A:0028 X:E5B5 Y:0014 SBC $0B24 [$92:0B24] A:0028 X:E5B5 Y:0014 STA $12 [$00:0012] A:0023 X:E5B5 Y:0014 ;Number * 7 LDA $D91E,y[$92:D932] A:0023 X:E5B5 Y:0014 ;Y = AF index for GFX offset table CLC A:D613 X:E5B5 Y:0014 ADC $12 [$00:0012] A:D613 X:E5B5 Y:0014 STA $071F [$92:071F] A:D636 X:E5B5 Y:0014 ;Pointer = 92D91E + second byte ;this way determines the GFX' LONG pointer table ;071F = Top Half GFX (3 byte address, 2 byte part 1 size, 2 byte part 2 size) SEP #$20 A:D636 X:E5B5 Y:0014 LDA #$01 A:D636 X:E5B5 Y:0014 STA $071D [$92:071D] A:D601 X:E5B5 Y:0014 ;samus' top needs to be transferred into VRAM with DMA REP #$20 A:D601 X:E5B5 Y:0014 ;Top Part is done LDA $0A1C [$92:0A1C] A:D601 X:E5B5 Y:0014 ;same for samus' bottom gfx again (duh...) ASL A A:0079 X:E5B5 Y:0014 TAX A:00F2 X:E5B5 Y:0014 LDA $D94E,x[$92:DA40] A:00F2 X:00F2 Y:0014 CLC A:E5A8 X:00F2 Y:0014 ADC $14 [$00:0014] A:E5A8 X:00F2 Y:0014 TAX A:E5B6 X:00F2 Y:0014 LDA $0000,x[$92:E5B6] A:E5B6 X:E5B6 Y:0014 ;0 because there are no gfx to load AND #$00FF A:0000 X:E5B6 Y:0014 CMP #$00FF A:0000 X:E5B6 Y:0014 BEQ $27 [$808A] A:0000 X:E5B6 Y:0014 ASL A A:0000 X:E5B6 Y:0014 TAY A:0000 X:E5B6 Y:0014 INX A:0000 X:E5B6 Y:0000 LDA $0000,x[$92:E5B7] A:0000 X:E5B7 Y:0000 AND #$00FF A:0A00 X:E5B7 Y:0000 STA $0B26 [$92:0B26] A:0000 X:E5B7 Y:0000 ;size calculation I guess ASL A A:0000 X:E5B7 Y:0000 ASL A A:0000 X:E5B7 Y:0000 ASL A A:0000 X:E5B7 Y:0000 SEC A:0000 X:E5B7 Y:0000 SBC $0B26 [$92:0B26] A:0000 X:E5B7 Y:0000 STA $14 [$00:0014] A:0000 X:E5B7 Y:0000 ;and thus it is 0, there's nothing to animate for Morphball here LDA $D938,y[$92:D938] A:0000 X:E5B7 Y:0000 ;unrelated junk when morphballing CLC A:D19E X:E5B7 Y:0000 ADC $14 [$00:0014] A:D19E X:E5B7 Y:0000 STA $0721 [$92:0721] A:D19E X:E5B7 Y:0000 SEP #$20 A:D19E X:E5B7 Y:0000 LDA #$01 A:D19E X:E5B7 Y:0000 STA $071E [$92:071E] A:D101 X:E5B7 Y:0000