Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bg_collision_check:
- ; Check if a given coordinate collides with the background.
- ;
- ; Parameters:
- ; $08 = x pixel
- ; $09 = screen number
- ; $0A = y pixel
- ; $0B = offscreen flag
- ; $55 = sprite collision override table length
- ; $56 = sprite collision override table
- ;
- ; Return values:
- ; $00 = type of tile at this position
- ; 0 = air
- ; 1 = ground
- ; 2 = ladder
- ; 3 = spikes
- ; 4 = water
- ; 5 = right conveyor belt
- ; 6 = left conveyor belt
- ; 7 = ice
- ; 8 = door scroll/side-only barrier
- 0F:CB9F: A4 55 LDY num_solid_sprites
- solid_sprite_lookup_loop:
- ; Check the sprite collision override table.
- ; These tables co-opt standard sprite variables to store a
- ; coordinate bitmask, coordinate compare value, and tile type
- ; to register as.
- ; The input coordinates are ANDed with the masks and compared
- ; directly to the sprite positions.
- ;
- ; This system was only used for solid tiles and door barriers.
- ; It can also work for air, spikes, conveyor belts, and ice,
- ; but has trouble with ladders and water for some reason
- ; (They act as air).
- 0F:CBA1: 88 DEY
- 0F:CBA2: 30 1C BMI +
- 0F:CBA4: B6 56 LDX solid_sprites,Y
- 0F:CBA6: A5 08 LDA $08
- 0F:CBA8: 3D 10 06 AND solid_sprite_x_masks[0],X
- 0F:CBAB: DD 50 06 CMP solid_sprite_x_pos[0],X
- 0F:CBAE: D0 F1 BNE solid_sprite_lookup_loop
- 0F:CBB0: A5 0A LDA $0A
- 0F:CBB2: 3D 30 06 AND solid_sprite_y_masks[0],X
- 0F:CBB5: DD 70 06 CMP solid_sprite_y_pos[0],X
- 0F:CBB8: D0 E7 BNE solid_sprite_lookup_loop
- ; Found a match. Return the solid sprite tile type.
- 0F:CBBA: BD F0 04 LDA solid_sprite_types[0],X
- 0F:CBBD: 85 00 STA $00
- 0F:CBBF: 60 RTS -----------------------------------------
- +:
- ; Load level data bank.
- ; Banks 0 - 7 store level data. Data for each Wily stage follows
- ; data for each main Robot Master stage.
- 0F:CBC0: A5 2A LDA stage_num
- 0F:CBC2: 29 07 AND #$07
- 0F:CBC4: 20 00 C0 JSR bank_switch
- 0F:CBC7: A9 00 LDA #$00
- 0F:CBC9: 85 00 STA $00
- ; If $0B is...
- ; 0: sprite is on-screen
- ; negative: sprite is above screen
- ; positive: intangible?
- 0F:CBCB: A5 0B LDA $0B
- 0F:CBCD: F0 09 BEQ ++
- 0F:CBCF: 30 03 BMI +
- 0F:CBD1: 4C 3E CC JMP exit_bg_collision_check
- +:
- ; If $0B is negative, set y_pixel to 0.
- ; This effectively makes the top tile extend infinitely offscreen
- ; for collision purposes.
- 0F:CBD4: A9 00 LDA #$00
- 0F:CBD6: 85 0A STA $0A
- ++:
- ; Set up pointer in $0C and $0D
- ; Set up offset in $00
- 0F:CBD8: A5 08 LDA $08
- 0F:CBDA: 4A LSR
- 0F:CBDB: 4A LSR
- 0F:CBDC: 29 38 AND #$38
- 0F:CBDE: 85 00 STA $00
- 0F:CBE0: A5 0A LDA $0A
- 0F:CBE2: 0A ASL
- 0F:CBE3: 2A ROL
- 0F:CBE4: 2A ROL
- 0F:CBE5: 2A ROL
- 0F:CBE6: 29 07 AND #$07
- 0F:CBE8: 05 00 ORA $00
- 0F:CBEA: 85 00 STA $00
- 0F:CBEC: A9 00 LDA #$00
- 0F:CBEE: 85 0C STA $0C
- 0F:CBF0: A5 09 LDA $09
- 0F:CBF2: 4A LSR
- 0F:CBF3: 66 0C ROR $0C
- 0F:CBF5: 4A LSR
- 0F:CBF6: 66 0C ROR $0C
- 0F:CBF8: 18 CLC
- 0F:CBF9: 69 85 ADC #$85
- 0F:CBFB: 85 0D STA $0D
- 0F:CBFD: A4 00 LDY $00
- ; I believe this loads the metatile ID.
- 0F:CBFF: B1 0C LDA ($0C),Y
- 0F:CC01: 85 0C STA $0C
- 0F:CC03: A9 20 LDA #$20
- 0F:CC05: 06 0C ASL $0C
- 0F:CC07: 2A ROL
- 0F:CC08: 06 0C ASL $0C
- 0F:CC0A: 2A ROL
- 0F:CC0B: 85 0D STA $0D
- 0F:CC0D: A0 00 LDY #$00
- 0F:CC0F: A5 08 LDA $08
- 0F:CC11: 29 10 AND #$10
- 0F:CC13: F0 02 BEQ +
- 0F:CC15: C8 INY
- 0F:CC16: C8 INY
- +:
- 0F:CC17: A5 0A LDA $0A
- 0F:CC19: 29 10 AND #$10
- 0F:CC1B: F0 01 BEQ +
- 0F:CC1D: C8 INY
- +:
- ; Load the type of tile we collided with.
- 0F:CC1E: B1 0C LDA ($0C),Y
- 0F:CC20: 85 00 STA $00
- 0F:CC22: 06 00 ASL $00
- 0F:CC24: 2A ROL
- 0F:CC25: 06 00 ASL $00
- 0F:CC27: 2A ROL
- 0F:CC28: 29 03 AND #$03
- 0F:CC2A: 85 00 STA $00
- ; $00 now contains the tile type, from 0 to 3.
- ; 0 = air
- ; 1 = ground
- ; 2 and 3 = special, determined by the table at $CC44.
- 0F:CC2C: 4A LSR
- 0F:CC2D: F0 0F BEQ exit_bg_collision_check
- ; X = 2 * stage_num + (tile_type - 2)
- 0F:CC2F: C6 00 DEC $00
- 0F:CC31: C6 00 DEC $00
- 0F:CC33: A5 2A LDA stage_num
- 0F:CC35: 0A ASL
- 0F:CC36: 65 00 ADC $00
- 0F:CC38: AA TAX
- ; There are two special tile entries for each stage.
- ;
- ; They indicate whether it's supposed to be a ladder,
- ; conveyor belt, etc.
- 0F:CC39: BD 44 CC LDA stage_special_tiles,X
- 0F:CC3C: 85 00 STA $00
- exit_bg_collision_check:
- ; Hardcoded switch back to bank E!
- 0F:CC3E: A9 0E LDA #$0E
- 0F:CC40: 20 00 C0 JSR bank_switch
- 0F:CC43: 60 RTS -----------------------------------------
- stage_special_tiles:
- ; Two entries for each stage, indicating what tile types
- ; 2 and 3 should be (0 and 1 are air and ground).
- .db 2, 3, 2, 3, 2, 0, 4, 3, 0, 3, 2, 7, 5, 6, 2, 3
- .db 2, 0, 2, 3, 4, 3, 2, 3, 0, 0, 0, 0, $20, $9f, $cb, $a9 ; these last 4 are actually code. There's no stage that would even load them.
- ; The erroneously disassembled table, 'cause why not
- 0F:CC44: 02 UNDEFINED
- 0F:CC45: 03 UNDEFINED
- 0F:CC46: 02 UNDEFINED
- 0F:CC47: 03 UNDEFINED
- 0F:CC48: 02 UNDEFINED
- 0F:CC49: 00 BRK
- 0F:CC4A: 04 UNDEFINED
- 0F:CC4B: 03 UNDEFINED
- 0F:CC4C: 00 BRK
- 0F:CC4D: 03 UNDEFINED
- 0F:CC4E: 02 UNDEFINED
- 0F:CC4F: 07 UNDEFINED
- 0F:CC50: 05 06 ORA $06
- 0F:CC52: 02 UNDEFINED
- 0F:CC53: 03 UNDEFINED
- 0F:CC54: 02 UNDEFINED
- 0F:CC55: 00 BRK
- 0F:CC56: 02 UNDEFINED
- 0F:CC57: 03 UNDEFINED
- 0F:CC58: 04 UNDEFINED
- 0F:CC59: 03 UNDEFINED
- 0F:CC5A: 02 UNDEFINED
- 0F:CC5B: 03 UNDEFINED
- 0F:CC5C: 00 BRK
- 0F:CC5D: 00 BRK
- 0F:CC5E: 00 BRK
- 0F:CC5F: 00 BRK
- 0F:CC60: 20 9F CB JSR bg_collision_check
- 0F:CC63: A9 0B LDA #$0B
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement