From 26a64ad0742d4e8d01aed7aa0184e4de5b72f129 Mon Sep 17 00:00:00 2001 From: Nick Downing Date: Mon, 15 Jul 2024 17:41:44 +1000 Subject: [PATCH] Reverse engineering microcode instructions that copy scaled velocity or position plus scaled velocity --- star_blazer/object_defs.inc | 16 ++-- star_blazer/star_blazer.asm.patch | 146 +++++++++++++++--------------- star_blazer/star_blazer.txt | 58 ++++++++---- 3 files changed, 122 insertions(+), 98 deletions(-) diff --git a/star_blazer/object_defs.inc b/star_blazer/object_defs.inc index e4dd6f5..3bdecbb 100644 --- a/star_blazer/object_defs.inc +++ b/star_blazer/object_defs.inc @@ -422,10 +422,10 @@ UCODE_INACTIVATE_OBJECT = 0x0f00 UCODE_RANDOMIZE_OBJECT_VELOCITY = 0x0100 UCODE_COPY_OBJECT_VELOCITY = 0x0200 UCODE_RANDOMIZE_OBJECT_VELOCITY_RELATIVE = 0x0300 -UCODE_UPDATE_OBJECT_VELOCITY = 0x0400 -UCODE_UPDATE_OBJECT_VELOCITY_ROTATE_90 = 0x0500 -UCODE_UPDATE_OBJECT_VELOCITY_ROTATE_180 = 0x0600 -UCODE_UPDATE_OBJECT_VELOCITY_ROTATE_270 = 0x0700 +UCODE_COPY_SCALED_OBJECT_VELOCITY = 0x0400 +UCODE_COPY_SCALED_OBJECT_VELOCITY_ROTATE_90 = 0x0500 +UCODE_COPY_SCALED_OBJECT_VELOCITY_ROTATE_180 = 0x0600 +UCODE_COPY_SCALED_OBJECT_VELOCITY_ROTATE_270 = 0x0700 ; update bit 3 UCODE_RESET_OBJECT = 0x0000 @@ -435,10 +435,10 @@ UCODE_ACTIVATE_OBJECT = 0x0800 UCODE_RANDOMIZE_OBJECT_POSITION = 0x1000 UCODE_COPY_OBJECT_POSITION = 0x2000 UCODE_RANDOMIZE_OBJECT_POSITION_RELATIVE = 0x3000 -UCODE_MOVE_OBJECT_POS_POS = 0x4000 -UCODE_MOVE_OBJECT_NEG_POS = 0x5000 -UCODE_MOVE_OBJECT_NEG_NEG = 0x6000 -UCODE_MOVE_OBJECT_POS_NEG = 0x7000 +UCODE_COPY_OBJECT_POSITION_PLUS_SCALED_VELOCITY = 0x4000 +UCODE_COPY_OBJECT_POSITION_PLUS_SCALED_VELOCITY_ROTATE_90 = 0x5000 +UCODE_COPY_OBJECT_POSITION_PLUS_SCALED_VELOCITY_ROTATE_180 = 0x6000 +UCODE_COPY_OBJECT_POSITION_PLUS_SCALED_VELOCITY_ROTATE_270 = 0x7000 ; update bit 7 UCODE_UPDATE_OBJECT_IF_INACTIVE = 0x0000 diff --git a/star_blazer/star_blazer.asm.patch b/star_blazer/star_blazer.asm.patch index 653ed6d..fae8faa 100644 --- a/star_blazer/star_blazer.asm.patch +++ b/star_blazer/star_blazer.asm.patch @@ -1,5 +1,5 @@ ---- star_blazer.asm0 2024-07-15 16:29:17.007858038 +1000 -+++ star_blazer.asm 2024-07-15 16:38:50.862930039 +1000 +--- star_blazer.asm0 2024-07-18 13:47:28.197250844 +1000 ++++ star_blazer.asm 2024-07-18 13:47:28.205250697 +1000 @@ -1,3 +1,10 @@ +UNREACHABLE = 1 +DHGR = 0 @@ -87,17 +87,17 @@ ; 24-bit register, repurposed for divide routine as ; accumulator: divisor ; accumulator + 1: remainder -@@ -399,20 +445,20 @@ - sta object1080_velocity_y_hi - 0x10,x ; 0b53 -> 0b56 -> 0b59 r x=50..52 - rts ; 0b56 -> 0b59 -> 0fcb r s=f0 - get_object_velocity_x_and_calculate_a: +@@ -408,20 +454,20 @@ + ; object1080_velocity_scale_for_position_(hi|lo) + ; returns a = high byte of scaled value + get_scaled_object_velocity_x_to_a: - lda object1080_velocity_y_hi + 0x60,y ; 0b5a r + lda object1080_velocity_x_lo - 0x10,y ;object1080_velocity_y_hi + 0x60,y ; 0b5a r sta *accumulator ; 0b5d r - lda object1080_state + 0x60,y ; 0b5f r + lda object1080_velocity_x_hi - 0x10,y ;object1080_state + 0x60,y ; 0b5f r jmp loc_0b6d ; 0b62 r - get_object_velocity_y_and_calculate_a: + get_scaled_object_velocity_y_to_a: - lda object1080_velocity_x_lo + 0x60,y ; 0b65 r + lda object1080_velocity_y_lo - 0x10,y ;object1080_velocity_x_lo + 0x60,y ; 0b65 r sta *accumulator ; 0b68 r @@ -107,52 +107,52 @@ sty *y_save ; 0b6d r sta *accumulator + 1 ; 0b6f r - lda object1080_velocity_y_random_range + 0x60,y ; 0b71 r -+ lda object1080_4dc0 - 0x10,y ;object1080_velocity_y_random_range + 0x60,y ; 0b71 r ++ lda object1080_velocity_scale_for_position_hi - 0x10,y ;object1080_velocity_y_random_range + 0x60,y ; 0b71 r sta *temp ; 0b74 r -- lda object1080_4dc0 + 0x60,y ; 0b76 r -+ lda object1080_4e30 - 0x10,y ;object1080_4dc0 + 0x60,y ; 0b76 r +- lda object1080_velocity_scale_for_position_hi + 0x60,y ; 0b76 r ++ lda object1080_velocity_scale_for_position_lo - 0x10,y ;object1080_velocity_scale_for_position_hi + 0x60,y ; 0b76 r ldy *temp ; 0b79 r - jsr get_scaled_accumulator_to_ya ; 0b7b r + jsr multiply_ya_by_accumulator_optimized ; 0b7b r tya ; 0b7e r -@@ -421,46 +467,46 @@ - move_object_pos_pos: - jsr get_object_velocity_x_and_calculate_a ; 0b82 r +@@ -436,46 +482,46 @@ + copy_object_position_plus_scaled_velocity: + jsr get_scaled_object_velocity_x_to_a ; 0b82 r clc ; 0b85 r - adc object1080_shape + 0x60,y ; 0b86 r - sta object1080_shape + 0x60,x ; 0b89 r + adc object1080_x_hi - 0x10,y ;object1080_shape + 0x60,y ; 0b86 r + sta object1080_x_hi - 0x10,x ;object1080_shape + 0x60,x ; 0b89 r - jsr get_object_velocity_y_and_calculate_a ; 0b8c r + jsr get_scaled_object_velocity_y_to_a ; 0b8c r clc ; 0b8f r - adc object1080_x_hi + 0x60,y ; 0b90 r - sta object1080_x_hi + 0x60,x ; 0b93 r + adc object1080_y_hi - 0x10,y ;object1080_x_hi + 0x60,y ; 0b90 r + sta object1080_y_hi - 0x10,x ;object1080_x_hi + 0x60,x ; 0b93 r rts ; 0b96 r - move_object_neg_pos: - jsr get_object_velocity_y_and_calculate_a ; 0b97 r + copy_object_position_plus_scaled_velocity_rotate_90: + jsr get_scaled_object_velocity_y_to_a ; 0b97 r jsr neg_a ; 0b9a r clc ; 0b9d r - adc object1080_shape + 0x60,y ; 0b9e r - sta object1080_shape + 0x60,x ; 0ba1 r + adc object1080_x_hi - 0x10,y ;object1080_shape + 0x60,y ; 0b9e r + sta object1080_x_hi - 0x10,x ;object1080_shape + 0x60,x ; 0ba1 r - jsr get_object_velocity_x_and_calculate_a ; 0ba4 r + jsr get_scaled_object_velocity_x_to_a ; 0ba4 r clc ; 0ba7 r - adc object1080_x_hi + 0x60,y ; 0ba8 r - sta object1080_x_hi + 0x60,x ; 0bab r + adc object1080_y_hi - 0x10,y ;object1080_x_hi + 0x60,y ; 0ba8 r + sta object1080_y_hi - 0x10,x ;object1080_x_hi + 0x60,x ; 0bab r rts ; 0bae r - move_object_neg_neg: - jsr get_object_velocity_x_and_calculate_a ; 0baf r + copy_object_position_plus_scaled_velocity_rotate_180: + jsr get_scaled_object_velocity_x_to_a ; 0baf r jsr neg_a ; 0bb2 r clc ; 0bb5 r - adc object1080_shape + 0x60,y ; 0bb6 r - sta object1080_shape + 0x60,x ; 0bb9 r + adc object1080_x_hi - 0x10,y ;object1080_shape + 0x60,y ; 0bb6 r + sta object1080_x_hi - 0x10,x ;object1080_shape + 0x60,x ; 0bb9 r - jsr get_object_velocity_y_and_calculate_a ; 0bbc r + jsr get_scaled_object_velocity_y_to_a ; 0bbc r jsr neg_a ; 0bbf r clc ; 0bc2 r - adc object1080_x_hi + 0x60,y ; 0bc3 r @@ -160,14 +160,14 @@ + adc object1080_y_hi - 0x10,y ;object1080_x_hi + 0x60,y ; 0bc3 r + sta object1080_y_hi - 0x10,x ;object1080_x_hi + 0x60,x ; 0bc6 r rts ; 0bc9 r - move_object_pos_neg: - jsr get_object_velocity_y_and_calculate_a ; 0bca r + copy_object_position_plus_scaled_velocity_rotate_270: + jsr get_scaled_object_velocity_y_to_a ; 0bca r clc ; 0bcd r - adc object1080_shape + 0x60,y ; 0bce r - sta object1080_shape + 0x60,x ; 0bd1 r + adc object1080_x_hi - 0x10,y ;object1080_shape + 0x60,y ; 0bce r + sta object1080_x_hi - 0x10,x ;object1080_shape + 0x60,x ; 0bd1 r - jsr get_object_velocity_x_and_calculate_a ; 0bd4 r + jsr get_scaled_object_velocity_x_to_a ; 0bd4 r jsr neg_a ; 0bd7 r clc ; 0bda r - adc object1080_x_hi + 0x60,y ; 0bdb r @@ -175,11 +175,11 @@ + adc object1080_y_hi - 0x10,y ;object1080_x_hi + 0x60,y ; 0bdb r + sta object1080_y_hi - 0x10,x ;object1080_x_hi + 0x60,x ; 0bde r rts ; 0be1 r - get_object_velocity_x_and_calculate_ya: - lda object1080_velocity_x_lo - 0x10,y ; 0c06,0c3b -> 0be2 -> 0be5 r y=44..6a -@@ -494,14 +540,14 @@ - update_object_velocity_rotate_90: - jsr get_object_velocity_y_and_calculate_ya ; 0c1f r + ; call with y = object to calculate for + ; uses coefficient from the following table: +@@ -518,14 +564,14 @@ + copy_scaled_object_velocity_rotate_90: + jsr get_scaled_object_velocity_y_to_ya ; 0c1f r jsr neg_ya ; 0c22 r - sta object1080_velocity_y_hi + 0x60,x ; 0c25 r + sta object1080_velocity_x_lo - 0x10,x ;object1080_velocity_y_hi + 0x60,x ; 0c25 r @@ -187,7 +187,7 @@ - sta object1080_state + 0x60,x ; 0c29 r + sta object1080_velocity_x_hi - 0x10,x ;object1080_state + 0x60,x ; 0c29 r ldy *y_save ; 0c2c r - jsr get_object_velocity_x_and_calculate_ya ; 0c2e r + jsr get_scaled_object_velocity_x_to_ya ; 0c2e r - sta object1080_velocity_x_lo + 0x60,x ; 0c31 r + sta object1080_velocity_y_lo - 0x10,x ;object1080_velocity_x_lo + 0x60,x ; 0c31 r tya ; 0c34 r @@ -195,18 +195,18 @@ + sta object1080_velocity_y_hi - 0x10,x ;object1080_velocity_x_hi + 0x60,x ; 0c35 r ldy *y_save ; 0c38 r rts ; 0c3a r - update_object_velocity_rotate_180: -@@ -520,15 +566,15 @@ + copy_scaled_object_velocity_rotate_180: +@@ -544,15 +590,15 @@ rts ; 0c57 -> 0c59 -> 0fcb r s=f0 - update_object_velocity_rotate_270: - jsr get_object_velocity_y_and_calculate_ya ; 0c5a r + copy_scaled_object_velocity_rotate_270: + jsr get_scaled_object_velocity_y_to_ya ; 0c5a r - sta object1080_velocity_y_hi + 0x60,x ; 0c5d r + sta object1080_velocity_x_lo - 0x10,x ;object1080_velocity_y_hi + 0x60,x ; 0c5d r tya ; 0c60 r - sta object1080_state + 0x60,x ; 0c61 r + sta object1080_velocity_x_hi - 0x10,x ;object1080_state + 0x60,x ; 0c61 r ldy *y_save ; 0c64 r - jsr get_object_velocity_x_and_calculate_ya ; 0c66 r + jsr get_scaled_object_velocity_x_to_ya ; 0c66 r jsr neg_ya ; 0c69 r - sta object1080_velocity_x_lo + 0x60,x ; 0c6c r + sta object1080_velocity_y_lo - 0x10,x ;object1080_velocity_x_lo + 0x60,x ; 0c6c r @@ -216,7 +216,7 @@ ldy *y_save ; 0c73 r rts ; 0c75 r horizontal_collision: -@@ -570,8 +616,8 @@ +@@ -594,8 +640,8 @@ horizontal_collision_and_zero: jsr horizontal_collision ; 0cc4 r lda #0x00 ; 0cc7 r @@ -227,7 +227,7 @@ rts ; 0ccf r vertical_collision_and_zero: jsr vertical_collision ; 1015 -> 0cd0 -> 0c9d r s=f5 -@@ -1258,7 +1304,7 @@ +@@ -1282,7 +1328,7 @@ tsx ; 1095 -> 1097 -> 1098 r stx *ucode_sp ; 1097 -> 1098 -> 109a r ldx *ucode_x_save_c9 ; 1098 -> 109a -> 109c r @@ -236,7 +236,7 @@ sta *ucode_object_state ; 109c -> 109f -> 10a1 r ; alternative entry point for ucode_execute_words that comes from scoring? ucode_execute_words_entry: -@@ -1288,7 +1334,7 @@ +@@ -1312,7 +1358,7 @@ ; returns the current value of object1080_state for the object in x ; I think this might be to provide the correct flags return? ucode_execute_words_done: @@ -245,7 +245,7 @@ rts ; 10cd -> 10d0 -> 123e,143a,1615,1629,1633,1649,165b,1759 r s=f7..fd,02 ; it seems to read values from table at ucode_ptr_c0 with some complicated ; indirection (value from table = index to use for next read from table?) and -@@ -1805,16 +1851,20 @@ +@@ -1829,16 +1875,20 @@ bpl loc_14c9 ; 14a0 -> 14a3 -> 14a5,14c9 r n=0..1 iny ; 14a3 -> 14a5 -> 14a6 r bne ucode_test_fire_all_objects_active ; 14a5 -> 14a6 -> 149b r z=0 @@ -267,7 +267,7 @@ ; opcode is followed by null-terminated list of objects to test ; note: some of these opcodes never executed in the trace ; references to object1080_y1 + 0x60 should be object1080_state - 0x10 -@@ -1848,17 +1898,21 @@ +@@ -1872,17 +1922,21 @@ bmi loc_14c9 ; 14d5 -> 14d8 -> 14da r n=0 iny ; 14d8 -> 14da -> 14db r bne ucode_test_fire_any_object_active ; 14da -> 14db -> 14d0 r z=0 @@ -290,7 +290,7 @@ test_object_fire_in_state_f0: lda object6080_fire_count - 0x60,x ; 1668 -> 14ef -> 14f2 r x=60..7f beq test_object_fire_false ; 14ef -> 14f2 -> 14f4,153f r z=0..1 -@@ -2222,10 +2276,35 @@ +@@ -2246,10 +2300,35 @@ sta *button_state ; 17ce r rts_17d0: rts ; 17ab,17ca -> 17d0 -> 1768,176f r s=fd @@ -327,7 +327,7 @@ ldx #0x01 ; 17db r 0$: jsr ROM_PREAD ; 17dd r cpy #0xff ; 17e0 r -@@ -2236,7 +2315,12 @@ +@@ -2260,7 +2339,12 @@ sta bvar_179e ; 17e9 r sta bvar_17a3 ; 17ec r sta bvar_1e0e ; 17ef r @@ -341,7 +341,7 @@ .area text1 -@@ -2304,10 +2388,12 @@ +@@ -2328,10 +2412,12 @@ lda *result + 1 ; 186e r ldy *result + 2 ; 1870 r rts ; 1872 r @@ -354,7 +354,7 @@ random_init: lda *random_seed ; 16ae -> 187a -> 187c r ora #0x01 ; 187a -> 187c -> 187e r -@@ -2467,16 +2553,30 @@ +@@ -2491,16 +2577,30 @@ ldx #>HIRES_SCREEN ; 199b -> 199d -> 199f r stx *video_line_ptr + 1 ; 199d -> 199f -> 19a1 r tay ; 199f -> 19a1 -> 19a2 r @@ -386,7 +386,7 @@ rts ; 19b5 -> 19b8 -> 1713 r s=fd video_clear_rectangle: ldx *clip_y0 ; 1064 -> 19b9 -> 19bb r -@@ -2484,8 +2584,20 @@ +@@ -2508,8 +2608,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 @@ -407,7 +407,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 -@@ -2534,6 +2646,7 @@ +@@ -2558,6 +2670,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 @@ -415,7 +415,7 @@ rts ; 1a23 -> 1a26 -> 1076,1179,1602 r s=f1..f9,02 pixel_data_table_left: .db 0x83 ; 1a27 r -@@ -2616,14 +2729,17 @@ +@@ -2640,14 +2753,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 @@ -433,7 +433,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 -@@ -2676,7 +2792,12 @@ +@@ -2700,7 +2816,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 @@ -446,7 +446,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 -@@ -2687,16 +2808,59 @@ +@@ -2711,16 +2832,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 @@ -506,7 +506,7 @@ 6$: .db 0xbd ; 1b69,1b76 -> 1b6b -> 1b6e r "lda bvar_6f9f,x" x=00..39 7$: .dw 0x6f9f ; 1b6c rw ora (*video_line_ptr),y ; 1b6b -> 1b6e -> 1b70 r y=6c..93 -@@ -2713,16 +2877,50 @@ +@@ -2737,16 +2901,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 @@ -559,7 +559,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 -@@ -2732,6 +2930,16 @@ +@@ -2756,6 +2954,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 @@ -576,7 +576,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 -@@ -2745,6 +2953,7 @@ +@@ -2769,6 +2977,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 @@ -584,7 +584,7 @@ rts ; 1bc9 -> 1bcb -> 15cd r s=fb erase_pixel_object: lda #0x00 ; 1c12 -> 1bcc -> 1bce r -@@ -2776,12 +2985,15 @@ +@@ -2800,12 +3009,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 @@ -600,7 +600,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 -@@ -2796,16 +3008,61 @@ +@@ -2820,16 +3032,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 @@ -662,7 +662,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 -@@ -2822,16 +3079,51 @@ +@@ -2846,16 +3103,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 @@ -716,7 +716,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 -@@ -2841,6 +3133,17 @@ +@@ -2865,6 +3157,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 @@ -734,7 +734,7 @@ .db 0xbd ; 1c96 -> 1c98 -> 1c9b r "lda 0x6fab,x" x=00..39 6$: .dw 0x6fab ; 1c99 rw eor #0xff ; 1c98 -> 1c9b -> 1c9d r -@@ -2860,9 +3163,24 @@ +@@ -2884,9 +3187,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 @@ -759,7 +759,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 -@@ -2870,6 +3188,11 @@ +@@ -2894,6 +3212,11 @@ lda *draw_x0 ; 1cc7 -> 1cc9 -> 1ccb r lsr a ; 1cc9 -> 1ccb -> 1ccc r bcc 0$ ; 1ccb -> 1ccc -> 1cce,1cd4 r c=0..1 @@ -771,7 +771,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 -@@ -2885,9 +3208,56 @@ +@@ -2909,9 +3232,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 @@ -828,7 +828,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 -@@ -2907,7 +3277,12 @@ +@@ -2931,7 +3301,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 @@ -841,7 +841,7 @@ ldx *x_save ; 1d17 -> 1d19 -> 1d1b r rts ; 1d19 -> 1d1b -> 1db3 r s=ec..f5 draw_misc_from_table: -@@ -2920,7 +3295,7 @@ +@@ -2944,7 +3319,7 @@ asl a ; 1d23 -> 1d24 -> 1d25 r sta *draw_misc_ptr ; 1d24 -> 1d25 -> 1d27 r lda #0x00 ; 1d25 -> 1d27 -> 1d29 r @@ -850,7 +850,7 @@ sta *draw_misc_ptr + 1 ; 1d29 -> 1d2b -> 1d2d r lda *half_dimension ; 1d2b -> 1d2d -> 1d2f r lsr a ; 1d2d -> 1d2f -> 1d30 r -@@ -2929,10 +3304,20 @@ +@@ -2953,10 +3328,20 @@ lsr a ; 1d31 -> 1d32 -> 1d33 r lsr a ; 1d32 -> 1d33 -> 1d34 r tay ; 1d33 -> 1d34 -> 1d35 r @@ -871,7 +871,7 @@ lda *half_dimension ; 1d3d -> 1d3f -> 1d41 r and #0x1f ; 1d3f -> 1d41 -> 1d43 r cmp #0x08 ; 1d41 -> 1d43 -> 1d45 r a=00..1f -@@ -2950,6 +3335,14 @@ +@@ -2974,6 +3359,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 @@ -886,7 +886,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 -@@ -3005,6 +3398,84 @@ +@@ -3029,6 +3422,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 @@ -971,7 +971,7 @@ draw_misc_mask_table: .db 0xff ; 1db6 r .db 0x00 ; 1db7 r -@@ -3015,14 +3486,15 @@ +@@ -3039,14 +3510,15 @@ .db 0xd5 ; 1dbc r .db 0xff ; 1dbd r draw_misc_mask_xor_table: @@ -995,7 +995,7 @@ .area text2 -@@ -3334,6 +3806,15 @@ +@@ -3358,6 +3830,15 @@ .area data2 @@ -1011,7 +1011,7 @@ shape_data_ptr_lo: .db