From: Nick Downing Date: Sun, 26 Jun 2022 13:11:19 +0000 (+1000) Subject: Analyze the ucode_test_fire strings X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=28f5b1b9afb2bf72d39c3c485a061e0c453d246b;p=star_disasm.git Analyze the ucode_test_fire strings --- diff --git a/disasm/object_defs.inc b/disasm/object_defs.inc index 91988f4..e4dd6f5 100644 --- a/disasm/object_defs.inc +++ b/disasm/object_defs.inc @@ -443,3 +443,9 @@ UCODE_MOVE_OBJECT_POS_NEG = 0x7000 ; update bit 7 UCODE_UPDATE_OBJECT_IF_INACTIVE = 0x0000 UCODE_UPDATE_OBJECT = 0x8000 + +; test fire +UCODE_TEST_FIRE_ALL_OBJECTS_ACTIVE = 0x01 +UCODE_TEST_FIRE_ALL_OBJECTS_INACTIVE = 0x02 +UCODE_TEST_FIRE_ANY_OBJECT_ACTIVE = 0x03 +UCODE_TEST_FIRE_ANY_OBJECT_INACTIVE = 0x04 diff --git a/disasm/object_extract.py b/disasm/object_extract.py index 3a5f4a4..e0b4eb6 100755 --- a/disasm/object_extract.py +++ b/disasm/object_extract.py @@ -72,13 +72,14 @@ def disasm_homing(value0): return value def disasm_test_fire(value0): - value = [] - for i in value0: + i = int(value0[0], 0) + value = [defs['test fire'].get(i, f'0x{i:02x}')] + for i in value0[1:]: j = int(i, 0) if j in defs['byte-wide sections']: i = defs['byte-wide sections'][j] - #elif j in defs['objects']: - # i = defs['objects'][j] + elif j in defs['objects']: + i = defs['objects'][j] value.append(i) return value diff --git a/disasm/star_blazer.asm.patch b/disasm/star_blazer.asm.patch index 7c21edb..63d31d1 100644 --- a/disasm/star_blazer.asm.patch +++ b/disasm/star_blazer.asm.patch @@ -1,5 +1,5 @@ ---- star_blazer.asm0 2022-06-26 11:07:42.795984293 +1000 -+++ star_blazer.asm 2022-06-26 11:09:09.991983215 +1000 +--- star_blazer.asm0 2022-06-26 22:25:29.735916717 +1000 ++++ star_blazer.asm 2022-06-26 23:05:52.507886748 +1000 @@ -1,3 +1,10 @@ +UNREACHABLE = 1 +DHGR = 0 @@ -105,7 +105,17 @@ rts ; 10cd -> 10d0 -> 123e,143a,1615,1629,1633,1649,165b,1759 r s=f7..fd,02 ucode_execute_fire_in_state_fn: beq rts_10ec ; 1216,123b,1260,1285 -> 10d1 -> 10d3,10ec r z=0..1 -@@ -1980,10 +2026,35 @@ +@@ -1611,7 +1657,9 @@ + iny ; 14d8 -> 14da -> 14db r + bne loc_14d0 ; 14da -> 14db -> 14d0 r z=0 + beq loc_14c9 ; 14dd r ++.if UNREACHABLE + rts ; 14df r ++.endif + loc_14e0: + lda [*ucode_ptr_e6],y ; 14e0 r + beq loc_14c9 ; 14e2 r +@@ -1980,10 +2028,35 @@ sta *button_state ; 17ce r rts_17d0: rts ; 17ab,17ca -> 17d0 -> 1768,176f r s=fd @@ -142,7 +152,7 @@ ldx #0x01 ; 17db r 0$: jsr ROM_PREAD ; 17dd r cpy #0xff ; 17e0 r -@@ -1994,7 +2065,12 @@ +@@ -1994,7 +2067,12 @@ sta bvar_179e ; 17e9 r sta bvar_17a3 ; 17ec r sta bvar_1e0e ; 17ef r @@ -156,7 +166,7 @@ .area text1 -@@ -2062,10 +2138,12 @@ +@@ -2062,10 +2140,12 @@ lda *result + 1 ; 186e r ldy *result + 2 ; 1870 r rts ; 1872 r @@ -169,7 +179,7 @@ random_init: lda *random_seed ; 16ae -> 187a -> 187c r ora #0x01 ; 187a -> 187c -> 187e r -@@ -2224,16 +2302,30 @@ +@@ -2224,16 +2304,30 @@ ldx #>HIRES_SCREEN ; 199b -> 199d -> 199f r stx *video_line_ptr + 1 ; 199d -> 199f -> 19a1 r tay ; 199f -> 19a1 -> 19a2 r @@ -201,7 +211,7 @@ rts ; 19b5 -> 19b8 -> 1713 r s=fd video_clear_rectangle: ldx *clip_y0 ; 1064 -> 19b9 -> 19bb r -@@ -2241,8 +2333,20 @@ +@@ -2241,8 +2335,20 @@ sta *video_line_ptr ; 19bb -> 19be -> 19c0 r lda video_line_table_hi - 0x20,x ; 19be -> 19c0 -> 19c3 r x=28..cf sta *video_line_ptr + 1 ; 19c0 -> 19c3 -> 19c5 r @@ -222,7 +232,7 @@ 1$: sta [*video_line_ptr],y ; 19c7,19ce -> 19c9 -> 19cb r y=6c..93 iny ; 19c9 -> 19cb -> 19cc r cpy *clip_x1 ; 19cb -> 19cc -> 19ce r y=6d..94 -@@ -2291,6 +2395,7 @@ +@@ -2291,6 +2397,7 @@ sta object1080_y0 - 0x10,x ; 1a1b -> 1a1e -> 1a21 r x=10..7f adc #0x01 ; 1a1e -> 1a21 -> 1a23 r c=0..1 d=0 sta object1080_y1 - 0x10,x ; 1a21 -> 1a23 -> 1a26 r x=10..7f @@ -230,7 +240,7 @@ rts ; 1a23 -> 1a26 -> 1076,1179,1602 r s=f1..f9,02 pixel_data_table_left: .db 0x83 ; 1a27 r -@@ -2373,14 +2478,17 @@ +@@ -2373,14 +2480,17 @@ lda object1080_onscreen_shape_ptr_hi - 0x10,x ; 1aa5 -> 1aa7 -> 1aaa r x=20..4f ora [*video_line_ptr],y ; 1aa7 -> 1aaa -> 1aac r y=6d..93,02 sta [*video_line_ptr],y ; 1aaa -> 1aac -> 1aae r y=6d..93,02 @@ -248,7 +258,7 @@ lda object1080_y0 - 0x10,x ; 1ab9 -> 1abb -> 1abe r x=14..77 cmp object1080_y1 - 0x10,x ; 1abb -> 1abe -> 1ac1 r a=11..d4 x=14..77 bcs rts_1aae ; 1abe -> 1ac1 -> 1ac3 r c=0 -@@ -2433,7 +2541,12 @@ +@@ -2433,7 +2543,12 @@ stx *x_save ; 1b32 -> 1b35 -> 1b37 r lda *draw_y ; 1b35 -> 1b37 -> 1b39 r cmp *clip_y0 ; 1b37 -> 1b39 -> 1b3b r a=11..d4 @@ -261,7 +271,7 @@ lda *clip_y1 ; 1b3b -> 1b3d -> 1b3f r cmp *draw_y1 ; 1b3d -> 1b3f -> 1b41 r a=d0 bcc 8$ ; 1b3f -> 1b41 -> 1b43,1b83 r c=0..1 -@@ -2444,16 +2557,59 @@ +@@ -2444,16 +2559,59 @@ cmp *draw_x1 ; 1b49 -> 1b4b -> 1b4d r a=94 bcc 8$ ; 1b4b -> 1b4d -> 1b4f,1b83 r c=0..1 lda object1080_onscreen_shape_ptr_lo - 0x10,x ; 1b4d -> 1b4f -> 1b52 r x=14..77 @@ -321,7 +331,7 @@ 6$: .db 0xbd ; 1b69,1b76 -> 1b6b -> 1b6e r "lda 0x6f9f,x" x=00..39 7$: .dw 0x6f9f ; 1b6c rw ora [*video_line_ptr],y ; 1b6b -> 1b6e -> 1b70 r y=6c..93 -@@ -2470,16 +2626,50 @@ +@@ -2470,16 +2628,50 @@ rts ; 1b80 -> 1b82 -> 15cd r s=fb 8$: inc object1080_onscreen_clipped - 0x10,x ; 1b3b,1b41,1b47,1b4d -> 1b83 -> 1b86 r x=14..77 lda object1080_onscreen_shape_ptr_lo - 0x10,x ; 1b83 -> 1b86 -> 1b89 r x=14..77 @@ -374,7 +384,7 @@ 10$: lda *draw_y ; 1ba0,1bbf -> 1ba2 -> 1ba4 r cmp *clip_y0 ; 1ba2 -> 1ba4 -> 1ba6 r a=11..d8 bcc 12$ ; 1ba4 -> 1ba6 -> 1ba8,1bbb r c=0..1 -@@ -2489,6 +2679,16 @@ +@@ -2489,6 +2681,16 @@ bcc 12$ ; 1bac -> 1bae -> 1bb0,1bbb r c=0..1 cpy *clip_x1 ; 1bae -> 1bb0 -> 1bb2 r y=6c..a4 bcs 12$ ; 1bb0 -> 1bb2 -> 1bb4,1bbb r c=0..1 @@ -391,7 +401,7 @@ .db 0xbd ; 1bb2 -> 1bb4 -> 1bb7 r "lda 0x6fab,x" x=00..39 11$: .dw 0x6fab ; 1bb5 rw ora [*video_line_ptr],y ; 1bb4 -> 1bb7 -> 1bb9 r y=6c..93 -@@ -2502,6 +2702,7 @@ +@@ -2502,6 +2704,7 @@ cpy *draw_y1 ; 1bc3 -> 1bc5 -> 1bc7 r y=12..d9 bcc 9$ ; 1bc5 -> 1bc7 -> 1b96,1bc9 r c=0..1 ldx *x_save ; 1bc7 -> 1bc9 -> 1bcb r @@ -399,7 +409,7 @@ rts ; 1bc9 -> 1bcb -> 15cd r s=fb erase_pixel_object: lda #0x00 ; 1c12 -> 1bcc -> 1bce r -@@ -2533,12 +2734,15 @@ +@@ -2533,12 +2736,15 @@ eor #0xff ; 1c03 -> 1c06 -> 1c08 r and [*video_line_ptr],y ; 1c06 -> 1c08 -> 1c0a r y=6d..93,02 sta [*video_line_ptr],y ; 1c08 -> 1c0a -> 1c0c r y=6d..93,02 @@ -415,7 +425,7 @@ lda #0x00 ; 1c12 -> 1c14 -> 1c16 r sta object1080_onscreen - 0x10,x ; 1c14 -> 1c16 -> 1c19 r x=14..77 lda object1080_onscreen_x0 - 0x10,x ; 1c16 -> 1c19 -> 1c1c r x=14..77 -@@ -2553,16 +2757,61 @@ +@@ -2553,16 +2759,61 @@ stx *x_save ; 1c2d -> 1c30 -> 1c32 r bne 3$ ; 1c30 -> 1c32 -> 1c34,1c6a r z=0..1 lda object1080_onscreen_shape_ptr_lo - 0x10,x ; 1c32 -> 1c34 -> 1c37 r x=14..77 @@ -477,7 +487,7 @@ 1$: .db 0xbd ; 1c4e,1c5d -> 1c50 -> 1c53 r "lda 0x6f93,x" x=00..39 2$: .dw 0x6f93 ; 1c51 rw eor #0xff ; 1c50 -> 1c53 -> 1c55 r -@@ -2579,16 +2828,51 @@ +@@ -2579,16 +2830,51 @@ ldx *x_save ; 1c65 -> 1c67 -> 1c69 r rts ; 1c67 -> 1c69 -> 1076,16a8 r s=f3..f9,02 3$: lda object1080_onscreen_shape_ptr_lo - 0x10,x ; 1c32 -> 1c6a -> 1c6d r x=14..77 @@ -531,7 +541,7 @@ 5$: lda *draw_y ; 1c84,1ca5 -> 1c86 -> 1c88 r cmp *clip_y0 ; 1c86 -> 1c88 -> 1c8a r a=11..d8 bcc 7$ ; 1c88 -> 1c8a -> 1c8c,1ca1 r c=0..1 -@@ -2598,6 +2882,17 @@ +@@ -2598,6 +2884,17 @@ bcc 7$ ; 1c90 -> 1c92 -> 1c94,1ca1 r c=0..1 cpy *clip_x1 ; 1c92 -> 1c94 -> 1c96 r y=6c..a4 bcs 7$ ; 1c94 -> 1c96 -> 1c98,1ca1 r c=0..1 @@ -549,7 +559,7 @@ .db 0xbd ; 1c96 -> 1c98 -> 1c9b r "lda 0x6fab,x" x=00..39 6$: .dw 0x6fab ; 1c99 rw eor #0xff ; 1c98 -> 1c9b -> 1c9d r -@@ -2617,9 +2912,24 @@ +@@ -2617,9 +2914,24 @@ stx *x_save ; 1db0 -> 1cb2 -> 1cb4 r tay ; 1cb2 -> 1cb4 -> 1cb5 r lda shape_data_ptr_lo,y ; 1cb4 -> 1cb5 -> 1cb8 r y=16..ff @@ -574,7 +584,7 @@ lda shape_width_bytes,y ; 1cbe -> 1cc1 -> 1cc4 r y=16..ff clc ; 1cc1 -> 1cc4 -> 1cc5 r adc *draw_x0 ; 1cc4 -> 1cc5 -> 1cc7 r c=0 d=0 -@@ -2627,6 +2937,11 @@ +@@ -2627,6 +2939,11 @@ lda *draw_x0 ; 1cc7 -> 1cc9 -> 1ccb r lsr a ; 1cc9 -> 1ccb -> 1ccc r bcc 0$ ; 1ccb -> 1ccc -> 1cce,1cd4 r c=0..1 @@ -586,7 +596,7 @@ lda *draw_misc_mask ; 1ccc -> 1cce -> 1cd0 r eor *draw_misc_mask_xor ; 1cce -> 1cd0 -> 1cd2 r sta *draw_misc_mask ; 1cd0 -> 1cd2 -> 1cd4 r -@@ -2642,9 +2957,56 @@ +@@ -2642,9 +2959,56 @@ lda video_line_table_hi,y ; 1ce5 -> 1ce7 -> 1cea r y=00..bc adc #0x00 ; 1ce7 -> 1cea -> 1cec r c=0..1 d=0 sta *video_line_ptr + 1 ; 1cea -> 1cec -> 1cee r @@ -643,7 +653,7 @@ 2$: lda *draw_y ; 1cf2,1d0f -> 1cf4 -> 1cf6 r cmp #0xc0 ; 1cf4 -> 1cf6 -> 1cf8 r a=00..bc bcs 4$ ; 1cf6 -> 1cf8 -> 1cfa r c=0 -@@ -2664,7 +3026,12 @@ +@@ -2664,7 +3028,12 @@ inc *draw_y ; 1d0f -> 1d11 -> 1d13 r ldy *draw_y ; 1d11 -> 1d13 -> 1d15 r cpy *draw_y1 ; 1d13 -> 1d15 -> 1d17 r y=01..bd @@ -656,7 +666,7 @@ ldx *x_save ; 1d17 -> 1d19 -> 1d1b r rts ; 1d19 -> 1d1b -> 1db3 r s=ec..f5 draw_misc_from_table: -@@ -2677,7 +3044,7 @@ +@@ -2677,7 +3046,7 @@ asl a ; 1d23 -> 1d24 -> 1d25 r sta *draw_misc_ptr ; 1d24 -> 1d25 -> 1d27 r lda #0x00 ; 1d25 -> 1d27 -> 1d29 r @@ -665,7 +675,7 @@ sta *draw_misc_ptr + 1 ; 1d29 -> 1d2b -> 1d2d r lda *half_dimension ; 1d2b -> 1d2d -> 1d2f r lsr a ; 1d2d -> 1d2f -> 1d30 r -@@ -2686,10 +3053,20 @@ +@@ -2686,10 +3055,20 @@ lsr a ; 1d31 -> 1d32 -> 1d33 r lsr a ; 1d32 -> 1d33 -> 1d34 r tay ; 1d33 -> 1d34 -> 1d35 r @@ -686,7 +696,7 @@ lda *half_dimension ; 1d3d -> 1d3f -> 1d41 r and #0x1f ; 1d3f -> 1d41 -> 1d43 r cmp #0x08 ; 1d41 -> 1d43 -> 1d45 r a=00..1f -@@ -2707,6 +3084,14 @@ +@@ -2707,6 +3086,14 @@ iny ; 1d57 -> 1d59 -> 1d5a r 1$: lda [*draw_misc_ptr],y ; 1d59,1d69 -> 1d5a -> 1d5c r y=03..0c beq 2$ ; 1d5a -> 1d5c -> 1d5e,1d61 r z=0..1 @@ -701,7 +711,7 @@ jsr do_draw_misc ; 1d5c -> 1d5e -> 1da6 r s=f3..f9,02 2$: iny ; 1d5c,1db5 -> 1d61 -> 1d62 r cpy #0x10 ; 1d61 -> 1d62 -> 1d64 r y=04..0d -@@ -2762,6 +3147,84 @@ +@@ -2762,6 +3149,84 @@ ldy *draw_misc_y_save ; 1d1b -> 1db3 -> 1db5 r rts_1db5: rts ; 1da1,1db3 -> 1db5 -> 1076,1d61,1d7d,1d82,1d87 r s=ee..f7 @@ -786,7 +796,7 @@ draw_misc_mask_table: .db 0xff ; 1db6 r .db 0x00 ; 1db7 r -@@ -2772,14 +3235,15 @@ +@@ -2772,14 +3237,15 @@ .db 0xd5 ; 1dbc r .db 0xff ; 1dbd r draw_misc_mask_xor_table: @@ -810,7 +820,7 @@ .area text2 -@@ -3083,6 +3547,15 @@ +@@ -3083,6 +3549,15 @@ .area data2 @@ -826,7 +836,7 @@ shape_data_ptr_lo: .db = 0x80) +# 0x02 loc_14aa test that all objects are inactive (object1080_state < 0x80) +# 0x03 loc_14d0 test that any object is active (object1080_state >= 0x80) +# 0x04 loc_14e0 test that any object is inactive (object1080_state >= 0x80) +# otherwise fall into: +# loc_14c9: cf=0 +# loc_14ca: return cf (cf=1 from cmp equality), a=object1080_state (for zf?) +0x14b9,0x0001,ucode_test_object_fire,code 0x14ef,0x0001,test_object_fire_in_state_f0,code 0x150f,0x0001,test_object_fire_in_state_f1,code 0x152c,0x0001,test_object_fire_entry,code @@ -365,7 +376,7 @@ items 0x1569,0x0001,test_object_fire_in_state_f3,code 0x1589,0x0001,objects_init,code 0x1595,0x0001,objects_init_entry,code -0x15d7,0x0001,maybe_calculate_object_shape_and_update,code +0x15d7,0x0001,update_object_player,code 0x15ee,0x0001,update_object,code 0x15ff,0x0001,update_object_entry,code 0x16ae,0x0001,all_init,code @@ -551,9 +562,17 @@ items 0xb350,0x0070,object1080_animate_shape_index,byte 0xb3c0,0x0030,object5080_abs_x_difference,byte 0xb3f0,0x0030,object5080_abs_y_difference,byte +# accelerate_object_somehow +# used as a countdown for whether x should be accelerated by +/- 0x4c 0xb420,0x0030,object5080_abs_difference_b420,byte +# accelerate_object_somehow +# used as a countdown for whether y should be accelerated by +/- 0x40 0xb450,0x0030,object5080_abs_difference_b450,byte +# accelerate_object_anyhow +# used as a countdown for whether x should be accelerated by calculated value 0xb480,0x0030,object5080_abs_difference_b480,byte +# accelerate_object_anyhow +# used as a countdown for whether y should be accelerated by calculated value 0xb4b0,0x0030,object5080_abs_difference_b4b0,byte 0xb4e0,0x0020,object6080_fire_count,byte # used from execute_object6080_ucode_fire_in_state_f0