from decode_common import *

BANK = None

kInstructionSet = {
  0xa288c5: ('BouncingGoofball_Instr_88C5', ''),
  0xa288c6: ('BouncingGoofball_Instr_88C6', ''),
  0xa2897e: ('MiniCrocomire_Instr_897E', 'H'),
  0xa28990: ('MiniCrocomire_Instr_8990', ''),
  0xa2899d: ('MiniCrocomire_Instr_899D', ''),
  0xa29381: ('MaridiaBeybladeTurtle_Instr_9381', ''),
  0xa29412: ('MaridiaBeybladeTurtle_Instr_9412', ''),
  0xa29447: ('MaridiaBeybladeTurtle_Instr_9447', ''),
  0xa29451: ('MaridiaBeybladeTurtle_Instr_9451', ''),
  0xa2946b: ('MaridiaBeybladeTurtle_Instr_946B', ''),
  0xa29485: ('MaridiaBeybladeTurtle_Instr_9485', ''),
  0xa294a1: ('MaridiaBeybladeTurtle_Instr_94A1', ''),
  0xa294c7: ('MaridiaBeybladeTurtle_Instr_94C7', ''),
  0xa294d1: ('MaridiaBeybladeTurtle_Instr_94D1', ''),
  0xa29f2a: ('SpikeShootingPlant_Instr_9F2A', ''),
  0xa2a095: ('SpikeShootingPlant_Instr_A095', ''),
  0xa2a56d: ('MaridiaSpikeyShell_Instr_A56D', ''),
  0xa2a571: ('MaridiaSpikeyShell_Instr_A571', ''),
  0xa2a0a7: ('SpikeShootingPlant_Instr_A0A7', 'H'),
  0xa2b9c7: ('Rinka_Instr_B9C7', ''),
  0xa2be8e: ('NorfairLavajumpingEnemy_Instr_BE8E', ''),
  0xa2bbc3: ('EnemyInstr_Rio_Instr_1', ''),
  0xa2c1c9: ('NorfairRio_Instr_C1C9', ''),
  0xa2c1d4: ('NorfairRio_Instr_C1D4', ''),
  0xa2c1df: ('NorfairRio_Instr_C1DF', ''),
  0xa2c1ea: ('NorfairRio_Instr_C1EA', ''),
  0xa2c1f5: ('NorfairRio_Instr_C1F5', ''),
  0xa2c200: ('NorfairRio_Instr_C200', ''),
  0xa2c20b: ('NorfairRio_Instr_C20B', ''),
  0xa2c216: ('NorfairRio_Instr_C216', ''),
  0xa2c221: ('NorfairRio_Instr_C221', ''),
  0xa2c22c: ('NorfairRio_Instr_C22C', ''),
  0xa2c237: ('NorfairRio_Instr_C237', ''),
  0xa2c6d2: ('LowerNorfairRio_Instr_C6D2', ''),
  0xa2c6dd: ('LowerNorfairRio_Instr_C6DD', ''),
  0xa2c6e8: ('LowerNorfairRio_Instr_C6E8', ''),
  0xa2b9b3: ('Rinka_Instr_B9B3', ''),
  0xa2b9bd: ('Rinka_Instr_B9BD', ''),
  0xa2cb6b: ('MaridiaLargeSnail_Instr_CB6B', ''),
  0xa2ccb3: ('MaridiaLargeSnail_Instr_CCB3', ''),
  0xa2ccbe: ('MaridiaLargeSnail_Instr_CCBE', ''),
  0xa2ccc9: ('MaridiaLargeSnail_Instr_CCC9', ''),
  0xa2e5fb: ('LavaSeahorse_Instr_E5FB', ''),
  0xa386e3: ('Waver_Instr_1', ''),
  0xa38956: ('Metalee_Instr_1', ''),
  0xa39096: ('MaridiaFish_Instr_3', ''),
  0xa390a0: ('MaridiaFish_Instr_1', ''),
  0xa390aa: ('MaridiaFish_Instr_2', ''),
  0xa39c6b: ('PlatformThatFallsWithSamus_Instr_3', ''),
  0xa39c76: ('PlatformThatFallsWithSamus_Instr_4', ''),
  0xa39c81: ('PlatformThatFallsWithSamus_Instr_1', ''),
  0xa39c8c: ('PlatformThatFallsWithSamus_Instr_2', ''),
  0xa3aa68: ('Sidehopper_Func_1', 'H'),
  0xa3aafe: ('Sidehopper_Instr_1', ''),
  0xa3b429: ('MaridiaRefillCandy_Instr_1', ''),
  0xa3b434: ('MaridiaRefillCandy_Instr_2', ''),
  0xa3b43f: ('MaridiaRefillCandy_Instr_3', ''),
  0xa3ba78: ('Bang_Instr_1', ''),
  0xa3baa8: ('Bang_Instr_2', ''),
  0xa3c6a4: ('Skree_Instr_1', ''),
  0xa3cc36: ('MaridiaSnail_Instr_1', 'A'),
  0xa3cc3f: ('MaridiaSnail_Instr_2', 'A'),
  0xa3cc48: ('MaridiaSnail_Instr_4', 'H'),
  0xa3cc5f: ('MaridiaSnail_Instr_3', 'II'),
  0xa3cc78: ('MaridiaSnail_Instr_5', ''),
  0xa3dfc2: ('WreckedShipOrangeZoomer_Func_1', 'A'),
  0xa3dbc8: ('Reflec_Instr_1', 'H'),
  0xa3e660: ('Zoomer_Instr_SetPreinstr', 'A'),
  0xa3eaa5: ('Metroid_Instr_2', ''),
  0xa3eab1: ('Metroid_Instr_1', ''),
  0xa486a6: ('Crocomire_Instr_1', ''),
  0xa48cfb: ('Crocomire_Instr_11', ''),
  0xa48fc7: ('Crocomire_Instr_2', ''),
  0xa48ffa: ('Crocomire_Instr_3', ''),
  0xa48fdf: ('Crocomire_Instr_4', ''),
  0xa48752: ('Crocomire_Instr_14', ''),
  0xa48d07: ('Crocomire_Instr_7', ''),
  0xa48d13: ('Crocomire_Instr_19', ''),
  0xa48fff: ('Crocomire_Instr_15', ''),
  0xa4907f: ('Crocomire_Instr_18', ''),
  0xa4908f: ('Crocomire_Instr_12', ''),
  0xa49094: ('Crocomire_Instr_17', ''),
  0xa4905b: ('Crocomire_Instr_13', ''),
  0xa4901d: ('Crocomire_Instr_16', ''),
  0xa49a9b: ('Crocomire_Instr_8', ''),
  0xa49aa0: ('Crocomire_Instr_6', ''),
  0xa49aa5: ('Crocomire_Instr_9', ''),
  0xa49aaa: ('Crocomire_Instr_5', ''),
  0xa49aaf: ('Crocomire_Instr_20', ''),
  0xa49ab4: ('Crocomire_Instr_21', ''),
  0xa49ab9: ('Crocomire_Instr_22', ''),
  0xa49abe: ('Crocomire_Instr_23', ''),
  0xa49ac3: ('Crocomire_Instr_24', ''),
  0xa49ac8: ('Crocomire_Instr_10', ''),
  0xa49acd: ('Crocomire_Instr_25', ''),
  0xa49ad2: ('Crocomire_Instr_26', ''),
  0xa49ad7: ('Crocomire_Instr_27', ''),
  0xa594dd: ('Draygon_Instr_1', 'GGGG'),
  0xa59736: ('Draygon_Instr_13', 'A'),
  0xa5973f: ('Draygon_Instr_8', ''),
  0xa59752: ('Draygon_Instr_7', ''),
  0xa59765: ('Draygon_Instr_6', ''),
  0xa59778: ('Draygon_Instr_9', ''),
  0xa59895: ('Draygon_Instr_2', ''),
  0xa598d3: ('Draygon_Instr_11', ''),
  0xa598ef: ('Draygon_Instr_5', ''),
  0xa59b9a: ('Draygon_Instr_15', ''),
  0xa59c8a: ('Draygon_Instr_17', ''),
  0xa59e0a: ('Draygon_Instr_14', 'II'),
  0xa59f57: ('Draygon_Instr_16', 'A'),
  0xa59f60: ('Draygon_Instr_10', 'H'),
  0xa59f6e: ('Draygon_Instr_4', 'H'),
  0xa59f7c: ('Draygon_Instr_12', ''),
  0xa59fae: ('Draygon_Instr_18', ''),
  0xa5c47b: ('Draygon_Instr_3', 'A'),
  0xa5e75f: ('Draygon_Instr_25', ''),
  0xa5e771: ('Draygon_Instr_24', ''),
  0xa5e9b1: ('Draygon_Instr_26', ''),
  0xa5e87c: ('Draygon_Instr_27', ''),
  0xa5e96e: ('Draygon_Instr_28', ''),
  0xa5e82d: ('Draygon_Instr_21', 'HH'),
  0xa5e872: ('Draygon_Instr_22', 'H'),
  0xa5e895: ('Draygon_Instr_23', 'H'),
  0xa5e8a3: ('Draygon_Instr_55', 'H'),
  0xa5e8b1: ('Draygon_Instr_30', ''),
  0xa5e8ba: ('Draygon_Instr_20', 'A'),
  0xa5e8ca: ('Draygon_Instr_29', 'H'),
  0xa5e91c: ('Draygon_Instr_19', 'H'),
  0xa68daf: ('FireGeyser_Instr_1', ''),
  0xa68e13: ('FireGeyser_Instr_2', ''),
  0xa68e2d: ('FireGeyser_Instr_3', ''),
  0xa68e41: ('FireGeyser_Instr_4', ''),
  0xa68e55: ('FireGeyser_Instr_5', ''),
  0xa68e69: ('FireGeyser_Instr_6', ''),
  0xa68e7d: ('FireGeyser_Instr_7', ''),
  0xa68e91: ('FireGeyser_Instr_8', ''),
  0xa68ea5: ('FireGeyser_Instr_9', ''),
  0xa68eb9: ('FireGeyser_Instr_10', ''),
  0xa68ecd: ('FireGeyser_Instr_11', ''),
  0xa68ee1: ('FireGeyser_Instr_12', ''),
  0xa68ef5: ('FireGeyser_Instr_13', ''),
  0xa68f09: ('FireGeyser_Instr_14', ''),
  0xa68f1d: ('FireGeyser_Instr_15', ''),
  0xa68f31: ('FireGeyser_Instr_16', ''),
  0xa68f45: ('FireGeyser_Instr_17', ''),
  0xa68f59: ('FireGeyser_Instr_18', ''),
  0xa68f6d: ('FireGeyser_Instr_19', ''),
  0xa68f81: ('FireGeyser_Instr_20', ''),
  0xa68f95: ('FireGeyser_Instr_21', ''),
  0xa68fa9: ('FireGeyser_Instr_22', ''),
  0xa68fbd: ('FireGeyser_Instr_23', ''),
  0xa68fd1: ('FireGeyser_Instr_24', ''),
  0xa69b26: ('FakeKraid_Instr_2', ''),
  0xa69b74: ('FakeKraid_Instr_1', ''),
  0xa69bb2: ('FakeKraid_Instr_3', ''),
  0xa69bc4: ('FakeKraid_Instr_4', ''),
  0xa69c02: ('FakeKraid_Instr_5', ''),
  0xa6bfc9: ('BabyMetroid_Instr_2', 'G'),
  0xa6bfe1: ('BabyMetroid_Instr_3', '6'),
  0xa6bff2: ('BabyMetroid_Instr_1', 'G'),
  0xa6bff8: ('BabyMetroid_Instr_4', 'G'),
  0xa6e4be: ('Ridley_Instr_5', ''),
  0xa6e4ca: ('Ridley_Instr_6', ''),
  0xa6e4d2: ('Ridley_Instr_10', 'G'),
  0xa6e4e9: ('sub_A6E4E9', 'H'),
  0xa6e4ee: ('Ridley_Instr_4', 'GG'),
  0xa6e4f8: ('Ridley_Instr_3', 'G'),
  0xa6e501: ('Ridley_Instr_2', 'H'),
  0xa6e517: ('Ridley_Instr_1', 'G'),
  0xa6e51f: ('Ridley_Instr_14', 'II'),
  0xa6e71c: ('Ridley_Instr_9', ''),
  0xa6e727: ('Ridley_Instr_7', ''),
  0xa6e72f: ('Ridley_Instr_8', ''),
  0xa6e84d: ('Ridley_Instr_11', ''),
  0xa6e904: ('Ridley_Instr_12', ''),
  0xa6e909: ('Ridley_Instr_13', ''),
  0xa6e969: ('Ridley_Instr_15', ''),
  0xa6e976: ('Ridley_Instr_16', ''),
  0xa6f11d: ('CeresSteam_Instr_1', ''),
  0xa6f127: ('CeresSteam_Instr_2', 'GG'),
  0xa6f135: ('CeresSteam_Instr_3', ''),
  0xa6f63e: ('CeresDoor_Instr_6', 'G'),
  0xa6f66a: ('CeresDoor_Instr_4', 'G'),
  0xa6f678: ('CeresDoor_Instr_8', 'G'),
  0xa6f68b: ('CeresSteam_Instr_4', ''),
  0xa6f695: ('CeresDoor_Instr_1', ''),
  0xa6f69f: ('CeresDoor_Instr_3', ''),
  0xa6f6a6: ('CeresSteam_Instr_5', ''),
  0xa6f6b0: ('CeresDoor_Instr_5', ''),
  0xa6f6b3: ('CeresDoor_Instr_2', ''),
  0xa6f6bd: ('CeresDoor_Instr_7', ''),
  0xa78a8f: ('Kraid_Instr_9', ''),
  0xa7b633: ('Kraid_Instr_1', ''),
  0xa7b636: ('Kraid_Instr_DecYpos', ''),
  0xa7b63c: ('Kraid_Instr_IncrYpos_Shake', ''),
  0xa7b64e: ('Kraid_Instr_PlaySound_0x76', ''),
  0xa7b65a: ('Kraid_Instr_XposMinus3', ''),
  0xa7b667: ('Kraid_Instr_XposMinus3b', ''),
  0xa7b674: ('Kraid_Instr_XposPlus3', ''),
  0xa7b683: ('Kraid_Instr_MoveHimRight', ''),
  0xa8878f: ('MiniDraygon_Instr_2', ''),
  0xa8879b: ('MiniDraygon_Instr_1', ''),
  0xa887b6: ('MiniDraygon_Instr_3', ''),
  0xa887cb: ('MiniDraygon_Instr_4', ''),
  0xa89625: ('Fune_Instr_2', ''),
  0xa89631: ('Fune_Instr_6', ''),
  0xa8964a: ('Fune_Instr_7', ''),
  0xa89663: ('Fune_Instr_1', ''),
  0xa8967c: ('Fune_Instr_4', ''),
  0xa89695: ('Fune_Instr_3', ''),
  0xa896b4: ('Fune_Instr_5', ''),
  0xa8ae26: ('NorfairLavaMan_Instr_8', ''),
  0xa8ae30: ('NorfairLavaMan_Instr_14', ''),
  0xa8ae3a: ('NorfairLavaMan_Instr_2', ''),
  0xa8ae45: ('NorfairLavaMan_Instr_7', ''),
  0xa8ae50: ('NorfairLavaMan_Instr_10', ''),
  0xa8ae5a: ('NorfairLavaMan_Instr_12', ''),
  0xa8ae64: ('NorfairLavaMan_Instr_9', ''),
  0xa8ae88: ('NorfairLavaMan_Instr_11', ''),
  0xa8ae96: ('NorfairLavaMan_Instr_13', ''),
  0xa8aeba: ('NorfairLavaMan_Instr_5', ''),
  0xa8aeca: ('NorfairLavaMan_Instr_15', ''),
  0xa8aee4: ('NorfairLavaMan_Instr_4', ''),
  0xa8aefe: ('NorfairLavaMan_Instr_16', ''),
  0xa8af18: ('NorfairLavaMan_Instr_6', ''),
  0xa8af32: ('sub_A8AF32', ''),
  0xa8af44: ('NorfairLavaMan_Instr_3', ''),
  0xa8a0c7: ('YappingMaw_Instr_2', ''),
  0xa8a0d9: ('YappingMaw_Instr_4', ''),
  0xa8a10f: ('YappingMaw_Instr_3', ''),
  0xa8a0eb: ('YappingMaw_Instr_5', ''),
  0xa8a0fd: ('YappingMaw_Instr_7', ''),
  0xa8a121: ('YappingMaw_Instr_6', ''),
  0xa8a133: ('YappingMaw_Instr_1', ''),
  0xa8ae12: ('NorfairLavaMan_Instr_1', 'H'),
  0xa8b75e: ('Beetom_Instr_1', ''),
  0xa8cd09: ('WreckedShipRobot_Instr_4', ''),
  0xa8cda4: ('WreckedShipRobot_Instr_9', ''),
  0xa8cdea: ('WreckedShipRobot_Instr_6', ''),
  0xa8ce85: ('WreckedShipRobot_Instr_8', ''),
  0xa8cecb: ('WreckedShipRobot_Instr_7', ''),
  0xa8cecf: ('WreckedShipRobot_Instr_15', ''),
  0xa8cf6a: ('WreckedShipRobot_Instr_18', ''),
  0xa8cfb0: ('WreckedShipRobot_Instr_16', ''),
  0xa8d04b: ('WreckedShipRobot_Instr_17', ''),
  0xa8d091: ('WreckedShipRobot_Instr_3', ''),
  0xa8d0c2: ('WreckedShipRobot_Instr_10', ''),
  0xa8d0c6: ('WreckedShipRobot_Instr_14', ''),
  0xa8d0d2: ('WreckedShipRobot_Instr_2', ''),
  0xa8d100: ('WreckedShipRobot_Instr_13', ''),
  0xa8d107: ('WreckedShipRobot_Instr_1', ''),
  0xa8d131: ('WreckedShipRobot_Instr_12', ''),
  0xa8d13d: ('WreckedShipRobot_Instr_5', ''),
  0xa8d16b: ('WreckedShipRobot_Instr_11', ''),
  0xa8df1c: ('WalkingLavaSeahorse_Instr_4', ''),
  0xa8df33: ('WalkingLavaSeahorse_Instr_3', ''),
  0xa8df39: ('WalkingLavaSeahorse_Instr_5', ''),
  0xa8df3f: ('WalkingLavaSeahorse_Instr_6', ''),
  0xa8df63: ('WalkingLavaSeahorse_Instr_2', ''),
  0xa8df71: ('WalkingLavaSeahorse_Instr_1', ''),
  0xa8e61d: ('WreckedShipSpark_Instr_2', ''),
  0xa8e62a: ('WreckedShipSpark_Instr_1', ''),
  0xa8f526: ('KiHunter_Instr_1', ''),
  0xa8f5e4: ('KiHunter_Instr_2', ''),
  0xa8f67f: ('KiHunter_Instr_3', ''),
  0xa8f6d2: ('KiHunter_Instr_4', ''),
  0xa8f6d8: ('KiHunter_Instr_5', ''),
  0xa995b6: ('MotherBrain_Instr_MoveBodyUp10Left4', ''),
  0xa995c0: ('MotherBrain_Instr_MoveBodyUp16Left4', ''),
  0xa995ca: ('MotherBrain_Instr_MoveBodyUp12Right2', ''),
  0xa995de: ('MotherBrain_Instr_MoveDown12Left4', ''),
  0xa995e8: ('MotherBrain_Instr_MoveDown16Right2', ''),
  0xa995f2: ('MotherBrain_Instr_MoveDown10Right2', ''),
  0xa995fc: ('MotherBrain_Instr_MoveUp2Right1', ''),
  0xa9960c: ('MotherBrain_Instr_MoveRight2', ''),
  0xa9961c: ('MotherBrain_Instr_MoveUp1', ''),
  0xa99622: ('MotherBrain_Instr_MoveUp1Right3_Sfx', ''),
  0xa99638: ('MotherBrain_Instr_Down2Right15', ''),
  0xa99648: ('MotherBrain_Instr_Down4Right6', ''),
  0xa99658: ('MotherBrain_Instr_Up4Left2', ''),
  0xa99668: ('MotherBrain_Instr_Up2Left1_Sfx', ''),
  0xa9967e: ('MotherBrain_Instr_Up2Left1_Sfx2', ''),
  0xa99694: ('MotherBrain_Instr_MoveLeft2', ''),
  0xa996a4: ('MotherBrain_Instr_MoveDown1', ''),
  0xa996aa: ('MotherBrain_Instr_MoveDown1Left3', ''),
  0xa996ba: ('MotherBrain_Instr_MoveUp2Left15_Sfx', ''),
  0xa996d0: ('MotherBrain_Instr_MoveUp4Left6', ''),
  0xa996e0: ('MotherBrain_Instr_MoveDown4Right2', ''),
  0xa996f0: ('MotherBrain_Instr_MoveDown2Right1', ''),
  0xa99700: ('MotherBrain_Instr_SetPose_Standing', ''),
  0xa99708: ('MotherBrain_Instr_SetPose_Walking', ''),
  0xa99710: ('MotherBrain_Instr_SetPose_Crouched', ''),
  0xa99718: ('MotherBrain_Instr_SetPose_CrouchedTrans', ''),
  0xa99720: ('MotherBrain_Instr_SetPose_DeathBeamMode', ''),
  0xa99728: ('MotherBrain_Instr_SetPose_LeaningDown', ''),
  0xa99ac8: ('MotherBrain_Instr_SpawnEprojToOffset', 'IIH'),
  0xa99aef: ('MotherBrain_Instr_SpawnDeathBeamEproj', ''),
  0xa99b05: ('MotherBrain_Instr_IncrBeamAttackPhase', ''),
  0xa99b0f: ('MotherBrain_Instr_Goto', 'G'),
  0xa99b14: ('MotherBrain_Instr_EnableNeckMovementGoto', 'G'),
  0xa99b20: ('MotherBrain_Instr_DisableNeckMovement', ''),
  0xa99b28: ('MotherBrain_Instr_QueueSfx2', 'H'),
  0xa99b32: ('MotherBrain_Instr_QueueSfx3', 'H'),
  0xa99b3c: ('MotherBrain_Instr_SpawnDroolEproj', ''),
  0xa99b6d: ('MotherBrain_Instr_SpawnPurpleBreath', ''),
  0xa99b77: ('MotherBrain_Instr_SetMainShakeTimer50', ''),
  0xa99c65: ('MotherBrain_Instr_GotoEitherOr', ''),
  0xa99cad: ('MotherBrain_Instr_MaybeGoto', ''),
  0xa99d0d: ('MotherBrain_Instr_MaybeGoto2', ''),
  0xa99d21: ('MotherBrain_Instr_Goto2', ''),
  0xa99df7: ('MotherBrain_Instr_QueueShitroidAttackSfx', ''),
  0xa99e29: ('MotherBrain_Instr_SpawnBlueRingEproj', ''),
  0xa99e37: ('MotherBrain_Instr_AimRingsAtShitroid', ''),
  0xa99e5b: ('MotherBrain_Instr_AimRingsAtSamus', ''),
  0xa99ea3: ('MotherBrain_Instr_IncrShitroidAttackCtr', ''),
  0xa99eb5: ('MotherBrain_Instr_SetShitroidAttackCtr0', ''),
  0xa99ebd: ('MotherBrain_Instr_SpawnBombEproj', 'H'),
  0xa99f46: ('MotherBrain_Instr_SpawnLaserEproj', ''),
  0xa99f84: ('MotherBrain_Instr_SpawnRainbowEproj', ''),
  0xa99f8e: ('MotherBrain_Instr_SetupFxForRainbowBeam', ''),
  0xa9cfb4: ('Shitroid_Instr_1', ''),
  0xa9cfca: ('Shitroid_Instr_2', ''),
  0xa9ecd0: ('sub_A9ECD0', ''),
  0xa9f920: ('Shitroid_Instr_3', ''),
  0xa9f936: ('Shitroid_Instr_4', ''),
  0xa9f990: ('Shitroid_Instr_6', ''),
  0xa9f994: ('Shitroid_Instr_5', 'G'),
  0xaab09c: ('Torizo_Instr_3', 'A'),
  0xaab11d: ('Torizo_Instr_31', ''),
  0xaab1be: ('Torizo_Instr_33', ''),
  0xaab224: ('Torizo_Instr_36', ''),
  0xaab22e: ('Torizo_Instr_37', ''),
  0xaab238: ('Torizo_Instr_35', ''),
  0xaab24d: ('Torizo_Instr_38', ''),
  0xaab271: ('Torizo_Instr_6', ''),
  0xaab94d: ('Torizo_Instr_5', ''),
  0xaab951: ('Torizo_Instr_9', ''),
  0xaac2c8: ('Torizo_Instr_7', ''),
  0xaac2c9: ('Torizo_Instr_2', ''),
  0xaac2d1: ('Torizo_Instr_8', ''),
  0xaac2d9: ('Torizo_Instr_25', 'GG'),
  0xaac2ed: ('Torizo_Instr_22', 'A'),
  0xaac2f7: ('Torizo_Instr_19', ''),
  0xaac2fd: ('Torizo_Instr_32', ''),
  0xaac303: ('Torizo_Instr_30', 'H'),
  0xaac32f: ('Torizo_Instr_34', ''),
  0xaac34a: ('Torizo_Instr_24', ''),
  0xaac35b: ('Torizo_Instr_12', ''),
  0xaac36d: ('Torizo_Instr_10', ''),
  0xaac377: ('Torizo_Instr_11', ''),
  0xaac38a: ('Torizo_Instr_29', ''),
  0xaac3a0: ('Torizo_Instr_1', ''),
  0xaac3b6: ('Torizo_Instr_28', ''),
  0xaac3cc: ('Torizo_Instr_4', 'H'),
  0xaac41e: ('Torizo_Instr_40', 'H'),
  0xaac470: ('Torizo_Instr_16', 'H'),
  0xaac4e5: ('Torizo_Instr_27', 'H'),
  0xaac55a: ('Torizo_Instr_23', 'G'),
  0xaac567: ('Torizo_Instr_14', 'G'),
  0xaac58b: ('Torizo_Instr_15', 'G'),
  0xaac5a4: ('Torizo_Instr_26', 'GG'),
  0xaac5cb: ('Torizo_Instr_18', ''),
  0xaac5e3: ('Torizo_Instr_20', 'H'),
  0xaac5f2: ('Torizo_Instr_44', 'H'),
  0xaac601: ('Torizo_Instr_21', 'H'),
  0xaac610: ('Torizo_Instr_17', ''),
  0xaac618: ('Torizo_Instr_13', ''),
  0xaacace: ('Torizo_Instr_39', 'G'),
  0xaacade: ('Torizo_Instr_41', ''),
  0xaacae2: ('Torizo_Instr_42', ''),
  0xaacdd7: ('Torizo_Instr_48', ''),
  0xaad0e9: ('Torizo_Instr_57', ''),
  0xaad0f3: ('Torizo_Instr_58', 'G'),
  0xaad17b: ('Torizo_Instr_59', ''),
  0xaad187: ('Torizo_Instr_62', ''),
  0xaad1e7: ('Torizo_Instr_63', ''),
  0xaad38f: ('Torizo_Instr_56', ''),
  0xaad397: ('Torizo_Instr_60', ''),
  0xaad39f: ('Torizo_Instr_46', ''),
  0xaad3e0: ('Torizo_Instr_47', ''),
  0xaad3ea: ('Torizo_Instr_49', 'G'),
  0xaad436: ('Torizo_Instr_61', 'H'),
  0xaad445: ('Torizo_Instr_53', 'G'),
  0xaad474: ('Torizo_Instr_55', 'G'),
  0xaad49b: ('Torizo_Instr_52', 'G'),
  0xaad4ba: ('Torizo_Instr_50', 'G'),
  0xaad4f3: ('Torizo_Instr_43', ''),
  0xaad4fd: ('Torizo_Instr_51', 'G'),
  0xaad526: ('Torizo_Instr_45', 'GG'),
  0xaad54d: ('Torizo_Instr_54', 'H'),
  0xaad9ba: ('Shaktool_Instr_1', ''),
  0xaad931: ('Shaktool_Instr_2', ''),
  0xaad93f: ('Shaktool_Instr_3', ''),
  0xaad94a: ('Shaktool_Instr_4', ''),
  0xaad953: ('Shaktool_Instr_5', ''),
  0xaad99f: ('Shaktool_Instr_6', ''),
  0xaae429: ('Shaktool_Instr_9', ''),
  0xaae436: ('Shaktool_Instr_11', ''),
  0xaae43d: ('Shaktool_Instr_10', ''),
  0xaae57f: ('Shaktool_Instr_8', ''),
  0xaae587: ('Shaktool_Instr_13', ''),
  0xaae58f: ('Shaktool_Instr_12', 'I'),
  0xaae5d8: ('Shaktool_Instr_7', 'H'),
  0xaae6f0: ('Shaktool_Instr_14', ''),
  0xb2ee40: ('SpacePirates_Instr_MovePixelsDownAndChangeDirFaceRight', 'I'),
  0xb2ee72: ('SpacePirates_Instr_MovePixelsDownAndChangeDirFaceLeft', 'I'),
  0xb2eea4: ('SpacePirates_Instr_RandomNewDirFaceR', ''),
  0xb2eebc: ('SpacePirates_Instr_RandomNewDirFaceL', ''),
  0xb2eed4: ('SpacePirates_Instr_PrepareWallJumpR', ''),
  0xb2eefd: ('SpacePirates_Instr_PrepareWallJumpL', ''),
  0xb2ef2a: ('SpacePirates_Instr_FireLaserL', ''),
  0xb2ef5d: ('SpacePirates_Instr_FireLaserR', ''),
  0xb2ef83: ('SpacePirates_Instr_SetEnemyFunc', 'A'),
  0xb2ef93: ('SpacePirates_Instr_PlaySfx', ''),
  0xb2f536: ('SpacePirates_Instr_20', 'H'),
  0xb2f546: ('SpacePirates_Instr_16', 'H'),
  0xb2f554: ('sub_B2F554', ''),
  0xb2f564: ('SpacePirates_Instr_15', 'HII'),
  0xb2f590: ('SpacePirates_Instr_18', ''),
  0xb2f5b3: ('sub_B2F5B3', ''),
  0xb2f5d6: ('SpacePirates_Instr_17', ''),
  0xb2f969: ('SpacePirates_Instr_19', ''),
  0xb2f985: ('SpacePirates_F985', ''),
  0xb2fa3d: ('SpacePirates_Instr_21', ''),
  0xb2fa59: ('SpacePirates_FA59', ''),
  0xb2fc68: ('SpacePirates_Instr_12', 'I'),
  0xb2fc90: ('SpacePirates_Instr_14', 'I'),
  0xb2fcb8: ('SpacePirates_Instr_11', 'A'),
  0xb2fcc8: ('SpacePirates_Instr_13', ''),
  0xb394c7: ('Botwoon_Instr_1', ''),
  0xb394d7: ('Botwoon_Instr_2', ''),
  0xb394e7: ('Botwoon_Instr_3', ''),
  0xb394f7: ('Botwoon_Instr_4', ''),
  0xb39507: ('Botwoon_Instr_5', ''),
  0xb39517: ('Botwoon_Instr_6', ''),
  0xb39527: ('Botwoon_Instr_7', ''),
  0xb39537: ('Botwoon_Instr_8', ''),
  0xb39547: ('Botwoon_Instr_9', ''),
  0xb39557: ('Botwoon_Instr_10', ''),
  0xb39567: ('Botwoon_Instr_SetSpitting', ''),
  0xb39572: ('Botwoon_Instr_QueueSpitSfx', ''),
  0xb3e545: ('EscapeEtecoon_Instr_1', 'G'),
  0xb3e610: ('EscapeEtecoon_Instr_2', 'I'),
  0xb3eaa8: ('EscapeDachora_Instr_2', 'G'),
  0xb3eab8: ('EscapeDachora_Instr_3', 'G'),
  0xb3eac9: ('EscapeDachora_Instr_1', ''),
  0xb3ead7: ('EscapeDachora_Instr_4', ''),
}

commons = {
  0x806b: ('SetAiPreInstr', 'A'),
  0x8074: ('ClearAiPreInstr', ''),
  0x807c: ('StopScript', ''),
  0x808a: ('Call', 'A'),
  0x80b5: ('CallFar', 'L'),
  0x80ed: ('Goto', 'G'),
  0x8110: ('DecTimerAndGoto', 'G'),
  0x8123: ('SetTimer', 'H'),
  0x812f: ('Sleep', ''),
  0x813a: ('WaitNframes', 'H'),
  0x814b: ('CopyToVram', 'HLX'),
  0x8173: ('EnableOffScreenProcessing', ''),
  0x817d: ('DisableOffScreenProcessing', ''),  
}

kInstrTerminator = {
  0x807C, 0x80ED, 0x812F,
  0xa6BFF8, 0xa29451, 0xa8CECB, 0xa8D0C2, 0xa8F526, 0xa99B0F, 0xa99B14, 0xa99C65, 0xa99d21, 0xa9cfb4, 0xA9CFCA, 0xa9f920, 0xa9f936, 0xa9f990,
  0xaaC2F7, 0xaaC2FD, 0xb2EEA4, 0xb2EEBC, 0xb2FCC8
}


for x in [0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3]:
  for k, v in commons.items():
    kInstructionSet[k + (x << 16)] = v

kCommandByName = {v[0] : (k, v[1]) for k, v in kInstructionSet.items()}

class EnemyInstrParser(InstrParserCommon):
  instruction_set = kInstructionSet
  instruction_set_term = kInstrTerminator
  TAG = 'enemy'

  def __init__(self):
    super().__init__()
    self.sprite_maps = set()

  def handle_draw_command(self, ins, ea):
    drawp = get_word(ea + 2) | (ea & 0xff0000)
    self.sprite_maps.add(drawp)
    #assert drawp != 0xa6f142, hex(ea)
    self.print_line(ea, f'  {ins} ! {get_ea_name(drawp)}') 
    return 4

  def process_queue_entry(self, ea):
    assert ea & 0x8000
    while ea not in self.visited:
      self.visited.add(ea)
      ins = get_word(ea)
      if ins & 0x8000:
        ea_org = ea
        ins = (ea & 0xff0000) | ins
        if ins not in self.instruction_set:
          print(f'// Ins {ins:X} not in iset at {ea:X}')
          return
        name, operands = self.instruction_set[ins]
        ea += 2
        r = []
        for op in operands:
          if op == 'H':
            r.append('%d' % get_word(ea))
            ea += 2
          elif op == 'I':
            r.append('%d' % sex16(get_word(ea)))
            ea += 2            
          elif op == 'X':
            r.append('0x%x' % get_word(ea))
            ea += 2
          elif op == 'L':
            r.append(get_ea_name(get_word(ea) + get_byte(ea+2) * 65536))
            ea += 3   
          elif op == 'A':
            addr = (ea & 0xff0000) | get_word(ea)
            r.append(get_ea_name(addr))
            ea += 2                     
          elif op == '6':
            addr = 0xa60000 | get_word(ea)
            r.append(get_ea_name(addr))
            ea += 2                     
          elif op == 'G':
            addr = (ea & 0xff0000) | get_word(ea)
            assert addr & 0x8000, hex(ea)
            r.append(get_ea_name(addr, short_label = True))
            self.visit(addr)
            ea += 2
          else:
            assert 0, op
        self.print_line(ea_org, f'  {name}({", ".join(r)})') 
        if ins in self.instruction_set_term or (ins & 0xffff) in self.instruction_set_term:
          self.print_line(ea_org + 1, '')
          break
      else:
        ea += self.handle_draw_command(ins, ea)
