Improve disassembly of decimal ops
authorNick Downing <nick@ndcode.org>
Sat, 25 Jun 2022 14:49:28 +0000 (00:49 +1000)
committerNick Downing <nick@ndcode.org>
Tue, 28 Jun 2022 03:21:38 +0000 (13:21 +1000)
disasm/object_defs.inc
disasm/object_extract.py

index 68a5ebe..bcf2693 100644 (file)
@@ -275,8 +275,8 @@ UCODE_IF_DEMO = 0x0001
 UCODE_IF_NOT_DEMO = 0x0002
 
 ; escape bits 2 to 3
-UCODE_CONTROL_GAME = 0x0100
-UCODE_SET_DECIMAL = 0x0104
+UCODE_CONTROL_GAME = 0x0000
+UCODE_DECIMAL = 0x0004
 UCODE_DRAW_MISC = 0x0108
 UCODE_SOUND_EFFECT = 0x010c
 
@@ -286,14 +286,31 @@ 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_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
+; decimal
+UCODE_DECIMAL_DRAW = 0x2000
+UCODE_DECIMAL_SET = 0x3000
+UCODE_DECIMAL_INC = 0x4000
+UCODE_DECIMAL_DEC = 0x5000
+UCODE_DECIMAL_ADJUST = 0x7000
+
+; decimal set
+UCODE_DECIMAL_SET_0 = 0x100
+UCODE_DECIMAL_SET_SCORE_VAR_4B80_SCORE_VAR_4B00_BY_MISSION = 0x200
+UCODE_DECIMAL_SET_1 = 0x300
+UCODE_DECIMAL_SET_SCORE_VAR_4880_SCORE_VAR_4800 = 0x400
+UCODE_DECIMAL_SET_SCORE_VAR_4980_SCORE_VAR_4900 = 0x500
+UCODE_DECIMAL_SET_SCORE_VAR_4A80_SCORE_VAR_4A00 = 0x600
+UCODE_DECIMAL_SET_SCORE_VAR_4B80_SCORE_VAR_4B00 = 0x700
+
+; decimal other
+UCODE_DECIMAL_0_SCORE = 0x0000
+UCODE_DECIMAL_1_HIGH_SCORE = 0x0100
+UCODE_DECIMAL_2 = 0x0200
+UCODE_DECIMAL_3_MISSION = 0x0300
+UCODE_DECIMAL_4_FUEL = 0x0400
+UCODE_DECIMAL_5_BOMB = 0x0500
+UCODE_DECIMAL_6_SHIP_LEFT = 0x0600
+UCODE_DECIMAL_7_BONUS = 0x0700
 
 ; draw misc
 UCODE_DRAW_MISC_RESTART = 0xe000
index 5bf0e40..8c18dbb 100755 (executable)
@@ -96,24 +96,37 @@ def disasm_words(value0):
       k = j & 2
       if k in defs['escape bit 1']:
         value1.append(defs['escape bit 1'][k])
-      k = (j & 0xc) + 0x100
+      k = j & 0xc
+      if k + 0x100 in defs['escape bits 2 to 3']:
+        k += 0x100
+        j -= 0x100
       value1.append(defs['escape bits 2 to 3'][k])
-      j = (j & 0xff00) - 0x100
-      if k == 0x100: # control game
+      j &= 0xff00
+      if k == 0: # control game
         value1.append(defs['control game'].get(j, f'0x{j:04x}'))
-      elif k == 0x104: # set decimal
-        value1.append(defs['set decimal'].get(j, f'0x{j:04x}'))
+      elif k == 4: # decimal
+        k = j & 0xf000
+        value1.append(defs['decimal'].get(k, f'0x{k:04x}'))
+        j &= 0xf00
+        if k == 0x3000: # decimal set
+          value1.append(defs['decimal set'].get(j, f'0x{j:04x}'))
+        else:
+          value1.append(defs['decimal other'].get(j, f'0x{j:04x}'))
       elif k == 0x108: # draw misc
+        value2 = [value1.pop()]
         if j < 0xe000: # from table
           k = j & 0x1f00
-          value1.append(defs['draw misc bits 0 to 4'][k])
+          value2.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])
+            value2.append(defs['draw misc bits 5 to 7'][k])
         else:
-          value1.append(defs['draw misc'].get(j, f'0x{j:04x}'))
+          value2.append(defs['draw misc'].get(j, f'0x{j:04x}'))
+        value1.append('({0:s})'.format(' + '.join(value2)))
       elif k == 0x10c: # sound effect
-        value1.append(defs['sound effect'].get(j, f'0x{j:04x}'))
+        value2 = [value1.pop()]
+        value2.append(defs['sound effect'].get(j, f'0x{j:04x}'))
+        value1.append('({0:s})'.format(' + '.join(value2)))
       else:
         assert False
     else:
@@ -135,7 +148,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')