Re-add ucode disassembler more properly (it does not try to be comprehensive)
authorNick Downing <nick@ndcode.org>
Sat, 25 Jun 2022 12:13:54 +0000 (22:13 +1000)
committerNick Downing <nick@ndcode.org>
Tue, 28 Jun 2022 03:21:37 +0000 (13:21 +1000)
.gitignore
disasm/Makefile
disasm/object_defs.inc [new file with mode: 0644]
disasm/object_extract.py
disasm/star_blazer.asm.patch
disasm/ucode0.py [deleted file]
disasm/ucode1.py [deleted file]
disasm/ucode_defs.inc [deleted file]
disasm/ucode_disasm.py [deleted file]

index 1f2d497..432c5b7 100644 (file)
@@ -21,7 +21,6 @@
 /disasm/star_blazer.asm
 /disasm/star_blazer.asm0
 /disasm/star_blazer.dsk
-/disasm/ucode_data.inc
 /emu_65c02/emu_65c02
 /emu_65c02/cg_default/*.inc
 /emu_65c02/cg_default/*.pbm
index c7733fb..42d3f7a 100644 (file)
@@ -55,9 +55,9 @@ shape_index_pixel.inc \
 shape_data_pixel.inc \
 shape_index.inc \
 shape_data.inc \
+object_defs.inc \
 object_index.inc \
-object_data.inc \
-ucode_defs.inc
+object_data.inc
        ${AS6500} -3 -l -o $<
 
 shape_index_pixel.inc shape_data_pixel.inc: star_blazer.txt shape_pixel.json
@@ -75,12 +75,8 @@ shape.json: star_blazer.txt ../loader/star_blazer.ihx
 object_index.inc object_data.inc: star_blazer.txt object.json
        ./object_compile.py 0x4800 $^ object_index.inc object_data.inc
 
-object.json: star_blazer.txt ../loader/star_blazer.ihx
-       ./object_extract.py $^ $@
-
-ucode_data.inc: star_blazer.asm
-       sed -ne '/^ucode1080_countdown_30_pixel:/,/; 9dec/p' $< |\
-./ucode_disasm.py >$@
+object.json: object_defs.inc star_blazer.txt ../loader/star_blazer.ihx
+       ./object_extract.py --disasm=$^ $@
 
 star_blazer.asm: \
 trace.txt \
diff --git a/disasm/object_defs.inc b/disasm/object_defs.inc
new file mode 100644 (file)
index 0000000..2d2c8b4
--- /dev/null
@@ -0,0 +1,358 @@
+; objects
+OBJECT_10_PIXEL = 0x10
+OBJECT_11_PIXEL = 0x11
+OBJECT_12_PIXEL = 0x12
+OBJECT_13_PIXEL = 0x13
+OBJECT_14_FRAGMENT = 0x14
+OBJECT_15_FRAGMENT = 0x15
+OBJECT_16_FRAGMENT = 0x16
+OBJECT_17_FRAGMENT = 0x17
+OBJECT_18_FRAGMENT = 0x18
+OBJECT_19_FRAGMENT = 0x19
+OBJECT_1A_FRAGMENT = 0x1a
+OBJECT_1B_FRAGMENT = 0x1b
+OBJECT_1C_FRAGMENT = 0x1c
+OBJECT_1D_FRAGMENT = 0x1d
+OBJECT_1E_FRAGMENT = 0x1e
+OBJECT_1F_FRAGMENT = 0x1f
+OBJECT_20_PIXEL = 0x20
+OBJECT_21_PIXEL = 0x21
+OBJECT_22_PIXEL = 0x22
+OBJECT_23_PIXEL = 0x23
+OBJECT_24_PIXEL = 0x24
+OBJECT_25_PIXEL = 0x25
+OBJECT_26_PIXEL = 0x26
+OBJECT_27_PIXEL = 0x27
+OBJECT_28_EXHAUST = 0x28
+OBJECT_29_PIXEL = 0x29
+OBJECT_2A_EXPLOSION = 0x2a
+OBJECT_2C_PIXEL = 0x2c
+OBJECT_2D_PIXEL = 0x2d
+OBJECT_2E_PIXEL = 0x2e
+OBJECT_2F_PIXEL = 0x2f
+OBJECT_30_PIXEL = 0x30
+OBJECT_31_PIXEL = 0x31
+OBJECT_32_PIXEL = 0x32
+OBJECT_33_PIXEL = 0x33
+OBJECT_34_PIXEL = 0x34
+OBJECT_35_PIXEL = 0x35
+OBJECT_36_PIXEL = 0x36
+OBJECT_37_PIXEL = 0x37
+OBJECT_38_PIXEL = 0x38
+OBJECT_39_PIXEL = 0x39
+OBJECT_3A_PIXEL = 0x3a
+OBJECT_3B_PIXEL = 0x3b
+OBJECT_3C_PIXEL = 0x3c
+OBJECT_3D_PIXEL = 0x3d
+OBJECT_40_BIRD = 0x40
+OBJECT_41_TREE_CACTUS = 0x41
+OBJECT_42_TREE_CACTUS = 0x42
+OBJECT_43_TREE_CACTUS = 0x43
+OBJECT_44_MISSILE_LAUNCHER = 0x44
+OBJECT_45_MISSILE_LAUNCHER = 0x45
+OBJECT_46_MISSILE_LAUNCHER = 0x46
+OBJECT_47_PYLON = 0x47
+OBJECT_48_PYLON = 0x48
+OBJECT_49_SILO = 0x49
+OBJECT_4A_SILO_HAYSTACK = 0x4a
+OBJECT_4B_HAYSTACK_HOUSE = 0x4b
+OBJECT_4C_SILO_HOUSE = 0x4c
+OBJECT_4D_HEADQUARTERS_RADAR_ICBM = 0x4d
+OBJECT_4E_PIXEL = 0x4e
+OBJECT_4F_PIXEL = 0x4f
+OBJECT_50_BULLET = 0x50
+OBJECT_51_BULLET = 0x51
+OBJECT_52_BULLET = 0x52
+OBJECT_53_PIXEL_BALLOON_EXPLOSION = 0x53
+OBJECT_54_PIXEL_BALLOON_EXPLOSION = 0x54
+OBJECT_55_PIXEL_BALLOON_EXPLOSION = 0x55
+OBJECT_56_PIXEL_BALLOON_EXPLOSION = 0x56
+OBJECT_57_PIXEL_BALLOON_EXPLOSION = 0x57
+OBJECT_58_BOMB_EXPLOSION = 0x58
+OBJECT_59_BOMB_EXPLOSION = 0x59
+OBJECT_5A_BOMB_EXPLOSION = 0x5a
+OBJECT_5B_BOMB_EXPLOSION = 0x5b
+OBJECT_5C_BOMB_EXPLOSION = 0x5c
+OBJECT_5D_BOMB_EXPLOSION = 0x5d
+OBJECT_5E_BOMB_EXPLOSION = 0x5e
+OBJECT_5F_BOMB_EXPLOSION = 0x5f
+OBJECT_60_PIXEL = 0x60
+OBJECT_61_SHIP = 0x61
+OBJECT_62_SHIP = 0x62
+OBJECT_63_PIXEL = 0x63
+OBJECT_64_PIXEL_SHIP = 0x64
+OBJECT_65_PIXEL_EXHAUST = 0x65
+OBJECT_66_SHIP = 0x66
+OBJECT_67_BIRD = 0x67
+OBJECT_68_MISSILE = 0x68
+OBJECT_69_MISSILE = 0x69
+OBJECT_6A_MISSILE = 0x6a
+OBJECT_6B_HELICOPTER_ENEMY_PLANE = 0x6b
+OBJECT_6C_HELICOPTER_ENEMY_PLANE = 0x6c
+OBJECT_6D_HELICOPTER_ENEMY_PLANE = 0x6d
+OBJECT_6E_HELICOPTER_ENEMY_PLANE = 0x6e
+OBJECT_6F_HELICOPTER_ENEMY_PLANE = 0x6f
+OBJECT_70_SUPPLY_PLANE = 0x70
+OBJECT_71_PARACHUTE = 0x71
+OBJECT_72_FUEL_EXPLOSION = 0x72
+OBJECT_73_BULLET = 0x73
+OBJECT_74_BULLET = 0x74
+OBJECT_75_BULLET = 0x75
+OBJECT_76_PIXEL = 0x76
+OBJECT_77_TANK = 0x77
+OBJECT_78_PIXEL = 0x78
+OBJECT_79_PIXEL = 0x79
+OBJECT_7A_PIXEL = 0x7a
+OBJECT_7B_PIXEL = 0x7b
+OBJECT_7C_PIXEL = 0x7c
+OBJECT_7D_PIXEL = 0x7d
+OBJECT_7E_PIXEL = 0x7e
+OBJECT_7F_PIXEL = 0x7f
+
+; shapes
+SHAPE_00_PIXEL = 0x00
+SHAPE_01_PIXEL = 0x01
+SHAPE_02_PIXEL = 0x02
+SHAPE_03_PIXEL = 0x03
+SHAPE_04_PIXEL = 0x04
+SHAPE_05_PIXEL = 0x05
+SHAPE_06_PIXEL = 0x06
+SHAPE_07_PIXEL = 0x07
+SHAPE_08_BULLET = 0x08
+SHAPE_09_BULLET = 0x09
+SHAPE_0A_BULLET = 0x0a
+SHAPE_0B_BULLET = 0x0b
+SHAPE_0C_BIRD = 0x0c
+SHAPE_0D_BIRD = 0x0d
+SHAPE_0E_BIRD = 0x0e
+SHAPE_0F_BIRD = 0x0f
+SHAPE_10_SHIP_STATE0 = 0x10
+SHAPE_11_SHIP_STATE1 = 0x11
+SHAPE_12_EXHAUST = 0x12
+SHAPE_13_EXHAUST = 0x13
+SHAPE_14_PARACHUTE = 0x14
+SHAPE_15_PARACHUTE = 0x15
+SHAPE_16_PARACHUTE = 0x16
+SHAPE_17_FUEL = 0x17
+SHAPE_18_SUPPLY_PLANE = 0x18
+SHAPE_1C_TANK = 0x1c
+SHAPE_1E_MISSILE_TANK_STATE0 = 0x1e
+SHAPE_1F_MISSILE_TANK_STATE1 = 0x1f
+SHAPE_20_BOMB = 0x20
+SHAPE_21_BOMB = 0x21
+SHAPE_22_BOMB = 0x22
+SHAPE_23_BOMB = 0x23
+SHAPE_28_BALLOON = 0x28
+SHAPE_29_BALLOON = 0x29
+SHAPE_2A_BALLOON = 0x2a
+SHAPE_2C_HELICOPTER = 0x2c
+SHAPE_2E_ENEMY_PLANE = 0x2e
+SHAPE_2F_ENEMY_PLANE = 0x2f
+SHAPE_30_SILO = 0x30
+SHAPE_31_SILO = 0x31
+SHAPE_36_PYLON = 0x36
+SHAPE_40_MISSILE = 0x40
+SHAPE_41_MISSILE = 0x41
+SHAPE_42_MISSILE = 0x42
+SHAPE_43_MISSILE = 0x43
+SHAPE_44_MISSILE = 0x44
+SHAPE_45_MISSILE = 0x45
+SHAPE_46_MISSILE = 0x46
+SHAPE_47_MISSILE = 0x47
+SHAPE_48_MISSILE = 0x48
+SHAPE_49_MISSILE = 0x49
+SHAPE_4A_MISSILE = 0x4a
+SHAPE_4B_MISSILE = 0x4b
+SHAPE_4C_MISSILE = 0x4c
+SHAPE_4D_MISSILE = 0x4d
+SHAPE_4E_MISSILE = 0x4e
+SHAPE_4F_MISSILE = 0x4f
+SHAPE_50_MISSILE_LAUNCHER_STATE0 = 0x50
+SHAPE_51_MISSILE_LAUNCHER_STATE0 = 0x51
+SHAPE_52_MISSILE_LAUNCHER_STATE0 = 0x52
+SHAPE_54_MISSILE_LAUNCHER_STATE1 = 0x54
+SHAPE_55_MISSILE_LAUNCHER_STATE1 = 0x55
+SHAPE_56_MISSILE_LAUNCHER_STATE1 = 0x56
+SHAPE_60_FRAGMENT = 0x60
+SHAPE_61_FRAGMENT = 0x61
+SHAPE_62_FRAGMENT = 0x62
+SHAPE_63_FRAGMENT = 0x63
+SHAPE_64_FRAGMENT = 0x64
+SHAPE_65_FRAGMENT = 0x65
+SHAPE_66_FRAGMENT = 0x66
+SHAPE_67_FRAGMENT = 0x67
+SHAPE_70_HAYSTACK = 0x70
+SHAPE_71_HOUSE = 0x71
+SHAPE_72_HEADQUARTERS = 0x72
+SHAPE_73_RADAR = 0x73
+SHAPE_74_RADAR = 0x74
+SHAPE_75_RADAR = 0x75
+SHAPE_76_ICBM = 0x76
+SHAPE_78_TREE = 0x78
+SHAPE_79_CACTUS = 0x79
+SHAPE_88_EXPLOSION = 0x88
+SHAPE_89_EXPLOSION = 0x89
+SHAPE_8A_EXPLOSION = 0x8a
+SHAPE_8B_EXPLOSION = 0x8b
+SHAPE_A0_TEXT_0 = 0xa0
+SHAPE_A1_TEXT_1 = 0xa1
+SHAPE_A2_TEXT_2 = 0xa2
+SHAPE_A3_TEXT_3 = 0xa3
+SHAPE_A4_TEXT_4 = 0xa4
+SHAPE_A5_TEXT_5 = 0xa5
+SHAPE_A6_TEXT_6 = 0xa6
+SHAPE_A7_TEXT_7 = 0xa7
+SHAPE_A8_TEXT_8 = 0xa8
+SHAPE_A9_TEXT_9 = 0xa9
+SHAPE_AA_TEXT_SCORE = 0xaa
+SHAPE_AB_TEXT_COLON = 0xab
+SHAPE_AC_TEXT_HIGH = 0xac
+SHAPE_B0_TEXT_MISSION = 0xb0
+SHAPE_B2_TEXT_FUEL = 0xb2
+SHAPE_B3_TEXT_EMPTY = 0xb3
+SHAPE_B4_TEXT_BOMB = 0xb4
+SHAPE_B6_TEXT_SHIP_LEFT = 0xb6
+SHAPE_B7_TEXT_COMPLETE = 0xb7
+SHAPE_B8_TEXT_THE = 0xb8
+SHAPE_B9_TEXT_RADAR = 0xb9
+SHAPE_BA_TEXT_ICBM = 0xba
+SHAPE_BC_TEXT_ATTACK = 0xbc
+SHAPE_BD_TEXT_TANK = 0xbd
+SHAPE_BE_TEXT_HEADQUARTERS = 0xbe
+SHAPE_BF_TEXT_A = 0xbf
+SHAPE_C0_SHIPS = 0xc0
+SHAPE_C1_SHIPS = 0xc1
+SHAPE_C2_SHIPS = 0xc2
+SHAPE_C3_SHIPS = 0xc3
+SHAPE_D0_TEXT_STAR = 0xd0
+SHAPE_D1_TEXT_BLAZER = 0xd1
+SHAPE_D2_TEXT_BY = 0xd2
+SHAPE_D3_TEXT_TONY = 0xd3
+SHAPE_D4_TEXT_SUZUKI = 0xd4
+SHAPE_D8_TEXT_GAME = 0xd8
+SHAPE_D9_TEXT_OVER = 0xd9
+SHAPE_DA_TEXT_BONUS = 0xda
+SHAPE_DC_TEXT_GREAT = 0xdc
+SHAPE_DD_TEXT_PERFORMANCE = 0xdd
+SHAPE_E1_TEXT_COPYRIGHT = 0xe1
+SHAPE_E2_TEXT_STAR_CRAFT = 0xe2
+SHAPE_E3_TEXT_INC = 0xe3
+SHAPE_E4_TEXT_THANKS = 0xe4
+SHAPE_E5_TEXT_LOT_COMMA = 0xe5
+SHAPE_E6_TEXT_RALY = 0xe6
+SHAPE_E7_TEXT_MINUS_20 = 0xe7
+SHAPE_E8_TEXT_20_40_60_80 = 0xe8
+SHAPE_E9_TEXT_100_120_300_1500 = 0xe9
+SHAPE_F0_GROUND = 0xf0
+SHAPE_F1_GROUND = 0xf1
+SHAPE_F2_GROUND = 0xf2
+SHAPE_F3_GROUND = 0xf3
+SHAPE_FF_BLANK = 0xff
+
+; sections
+
+; byte-wide sections
+SECTION_F0 = 0xf0
+SECTION_F1 = 0xf1
+SECTION_F2 = 0xf2
+SECTION_F3 = 0xf3
+SECTION_F8_REPEAT = 0xf8
+SECTION_F9_REPEAT = 0xf9
+SECTION_FA_REPEAT = 0xfa
+SECTION_FB_REPEAT = 0xfb
+SECTION_FF = 0xff
+
+; word-wide sections
+SECTION_F0F0 = 0xf0f0
+SECTION_F1F1 = 0xf1f1
+SECTION_F2F2 = 0xf2f2
+SECTION_F3F3 = 0xf3f3
+
+; escape bit 0
+UCODE_IF_DEMO = 0x0001
+
+; escape bit 1
+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
+
+; control game
+UCODE_CONTROL_GAME_CLEAR_DEMO_SET_MISSION = 0x0000
+UCODE_CONTROL_GAME_SET_DEMO_SET_MISSION = 0x2000
+UCODE_CONTROL_GAME_START_GAME = 0x4000
+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
+
+; title display
+UCODE_TITLE_DISPLAY_RESTART = 0xe100
+UCODE_TITLE_DISPLAY_CLEAR_RECTANGLE = 0xe200
+
+; 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
+
+; the following occur by themselves
+
+; byte
+UCODE_HORIZONTAL_COLLISION_AND_ZERO = 0x0800
+UCODE_VERTICAL_COLLISION_AND_ZERO = 0x0900
+UCODE_HORIZONTAL_COLLISION = 0x0a00
+UCODE_VERTICAL_COLLISION = 0x0b00
+UCODE_HORIZONTAL_COLLISION_AND_COPY = 0x0c00
+UCODE_VERTICAL_COLLISION_AND_COPY = 0x0d00
+UCODE_INACTIVATE_OBJECT = 0x0f00
+
+; the following are used with UCODE_UPDATE_OBJECT(_IF_INACTIVE)
+
+; update bits 0 to 2
+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
+
+; update bit 3
+UCODE_RESET_OBJECT = 0x0000
+UCODE_ACTIVATE_OBJECT = 0x0800
+
+; update bits 4 to 6
+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
+
+; update bit 7
+UCODE_UPDATE_OBJECT_IF_INACTIVE = 0x0000
+UCODE_UPDATE_OBJECT = 0x8000
index f784504..58eafca 100755 (executable)
@@ -8,13 +8,129 @@ from intelhex import IntelHex
 EXIT_SUCCESS = 0
 EXIT_FAILURE = 1
 
+defs_inc = None
+if len(sys.argv) >= 2 and sys.argv[1][:9] == '--disasm=':
+  defs_inc = sys.argv[1][9:]
+  del sys.argv[1]
 if len(sys.argv) < 4:
-  print(f'usage: {sys.argv[0]:s} addrs.txt in.ihx out.json')
+  print(f'usage: {sys.argv[0]:s} [--disasm=defs.inc] 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]
 
+defs = {}
+if defs_inc is not None: # --disasm requested
+  print('reading defs')
+  with open(defs_inc) as fin:
+    for line in fin:
+      line = line.rstrip()
+      if len(line):
+        if line[:1] == ';':
+          fields = line[1:].split()
+          section = ' '.join(fields)
+        else:
+          fields = line.split()
+          assert len(fields) == 3 and fields[1] == '='
+          name = fields[0]
+          value = int(fields[2], 0)
+          if section not in defs:
+            defs[section] = {}
+          defs[section][value] = name
+
+def disasm_animate_shape(value0):
+  value = []
+  for i in value0:
+    j = int(i, 0)
+    if j in defs['byte-wide sections']:
+      i = defs['byte-wide sections'][j]
+    elif j in defs['shapes']:
+      i = defs['shapes'][j]
+    value.append(i)
+  return value
+
+def disasm_collision_test(value0):
+  value = []
+  for i in value0:
+    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]
+    value.append(i)
+  return value
+
+def disasm_homing(value0):
+  value = []
+  for i in value0:
+    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]
+    value.append(i)
+  return value
+
+def disasm_test_fire(value0):
+  value = []
+  for i in value0:
+    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]
+    value.append(i)
+  return value
+
+def disasm_words(value0):
+  value = []
+  for i in value0:
+    j = int(i, 0)
+    value1 = []
+    if j in defs['word-wide sections']:
+      value1.append(defs['word-wide sections'][j])
+    elif (j & 0xff) < 0x10: # escape
+      k = j & 1
+      if k in defs['escape bit 0']:
+        value1.append(defs['escape bit 0'][k])
+      k = j & 2
+      if k in defs['escape bit 1']:
+        value1.append(defs['escape bit 1'][k])
+      k = j & 0xc
+      value1.append(defs['escape bits 2 to 3'][k])
+      j &= 0xff00
+      if k == 0: # control game
+        value1.append(defs['control game'].get(j, f'0x{j:04x}'))
+      elif k == 4: # 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
+        value1.append(defs['sound effect'].get(j, f'0x{j:04x}'))
+      else:
+        assert False
+    else:
+      k = j & 0xff
+      value1.append(defs['objects'].get(k, f'0x{k:02x}'))
+      j &= 0xff00
+      if j in defs['byte']:
+        value1.append(defs['byte'].get(j))
+      else:
+        k = j & 0x700
+        if k in defs['update bits 0 to 2']:
+          value1.append(defs['update bits 0 to 2'][k])
+        k = j & 0x800
+        if k in defs['update bit 3']:
+          value1.append(defs['update bit 3'][k])
+        k = j & 0x7000
+        if k in defs['update bits 4 to 6']:
+          value1.append(defs['update bits 4 to 6'][k])
+        k = j & 0x8000
+        if k in defs['update bit 7']:
+          value1.append(defs['update bit 7'][k])
+    value.append(' | '.join(value1))
+  return value
+
 print('reading addrs')
 object_tables = {}
 objects = {}
@@ -79,13 +195,13 @@ with open(addrs_txt) as fin:
       fields = get_line()
 
 byte_tables = {
-  'ucode_animate_shape',
-  'ucode_collision_test',
-  'ucode_homing',
-  'ucode_test_fire_in_state_f0',
-  'ucode_test_fire_in_state_f1',
-  'ucode_test_fire_in_state_f2',
-  'ucode_test_fire_in_state_f3',
+  'ucode_animate_shape': disasm_animate_shape,
+  'ucode_collision_test': disasm_collision_test,
+  'ucode_homing': disasm_homing,
+  'ucode_test_fire_in_state_f0': disasm_test_fire,
+  'ucode_test_fire_in_state_f1': disasm_test_fire,
+  'ucode_test_fire_in_state_f2': disasm_test_fire,
+  'ucode_test_fire_in_state_f3': disasm_test_fire,
 }
 object0 = min([i for _, i, _, _ in object_tables.values()])
 object1 = max([i for _, _, i, _ in object_tables.values()])
@@ -136,6 +252,8 @@ for table, (addr, index0, index1, word) in object_tables.items():
             value1 = intelhex[addr1] | (intelhex[addr1 + 1] << 8)
             value.append(f'0x{value1:04x}')
             addr1 += 2
+        if defs_inc is not None: # --disasm requested
+          value = (byte_tables.get(table1, disasm_words))(value)
       data[i - object0][table1] = value
 
 print('writing json')
index 3b45c9a..51e7e6a 100644 (file)
@@ -1,5 +1,5 @@
---- star_blazer.asm0   2022-06-25 20:38:17.371562181 +1000
-+++ star_blazer.asm    2022-06-25 20:41:40.595559667 +1000
+--- 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 @@
 +UNREACHABLE = 1
 +DHGR = 0
@@ -39,7 +39,7 @@
 +HW_SET80VID = 0xc00d
 +.endif
 +
-+.include "ucode_defs.inc"
++.include "object_defs.inc"
 +
 +      .globl  start
 +
diff --git a/disasm/ucode0.py b/disasm/ucode0.py
deleted file mode 100755 (executable)
index cb52164..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env python3
-
-# process the ucode tables, numbering the entries
-
-import sys
-
-for line in sys.stdin:
-  fields = line.rstrip().split()
-  if len(fields) == 1:
-    label = fields[0]
-    assert label[-1:] == ':'
-    label = label[:-1]
-    assert label[:5] == 'ucode'
-    count = int(label[5:7], 16)
-  else:
-    assert fields[0] == '.dw'
-    target = fields[1]
-    if target != '0x0000':
-      print(f's/{target:s}/{label:s}_{count:02x}/g')
-    count += 1
diff --git a/disasm/ucode1.py b/disasm/ucode1.py
deleted file mode 100755 (executable)
index c4d6d4a..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-#!/usr/bin/env python3
-
-import sys
-
-# process the ucode data, extracting possible shapes for each object
-
-shapes = {
-  0x00: 'pixel0',
-  0x01: 'pixel1',
-  0x02: 'pixel2',
-  0x03: 'pixel3',
-  0x04: 'pixel4',
-  0x05: 'pixel5',
-  0x06: 'pixel6',
-  0x07: 'pixel7',
-  0x08: 'bullet3',
-  0x09: 'bullet5',
-  0x0a: 'bullet7',
-  0x0b: 'bullet9',
-  0x0c: 'bird0',
-  0x0d: 'bird1',
-  0x0e: 'bird2',
-  0x0f: 'bird3',
-  0x10: 'ship',
-  0x11: 'ship_open',
-  0x12: 'exhaust0',
-  0x13: 'exhaust1',
-  0x14: 'parachute0',
-  0x15: 'parachute1',
-  0x16: 'parachute_open',
-  0x17: 'fuel',
-  0x18: 'supply_plane',
-  0x1c: 'tank',
-  0x1e: 'missile_tank',
-  0x1f: 'missile_tank_empty',
-  0x20: 'bomb0',
-  0x21: 'bomb1',
-  0x22: 'bomb2',
-  0x23: 'bomb3',
-  0x28: 'balloon0',
-  0x29: 'balloon1',
-  0x2a: 'balloon2',
-  0x2c: 'helicopter',
-  0x2e: 'enemy_plane0',
-  0x2f: 'enemy_plane1',
-  0x30: 'silo0',
-  0x31: 'silo1',
-  0x36: 'pylon',
-  0x40: 'missile0',
-  0x41: 'missile1',
-  0x42: 'missile2',
-  0x43: 'missile3',
-  0x44: 'missile4',
-  0x45: 'missile5',
-  0x46: 'missile6',
-  0x47: 'missile7',
-  0x48: 'missile8',
-  0x49: 'missile9',
-  0x4a: 'missile10',
-  0x4b: 'missile11',
-  0x4c: 'missile12',
-  0x4d: 'missile13',
-  0x4e: 'missile14',
-  0x4f: 'missile15',
-  0x50: 'missile_launcher0_empty',
-  0x51: 'missile_launcher1_empty',
-  0x52: 'missile_launcher2_empty',
-  0x54: 'missile_launcher0',
-  0x55: 'missile_launcher1',
-  0x56: 'missile_launcher2',
-  0x60: 'fragment0',
-  0x61: 'fragment1',
-  0x62: 'fragment2',
-  0x63: 'fragment3',
-  0x64: 'fragment4',
-  0x65: 'fragment5',
-  0x66: 'fragment6',
-  0x67: 'fragment7',
-  0x70: 'haystack',
-  0x71: 'house',
-  0x72: 'headquarters',
-  0x73: 'radar0',
-  0x74: 'radar1',
-  0x75: 'radar2',
-  0x76: 'icbm',
-  0x78: 'tree',
-  0x79: 'cactus',
-  0x88: 'explosion0',
-  0x89: 'explosion1',
-  0x8a: 'explosion2',
-  0x8b: 'explosion3',
-  0xa0: 'text_0',
-  0xa1: 'text_1',
-  0xa2: 'text_2',
-  0xa3: 'text_3',
-  0xa4: 'text_4',
-  0xa5: 'text_5',
-  0xa6: 'text_6',
-  0xa7: 'text_7',
-  0xa8: 'text_8',
-  0xa9: 'text_9',
-  0xaa: 'text_score',
-  0xab: 'text_colon',
-  0xac: 'text_high',
-  0xb0: 'text_mission',
-  0xb2: 'text_fuel',
-  0xb3: 'text_empty',
-  0xb4: 'text_bomb',
-  0xb6: 'text_ship_left',
-  0xb7: 'text_complete',
-  0xb8: 'text_the',
-  0xb9: 'text_radar',
-  0xba: 'text_icbm',
-  0xbc: 'text_attack',
-  0xbd: 'text_tank',
-  0xbe: 'text_headquarters',
-  0xbf: 'text_a',
-  0xc0: 'ships0',
-  0xc1: 'ships1',
-  0xc2: 'ships2',
-  0xc3: 'ships3',
-  0xd0: 'text_star',
-  0xd1: 'text_blazer',
-  0xd2: 'text_by',
-  0xd3: 'text_tony',
-  0xd4: 'text_suzuki',
-  0xd8: 'text_game',
-  0xd9: 'text_over',
-  0xda: 'text_bonus',
-  0xdc: 'text_great',
-  0xdd: 'text_performance',
-  0xe1: 'text_copyright',
-  0xe2: 'text_star_craft',
-  0xe3: 'text_inc',
-  0xe4: 'text_thanks',
-  0xe5: 'text_lot_comma',
-  0xe6: 'text_raly',
-  0xe7: 'text_minus_20',
-  0xe8: 'text_20_40_60_80',
-  0xe9: 'text_100_120_300_1500',
-  0xf0: 'ground0',
-  0xf1: 'ground1',
-  0xf2: 'ground2',
-  0xf3: 'ground3',
-  0xff: 'blank',
-}
-objects = {}
-
-for line in sys.stdin:
-  fields = line.rstrip().split()
-  if len(fields) == 1:
-    label = fields[0]
-    assert label[-1:] == ':'
-    label = label[:-1]
-  else:
-    assert fields[0] == '.db'
-    assert fields[1][:2] == '0x'
-    value = int(fields[1][2:], 16)
-    if label[:-2] == 'ucode1080_animate_shape_':
-      object = int(label[-2:], 16)
-      if object not in objects:
-        objects[object] = set()
-      if value >= 1 and value < 0xf0:
-        objects[object].add(value)
-
-for object in sorted(objects.keys()):
-  suffixes = []
-  shape_names = []
-  for shape in sorted(objects[object]):
-    suffix = '_' + shapes[shape]
-    if suffix[-1] >= '0' and suffix[-1] <= '9':
-      while suffix[-1] >= '0' and suffix[-1] <= '9':
-        suffix = suffix[:-1]
-    if suffix not in suffixes:
-      suffixes.append(suffix)
-    shape_names.append(f'shape_{shape:02x}_{shapes[shape]:s}')
-  print(f'object_{object:02x}' + ''.join(suffixes))
-  for shape_name in shape_names:
-    print('  ' + shape_name)
diff --git a/disasm/ucode_defs.inc b/disasm/ucode_defs.inc
deleted file mode 100644 (file)
index 96149fc..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
-; objects
-OBJECT_10_PIXEL = 0x10
-OBJECT_11_PIXEL = 0x11
-OBJECT_12_PIXEL = 0x12
-OBJECT_13_PIXEL = 0x13
-OBJECT_14_FRAGMENT = 0x14
-OBJECT_15_FRAGMENT = 0x15
-OBJECT_16_FRAGMENT = 0x16
-OBJECT_17_FRAGMENT = 0x17
-OBJECT_18_FRAGMENT = 0x18
-OBJECT_19_FRAGMENT = 0x19
-OBJECT_1A_FRAGMENT = 0x1a
-OBJECT_1B_FRAGMENT = 0x1b
-OBJECT_1C_FRAGMENT = 0x1c
-OBJECT_1D_FRAGMENT = 0x1d
-OBJECT_1E_FRAGMENT = 0x1e
-OBJECT_1F_FRAGMENT = 0x1f
-OBJECT_20_PIXEL = 0x20
-OBJECT_21_PIXEL = 0x21
-OBJECT_22_PIXEL = 0x22
-OBJECT_23_PIXEL = 0x23
-OBJECT_24_PIXEL = 0x24
-OBJECT_25_PIXEL = 0x25
-OBJECT_26_PIXEL = 0x26
-OBJECT_27_PIXEL = 0x27
-OBJECT_28_EXHAUST = 0x28
-OBJECT_29_PIXEL = 0x29
-OBJECT_2A_EXPLOSION = 0x2a
-OBJECT_2C_PIXEL = 0x2c
-OBJECT_2D_PIXEL = 0x2d
-OBJECT_2E_PIXEL = 0x2e
-OBJECT_2F_PIXEL = 0x2f
-OBJECT_30_PIXEL = 0x30
-OBJECT_31_PIXEL = 0x31
-OBJECT_32_PIXEL = 0x32
-OBJECT_33_PIXEL = 0x33
-OBJECT_34_PIXEL = 0x34
-OBJECT_35_PIXEL = 0x35
-OBJECT_36_PIXEL = 0x36
-OBJECT_37_PIXEL = 0x37
-OBJECT_38_PIXEL = 0x38
-OBJECT_39_PIXEL = 0x39
-OBJECT_3A_PIXEL = 0x3a
-OBJECT_3B_PIXEL = 0x3b
-OBJECT_3C_PIXEL = 0x3c
-OBJECT_3D_PIXEL = 0x3d
-OBJECT_40_BIRD = 0x40
-OBJECT_41_TREE_CACTUS = 0x41
-OBJECT_42_TREE_CACTUS = 0x42
-OBJECT_43_TREE_CACTUS = 0x43
-OBJECT_44_MISSILE_LAUNCHER = 0x44
-OBJECT_45_MISSILE_LAUNCHER = 0x45
-OBJECT_46_MISSILE_LAUNCHER = 0x46
-OBJECT_47_PYLON = 0x47
-OBJECT_48_PYLON = 0x48
-OBJECT_49_SILO = 0x49
-OBJECT_4A_SILO_HAYSTACK = 0x4a
-OBJECT_4B_HAYSTACK_HOUSE = 0x4b
-OBJECT_4C_SILO_HOUSE = 0x4c
-OBJECT_4D_HEADQUARTERS_RADAR_ICBM = 0x4d
-OBJECT_4E_PIXEL = 0x4e
-OBJECT_4F_PIXEL = 0x4f
-OBJECT_50_BULLET = 0x50
-OBJECT_51_BULLET = 0x51
-OBJECT_52_BULLET = 0x52
-OBJECT_53_PIXEL_BALLOON_EXPLOSION = 0x53
-OBJECT_54_PIXEL_BALLOON_EXPLOSION = 0x54
-OBJECT_55_PIXEL_BALLOON_EXPLOSION = 0x55
-OBJECT_56_PIXEL_BALLOON_EXPLOSION = 0x56
-OBJECT_57_PIXEL_BALLOON_EXPLOSION = 0x57
-OBJECT_58_BOMB_EXPLOSION = 0x58
-OBJECT_59_BOMB_EXPLOSION = 0x59
-OBJECT_5A_BOMB_EXPLOSION = 0x5a
-OBJECT_5B_BOMB_EXPLOSION = 0x5b
-OBJECT_5C_BOMB_EXPLOSION = 0x5c
-OBJECT_5D_BOMB_EXPLOSION = 0x5d
-OBJECT_5E_BOMB_EXPLOSION = 0x5e
-OBJECT_5F_BOMB_EXPLOSION = 0x5f
-OBJECT_60_PIXEL = 0x60
-OBJECT_61_SHIP = 0x61
-OBJECT_62_SHIP = 0x62
-OBJECT_63_PIXEL = 0x63
-OBJECT_64_PIXEL_SHIP = 0x64
-OBJECT_65_PIXEL_EXHAUST = 0x65
-OBJECT_66_SHIP = 0x66
-OBJECT_67_BIRD = 0x67
-OBJECT_68_MISSILE = 0x68
-OBJECT_69_MISSILE = 0x69
-OBJECT_6A_MISSILE = 0x6a
-OBJECT_6B_HELICOPTER_ENEMY_PLANE = 0x6b
-OBJECT_6C_HELICOPTER_ENEMY_PLANE = 0x6c
-OBJECT_6D_HELICOPTER_ENEMY_PLANE = 0x6d
-OBJECT_6E_HELICOPTER_ENEMY_PLANE = 0x6e
-OBJECT_6F_HELICOPTER_ENEMY_PLANE = 0x6f
-OBJECT_70_SUPPLY_PLANE = 0x70
-OBJECT_71_PARACHUTE = 0x71
-OBJECT_72_FUEL_EXPLOSION = 0x72
-OBJECT_73_BULLET = 0x73
-OBJECT_74_BULLET = 0x74
-OBJECT_75_BULLET = 0x75
-OBJECT_76_PIXEL = 0x76
-OBJECT_77_TANK = 0x77
-OBJECT_78_PIXEL = 0x78
-OBJECT_79_PIXEL = 0x79
-OBJECT_7A_PIXEL = 0x7a
-OBJECT_7B_PIXEL = 0x7b
-OBJECT_7C_PIXEL = 0x7c
-OBJECT_7D_PIXEL = 0x7d
-OBJECT_7E_PIXEL = 0x7e
-OBJECT_7F_PIXEL = 0x7f
-
-; shapes
-SHAPE_00_PIXEL0 = 0x00
-SHAPE_01_PIXEL1 = 0x01
-SHAPE_02_PIXEL2 = 0x02
-SHAPE_03_PIXEL3 = 0x03
-SHAPE_04_PIXEL4 = 0x04
-SHAPE_05_PIXEL5 = 0x05
-SHAPE_06_PIXEL6 = 0x06
-SHAPE_07_PIXEL7 = 0x07
-SHAPE_08_BULLET3 = 0x08
-SHAPE_09_BULLET5 = 0x09
-SHAPE_0A_BULLET7 = 0x0a
-SHAPE_0B_BULLET9 = 0x0b
-SHAPE_0C_BIRD0 = 0x0c
-SHAPE_0D_BIRD1 = 0x0d
-SHAPE_0E_BIRD2 = 0x0e
-SHAPE_0F_BIRD3 = 0x0f
-SHAPE_10_SHIP = 0x10
-SHAPE_11_SHIP_OPEN = 0x11
-SHAPE_12_EXHAUST0 = 0x12
-SHAPE_13_EXHAUST1 = 0x13
-SHAPE_14_PARACHUTE0 = 0x14
-SHAPE_15_PARACHUTE1 = 0x15
-SHAPE_16_PARACHUTE_OPEN = 0x16
-SHAPE_17_FUEL = 0x17
-SHAPE_18_SUPPLY_PLANE = 0x18
-SHAPE_1C_TANK = 0x1c
-SHAPE_1E_MISSILE_TANK = 0x1e
-SHAPE_1F_MISSILE_TANK_EMPTY = 0x1f
-SHAPE_20_BOMB0 = 0x20
-SHAPE_21_BOMB1 = 0x21
-SHAPE_22_BOMB2 = 0x22
-SHAPE_23_BOMB3 = 0x23
-SHAPE_28_BALLOON0 = 0x28
-SHAPE_29_BALLOON1 = 0x29
-SHAPE_2A_BALLOON2 = 0x2a
-SHAPE_2C_HELICOPTER = 0x2c
-SHAPE_2E_ENEMY_PLANE0 = 0x2e
-SHAPE_2F_ENEMY_PLANE1 = 0x2f
-SHAPE_30_SILO0 = 0x30
-SHAPE_31_SILO1 = 0x31
-SHAPE_36_PYLON = 0x36
-SHAPE_40_MISSILE0 = 0x40
-SHAPE_41_MISSILE1 = 0x41
-SHAPE_42_MISSILE2 = 0x42
-SHAPE_43_MISSILE3 = 0x43
-SHAPE_44_MISSILE4 = 0x44
-SHAPE_45_MISSILE5 = 0x45
-SHAPE_46_MISSILE6 = 0x46
-SHAPE_47_MISSILE7 = 0x47
-SHAPE_48_MISSILE8 = 0x48
-SHAPE_49_MISSILE9 = 0x49
-SHAPE_4A_MISSILE10 = 0x4a
-SHAPE_4B_MISSILE11 = 0x4b
-SHAPE_4C_MISSILE12 = 0x4c
-SHAPE_4D_MISSILE13 = 0x4d
-SHAPE_4E_MISSILE14 = 0x4e
-SHAPE_4F_MISSILE15 = 0x4f
-SHAPE_50_MISSILE_LAUNCHER0_EMPTY = 0x50
-SHAPE_51_MISSILE_LAUNCHER1_EMPTY = 0x51
-SHAPE_52_MISSILE_LAUNCHER2_EMPTY = 0x52
-SHAPE_54_MISSILE_LAUNCHER0 = 0x54
-SHAPE_55_MISSILE_LAUNCHER1 = 0x55
-SHAPE_56_MISSILE_LAUNCHER2 = 0x56
-SHAPE_60_FRAGMENT0 = 0x60
-SHAPE_61_FRAGMENT1 = 0x61
-SHAPE_62_FRAGMENT2 = 0x62
-SHAPE_63_FRAGMENT3 = 0x63
-SHAPE_64_FRAGMENT4 = 0x64
-SHAPE_65_FRAGMENT5 = 0x65
-SHAPE_66_FRAGMENT6 = 0x66
-SHAPE_67_FRAGMENT7 = 0x67
-SHAPE_70_HAYSTACK = 0x70
-SHAPE_71_HOUSE = 0x71
-SHAPE_72_HEADQUARTERS = 0x72
-SHAPE_73_RADAR0 = 0x73
-SHAPE_74_RADAR1 = 0x74
-SHAPE_75_RADAR2 = 0x75
-SHAPE_76_ICBM = 0x76
-SHAPE_78_TREE = 0x78
-SHAPE_79_CACTUS = 0x79
-SHAPE_88_EXPLOSION0 = 0x88
-SHAPE_89_EXPLOSION1 = 0x89
-SHAPE_8A_EXPLOSION2 = 0x8a
-SHAPE_8B_EXPLOSION3 = 0x8b
-SHAPE_A0_TEXT_0 = 0xa0
-SHAPE_A1_TEXT_1 = 0xa1
-SHAPE_A2_TEXT_2 = 0xa2
-SHAPE_A3_TEXT_3 = 0xa3
-SHAPE_A4_TEXT_4 = 0xa4
-SHAPE_A5_TEXT_5 = 0xa5
-SHAPE_A6_TEXT_6 = 0xa6
-SHAPE_A7_TEXT_7 = 0xa7
-SHAPE_A8_TEXT_8 = 0xa8
-SHAPE_A9_TEXT_9 = 0xa9
-SHAPE_AA_TEXT_SCORE = 0xaa
-SHAPE_AB_TEXT_COLON = 0xab
-SHAPE_AC_TEXT_HIGH = 0xac
-SHAPE_B0_TEXT_MISSION = 0xb0
-SHAPE_B2_TEXT_FUEL = 0xb2
-SHAPE_B3_TEXT_EMPTY = 0xb3
-SHAPE_B4_TEXT_BOMB = 0xb4
-SHAPE_B6_TEXT_SHIP_LEFT = 0xb6
-SHAPE_B7_TEXT_COMPLETE = 0xb7
-SHAPE_B8_TEXT_THE = 0xb8
-SHAPE_B9_TEXT_RADAR = 0xb9
-SHAPE_BA_TEXT_ICBM = 0xba
-SHAPE_BC_TEXT_ATTACK = 0xbc
-SHAPE_BD_TEXT_TANK = 0xbd
-SHAPE_BE_TEXT_HEADQUARTERS = 0xbe
-SHAPE_BF_TEXT_A = 0xbf
-SHAPE_C0_SHIPS0 = 0xc0
-SHAPE_C1_SHIPS1 = 0xc1
-SHAPE_C2_SHIPS2 = 0xc2
-SHAPE_C3_SHIPS3 = 0xc3
-SHAPE_D0_TEXT_STAR = 0xd0
-SHAPE_D1_TEXT_BLAZER = 0xd1
-SHAPE_D2_TEXT_BY = 0xd2
-SHAPE_D3_TEXT_TONY = 0xd3
-SHAPE_D4_TEXT_SUZUKI = 0xd4
-SHAPE_D8_TEXT_GAME = 0xd8
-SHAPE_D9_TEXT_OVER = 0xd9
-SHAPE_DA_TEXT_BONUS = 0xda
-SHAPE_DC_TEXT_GREAT = 0xdc
-SHAPE_DD_TEXT_PERFORMANCE = 0xdd
-SHAPE_E1_TEXT_COPYRIGHT = 0xe1
-SHAPE_E2_TEXT_STAR_CRAFT = 0xe2
-SHAPE_E3_TEXT_INC = 0xe3
-SHAPE_E4_TEXT_THANKS = 0xe4
-SHAPE_E5_TEXT_LOT_COMMA = 0xe5
-SHAPE_E6_TEXT_RALY = 0xe6
-SHAPE_E7_TEXT_MINUS_20 = 0xe7
-SHAPE_E8_TEXT_20_40_60_80 = 0xe8
-SHAPE_E9_TEXT_100_120_300_1500 = 0xe9
-SHAPE_F0_GROUND0 = 0xf0
-SHAPE_F1_GROUND1 = 0xf1
-SHAPE_F2_GROUND2 = 0xf2
-SHAPE_F3_GROUND3 = 0xf3
-SHAPE_FF_BLANK = 0xff
-
-; ucode sections
-
-; these occur in byte-wide tables
-UCODE_SECTION_F0 = 0xf0
-UCODE_SECTION_F1 = 0xf1
-UCODE_SECTION_F2 = 0xf2
-UCODE_SECTION_F3 = 0xf3
-UCODE_SECTION_F8_REPEAT = 0xf8
-UCODE_SECTION_F9_REPEAT = 0xf9
-UCODE_SECTION_FA_REPEAT = 0xfa
-UCODE_SECTION_FB_REPEAT = 0xfb
-UCODE_SECTION_FF = 0xff
-
-; these occur in word-wide tables
-UCODE_SECTION_F0F0 = 0xf0f0
-UCODE_SECTION_F1F1 = 0xf1f1
-UCODE_SECTION_F2F2 = 0xf2f2
-UCODE_SECTION_F3F3 = 0xf3f3
-
-; ucode 1st byte (escape) bit 0
-UCODE_0001_IF_DEMO = 0x0001
-
-; ucode 1st byte (escape) bit1
-UCODE_0002_IF_NOT_DEMO = 0x0002
-
-; ucode 1st byte (escape) bits 2 to 7
-UCODE_0000_CONTROL_GAME = 0x0000
-UCODE_0004_SET_DECIMAL = 0x0004
-UCODE_0008_TITLE_DISPLAY = 0x0008
-UCODE_000C_SOUND_CHANNEL = 0x000c
-
-; ucode 2nd byte under a given ucode escape
-UCODE_CONTROL_GAME_0000_CLEAR_DEMO_SET_MISSION = 0x0000
-UCODE_CONTROL_GAME_2000_SET_DEMO_SET_MISSION = 0x2000
-UCODE_CONTROL_GAME_4000_START_GAME = 0x4000
-UCODE_CONTROL_GAME_A000_START_GAME_DEMO = 0xa000
-
-UCODE_SET_DECIMAL_0000_0 = 0x0000
-UCODE_SET_DECIMAL_0100_0 = 0x0100
-UCODE_SET_DECIMAL_0200_SCORE_VAR_4B80_SCORE_VAR_4B00_BY_MISSION = 0x0200
-UCODE_SET_DECIMAL_0300_1 = 0x0300
-UCODE_SET_DECIMAL_0400_SCORE_VAR_4880_SCORE_VAR_4800 = 0x0400
-UCODE_SET_DECIMAL_0500_SCORE_VAR_4980_SCORE_VAR_4900 = 0x0500
-UCODE_SET_DECIMAL_0600_SCORE_VAR_4A80_SCORE_VAR_4A00 = 0x0600
-UCODE_SET_DECIMAL_0700_SCORE_VAR_4B80_SCORE_VAR_4B00 = 0x0700
-
-UCODE_TITLE_DISPLAY_E100_RESTART = 0xe100
-UCODE_TITLE_DISPLAY_E200_CLEAR_RECTANGLE = 0xe200
-
-UCODE_SOUND_CHANNEL_0100_00 = 0x0100
-UCODE_SOUND_CHANNEL_0200_01 = 0x0200
-UCODE_SOUND_CHANNEL_0300_02 = 0x0300
-UCODE_SOUND_CHANNEL_0400_03 = 0x0400
-UCODE_SOUND_CHANNEL_0500_04 = 0x0500
-UCODE_SOUND_CHANNEL_0600_05 = 0x0600
-UCODE_SOUND_CHANNEL_0700_06 = 0x0700
-UCODE_SOUND_CHANNEL_0800_07 = 0x0800
-UCODE_SOUND_CHANNEL_0900_08 = 0x0900
-UCODE_SOUND_CHANNEL_0A00_09 = 0x0a00
-UCODE_SOUND_CHANNEL_0B00_0A = 0x0b00
-UCODE_SOUND_CHANNEL_0C00_0B = 0x0c00
-UCODE_SOUND_CHANNEL_0D00_0C = 0x0d00
-UCODE_SOUND_CHANNEL_0E00_0D = 0x0e00
-UCODE_SOUND_CHANNEL_0F00_0E = 0x0f00
-UCODE_SOUND_CHANNEL_1000_0F = 0x1000
-
-; the following occur by themselves
-
-; ucode 2nd byte
-UCODE_0800_HORIZONTAL_COLLISION_AND_ZERO = 0x0800
-UCODE_0900_VERTICAL_COLLISION_AND_ZERO = 0x0900
-UCODE_0A00_HORIZONTAL_COLLISION = 0x0a00
-UCODE_0B00_VERTICAL_COLLISION = 0x0b00
-UCODE_0C00_HORIZONTAL_COLLISION_AND_COPY = 0x0c00
-UCODE_0D00_VERTICAL_COLLISION_AND_COPY = 0x0d00
-UCODE_0F00_INACTIVATE_OBJECT = 0x0f00
-
-; the following are used with UCODE_(0|8)000_UPDATE_OBJECT(_IF_INACTIVE)
-
-; ucode 2nd byte bits 0 to 2
-UCODE_0100_RANDOMIZE_OBJECT_VELOCITY = 0x0100
-UCODE_0200_COPY_OBJECT_VELOCITY = 0x0200
-UCODE_0300_RANDOMIZE_OBJECT_VELOCITY_RELATIVE = 0x0300
-UCODE_0400_UPDATE_OBJECT_VELOCITY = 0x0400
-UCODE_0500_UPDATE_OBJECT_VELOCITY_ROTATE_90 = 0x0500
-UCODE_0600_UPDATE_OBJECT_VELOCITY_ROTATE_180 = 0x0600
-UCODE_0700_UPDATE_OBJECT_VELOCITY_ROTATE_270 = 0x0700
-
-; ucode 2nd byte bit 3
-UCODE_0000_RESET_OBJECT = 0x0000
-UCODE_0800_ACTIVATE_OBJECT = 0x0800
-
-; ucode 2nd byte bits 4 to 6
-UCODE_1000_RANDOMIZE_OBJECT_POSITION = 0x1000
-UCODE_2000_COPY_OBJECT_POSITION = 0x2000
-UCODE_3000_RANDOMIZE_OBJECT_POSITION_RELATIVE = 0x3000
-UCODE_4000_MOVE_OBJECT_POS_POS = 0x4000
-UCODE_5000_MOVE_OBJECT_NEG_POS = 0x5000
-UCODE_6000_MOVE_OBJECT_NEG_NEG = 0x6000
-UCODE_7000_MOVE_OBJECT_POS_NEG = 0x7000
-
-; ucode 2nd byte bit 7
-UCODE_0000_UPDATE_OBJECT_IF_INACTIVE = 0x0000
-UCODE_8000_UPDATE_OBJECT = 0x8000
diff --git a/disasm/ucode_disasm.py b/disasm/ucode_disasm.py
deleted file mode 100755 (executable)
index 52bffbe..0000000
+++ /dev/null
@@ -1,427 +0,0 @@
-#!/usr/bin/env python3
-
-import sys
-
-objects = {
-  0x10: 'OBJECT_10_PIXEL',
-  0x11: 'OBJECT_11_PIXEL',
-  0x12: 'OBJECT_12_PIXEL',
-  0x13: 'OBJECT_13_PIXEL',
-  0x14: 'OBJECT_14_FRAGMENT',
-  0x15: 'OBJECT_15_FRAGMENT',
-  0x16: 'OBJECT_16_FRAGMENT',
-  0x17: 'OBJECT_17_FRAGMENT',
-  0x18: 'OBJECT_18_FRAGMENT',
-  0x19: 'OBJECT_19_FRAGMENT',
-  0x1a: 'OBJECT_1A_FRAGMENT',
-  0x1b: 'OBJECT_1B_FRAGMENT',
-  0x1c: 'OBJECT_1C_FRAGMENT',
-  0x1d: 'OBJECT_1D_FRAGMENT',
-  0x1e: 'OBJECT_1E_FRAGMENT',
-  0x1f: 'OBJECT_1F_FRAGMENT',
-  0x20: 'OBJECT_20_PIXEL',
-  0x21: 'OBJECT_21_PIXEL',
-  0x22: 'OBJECT_22_PIXEL',
-  0x23: 'OBJECT_23_PIXEL',
-  0x24: 'OBJECT_24_PIXEL',
-  0x25: 'OBJECT_25_PIXEL',
-  0x26: 'OBJECT_26_PIXEL',
-  0x27: 'OBJECT_27_PIXEL',
-  0x28: 'OBJECT_28_EXHAUST',
-  0x29: 'OBJECT_29_PIXEL',
-  0x2a: 'OBJECT_2A_EXPLOSION',
-  0x2c: 'OBJECT_2C_PIXEL',
-  0x2d: 'OBJECT_2D_PIXEL',
-  0x2e: 'OBJECT_2E_PIXEL',
-  0x2f: 'OBJECT_2F_PIXEL',
-  0x30: 'OBJECT_30_PIXEL',
-  0x31: 'OBJECT_31_PIXEL',
-  0x32: 'OBJECT_32_PIXEL',
-  0x33: 'OBJECT_33_PIXEL',
-  0x34: 'OBJECT_34_PIXEL',
-  0x35: 'OBJECT_35_PIXEL',
-  0x36: 'OBJECT_36_PIXEL',
-  0x37: 'OBJECT_37_PIXEL',
-  0x38: 'OBJECT_38_PIXEL',
-  0x39: 'OBJECT_39_PIXEL',
-  0x3a: 'OBJECT_3A_PIXEL',
-  0x3b: 'OBJECT_3B_PIXEL',
-  0x3c: 'OBJECT_3C_PIXEL',
-  0x3d: 'OBJECT_3D_PIXEL',
-  0x40: 'OBJECT_40_BIRD',
-  0x41: 'OBJECT_41_TREE_CACTUS',
-  0x42: 'OBJECT_42_TREE_CACTUS',
-  0x43: 'OBJECT_43_TREE_CACTUS',
-  0x44: 'OBJECT_44_MISSILE_LAUNCHER',
-  0x45: 'OBJECT_45_MISSILE_LAUNCHER',
-  0x46: 'OBJECT_46_MISSILE_LAUNCHER',
-  0x47: 'OBJECT_47_PYLON',
-  0x48: 'OBJECT_48_PYLON',
-  0x49: 'OBJECT_49_SILO',
-  0x4a: 'OBJECT_4A_SILO_HAYSTACK',
-  0x4b: 'OBJECT_4B_HAYSTACK_HOUSE',
-  0x4c: 'OBJECT_4C_SILO_HOUSE',
-  0x4d: 'OBJECT_4D_HEADQUARTERS_RADAR_ICBM',
-  0x4e: 'OBJECT_4E_PIXEL',
-  0x4f: 'OBJECT_4F_PIXEL',
-  0x50: 'OBJECT_50_BULLET',
-  0x51: 'OBJECT_51_BULLET',
-  0x52: 'OBJECT_52_BULLET',
-  0x53: 'OBJECT_53_PIXEL_BALLOON_EXPLOSION',
-  0x54: 'OBJECT_54_PIXEL_BALLOON_EXPLOSION',
-  0x55: 'OBJECT_55_PIXEL_BALLOON_EXPLOSION',
-  0x56: 'OBJECT_56_PIXEL_BALLOON_EXPLOSION',
-  0x57: 'OBJECT_57_PIXEL_BALLOON_EXPLOSION',
-  0x58: 'OBJECT_58_BOMB_EXPLOSION',
-  0x59: 'OBJECT_59_BOMB_EXPLOSION',
-  0x5a: 'OBJECT_5A_BOMB_EXPLOSION',
-  0x5b: 'OBJECT_5B_BOMB_EXPLOSION',
-  0x5c: 'OBJECT_5C_BOMB_EXPLOSION',
-  0x5d: 'OBJECT_5D_BOMB_EXPLOSION',
-  0x5e: 'OBJECT_5E_BOMB_EXPLOSION',
-  0x5f: 'OBJECT_5F_BOMB_EXPLOSION',
-  0x60: 'OBJECT_60_PIXEL',
-  0x61: 'OBJECT_61_SHIP',
-  0x62: 'OBJECT_62_SHIP',
-  0x63: 'OBJECT_63_PIXEL',
-  0x64: 'OBJECT_64_PIXEL_SHIP',
-  0x65: 'OBJECT_65_PIXEL_EXHAUST',
-  0x66: 'OBJECT_66_SHIP',
-  0x67: 'OBJECT_67_BIRD',
-  0x68: 'OBJECT_68_MISSILE',
-  0x69: 'OBJECT_69_MISSILE',
-  0x6a: 'OBJECT_6A_MISSILE',
-  0x6b: 'OBJECT_6B_HELICOPTER_ENEMY_PLANE',
-  0x6c: 'OBJECT_6C_HELICOPTER_ENEMY_PLANE',
-  0x6d: 'OBJECT_6D_HELICOPTER_ENEMY_PLANE',
-  0x6e: 'OBJECT_6E_HELICOPTER_ENEMY_PLANE',
-  0x6f: 'OBJECT_6F_HELICOPTER_ENEMY_PLANE',
-  0x70: 'OBJECT_70_SUPPLY_PLANE',
-  0x71: 'OBJECT_71_PARACHUTE',
-  0x72: 'OBJECT_72_FUEL_EXPLOSION',
-  0x73: 'OBJECT_73_BULLET',
-  0x74: 'OBJECT_74_BULLET',
-  0x75: 'OBJECT_75_BULLET',
-  0x76: 'OBJECT_76_PIXEL',
-  0x77: 'OBJECT_77_TANK',
-  0x78: 'OBJECT_78_PIXEL',
-  0x79: 'OBJECT_79_PIXEL',
-  0x7a: 'OBJECT_7A_PIXEL',
-  0x7b: 'OBJECT_7B_PIXEL',
-  0x7c: 'OBJECT_7C_PIXEL',
-  0x7d: 'OBJECT_7D_PIXEL',
-  0x7e: 'OBJECT_7E_PIXEL',
-  0x7f: 'OBJECT_7F_PIXEL',
-}
-
-shapes = {
-  0x00: 'SHAPE_00_PIXEL0',
-  0x01: 'SHAPE_01_PIXEL1',
-  0x02: 'SHAPE_02_PIXEL2',
-  0x03: 'SHAPE_03_PIXEL3',
-  0x04: 'SHAPE_04_PIXEL4',
-  0x05: 'SHAPE_05_PIXEL5',
-  0x06: 'SHAPE_06_PIXEL6',
-  0x07: 'SHAPE_07_PIXEL7',
-  0x08: 'SHAPE_08_BULLET3',
-  0x09: 'SHAPE_09_BULLET5',
-  0x0a: 'SHAPE_0A_BULLET7',
-  0x0b: 'SHAPE_0B_BULLET9',
-  0x0c: 'SHAPE_0C_BIRD0',
-  0x0d: 'SHAPE_0D_BIRD1',
-  0x0e: 'SHAPE_0E_BIRD2',
-  0x0f: 'SHAPE_0F_BIRD3',
-  0x10: 'SHAPE_10_SHIP',
-  0x11: 'SHAPE_11_SHIP_OPEN',
-  0x12: 'SHAPE_12_EXHAUST0',
-  0x13: 'SHAPE_13_EXHAUST1',
-  0x14: 'SHAPE_14_PARACHUTE0',
-  0x15: 'SHAPE_15_PARACHUTE1',
-  0x16: 'SHAPE_16_PARACHUTE_OPEN',
-  0x17: 'SHAPE_17_FUEL',
-  0x18: 'SHAPE_18_SUPPLY_PLANE',
-  0x1c: 'SHAPE_1C_TANK',
-  0x1e: 'SHAPE_1E_MISSILE_TANK',
-  0x1f: 'SHAPE_1F_MISSILE_TANK_EMPTY',
-  0x20: 'SHAPE_20_BOMB0',
-  0x21: 'SHAPE_21_BOMB1',
-  0x22: 'SHAPE_22_BOMB2',
-  0x23: 'SHAPE_23_BOMB3',
-  0x28: 'SHAPE_28_BALLOON0',
-  0x29: 'SHAPE_29_BALLOON1',
-  0x2a: 'SHAPE_2A_BALLOON2',
-  0x2c: 'SHAPE_2C_HELICOPTER',
-  0x2e: 'SHAPE_2E_ENEMY_PLANE0',
-  0x2f: 'SHAPE_2F_ENEMY_PLANE1',
-  0x30: 'SHAPE_30_SILO0',
-  0x31: 'SHAPE_31_SILO1',
-  0x36: 'SHAPE_36_PYLON',
-  0x40: 'SHAPE_40_MISSILE0',
-  0x41: 'SHAPE_41_MISSILE1',
-  0x42: 'SHAPE_42_MISSILE2',
-  0x43: 'SHAPE_43_MISSILE3',
-  0x44: 'SHAPE_44_MISSILE4',
-  0x45: 'SHAPE_45_MISSILE5',
-  0x46: 'SHAPE_46_MISSILE6',
-  0x47: 'SHAPE_47_MISSILE7',
-  0x48: 'SHAPE_48_MISSILE8',
-  0x49: 'SHAPE_49_MISSILE9',
-  0x4a: 'SHAPE_4A_MISSILE10',
-  0x4b: 'SHAPE_4B_MISSILE11',
-  0x4c: 'SHAPE_4C_MISSILE12',
-  0x4d: 'SHAPE_4D_MISSILE13',
-  0x4e: 'SHAPE_4E_MISSILE14',
-  0x4f: 'SHAPE_4F_MISSILE15',
-  0x50: 'SHAPE_50_MISSILE_LAUNCHER0_EMPTY',
-  0x51: 'SHAPE_51_MISSILE_LAUNCHER1_EMPTY',
-  0x52: 'SHAPE_52_MISSILE_LAUNCHER2_EMPTY',
-  0x54: 'SHAPE_54_MISSILE_LAUNCHER0',
-  0x55: 'SHAPE_55_MISSILE_LAUNCHER1',
-  0x56: 'SHAPE_56_MISSILE_LAUNCHER2',
-  0x60: 'SHAPE_60_FRAGMENT0',
-  0x61: 'SHAPE_61_FRAGMENT1',
-  0x62: 'SHAPE_62_FRAGMENT2',
-  0x63: 'SHAPE_63_FRAGMENT3',
-  0x64: 'SHAPE_64_FRAGMENT4',
-  0x65: 'SHAPE_65_FRAGMENT5',
-  0x66: 'SHAPE_66_FRAGMENT6',
-  0x67: 'SHAPE_67_FRAGMENT7',
-  0x70: 'SHAPE_70_HAYSTACK',
-  0x71: 'SHAPE_71_HOUSE',
-  0x72: 'SHAPE_72_HEADQUARTERS',
-  0x73: 'SHAPE_73_RADAR0',
-  0x74: 'SHAPE_74_RADAR1',
-  0x75: 'SHAPE_75_RADAR2',
-  0x76: 'SHAPE_76_ICBM',
-  0x78: 'SHAPE_78_TREE',
-  0x79: 'SHAPE_79_CACTUS',
-  0x88: 'SHAPE_88_EXPLOSION0',
-  0x89: 'SHAPE_89_EXPLOSION1',
-  0x8a: 'SHAPE_8A_EXPLOSION2',
-  0x8b: 'SHAPE_8B_EXPLOSION3',
-  0xa0: 'SHAPE_A0_TEXT_0',
-  0xa1: 'SHAPE_A1_TEXT_1',
-  0xa2: 'SHAPE_A2_TEXT_2',
-  0xa3: 'SHAPE_A3_TEXT_3',
-  0xa4: 'SHAPE_A4_TEXT_4',
-  0xa5: 'SHAPE_A5_TEXT_5',
-  0xa6: 'SHAPE_A6_TEXT_6',
-  0xa7: 'SHAPE_A7_TEXT_7',
-  0xa8: 'SHAPE_A8_TEXT_8',
-  0xa9: 'SHAPE_A9_TEXT_9',
-  0xaa: 'SHAPE_AA_TEXT_SCORE',
-  0xab: 'SHAPE_AB_TEXT_COLON',
-  0xac: 'SHAPE_AC_TEXT_HIGH',
-  0xb0: 'SHAPE_B0_TEXT_MISSION',
-  0xb2: 'SHAPE_B2_TEXT_FUEL',
-  0xb3: 'SHAPE_B3_TEXT_EMPTY',
-  0xb4: 'SHAPE_B4_TEXT_BOMB',
-  0xb6: 'SHAPE_B6_TEXT_SHIP_LEFT',
-  0xb7: 'SHAPE_B7_TEXT_COMPLETE',
-  0xb8: 'SHAPE_B8_TEXT_THE',
-  0xb9: 'SHAPE_B9_TEXT_RADAR',
-  0xba: 'SHAPE_BA_TEXT_ICBM',
-  0xbc: 'SHAPE_BC_TEXT_ATTACK',
-  0xbd: 'SHAPE_BD_TEXT_TANK',
-  0xbe: 'SHAPE_BE_TEXT_HEADQUARTERS',
-  0xbf: 'SHAPE_BF_TEXT_A',
-  0xc0: 'SHAPE_C0_SHIPS0',
-  0xc1: 'SHAPE_C1_SHIPS1',
-  0xc2: 'SHAPE_C2_SHIPS2',
-  0xc3: 'SHAPE_C3_SHIPS3',
-  0xd0: 'SHAPE_D0_TEXT_STAR',
-  0xd1: 'SHAPE_D1_TEXT_BLAZER',
-  0xd2: 'SHAPE_D2_TEXT_BY',
-  0xd3: 'SHAPE_D3_TEXT_TONY',
-  0xd4: 'SHAPE_D4_TEXT_SUZUKI',
-  0xd8: 'SHAPE_D8_TEXT_GAME',
-  0xd9: 'SHAPE_D9_TEXT_OVER',
-  0xda: 'SHAPE_DA_TEXT_BONUS',
-  0xdc: 'SHAPE_DC_TEXT_GREAT',
-  0xdd: 'SHAPE_DD_TEXT_PERFORMANCE',
-  0xe1: 'SHAPE_E1_TEXT_COPYRIGHT',
-  0xe2: 'SHAPE_E2_TEXT_STAR_CRAFT',
-  0xe3: 'SHAPE_E3_TEXT_INC',
-  0xe4: 'SHAPE_E4_TEXT_THANKS',
-  0xe5: 'SHAPE_E5_TEXT_LOT_COMMA',
-  0xe6: 'SHAPE_E6_TEXT_RALY',
-  0xe7: 'SHAPE_E7_TEXT_MINUS_20',
-  0xe8: 'SHAPE_E8_TEXT_20_40_60_80',
-  0xe9: 'SHAPE_E9_TEXT_100_120_300_1500',
-  0xf0: 'SHAPE_F0_GROUND0',
-  0xf1: 'SHAPE_F1_GROUND1',
-  0xf2: 'SHAPE_F2_GROUND2',
-  0xf3: 'SHAPE_F3_GROUND3',
-  0xff: 'SHAPE_FF_BLANK',
-}
-
-ucode_sections_db = {
-  0xf0: 'UCODE_SECTION_F0',
-  0xf1: 'UCODE_SECTION_F1',
-  0xf2: 'UCODE_SECTION_F2',
-  0xf3: 'UCODE_SECTION_F3',
-  0xf8: 'UCODE_SECTION_F8_REPEAT',
-  0xf9: 'UCODE_SECTION_F9_REPEAT',
-  0xfa: 'UCODE_SECTION_FA_REPEAT',
-  0xfb: 'UCODE_SECTION_FB_REPEAT',
-  0xff: 'UCODE_SECTION_FF',
-}
-
-ucode_sections_dw = {
-  0xf0f0: 'UCODE_SECTION_F0F0',
-  0xf1f1: 'UCODE_SECTION_F1F1',
-  0xf2f2: 'UCODE_SECTION_F2F2',
-  0xf3f3: 'UCODE_SECTION_F3F3',
-}
-
-ucode_escape_bit_0 = {
-  0x0001: ' | UCODE_0001_IF_DEMO',
-}
-
-ucode_escape_bit_1 = {
-  0x0002: ' | UCODE_0002_IF_NOT_DEMO',
-}
-
-ucode_escape_bits_2_to_7 = {
-  0x0000: ' | UCODE_0000_CONTROL_GAME',
-  0x0004: ' | UCODE_0004_SET_DECIMAL',
-  0x0008: ' | UCODE_0008_TITLE_DISPLAY',
-  0x000c: ' | UCODE_000C_SOUND_CHANNEL',
-}
-
-ucode_control_game = {
-  0x0000: ' | UCODE_CONTROL_GAME_0000_CLEAR_DEMO_SET_MISSION',
-  0x2000: ' | UCODE_CONTROL_GAME_2000_SET_DEMO_SET_MISSION',
-  0x4000: ' | UCODE_CONTROL_GAME_4000_START_GAME',
-  0xa000: ' | UCODE_CONTROL_GAME_A000_START_GAME_DEMO',
-}
-
-ucode_set_decimal = {
-  0x0000: ' | UCODE_SET_DECIMAL_0000_0',
-  0x0100: ' | UCODE_SET_DECIMAL_0100_0',
-  0x0200: ' | UCODE_SET_DECIMAL_0200_SCORE_VAR_4B80_SCORE_VAR_4B00_BY_MISSION',
-  0x0300: ' | UCODE_SET_DECIMAL_0300_1',
-  0x0400: ' | UCODE_SET_DECIMAL_0400_SCORE_VAR_4880_SCORE_VAR_4800',
-  0x0500: ' | UCODE_SET_DECIMAL_0500_SCORE_VAR_4980_SCORE_VAR_4900',
-  0x0600: ' | UCODE_SET_DECIMAL_0600_SCORE_VAR_4A80_SCORE_VAR_4A00',
-  0x0700: ' | UCODE_SET_DECIMAL_0700_SCORE_VAR_4B80_SCORE_VAR_4B00',
-}
-
-ucode_title_display = {
-  0xe100: ' | UCODE_TITLE_DISPLAY_E100_RESTART',
-  0xe200: ' | UCODE_TITLE_DISPLAY_E200_CLEAR_RECTANGLE',
-}
-
-ucode_sound_channel = {
-  0x0100: ' | UCODE_SOUND_CHANNEL_0100_00',
-  0x0200: ' | UCODE_SOUND_CHANNEL_0200_01',
-  0x0300: ' | UCODE_SOUND_CHANNEL_0300_02',
-  0x0400: ' | UCODE_SOUND_CHANNEL_0400_03',
-  0x0500: ' | UCODE_SOUND_CHANNEL_0500_04',
-  0x0600: ' | UCODE_SOUND_CHANNEL_0600_05',
-  0x0700: ' | UCODE_SOUND_CHANNEL_0700_06',
-  0x0800: ' | UCODE_SOUND_CHANNEL_0800_07',
-  0x0900: ' | UCODE_SOUND_CHANNEL_0900_08',
-  0x0a00: ' | UCODE_SOUND_CHANNEL_0A00_09',
-  0x0b00: ' | UCODE_SOUND_CHANNEL_0B00_0A',
-  0x0c00: ' | UCODE_SOUND_CHANNEL_0C00_0B',
-  0x0d00: ' | UCODE_SOUND_CHANNEL_0D00_0C',
-  0x0e00: ' | UCODE_SOUND_CHANNEL_0E00_0D',
-  0x0f00: ' | UCODE_SOUND_CHANNEL_0F00_0E',
-  0x1000: ' | UCODE_SOUND_CHANNEL_1000_0F',
-}
-
-ucode_byte = {
-  0x0800: ' | UCODE_0800_HORIZONTAL_COLLISION_AND_ZERO',
-  0x0900: ' | UCODE_0900_VERTICAL_COLLISION_AND_ZERO',
-  0x0a00: ' | UCODE_0A00_HORIZONTAL_COLLISION',
-  0x0b00: ' | UCODE_0B00_VERTICAL_COLLISION',
-  0x0c00: ' | UCODE_0C00_HORIZONTAL_COLLISION_AND_COPY',
-  0x0d00: ' | UCODE_0D00_VERTICAL_COLLISION_AND_COPY',
-  0x0f00: ' | UCODE_0F00_INACTIVATE_OBJECT',
-}
-
-ucode_update_bits_0_to_2 = {
-  0x0100: ' | UCODE_0100_RANDOMIZE_OBJECT_VELOCITY',
-  0x0200: ' | UCODE_0200_COPY_OBJECT_VELOCITY',
-  0x0300: ' | UCODE_0300_RANDOMIZE_OBJECT_VELOCITY_RELATIVE',
-  0x0400: ' | UCODE_0400_UPDATE_OBJECT_VELOCITY',
-  0x0500: ' | UCODE_0500_UPDATE_OBJECT_VELOCITY_ROTATE_90',
-  0x0600: ' | UCODE_0600_UPDATE_OBJECT_VELOCITY_ROTATE_180',
-  0x0700: ' | UCODE_0700_UPDATE_OBJECT_VELOCITY_ROTATE_270',
-}
-ucode_update_bit_3 = {
-  0x0000: ' | UCODE_0000_RESET_OBJECT',
-  0x0800: ' | UCODE_0800_ACTIVATE_OBJECT',
-}
-ucode_update_bits_4_to_6 = {
-  0x1000: ' | UCODE_1000_RANDOMIZE_OBJECT_POSITION',
-  0x2000: ' | UCODE_2000_COPY_OBJECT_POSITION',
-  0x3000: ' | UCODE_3000_RANDOMIZE_OBJECT_POSITION_RELATIVE',
-  0x4000: ' | UCODE_4000_MOVE_OBJECT_POS_POS',
-  0x5000: ' | UCODE_5000_MOVE_OBJECT_NEG_POS',
-  0x6000: ' | UCODE_6000_MOVE_OBJECT_NEG_NEG',
-  0x7000: ' | UCODE_7000_MOVE_OBJECT_POS_NEG',
-}
-ucode_update_bit_7 = {
-  0x0000: ' | UCODE_0000_UPDATE_OBJECT_IF_INACTIVE',
-  0x8000: ' | UCODE_8000_UPDATE_OBJECT',
-}
-
-for line in sys.stdin:
-  fields = line.rstrip().split()
-  if len(fields) == 1:
-    label = fields[0]
-    assert label[-1:] == ':'
-    label = label[:-1]
-    sys.stdout.write(f'{label:s}:\n')
-  elif fields[0] == '.db':
-    assert fields[1][:2] == '0x'
-    value = int(fields[1][2:], 16)
-    if value == 0:
-      text = '0'
-    elif value in ucode_sections_db:
-      text = ucode_sections_db[value]
-    elif label[:24] == 'ucode1080_animate_shape_':
-      text = shapes[value]
-    elif label[:25] == 'ucode1080_collision_test_':
-      text = objects[value]
-    else:
-      assert False
-    sys.stdout.write(f'\t.db\t{text:s}\n')
-  elif fields[0] == '.dw':
-    assert fields[1][:2] == '0x'
-    value = int(fields[1][2:], 16)
-    if value in ucode_sections_dw:
-      text = ucode_sections_dw[value]
-    elif (value & 0xff) < 0x10: # escapes
-      text = '0'
-      text += ucode_escape_bit_0.get(value & 1, '')
-      text += ucode_escape_bit_1.get(value & 2, '')
-      bits_2_to_7 = value & 0xfc
-      text += ucode_escape_bits_2_to_7.get(bits_2_to_7, ' | ' + hex(bits_2_to_7))
-      value &= 0xff00
-      if bits_2_to_7 == 0:
-        text += ucode_control_game.get(value, ' | ' + hex(value))
-      elif bits_2_to_7 == 4:
-        text += ucode_set_decimal.get(value, ' | ' + hex(value))
-      elif bits_2_to_7 == 8:
-        text += ucode_title_display.get(value, ' | ' + hex(value))
-      elif bits_2_to_7 == 0xc:
-        text += ucode_sound_channel.get(value, ' | ' + hex(value))
-      if text[:4] == '0 | ':
-        text = text[4:]
-    else:
-      object = value & 0xff
-      text = objects.get(object, hex(object))
-      value &= 0xff00
-      if value in ucode_byte:
-        text += ucode_byte.get(value, '')
-      else:
-        text += ucode_update_bits_0_to_2.get(value & 0x700, '')
-        text += ucode_update_bit_3.get(value & 0x800, '')
-        text += ucode_update_bits_4_to_6.get(value & 0x7000, '')
-        text += ucode_update_bit_7.get(value & 0x8000, '')
-    sys.stdout.write(f'\t.dw\t{text:s}\n')
-  else:
-    assert False