experimental/shot_panel_left.s

Download file

Release 2026-11-04-r2 · SHA256 6ba23884b561196f9f5e02dc5ae604d1fb08233a8f67d7094a690576191d47fb · Click a line number for a direct link.

1    .ifndef WITH_REFINEMENTS2    .equ WITH_REFINEMENTS,03    .endif4    .ifndef WITH_REPLAY_HUD5    .equ WITH_REPLAY_HUD,06    .endif7    .equ MAGIC,0xFFF6408    .equ SHOOT,0xFFF642                | shooter object + 19    .equ CHG,0xFFF64410    .equ SHOW,0xFFF64611    .equ LIVE,0xFFF64812    .equ BLINK,0xFFF64A13    .equ OBJ,0xFFFFB04A14    .equ TILE,0x7E1                    | crowd.s bar tiles: +0 black 32x8, +4 white, +8 red, partials15    .equ PANEL,0xFFF64C                | 1 while the panel is in the HUD plane16    .equ HELD,0xFFF64E                 | last shot held throughout automatic replay17    .equ KMH,0xFFF65018    .equ MPH,0xFFF65219    .equ STILE,0x7E1                   | r38: the bar's own 4 tiles (crowd.s mkbar), HUD-plane cells20    .equ SBUF,0xFFEA00                 | crowd.s BBUF+25621    .equ VDATA,0xC0000022    .equ VCTRL,0xC0000423 .text24 .globl _start25_start:26 bra.w panel_left27 bra.w badge_available28 bra.w wipe_logo29 bra.w compact_clear30 bra.w above_owned31| Compact shot display uses only the native NHL badge's 7x2 interior.32| Actual native penalty text owns that same interior: fall back above it.33| Availability reads VDP memory atomically and accepts only NHL/our own cells.34badge_available:35 movem.l %d1-%d7/%a0-%a2,-(%sp)36 move.w %sr,-(%sp)37 ori.w #0x700,%sr38 suba.w #28,%sp39 movea.l %sp,%a040 move.w #0x8F02,VCTRL41 move.l #0x2C820003,VCTRL42 moveq #6,%d143badge_read1:44 move.w VDATA,(%a0)+45 dbra %d1,badge_read146 move.l #0x2D020003,VCTRL47 moveq #6,%d148badge_read2:49 move.w VDATA,(%a0)+50 dbra %d1,badge_read251 movea.l %sp,%a052 move.w #0xA1C8,%d153 moveq #13,%d254badge_logo_check:55 cmp.w (%a0)+,%d156 bne.s badge_check_ours57 addq.w #1,%d158 dbra %d2,badge_logo_check59 moveq #2,%d060 bra.w badge_done61badge_check_ours:62 movea.l %sp,%a063 moveq #6,%d264badge_bar_check:65 move.w (%a0)+,%d166 cmpi.w #0xA403,%d167 beq.s badge_bar_next68 cmpi.w #0x841B,%d169 beq.s badge_bar_next70 tst.w HELD71 beq.s badge_check_bar_tile72 cmpi.w #0x07FF,%d173 beq.s badge_bar_next74badge_check_bar_tile:75 andi.w #0x9FFF,%d176 cmpi.w #0x87E1,%d177 bcs.w badge_foreign78 .if WITH_REFINEMENTS79 cmpi.w #0x87E6,%d180 .else81 cmpi.w #0x87E4,%d182 .endif83 bhi.w badge_foreign84badge_bar_next:85 dbra %d2,badge_bar_check86 movea.l %a0,%a287 moveq #6,%d288badge_blank_check:89 move.w (%a0)+,%d190 cmpi.w #0xA403,%d191 beq.s badge_blank_next92 tst.w HELD93 beq.s badge_font_check94 cmpi.w #0x07FF,%d195 bne.s badge_font_check96badge_blank_next:97 dbra %d2,badge_blank_check98 moveq #1,%d099 bra.s badge_done100badge_font_check:101 movea.l %a2,%a0102 lea compact_map,%a1103 moveq #6,%d2104badge_font_loop:105 cmpm.w (%a0)+,(%a1)+106 bne.s badge_foreign107 dbra %d2,badge_font_loop108 moveq #1,%d0109 bra.s badge_done110badge_foreign:111 moveq #0,%d0112badge_done:113 adda.w #28,%sp114 move.w (%sp)+,%sr115 movem.l (%sp)+,%d1-%d7/%a0-%a2116 tst.w %d0117 rts118compact_map:119 .if WITH_REFINEMENTS120 .word 0x87F4,0x87F5,0x87F6,0xA403,0xA403,0xA403,0xA403121 .else122 .word 0x87F4,0x87F5,0x87F6,0xA403,0x87F7,0x87F8,0x87F9123 .endif124125wipe_logo:126 movem.l %d0-%d2/%a1,-(%sp)127 move.w %sr,-(%sp)128 ori.w #0x700,%sr129 move.w #0x8F02,VCTRL130 move.l #0x2C820003,VCTRL131 move.w VDATA,%d0132 cmpi.w #0xA1C8,%d0133 bne.s wipe_done134 | The common already-erased case costs just one read. Verify all14native135 | badge cells before clearing; penalty text and our existing panel stay intact.136 bsr.w badge_available137 cmpi.w #2,%d0138 bne.s wipe_done139 bsr.w compact_clear140wipe_done:141 move.w (%sp)+,%sr142 movem.l (%sp)+,%d0-%d2/%a1143 rts144compact_clear:145 move.w %sr,-(%sp)146 ori.w #0x700,%sr147 lea VDATA,%a1148 move.w #0x8F02,VCTRL149 move.l #0x6C820003,VCTRL150 moveq #6,%d2151compact_clear1:152 move.w #0xA403,(%a1)153 dbra %d2,compact_clear1154 move.l #0x6D020003,VCTRL155 moveq #6,%d2156compact_clear2:157 move.w #0xA403,(%a1)158 dbra %d2,compact_clear2159 move.w (%sp)+,%sr160 rts161162panel_left:163 movem.l %d0-%d7/%a0-%a1,-(%sp)164 bsr.w badge_available165 .if WITH_REPLAY_HUD && !WITH_REFINEMENTS166 | Native timer redraws can temporarily blank the badge before PP text returns.167 | Actual unequal manpower still owns that interior, even in that blank phase.168 move.w 0xFFFFC6F2,%d1169 cmp.w 0xFFFFCA56,%d1170 beq.s panel_caption_ready171 moveq #0,%d0172panel_caption_ready:173 .endif174 moveq #2,%d2175 tst.w %d0176 beq.s choose_layout177 moveq #1,%d2178choose_layout:179 cmp.w PANEL,%d2180 beq.s layout_ready181 jsr 0x2ED010182layout_ready:183 tst.w PANEL184 bne.s font_cache_ready185 move.l #-1,0xFFE8F6                | a new panel may follow a native VRAM clear186font_cache_ready:187 movem.l (%sp),%d0-%d1188 move.l 16(%sp),%d4189 cmpi.w #1,%d2190 beq.s draw_compact191 jsr 0x2ED014192 bra.s panel_left_done193draw_compact:194 bsr.w compact_panel195panel_left_done:196 movem.l (%sp)+,%d0-%d7/%a0-%a1197 rts198compact_panel:199 move.w %sr,-(%sp)200 ori.w #0x700,%sr201 lea VDATA,%a1202 move.w %d0,%d5203 move.w #0x8F02,VCTRL204 move.l #0x6C820003,VCTRL205 tst.w HELD206 bne.s compact_replay207compact_coloured:208 jsr 0x2ED00C209 move.w %d0,(%a1)210 addq.w #1,%d0211 move.w %d0,(%a1)212 addq.w #1,%d0213 move.w %d0,(%a1)214 addq.w #1,%d0215 move.w %d0,(%a1)216 move.w #0xA403,(%a1)217 move.w #0xA403,(%a1)218 move.w #0xA403,(%a1)219 bra.s compact_speed220compact_replay:221 .if WITH_REPLAY_HUD222 bra.w compact_coloured223 .endif224 move.w CHG,%d6225 subi.w #15,%d6226 bpl.s compact_positive227 moveq #0,%d6228compact_positive:229 cmpi.w #16,%d6230 bls.s compact_capped231 moveq #16,%d6232compact_capped:233 mulu.w #6,%d6234 addi.w #15,%d6235 divu.w #16,%d6236 moveq #0,%d2237compact_dash:238 move.w #0xA403,%d0239 cmp.w %d6,%d2240 bcc.s compact_dash_write241 move.w #0x841B,%d0242compact_dash_write:243 move.w %d0,(%a1)244 addq.w #1,%d2245 cmpi.w #6,%d2246 bcs.s compact_dash247 move.w #0xA403,(%a1)248compact_speed:249 move.l #0x6D020003,VCTRL250 tst.w SHOW251 bne.s compact_numbers252 moveq #6,%d2253compact_blank:254 move.w #0xA403,(%a1)255 dbra %d2,compact_blank256 bra.w compact_done257compact_numbers:258 lea compact_map,%a0259 moveq #6,%d2260compact_map_loop:261 move.w (%a0)+,(%a1)262 dbra %d2,compact_map_loop263 .if WITH_REFINEMENTS264 cmpi.w #1,0xFFFFF8D8265 bne.s compact_kmh266 move.w %d4,%d0267 lea 0x277700,%a0268 bra.s compact_unit_ready269compact_kmh:270 .endif271 move.w %d5,%d0272 lea 0x260000,%a0273 .if WITH_REFINEMENTS274compact_unit_ready:275 .endif276 move.w #0xFE80,%d1277 lea 0xFFE8F6,%a1278 bsr.w compact_font279 .if WITH_REFINEMENTS280 bra.s compact_done281 .endif282 move.w %d4,%d0283 lea 0x277700,%a0284 move.w #0xFEE0,%d1285 lea 0xFFE8F8,%a1286 bsr.w compact_font287compact_done:288 move.w #1,PANEL289 move.w (%sp)+,%sr290 rts291compact_font:292 andi.l #0xFFFF,%d0293 cmpi.w #999,%d0294 bls.s font_capped295 move.w #999,%d0296font_capped:297 tst.w PANEL298 beq.s font_load299 tst.w HELD300 bne.s font_load301 cmp.w (%a1),%d0302 beq.s font_done303font_load:304 move.w %d0,(%a1)305 mulu.w #96,%d0306 adda.l %d0,%a0307 move.l %a0,(%a5)+308 move.w #48,(%a5)+309 move.w %d1,(%a5)+310font_done:311 rts312313| Only erase an above-clock rectangle still carrying BOTH of our full frames.314| Native pause/penalty/period windows have already replaced them: leave intact.315above_owned:316 movem.l %d1-%d2/%a0,-(%sp)317 move.w %sr,-(%sp)318 ori.w #0x700,%sr319 lea above_frame,%a0320 move.w #0x8F02,VCTRL321 move.l #0x29000003,VCTRL322 moveq #7,%d1323above_top:324 move.w VDATA,%d2325 cmp.w (%a0)+,%d2326 bne.s above_foreign327 dbra %d1,above_top328 move.l #0x2B000003,VCTRL329 moveq #7,%d1330above_bottom:331 move.w VDATA,%d2332 cmp.w (%a0)+,%d2333 bne.s above_foreign334 dbra %d1,above_bottom335 moveq #1,%d0336 bra.s above_done337above_foreign:338 moveq #0,%d0339above_done:340 move.w (%sp)+,%sr341 movem.l (%sp)+,%d1-%d2/%a0342 tst.w %d0343 rts344above_frame:345 .word 0xA3FF,0xA400,0xA400,0xA400,0xA400,0xA400,0xA400,0xA401346 .word 0xA405,0xA406,0xA406,0xA406,0xA406,0xA406,0xA406,0xA407347