*.rel
*.rst
*.seed
+/disasm/draw_misc.json
+/disasm/draw_misc_table.inc
/disasm/object.json
/disasm/object_data.inc
/disasm/object_index.inc
shape_data.inc \
object_defs.inc \
object_index.inc \
-object_data.inc
+object_data.inc \
+draw_misc_table.inc
${AS6500} -3 -l -o $<
shape_index_pixel.inc shape_data_pixel.inc: star_blazer.txt shape_pixel.json
object.json: object_defs.inc star_blazer.txt ../loader/star_blazer.ihx
./object_extract.py --disasm=$^ $@
+draw_misc_table.inc: star_blazer.txt draw_misc.json
+ ./draw_misc_compile.py $^ $@
+
+draw_misc.json: star_blazer.txt ../loader/star_blazer.ihx
+ ./draw_misc_extract.py $^ $@
+
star_blazer.asm: \
trace.txt \
star_blazer.txt \
--- /dev/null
+#!/usr/bin/env python3
+
+import json
+import sys
+from intelhex import IntelHex
+
+EXIT_SUCCESS = 0
+EXIT_FAILURE = 1
+
+if len(sys.argv) < 4:
+ print(f'usage: {sys.argv[0]:s} addrs.txt in.json out_table.inc')
+ sys.exit(EXIT_FAILURE)
+addrs_txt = sys.argv[1]
+in_json = sys.argv[2]
+out_table_inc = sys.argv[3]
+
+print('reading addrs')
+draw_misc_table = -1
+with open(addrs_txt) as fin:
+ def get_line():
+ while True:
+ line = fin.readline()
+ if len(line) == 0:
+ return []
+ i = line.find('#')
+ if i >= 0:
+ line = line[:i]
+ fields = line.strip().split(',')
+ if fields != ['']:
+ #print('fields', fields)
+ return fields
+
+ fields = get_line()
+ while len(fields):
+ assert len(fields) == 1
+ section = fields[0]
+ print(section)
+
+ if section == 'items':
+ fields = get_line()
+ while len(fields) >= 2:
+ assert len(fields) >= 4
+ addr = int(fields[0], 0)
+ name = fields[2]
+ _type = fields[3]
+ if _type == 'byte' and name == 'draw_misc_table':
+ draw_misc_table = addr
+ fields = get_line()
+ continue
+
+ # unknown section, skip
+ fields = get_line()
+ while len(fields) >= 2:
+ fields = get_line()
+assert draw_misc_table != -1
+
+print('reading json')
+with open(in_json) as fin:
+ data = json.load(fin)
+
+print('writing table')
+with open(out_table_inc, 'w') as fout:
+ fout.write(f'draw_misc_table: ; {draw_misc_table:04x}\n')
+ dot = draw_misc_table
+ for i in range(0x20):
+ addr1 = draw_misc_table + (i + 1) * 0x10
+ for span in data[i]['value']:
+ x = span['x']
+ y = span['y']
+ string = span['string']
+ count = str(len(string))
+ fout.write(f'\t.db\t{count:s},{x:s},{y:s}\n')
+ dot += 3
+ for shape in string:
+ fout.write(f'\t.db\t{shape:s}\n')
+ dot += len(string)
+ assert dot <= addr1
+ if dot < addr1:
+ # don't use .ds here, as tiny holes in the .ihx file are annoying
+ fout.write('\t.db\t{0:s}\n'.format(','.join(['0'] * (addr1 - dot))))
+ dot = addr1
+ fout.write('\n')
--- /dev/null
+#!/usr/bin/env python3
+
+import json
+import sys
+from intelhex import IntelHex
+
+EXIT_SUCCESS = 0
+EXIT_FAILURE = 1
+
+pixel = False
+if len(sys.argv) >= 2 and sys.argv[1] == '--pixel':
+ pixel = True
+ del sys.argv[1]
+if len(sys.argv) < 4:
+ print(f'usage: {sys.argv[0]:s} [--pixel] addrs.txt in.ihx out.json')
+ sys.exit(EXIT_FAILURE)
+addrs_txt = sys.argv[1]
+in_ihx = sys.argv[2]
+out_json = sys.argv[3]
+
+print('reading addrs')
+draw_misc_table = -1
+shapes = {}
+with open(addrs_txt) as fin:
+ def get_line():
+ while True:
+ line = fin.readline()
+ if len(line) == 0:
+ return []
+ i = line.find('#')
+ if i >= 0:
+ line = line[:i]
+ fields = line.strip().split(',')
+ if fields != ['']:
+ #print('fields', fields)
+ return fields
+
+ fields = get_line()
+ while len(fields):
+ assert len(fields) == 1
+ section = fields[0]
+ print(section)
+
+ if section == 'items':
+ fields = get_line()
+ while len(fields) >= 2:
+ assert len(fields) >= 4
+ addr = int(fields[0], 0)
+ name = fields[2]
+ _type = fields[3]
+ if _type == 'byte' and name == 'draw_misc_table':
+ draw_misc_table = addr
+ fields = get_line()
+ continue
+
+ if section == 'shapes':
+ fields = get_line()
+ while len(fields) >= 2:
+ assert len(fields) == 2
+ index = int(fields[0], 0)
+ name = fields[1]
+ # shape < 8 is a single pixel masked by the shape number
+ # ignore these lines in addrs file unless --pixel requested
+ if index >= 8 or pixel:
+ shapes[index] = name
+ fields = get_line()
+ continue
+
+ # unknown section, skip
+ fields = get_line()
+ while len(fields) >= 2:
+ fields = get_line()
+assert draw_misc_table != -1
+
+print('reading ihx')
+intelhex = IntelHex(in_ihx)
+segments = [j for i in intelhex.segments() for j in i]
+for i in range(0, len(segments), 2):
+ print(f'[{segments[i]:04x}, {segments[i + 1]:04x})')
+
+print('extracting')
+data = []
+for i in range(0x20):
+ addr0 = draw_misc_table + i * 0x10
+ addr1 = draw_misc_table + (i + 1) * 0x10
+ name = f'decimal_{i:d}' if i < 8 else f'entry_{i:02x}'
+
+ addr = addr0
+ value = []
+ while addr < addr1:
+ count = intelhex[addr]
+ if count == 0:
+ break
+ assert addr + 3 + count <= addr1
+ x = str(intelhex[addr + 1])
+ y = str(intelhex[addr + 2])
+ addr += 3
+ string = []
+ for i in range(count):
+ shape = intelhex[addr + i]
+ string.append(
+ '0'
+ if shape == 0 else
+ f'SHAPE_{shape:02X}_{shapes[shape].upper():s}'
+ if shape in shapes else
+ f'0x{shape:02x}'
+ )
+ addr += count
+ value.append({'x': x, 'y': y, 'string': string})
+
+ data.append({'name': name, 'value': value})
+
+print('writing json')
+with open(out_json, 'w') as fout:
+ json.dump(data, fout, indent = 2)
UCODE_IF_NOT_DEMO = 0x0002
; escape bits 2 to 3
-UCODE_CONTROL_GAME = 0x0000
-UCODE_SET_DECIMAL = 0x0004
-UCODE_TITLE_DISPLAY = 0x0008
-UCODE_SOUND_EFFECT = 0x000c
+UCODE_CONTROL_GAME = 0x0100
+UCODE_SET_DECIMAL = 0x0104
+UCODE_DRAW_MISC = 0x0108
+UCODE_SOUND_EFFECT = 0x010c
; control game
UCODE_CONTROL_GAME_CLEAR_DEMO_SET_MISSION = 0x0000
; set decimal
UCODE_SET_DECIMAL_0 = 0x0000
-UCODE_SET_DECIMAL_0_ALT = 0x0100
-UCODE_SET_DECIMAL_SCORE_VAR_4B80_SCORE_VAR_4B00_BY_MISSION = 0x0200
-UCODE_SET_DECIMAL_1 = 0x0300
-UCODE_SET_DECIMAL_SCORE_VAR_4880_SCORE_VAR_4800 = 0x0400
-UCODE_SET_DECIMAL_SCORE_VAR_4980_SCORE_VAR_4900 = 0x0500
-UCODE_SET_DECIMAL_SCORE_VAR_4A80_SCORE_VAR_4A00 = 0x0600
-UCODE_SET_DECIMAL_SCORE_VAR_4B80_SCORE_VAR_4B00 = 0x0700
+UCODE_SET_DECIMAL_SCORE_VAR_4B80_SCORE_VAR_4B00_BY_MISSION = 0x0100
+UCODE_SET_DECIMAL_1 = 0x0200
+UCODE_SET_DECIMAL_SCORE_VAR_4880_SCORE_VAR_4800 = 0x0300
+UCODE_SET_DECIMAL_SCORE_VAR_4980_SCORE_VAR_4900 = 0x0400
+UCODE_SET_DECIMAL_SCORE_VAR_4A80_SCORE_VAR_4A00 = 0x0500
+UCODE_SET_DECIMAL_SCORE_VAR_4B80_SCORE_VAR_4B00 = 0x0600
-; title display
-UCODE_TITLE_DISPLAY_RESTART = 0xe100
-UCODE_TITLE_DISPLAY_CLEAR_RECTANGLE = 0xe200
+; draw misc
+UCODE_DRAW_MISC_RESTART = 0xe000
+UCODE_DRAW_MISC_CLEAR_RECTANGLE = 0xe100
+
+; draw misc bits 0 to 4
+UCODE_DRAW_MISC_DECIMAL_0 = 0x0000
+UCODE_DRAW_MISC_DECIMAL_1 = 0x0100
+UCODE_DRAW_MISC_DECIMAL_2 = 0x0200
+UCODE_DRAW_MISC_DECIMAL_3 = 0x0300
+UCODE_DRAW_MISC_DECIMAL_4 = 0x0400
+UCODE_DRAW_MISC_DECIMAL_5 = 0x0500
+UCODE_DRAW_MISC_DECIMAL_6 = 0x0600
+UCODE_DRAW_MISC_DECIMAL_7 = 0x0700
+UCODE_DRAW_MISC_ENTRY_08 = 0x0800
+UCODE_DRAW_MISC_ENTRY_09 = 0x0900
+UCODE_DRAW_MISC_ENTRY_0A = 0x0a00
+UCODE_DRAW_MISC_ENTRY_0B = 0x0b00
+UCODE_DRAW_MISC_ENTRY_0C = 0x0c00
+UCODE_DRAW_MISC_ENTRY_0D = 0x0d00
+UCODE_DRAW_MISC_ENTRY_0E = 0x0e00
+UCODE_DRAW_MISC_ENTRY_0F = 0x0f00
+UCODE_DRAW_MISC_ENTRY_10 = 0x1000
+UCODE_DRAW_MISC_ENTRY_11 = 0x1100
+UCODE_DRAW_MISC_ENTRY_12 = 0x1200
+UCODE_DRAW_MISC_ENTRY_13 = 0x1300
+UCODE_DRAW_MISC_ENTRY_14 = 0x1400
+UCODE_DRAW_MISC_ENTRY_15 = 0x1500
+UCODE_DRAW_MISC_ENTRY_16 = 0x1600
+UCODE_DRAW_MISC_ENTRY_17 = 0x1700
+UCODE_DRAW_MISC_ENTRY_18 = 0x1800
+UCODE_DRAW_MISC_ENTRY_19 = 0x1900
+UCODE_DRAW_MISC_ENTRY_1A = 0x1a00
+UCODE_DRAW_MISC_ENTRY_1B = 0x1b00
+UCODE_DRAW_MISC_ENTRY_1C = 0x1c00
+UCODE_DRAW_MISC_ENTRY_1D = 0x1d00
+UCODE_DRAW_MISC_ENTRY_1E = 0x1e00
+UCODE_DRAW_MISC_ENTRY_1F = 0x1f00
+
+; draw misc bits 5 to 7
+UCODE_DRAW_MISC_MASK_1 = 0x2000
+UCODE_DRAW_MISC_MASK_2 = 0x4000
+UCODE_DRAW_MISC_MASK_3 = 0x6000
+UCODE_DRAW_MISC_MASK_4 = 0x8000
+UCODE_DRAW_MISC_MASK_5 = 0xa000
+UCODE_DRAW_MISC_MASK_6 = 0xc000
; sound effect
-UCODE_SOUND_EFFECT_00 = 0x0100
-UCODE_SOUND_EFFECT_01 = 0x0200
-UCODE_SOUND_EFFECT_02 = 0x0300
-UCODE_SOUND_EFFECT_03 = 0x0400
-UCODE_SOUND_EFFECT_04 = 0x0500
-UCODE_SOUND_EFFECT_05 = 0x0600
-UCODE_SOUND_EFFECT_06 = 0x0700
-UCODE_SOUND_EFFECT_07 = 0x0800
-UCODE_SOUND_EFFECT_08 = 0x0900
-UCODE_SOUND_EFFECT_09 = 0x0a00
-UCODE_SOUND_EFFECT_0A = 0x0b00
-UCODE_SOUND_EFFECT_0B = 0x0c00
-UCODE_SOUND_EFFECT_0C = 0x0d00
-UCODE_SOUND_EFFECT_0D = 0x0e00
-UCODE_SOUND_EFFECT_0E = 0x0f00
-UCODE_SOUND_EFFECT_0F = 0x1000
+UCODE_SOUND_EFFECT_0 = 0x0000
+UCODE_SOUND_EFFECT_1 = 0x0100
+UCODE_SOUND_EFFECT_2 = 0x0200
+UCODE_SOUND_EFFECT_3 = 0x0300
+UCODE_SOUND_EFFECT_4 = 0x0400
+UCODE_SOUND_EFFECT_5 = 0x0500
+UCODE_SOUND_EFFECT_6 = 0x0600
+UCODE_SOUND_EFFECT_7 = 0x0700
+UCODE_SOUND_EFFECT_8 = 0x0800
+UCODE_SOUND_EFFECT_9 = 0x0900
+UCODE_SOUND_EFFECT_A = 0x0a00
+UCODE_SOUND_EFFECT_B = 0x0b00
+UCODE_SOUND_EFFECT_C = 0x0c00
+UCODE_SOUND_EFFECT_D = 0x0d00
+UCODE_SOUND_EFFECT_E = 0x0e00
+UCODE_SOUND_EFFECT_F = 0x0f00
; the following occur by themselves
k = j & 2
if k in defs['escape bit 1']:
value1.append(defs['escape bit 1'][k])
- k = j & 0xc
+ k = (j & 0xc) + 0x100
value1.append(defs['escape bits 2 to 3'][k])
- j &= 0xff00
- if k == 0: # control game
+ j = (j & 0xff00) - 0x100
+ if k == 0x100: # control game
value1.append(defs['control game'].get(j, f'0x{j:04x}'))
- elif k == 4: # set decimal
+ elif k == 0x104: # set decimal
value1.append(defs['set decimal'].get(j, f'0x{j:04x}'))
- elif k == 8: # title display
- value1.append(defs['title display'].get(j, f'0x{j:04x}'))
- elif k == 0xc: # sound effect
+ elif k == 0x108: # draw misc
+ if j < 0xe000: # from table
+ k = j & 0x1f00
+ value1.append(defs['draw misc bits 0 to 4'][k])
+ k = j & 0xe000
+ if k in defs['draw misc bits 5 to 7']:
+ value1.append(defs['draw misc bits 5 to 7'][k])
+ else:
+ value1.append(defs['draw misc'].get(j, f'0x{j:04x}'))
+ elif k == 0x10c: # sound effect
value1.append(defs['sound effect'].get(j, f'0x{j:04x}'))
else:
assert False
k = j & 0x8000
if k in defs['update bit 7']:
value1.append(defs['update bit 7'][k])
- value.append(' | '.join(value1))
+ value.append(' + '.join(value1))
return value
print('reading addrs')
---- star_blazer.asm0 2022-06-25 21:13:37.563535955 +1000
-+++ star_blazer.asm 2022-06-25 21:36:21.751519080 +1000
-@@ -1,3 +1,9 @@
+--- star_blazer.asm0 2022-06-26 00:00:24.179412175 +1000
++++ star_blazer.asm 2022-06-26 00:02:51.759410350 +1000
+@@ -1,3 +1,10 @@
+UNREACHABLE = 1
+DHGR = 0
+PIXEL_SHAPE = 0
+SHAPE = 1
+OBJECT = 1
++DRAW_MISC = 1
+
HIRES_SCREEN = 0x2000 ; 2000
HW_KBD = 0xc000 ; c000
HW_KBDSTRB = 0xc010 ; c010
-@@ -12,19 +18,48 @@
+@@ -12,19 +19,48 @@
HW_PTRIG = 0xc070 ; c070
ROM_PREAD = 0xfb1e ; fb1e
.ds 0x30 ; 0050
half_dimension:
.ds 1 ; 0080 rw
-@@ -48,12 +83,22 @@
+@@ -48,12 +84,22 @@
draw_y: .ds 1 ; 008a rw
video_line_ptr:
.ds 2 ; 008b rw
accumulator:
.ds 3 ; 0090 rw
.ds 1 ; 0093
-@@ -1071,7 +1116,7 @@
+@@ -1071,7 +1117,7 @@
tsx ; 1095 -> 1097 -> 1098 r
stx *ucode_sp ; 1097 -> 1098 -> 109a r
ldx *ucode_x_save_c9 ; 1098 -> 109a -> 109c r
sta *ucode_start_sentinel ; 109c -> 109f -> 10a1 r
ucode_execute_1093_entry:
ldy #0x00 ; 1090,109f -> 10a1 -> 10a3 r
-@@ -1098,7 +1143,7 @@
+@@ -1098,7 +1144,7 @@
jsr do_ucode_pair ; 10c6 -> 10c8 -> 106a r s=f7..f9,02
bne 3$ ; 107b -> 10cb -> 10c0 r z=0
ucode_execute_1093_done:
rts ; 10cd -> 10d0 -> 123e,143a,1615,1629,1633,1649,165b,1759 r s=f7..fd,02
ucode_execute_10d1:
beq rts_10ec ; 1216,123b,1260,1285 -> 10d1 -> 10d3,10ec r z=0..1
-@@ -1980,10 +2025,35 @@
+@@ -1980,10 +2026,35 @@
sta *button_state ; 17ce r
rts_17d0:
rts ; 17ab,17ca -> 17d0 -> 1768,176f r s=fd
ldx #0x01 ; 17db r
0$: jsr ROM_PREAD ; 17dd r
cpy #0xff ; 17e0 r
-@@ -1994,7 +2064,12 @@
+@@ -1994,7 +2065,12 @@
sta bvar_179e ; 17e9 r
sta bvar_17a3 ; 17ec r
sta bvar_1e0e ; 17ef r
.area text1
-@@ -2062,10 +2137,12 @@
+@@ -2062,10 +2138,12 @@
lda *result + 1 ; 186e r
ldy *result + 2 ; 1870 r
rts ; 1872 r
random_init:
lda *random_seed ; 16ae -> 187a -> 187c r
ora #0x01 ; 187a -> 187c -> 187e r
-@@ -2224,16 +2301,30 @@
+@@ -2224,16 +2302,30 @@
ldx #>HIRES_SCREEN ; 199b -> 199d -> 199f r
stx *video_line_ptr + 1 ; 199d -> 199f -> 19a1 r
tay ; 199f -> 19a1 -> 19a2 r
rts ; 19b5 -> 19b8 -> 1713 r s=fd
video_clear_rectangle:
ldx *clip_y0 ; 1064 -> 19b9 -> 19bb r
-@@ -2241,8 +2332,20 @@
+@@ -2241,8 +2333,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
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 +2394,7 @@
+@@ -2291,6 +2395,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
rts ; 1a23 -> 1a26 -> 1076,1179,1602 r s=f1..f9,02
pixel_data_table_left:
.db 0x83 ; 1a27 r
-@@ -2373,14 +2477,17 @@
+@@ -2373,14 +2478,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
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 +2540,12 @@
+@@ -2433,7 +2541,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
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 +2556,59 @@
+@@ -2444,16 +2557,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
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 +2625,50 @@
+@@ -2470,16 +2626,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
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 +2678,16 @@
+@@ -2489,6 +2679,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
.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 +2701,7 @@
+@@ -2502,6 +2702,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
rts ; 1bc9 -> 1bcb -> 15cd r s=fb
erase_pixel_object:
lda #0x00 ; 1c12 -> 1bcc -> 1bce r
-@@ -2533,12 +2733,15 @@
+@@ -2533,12 +2734,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
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 +2756,61 @@
+@@ -2553,16 +2757,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
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 +2827,51 @@
+@@ -2579,16 +2828,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
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 +2881,17 @@
+@@ -2598,6 +2882,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
.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 +2911,24 @@
+@@ -2617,9 +2912,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
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 +2936,11 @@
+@@ -2627,6 +2937,11 @@
lda *draw_x0 ; 1cc7 -> 1cc9 -> 1ccb r
lsr a ; 1cc9 -> 1ccb -> 1ccc r
bcc 0$ ; 1ccb -> 1ccc -> 1cce,1cd4 r c=0..1
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 +2956,56 @@
+@@ -2642,9 +2957,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
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 +3025,12 @@
+@@ -2664,7 +3026,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
ldx *x_save ; 1d17 -> 1d19 -> 1d1b r
rts ; 1d19 -> 1d1b -> 1db3 r s=ec..f5
draw_misc_from_table:
-@@ -2677,7 +3043,7 @@
+@@ -2677,7 +3044,7 @@
asl a ; 1d23 -> 1d24 -> 1d25 r
sta *draw_misc_ptr ; 1d24 -> 1d25 -> 1d27 r
lda #0x00 ; 1d25 -> 1d27 -> 1d29 r
sta *draw_misc_ptr + 1 ; 1d29 -> 1d2b -> 1d2d r
lda *half_dimension ; 1d2b -> 1d2d -> 1d2f r
lsr a ; 1d2d -> 1d2f -> 1d30 r
-@@ -2686,10 +3052,20 @@
+@@ -2686,10 +3053,20 @@
lsr a ; 1d31 -> 1d32 -> 1d33 r
lsr a ; 1d32 -> 1d33 -> 1d34 r
tay ; 1d33 -> 1d34 -> 1d35 r
lda *half_dimension ; 1d3d -> 1d3f -> 1d41 r
and #0x1f ; 1d3f -> 1d41 -> 1d43 r
cmp #0x08 ; 1d41 -> 1d43 -> 1d45 r a=00..1f
-@@ -2707,6 +3083,14 @@
+@@ -2707,6 +3084,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
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 +3146,84 @@
+@@ -2762,6 +3147,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
draw_misc_mask_table:
.db 0xff ; 1db6 r
.db 0x00 ; 1db7 r
-@@ -2772,14 +3234,15 @@
+@@ -2772,14 +3235,15 @@
.db 0xd5 ; 1dbc r
.db 0xff ; 1dbd r
draw_misc_mask_xor_table:
.area text2
-@@ -3083,6 +3546,15 @@
+@@ -3083,6 +3547,15 @@
.area data2
shape_data_ptr_lo:
.db <bvar_5d01 ; 4000 r
.db <bvar_5d01 ; 4001 r
-@@ -4625,6 +5097,9 @@
+@@ -4625,6 +5098,12 @@
.db 0x01 ; 45fd r
.db 0x01 ; 45fe r
.db 0x04 ; 45ff r
+.endif
+.endif
+.endif
++.if DRAW_MISC
++.include "draw_misc_table.inc"
++.else
draw_misc_table:
.db 0x01 ; 4600 r
.db 0x07 ; 4601 r
-@@ -5139,6 +5614,164 @@
+@@ -5138,9 +5617,168 @@
+ .db 0x00 ; 47fd r
.db 0x00 ; 47fe r
.db 0x00 ; 47ff r
-
++.endif
++
+.if OBJECT
+; move these to here where they'll overlay data3 and fill in gaps
+score_var_4800:
+ .db 0x99 ; 4b8d r
+ .db 0x99 ; 4b8e r
+ .db 0x99 ; 4b8f r
-+
-+ .area data3
-+
-+.include "object_index.inc"
-+.else
+
.area data3
++.include "object_index.inc"
++.else
++ .area data3
++
score_var_4800:
-@@ -9271,9 +9904,19 @@
+ .db 0x03 ; 4800 r
+ score_table_4801:
+@@ -9271,9 +9909,19 @@
.dw 0x0000 ; 5bba r
.dw bvar_9d1d ; 5bbc r
.dw 0x0000 ; 5bbe r
.db 0x5c ; 5c00
.db 0x02 ; 5c01
.db 0x00 ; 5c02
-@@ -21699,9 +22342,15 @@
+@@ -21699,9 +22347,15 @@
.db 0xe0 ; 8c05
.db 0x83 ; 8c06
.db 0x9e ; 8c07
bvar_8e00:
.db 0x30 ; 8e00 r
.db 0x0f ; 8e01
-@@ -26272,6 +26921,13 @@
+@@ -26272,6 +26926,13 @@
.db 0x7c ; 9dea
.db 0x98 ; 9deb
.db 0x00 ; 9dec