---- star_blazer.asm0 2022-06-23 02:59:40.560126092 +1000
-+++ star_blazer.asm 2022-06-23 12:47:34.327997560 +1000
+--- star_blazer.asm0 2022-06-23 18:12:24.911895205 +1000
++++ star_blazer.asm 2022-06-23 18:12:53.087894857 +1000
@@ -1,3 +1,8 @@
+ALIGN = 0
+DHGR = 1
@@ -1072,7 +1117,7 @@
tsx ; 1095 -> 1097 -> 1098 r
stx *microcode_sp ; 1097 -> 1098 -> 109a r
- ldx *microcode_object_c9 ; 1098 -> 109a -> 109c r
+ ldx *microcode_x_save_c9 ; 1098 -> 109a -> 109c r
- lda 0xaee0,x ; 109a -> 109c -> 109f r x=01..7f
-+ lda object1080_aef0 - 0x10,x ;0xaee0,x ; 109a -> 109c -> 109f r x=01..7f
- sta *microcode_object_cc ; 109c -> 109f -> 10a1 r
- loc_10a1:
++ lda object1080_start_sentinel - 0x10,x ;0xaee0,x ; 109a -> 109c -> 109f r x=01..7f
+ sta *microcode_start_sentinel ; 109c -> 109f -> 10a1 r
+ microcode_execute_1093_entry:
ldy #0x00 ; 1090,109f -> 10a1 -> 10a3 r
@@ -1099,7 +1144,7 @@
- jsr do_microcode_test1 ; 10c6 -> 10c8 -> 106a r s=f7..f9,02
+ jsr do_microcode_test ; 10c6 -> 10c8 -> 106a r s=f7..f9,02
bne 3$ ; 107b -> 10cb -> 10c0 r z=0
- loc_10cd:
+ microcode_execute_1093_done:
- lda 0xaee0,x ; 1093,10a5,10ba,10c2,10c6 -> 10cd -> 10d0 r x=01..7f
-+ lda object1080_aef0 - 0x10,x ;0xaee0,x ; 1093,10a5,10ba,10c2,10c6 -> 10cd -> 10d0 r x=01..7f
++ lda object1080_start_sentinel - 0x10,x ;0xaee0,x ; 1093,10a5,10ba,10c2,10c6 -> 10cd -> 10d0 r x=01..7f
rts ; 10cd -> 10d0 -> 123e,143a,1615,1629,1633,1649,165b,1759 r s=f7..fd,02
- sub_10d1:
+ microcode_execute_10d1:
beq rts_10ec ; 1216,123b,1260,1285 -> 10d1 -> 10d3,10ec r z=0..1
@@ -1981,10 +2026,35 @@
sta *button_state ; 17ce r
microcode_table_5560_data_8e00:
.db 0x30 ; 8e00 r
.db 0x0f ; 8e01
-@@ -26926,31 +26780,308 @@
+@@ -24655,7 +24509,15 @@
+ .db 0x0a ; 95da
+ .db 0x00 ; 95db
+ microcode_table_54d6_data_95dc:
++.if 0 ; testing
++ .db 0x73 ; radar0 shape
++ .db 0x74 ; radar1 shape
++ .db 0x75 ; radar2 shape
++ .db 0x74 ; radar1 shape
++ .db 0xf8 ; -> repeating
++.else
+ .db 0x2c ; 95dc r
++.endif
+ .db 0xf2 ; 95dd
+ .db 0x2e ; 95de
+ .db 0xf3 ; 95df
+@@ -24670,7 +24532,15 @@
+ .db 0x60 ; 95e7
+ .db 0x00 ; 95e8
+ microcode_table_54d8_data_95e9:
++.if 0 ; testing
++ .db 0x73 ; radar0 shape
++ .db 0x74 ; radar1 shape
++ .db 0x75 ; radar2 shape
++ .db 0x74 ; radar1 shape
++ .db 0xf8 ; -> repeating
++.else
+ .db 0x2c ; 95e9 r
++.endif
+ .db 0xf2 ; 95ea
+ .db 0x2e ; 95eb
+ .db 0xf3 ; 95ec
+@@ -24685,7 +24555,15 @@
+ .db 0x60 ; 95f4
+ .db 0x00 ; 95f5
+ microcode_table_54da_data_95f6:
++.if 0 ; testing
++ .db 0x73 ; radar0 shape
++ .db 0x74 ; radar1 shape
++ .db 0x75 ; radar2 shape
++ .db 0x74 ; radar1 shape
++ .db 0xf8 ; -> repeating
++.else
+ .db 0x2c ; 95f6 r
++.endif
+ .db 0xf2 ; 95f7
+ .db 0x2e ; 95f8
+ .db 0xf3 ; 95f9
+@@ -26926,31 +26804,308 @@
.db 0x7c ; 9dea
.db 0x98 ; 9deb
.db 0x00 ; 9dec
.area udata2
-@@ -27033,3 +27164,4 @@
+@@ -27033,3 +27188,4 @@
object6080_b560:
.ds 0x20 ; b560 rw
# decimal + 0xe: ?
0x00b0,0x0010,decimal,byte
0x00c0,0x0002,microcode_ptr_c0,word
+0x00c2,0x0001,microcode_test_object,byte
0x00c7,0x0001,microcode_object_c7,byte
0x00c8,0x0001,sp_save,byte
-0x00c9,0x0001,microcode_object_c9,byte
-0x00cc,0x0001,microcode_object_cc,byte
+0x00c9,0x0001,microcode_x_save_c9,byte
+0x00ca,0x0001,microcode_y_save_ca,byte
+# may contain a value from object1080_microcode_start_sentinel (basically
+# the current state of the object) and also seems to be used as a counter
+0x00cc,0x0001,microcode_start_sentinel,byte
0x00cd,0x0001,microcode_sp,byte
0x00d0,0x0002,microcode_ptr_d0,word # or shape_ptr?
0x00d2,0x0002,temp,word
0x00d4,0x0001,y_save,byte
-0x00e2,0x0001,microcode_x_save,byte
-0x00e3,0x0001,microcode_y_save,byte
+0x00e2,0x0001,microcode_x_save_e2,byte
+0x00e3,0x0001,microcode_y_save_e3,byte
0x00e4,0x0002,homing_ptr,word # is it really?
0x00e6,0x0002,microcode_ptr_e6,word
0x00f0,0x0001,demo_mode,byte # 0xff = demo mode, 0x00 = play mode
0x0f57,0x0001,decimal_inc,code
0x0f66,0x0001,decimal_dec,code
0x0f83,0x0001,vector_to_update_a_decimal,code
-0x0f8d,0x0001,microcode_test0,code
+0x0f8d,0x0001,microcode_test_end,code
0x0fb1,0x0001,adjust_score_for_reset_object,code
-0x0fdb,0x0001,microcode_test,code
-0x0fdd,0x0001,microcode_test1,code
+0x0fdb,0x0001,microcode_test_loop,code
+# enter with a = command from microcode, microcode_test_object setup
+# these values come from do_microcode_test (I think the only external caller)
+0x0fdd,0x0001,microcode_test,code
0x1009,0x0001,vector_to_microcode,code
0x1016,0x0001,check_microcode_status_bits,code
-0x106a,0x0001,do_microcode_test1,code
+# enter with a = value for microcode_test_object, microcode_ptr_c0 setup,
+# y = index into table at microcode_ptr_c0 (it will be incremented twice)
+# routine loads a command from the microcode table and calls microcode_test
+0x106a,0x0001,do_microcode_test,code
0x107c,0x0001,decimal_zero,code
+# zf=1 -> go to loc_10cd
+# otherwise load microcode_start_sentinel from object1080_start_sentinel,
+# and enter a loop scanning microcode table at microcode_ptr_c0 from index 0,
+# when value read from microcode table is:
+# 0 go to loc_10cd
+# >= 0xf0 see if it's the start sentinel in microcode_start_sentinel
+# if it's not then keep skipping 2 locations until end of table or found
+# when found, skip 2 locations and check for more commands (0 is end of
+# table, >= 0xf0 is a different section, otherwise execute + zf=0 repeat
+# otherwise execute it via do_microcode_test, and check zf return because
+# zf=1 means terminate the loop at loc_10cd otherwise keep executing loop
+# in summary there seems to be a global section at the start of the table that
+# is always executed, and a specific section to execute based on current state
+0x1093,0x0001,microcode_execute_1093,code
0x109c,0x0001,,code_ign # bug? spans ae80 and aef0 tables, don't merge them
-0x10cd,0x0001,,code_ign # bug? spans ae80 and aef0 tables, don't merge them
+# alternative entry point for microcode_execute_1093 that comes from scoring?
+0x10a1,0x0001,microcode_execute_1093_entry,code
+# returns the current value of object1080_start_sentinel for the object in x
+# I think this might be to provide the correct flags return?
+0x10cd,0x0001,microcode_execute_1093_done,code_ign # bug? spans ae80 and aef0 tables, don't merge them
+# it seems to read values from table at microcode_ptr_c0 with some complicated
+# indirection (value from table = index to use for next read from table?) and
+# it executes them by calling do_microcode_test, this may read adjacent value?
+# microcode_start_sentinel = counter that gets decremented to 0
+# bvar_00cb = start index in table, and is advanced by the routine
+0x10d1,0x0001,microcode_execute_10d1,code
0x10ed,0x0001,adjust_score,code
0x1153,0x0001,reset_decimals,code
-0x1160,0x0001,do_set_object_shape,code
-0x11a7,0x0001,set_object1080_aef0_bit7_and_compute_object_bounds,code
-0x11b2,0x0001,clear_object1080_aef0_bit7_and_erase_object,code
+0x1160,0x0001,reset_object_state,code
+0x11a7,0x0001,set_object1080_start_sentinel_bit7_and_compute_object_bounds,code
+0x11b2,0x0001,clear_object1080_start_sentinel_bit7_and_erase_object,code
+0x11bd,0x0001,countdown_b120_or_b190_expired,code
0x1291,0x0001,homing_test,code
0x12e1,0x0001,accelerate_object_towards_another,code
0x133f,0x0001,sign_extend_a_to_ya_asl_by_4,code
0x53c0,0x0020,object6080_53c0,byte
0x53e0,0x0020,object6080_53e0,byte
# the partitioning below is approximate and just tries to cover everything
-0x5400,0x0020,,word # object_shape_table_ptr?
-0x5420,0x00e0,microcode_table_5420,word
+0x5400,0x0020,,word
+0x5420,0x00e0,microcode_table_animate_shape,word
0x5500,0x0020,microcode_table_5500,word
0x5520,0x00e0,microcode_table_5520,word
0x5600,0x0020,,word
0x95b7,0x0001,microcode_table_5b3e_data_95b7,byte
0x95c4,0x0001,microcode_table_5b3a_data_95c4,byte
0x95d1,0x0001,microcode_table_551c_data_95d1,byte
+# object 0x6b is helicopter_or_enemy_plane0
+# 54d6 = microcode_table_animate_shape + 0x6b * 2
+# -> implied start of section 0xf0
+# .db 0x2c helicopter shape
+# .db 0xf2 -> start of section 0xf2
+# .db 0x2e enemy_plane0 shape
+# .db 0xf3 -> start of section 0xf3
+# .db 0x2f enemy_plane1 shape
+# .db 0x00 sentinel
0x95dc,0x0001,microcode_table_54d6_data_95dc,byte
0x95e2,0x0001,microcode_table_5936_data_95e2,byte
+# object 0x6c is helicopter_or_enemy_plane1
+# 54d8 = microcode_table_animate_shape + 0x6c * 2
+# -> implied start of section 0xf0
+# .db 0x2c helicopter shape
+# .db 0xf2 -> start of section 0xf2
+# .db 0x2e enemy_plane0 shape
+# .db 0xf3 -> start of section 0xf3
+# .db 0x2f enemy_plane1 shape
+# .db 0x00 sentinel
0x95e9,0x0001,microcode_table_54d8_data_95e9,byte
0x95ef,0x0001,microcode_table_5938_data_95ef,byte
+# object 0x6d is helicopter_or_enemy_plane2
+# 54da = microcode_table_animate_shape + 0x6d * 2
+# -> implied start of section 0xf0
+# .db 0x2c helicopter shape
+# .db 0xf2 -> start of section 0xf2
+# .db 0x2e enemy_plane0 shape
+# .db 0xf3 -> start of section 0xf3
+# .db 0x2f enemy_plane1 shape
+# .db 0x00 sentinel
0x95f6,0x0001,microcode_table_54da_data_95f6,byte
0x95fc,0x0001,microcode_table_593a_data_95fc,byte
0x9603,0x0001,microcode_table_54dc_data_9603,byte
0x96e0,0x0001,microcode_table_555a_data_96e0,byte
0x96f1,0x0001,microcode_table_555c_data_96f1,byte
0x9704,0x0001,microcode_table_5b6e_data_9704,byte
+# object 0x4d is radar_or_icbm
+# 549a = microcode_table_animate_shape + 0x4d * 2
+# controls the headquarters, icbm or radar shape as follows
+# -> implied start of section 0xf0
+# .db 0x72 headquarters shape
+# .db 0xf2 -> start of section 0xf2
+# .db 0x76 icbm shape
+# .db 0xf1 -> start of section 0xf1
+# .db 0x73 radar0 shape
+# .db 0x74 radar1 shape
+# .db 0x75 radar2 shape
+# .db 0x74 radar1 shape
+# .db 0xf9 -> repeating, & 0xf3 for start sentinel (0xf1)
+# .db 0x00 sentinel
+# object1080_animate_shape_index + 0x4d holds the index into above table
+# loc_0daf controls wraparound when sentinel >= 0xf0 reached
+# loc_0da6 does a post-increment
+# loc_0dac for 0xff
+# loc_0db9 for 0xf8..0xfe (repeating, & 0xf3 for the start sentinel)
+# 0xf0..0xf3 value is poked into object1080_start_sentinel + object, and
+# something happens when it changes, if object >= 0x60 ... then loc_0dcb
+# loc_0dcb for 0xf0..0xf7
+# scan the table from the beginning (except if sentinel was 0xf0)
+# loc_0ddc when end of table is reached
+# scan until we find the value at object1080_start_sentinel + object
+# loc_0ddc a = table index where start sentinel was found (or end sentinel)
+# update object1080_animate_shape_index with this index (causes the
+# wrapping to restart the animation sequence) ... resume at loc_0da6
+# note: the microcode_test routine seems implicated in launching this:
+# 0$: ldy object1080_start_sentinel - 0x10,x
+# bpl 2$
+# and #0x03
+# ora #0xf0
+# jmp [vec_calculate_object_shape]
0x9707,0x0001,microcode_table_549a_data_9707,byte
0x9711,0x0001,microcode_table_54e4_data_9711,byte
0x971d,0x0001,microcode_table_56c4_data_971d,byte
0xada0,0x0070,object1080_x1,byte
0xae10,0x0070,object1080_y0,byte
0xae80,0x0070,object1080_y1,byte
-0xaef0,0x0070,object1080_aef0,byte
+# current state of object
+# often a value 0xf0..0xf3 to identify relevant section in microcode table,
+# but I think it has other purposes too (bit 7 may mean object is active?)
+0xaef0,0x0070,object1080_start_sentinel,byte
0xaf60,0x0070,object1080_velocity_x_hi,byte
0xafd0,0x0070,object1080_velocity_y_hi,byte
0xb040,0x0070,object1080_velocity_x_lo,byte
0xb190,0x0070,object1080_countdown_b190,byte
0xb200,0x0070,object1080_x_lo,byte
0xb270,0x0070,object1080_y_lo,byte
-0xb2e0,0x0070,object1080_b2e0,byte
-0xb350,0x0070,object1080_shape_table_index,byte
+0xb2e0,0x0070,object1080_animate2,byte
+0xb350,0x0070,object1080_animate_shape_index,byte
0xb3c0,0x0030,object5080_abs_x_difference,byte
0xb3f0,0x0030,object5080_abs_y_difference,byte
0xb420,0x0030,object5080_abs_difference_b420,byte