New JSON-based draw misc extractor and compiler
authorNick Downing <nick@ndcode.org>
Sat, 25 Jun 2022 14:04:46 +0000 (00:04 +1000)
committerNick Downing <nick@ndcode.org>
Tue, 28 Jun 2022 03:21:38 +0000 (13:21 +1000)
.gitignore
disasm/Makefile
disasm/draw_misc_compile.py [new file with mode: 0755]
disasm/draw_misc_extract.py [new file with mode: 0755]
disasm/object_defs.inc
disasm/object_extract.py
disasm/star_blazer.asm.patch

index 432c5b7..7cda1b6 100644 (file)
@@ -9,6 +9,8 @@
 *.rel
 *.rst
 *.seed
+/disasm/draw_misc.json
+/disasm/draw_misc_table.inc
 /disasm/object.json
 /disasm/object_data.inc
 /disasm/object_index.inc
index 42d3f7a..4c5abcd 100644 (file)
@@ -57,7 +57,8 @@ shape_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
@@ -78,6 +79,12 @@ object_index.inc object_data.inc: star_blazer.txt object.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 \
diff --git a/disasm/draw_misc_compile.py b/disasm/draw_misc_compile.py
new file mode 100755 (executable)
index 0000000..4667162
--- /dev/null
@@ -0,0 +1,82 @@
+#!/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')
diff --git a/disasm/draw_misc_extract.py b/disasm/draw_misc_extract.py
new file mode 100755 (executable)
index 0000000..bcd1b07
--- /dev/null
@@ -0,0 +1,115 @@
+#!/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)
index 2d2c8b4..1e6c4fb 100644 (file)
@@ -275,10 +275,10 @@ UCODE_IF_DEMO = 0x0001
 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
@@ -288,35 +288,76 @@ UCODE_CONTROL_GAME_START_GAME_DEMO = 0xa000
 
 ; 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
 
index 58eafca..5bf0e40 100755 (executable)
@@ -96,16 +96,23 @@ def disasm_words(value0):
       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
@@ -128,7 +135,7 @@ def disasm_words(value0):
         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')
index 51e7e6a..42520b2 100644 (file)
@@ -1,16 +1,17 @@
---- 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
  
@@ -63,7 +64,7 @@
        .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
@@ -86,7 +87,7 @@
  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
@@ -95,7 +96,7 @@
        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