| Prev: 6068 | Up: Map | Next: 6124 |
60A5: Render player plane and terrain fragments
|
Top-level render routine called from main loop (main_loop). Orchestrates visual updates in a specific order to prevent flicker.
|
||||
|
Render sequence:
Speed affects the number of terrain fragments rendered per frame and the sprite animation frame selection.
|
||||
| render_plane_and_terrain | 60A5 | LD A,($5F68) | Skip plane rendering if not GAMEPLAY_MODE_NORMAL. | |
| 60A8 | CP $00 | |||
| 60AA | JP NZ,render_terrain_fragments | |||
| 60AD | LD A,$00 | Set collision mode to NONE for plane (no collision during render). | ||
| 60AF | LD ($5EF5),A | |||
| 60B2 | LD A,($5F72) | Calculate plane sprite frame: offset = (8 - speed) * 2. | ||
| 60B5 | LD C,A | |||
| 60B6 | LD A,($5F64) | |||
| 60B9 | LD E,A | |||
| 60BA | LD A,$08 | |||
| 60BC | SUB E | |||
| 60BD | LD D,$00 | |||
| 60BF | LD E,A | |||
| 60C0 | SLA E | |||
| 60C2 | LD HL,($5EF7) | Apply offset to sprite pointer. | ||
| 60C5 | ADD HL,DE | |||
| 60C6 | LD ($8B0E),HL | |||
| 60C9 | ADD A,$80 | Calculate plane Y: Y = $88 - speed. However, movement handlers (handle_right, handle_left, render_plane) always use the fixed PLANE_COORDINATE_Y ($80), so this speed-dependent value has no visible effect. | ||
| 60CB | LD B,A | |||
| 60CC | LD A,($5F64) | |||
| 60CF | LD D,A | |||
| 60D0 | LD ($8B0A),BC | Set plane coordinates for rendering. | ||
| 60D4 | LD ($8B0C),BC | |||
| 60D8 | LD E,$00 | Render plane: width=2, size=$10, attrs=$00. | ||
| 60DA | LD BC,$0010 | |||
| 60DD | LD A,$02 | |||
| 60DF | LD HL,$82F5 | |||
| 60E2 | CALL render_object | |||
| render_terrain_fragments | 60E5 | CALL scroll_screen | Render islands. | |
| 60E8 | LD A,($5F64) | Calculate starting screen row based on speed. | ||
| 60EB | LD DE,$0100 | |||
| 60EE | LD HL,$4000 | |||
| 60F1 | OR A | |||
| 60F2 | SBC HL,DE | |||
| calculate_screen_row_loop | 60F4 | ADD HL,DE | HL = screen_start + (speed * $100). | |
| 60F5 | DEC A | |||
| 60F6 | JR NZ,calculate_screen_row_loop | |||
| 60F8 | LD ($5F7B),HL | Store screen pointer to screen_ptr. | ||
| 60FB | LD A,($5F64) | Set up terrain fragment loop (count = speed). | ||
| 60FE | LD B,A | |||
| 60FF | LD A,($5EEE) | |||
| 6102 | LD C,A | |||
| render_terrain_loop | 6103 | INC C | Increment fragment counter. | |
| 6104 | LD A,C | |||
| 6105 | PUSH BC | |||
| 6106 | AND $07 | Every 8 fragments, scroll attributes. | ||
| 6108 | CP $00 | |||
| 610A | CALL Z,scroll_attributes | |||
| 610D | CALL render_terrain_fragment | Render terrain fragment. | ||
| 6110 | LD DE,$0100 | Move screen pointer up one row ($100 bytes). | ||
| 6113 | LD HL,($5F7B) | |||
| 6116 | OR A | |||
| 6117 | SBC HL,DE | |||
| 6119 | LD ($5F7B),HL | |||
| 611C | POP BC | |||
| 611D | DJNZ render_terrain_loop | Loop until all fragments rendered. | ||
| 611F | LD A,C | Store updated fragment counter. | ||
| 6120 | LD ($5EEE),A | |||
| 6123 | RET | |||
| Prev: 6068 | Up: Map | Next: 6124 |