; Sound processor for the arcade game "Time Pilot" ; 1982 by Centuri/Konami ; Dissassembly comments by Chris Cantrell 1998 ; For detailed discussion of code visit http://www.computerarcheology.com ; TO DO ; - Decompose music script into command text ;##- ;##- Menu structure for CodeToWeb HTML generator ;##- ;##Menu 3 "General Processing" ;##MenuLink SoundCommands "Command List" ;##MenuLink MemoryMap "Memory Map" ;##MenuLink Start "START" ;##MenuLink AYChipIO "AY Chip IO" ;##MenuLink InterruptService "Interrupt" ;##MenuLink CommandBuffer "Command Buffer" ;##MenuLink MainLoop "Main Loop" ;##MenuLink FilterCaps "Filter Caps" ;##MenuLink MusicProcessing "Music Processing" ;##MenuLink CommandTable "Command Tables" ;##MenuLink MusicData "Music Data" ;##- ;##Menu 2 "Sound Commands" ;##MenuLink Command00 "00 Clear Buffer" ;##MenuLink Command01 "01 Coin" ;##MenuLink Command02 "02 Enemy Shot" ;##MenuLink Command03 "03 1910 Bomb" ;##MenuLink Command04 "04 Missile Launch" ;##MenuLink Command05 "05 UFO Shot" ;##MenuLink Command06 "06 Missile (continuous)" ;##MenuLink Command07 "07 Player Shot" ;##MenuLink Command08 "08 Enemy Explosion (thud)" ;##MenuLink Command09 "09 Enemy Explosion (noise)" ;##MenuLink Command0A "0A Tracker or Bomb Explosion" ;##MenuLink Command0B "0B Squad Appears" ;##MenuLink Command0C "0C 1st boss - blimp (continuous)" ;##MenuLink Command0D "0D 2nd boss - jest (continuous)" ;##MenuLink Command0E "0E 3rd boss - helicopter (continuous)" ;##MenuLink Command0F "0F 4th boss - super jet (continuous)" ;##MenuLink Command10 "10 5th boss - mother ship (continuous)" ;##MenuLink Command11 "11 User Explosion Component" ;##MenuLink Command12 "12 User Explosion Component" ;##MenuLink Command13 "13 User Explosion Component" ;##MenuLink Command14 "14 User Explosion Component" ;##MenuLink Command15 "15 User Explosion Component" ;##MenuLink Command16 "16 Pickup Parachute" ;##MenuLink Command17 "17 Free Man" ;##MenuLink Command18 "18 Time Jump 1" ;##MenuLink Command19 "19 Time Jump 2" ;##MenuLink Command1A "1A Play Song 1" ;##MenuLink Command1B "1B Play Song 2" ;##- ;##$CPU Z80 ;##$OriginalBinary TM7 ; Z80 CPU and 2 AY-3-8910 Sound Chips ; The sound board receives commands from the game board through ; port A of one sound chip. The upper nibble of Port B is connected ; to an oscillator and drives sound timing. ; ; Sound board oscillator is 14.318MHz. The CPU and sound chips use ; the same division ... 14.31818 / 8 = 1.789772. ; ; The timer on the upper four bits of Port B reaches 0 at the main ; clock divided by 10240 (1024*10). ; ; Processing loop = 1.789772MHz / 10240 = 174.782421875Hz (0.005721399 sec per tick) ;##SoundCommands ; ; First number is command number ; Second is filter-capacitor configuration ; ; 00 Write 0 to voice ; 01 0 Coin ; 02 0 Plane fire ; 03 0 1910 bomb ; 04 1 Missile launch ; 05 0 UFO shot ; 06 0 Missile (continuous) ; 07 0 User Fire ; 08 1 Enemy Explosion Component (thud) ; 09 1 Enemy Explosion Component (white-noise) ; 0A 0 Tracker or Bomb Explosion ; 0B 0 Squad Appears ; 0C 1 1st boss (blimp) ; 0D 1 2nd boss (jet) ; 0E 1 3rd boss (helicopter) ; 0F 1 4th boss (super jet) ; 10 1 5th boss (mother ship) ; 11 1 User explosion component ; 12 1 User explosion component ; 13 2 User explosion component ; 14 2 User explosion component ; 15 1 User explosion component ; 16 0 Pickup parachute ; 17 1 Free man ; 18 0 Time jump 1 ; 19 0 Time jump 2 ; 1A 0 Initialize song 2 ; 1B 1 Initialize song 1 ; 1C 0 Initialize music D1 ; 1D 0 Initialize music D2 ; 1E 0 Initialize music D3 ; 1F 0 Initialize music D4 ; 20 0 Initialize music D5 ;##MemoryMap ; Memory usage starts at 3000 ; 3000-0B Command Buffer (see COMMAND BUFFER) ; 300C,0D Current cap-filter settings ; 300E Voice number = command index ; Music descriptors (see MUSIC PROCESSING) ; 300F,10,11,12,13,14,15,16,17,18 ; 3019,1A,1B,1C,1D,1E,1F,00,01,02 ; 3023,24,25,26,27,28,29,2A,2B,2C ; 302D,2E,2F,30,31,32,33,34,35,36 ; 3037,38,39,3A,3B,3C,3D,3E,3F,40 ; Individual sound routines use some memory above 3040 ;##Start ; Reset/Startup 0000: 21 00 30 LD HL,$3000 ; Command buffer 0003: 06 00 LD B,$00 ; Fill value 0005: C3 9B 00 JP $009B ; Continue initialization ;##AYChipIO ; Read CHIP0 register. A=register, return in A 0008: 32 00 50 LD ($5000),A ; Store the register number 000B: 3A 00 40 LD A,($4000) ; Read the value 000E: C9 RET ; Done 000F: FF RST $38 ; Filler to align RST routines ; Read CHIP1 register. A=register, retun in A 0010: 32 00 70 LD ($7000),A ; Store the register number 0013: 3A 00 60 LD A,($6000) ; Read the value 0016: C9 RET ; Done 0017: FF RST $38 ; Filler to align RST routines ; Write CHIP0 register. A=register, C=value 0018: 32 00 50 LD ($5000),A ; Store register number 001B: 79 LD A,C ; Write ... 001C: 32 00 40 LD ($4000),A ; ... value 001F: C9 RET ; Done ; Write CHIP1 register. A=register, C=value 0020: 32 00 70 LD ($7000),A ; Store register number 0023: 79 LD A,C ; Write ... 0024: 32 00 60 LD ($6000),A ; ... value 0027: C9 RET ; Done ; Vector to desired function indexed by A ; HL = address table ; A = index 0028: 87 ADD A,A ; *2 0029: 85 ADD A,L ; Add to offset 002A: 6F LD L,A ; Set LSB of pointer 002B: 7C LD A,H ; Carry into ... 002C: CE 00 ADC A,$00 ; ... MSB of pointer 002E: 67 LD H,A ; Set MSB of pointer 002F: 7E LD A,(HL) ; Get LSB of address 0030: 23 INC HL ; Next in table 0031: 66 LD H,(HL) ; Get MSB of address 0032: 6F LD L,A ; Get LSB of address 0033: E9 JP (HL) ; Jump to routine 0034: FF RST $38 ; Filler ... 0035: FF RST $38 ; ... 0036: FF RST $38 ; ... 0037: FF RST $38 ; ... ;##InterruptService ; # #### Interrupt Service Routine ####################################### ; Called when the main CPU signals a new sound command. ; Switch banks and call the command fetch routine 0038: D9 EXX ; Switch banks B-L 0039: 08 EX AF,AF' ; Switch AF banks 003A: CD 40 00 CALL $0040 ; Make the call 003D: 08 EX AF,AF' ; Set the AF banks back 003E: D9 EXX ; Set the B-L banks back 003F: C9 RET ; Done ;##CommandBuffer ; # #### COMMAND BUFFER######################################## ; ; COMMAND BUFFER ; Command Buffer is kept at 3000 and contains 6 2-byte entries. ; The first byte is the command. A zero marks an available slot. ; Commands are read from Port A of Chip 0. ; ; Command 0 clears the command buffer. ; ; If a command is already running, it is restarted. ; ; The command numbers are used as priorities if the buffer is full. The ; higher the command number, the higher the priority. If all commands ; in the buffer are of higher priority than the new command then the ; new command is ignored. Otherwise the new command replaces the lowest ; priority command in the buffer. ; ; If the upper bit is set, the command is removed from the buffer. Command ; values above 0x20 are ignored. ; ; The second byte indicates initialization status. 0=not initialized, 1= ; initialized. Note that entries are removed by setting them to 0000 which ; forces an initialization of command 00 which turns the voice off. ; ; # ########################################################### ; Fetch a command from the port and place it in the ; command buffer. 0040: 3E 0E LD A,$0E ; Port A 0042: CF RST $08 ; Read CHIP0 Port A 0043: B7 OR A ; Set flags 0044: 28 2F JR Z,$75 ; If 0, clear 3000-300B and out 0046: 57 LD D,A ; Hang on to command 0047: E6 7F AND $7F ; Mask off upper bit 0049: FE 21 CP $21 ; Compare command to 21 004B: D0 RET NC ; Invalid command (above 20) 004C: CB 7A BIT 7,D ; Upper bit set? 004E: 20 42 JR NZ,$92 ; Yes -- remove the command from the buffer 0050: CD 80 00 CALL $0080 ; Is the command already in the buffer? 0053: 20 1C JR NZ,$71 ; Found ... restart it. 0055: CD 80 00 CALL $0080 ; Find 0 in the buffer 0058: 20 16 JR NZ,$70 ; Found a slot -- store command in buffer ; Find the lowest numbered command 005A: 21 00 30 LD HL,$3000 ; Buffer 005D: 1E 06 LD E,$06 ; 6 entries to check 005F: 7E LD A,(HL) ; Get command value 0060: 1D DEC E ; Count down 0061: 28 08 JR Z,$6B ; All checked -- 0063: 2C INC L ; Bump to next ... 0064: 2C INC L ; ... entry 0065: BE CP (HL) ; Compare current lowest with next entry 0066: 38 F8 JR C,$60 ; Next entry is higher -- keep our lowest 0068: C3 5F 00 JP $005F ; New lowest value ; 006B: BA CP D ; Is the new command even lower? 006C: D0 RET NC ; Yes -- ignore the command ; Find entry, replace type with D and clear second byte 006D: CD 80 00 CALL $0080 ; Find entry 0070: 72 LD (HL),D ; Store D 0071: 2C INC L ; Second byte in entry 0072: 36 00 LD (HL),$00 ; Flag command needs initializing 0074: C9 RET ; Done ; Clear buffer 0075: 21 00 30 LD HL,$3000 ; Clear 13 bytes ... 0078: 06 0C LD B,$0C ; ... starting at ... 007A: AF XOR A ; ... 007B: 77 LD (HL),A ; ... 007C: 2C INC L ; ... 007D: 10 FC DJNZ $7B ; ... 3000 007F: C9 RET ; Done ; Find entry A in buffer. Return 7-index and HL if found. ; If not found, return 0 0080: 21 00 30 LD HL,$3000 ; Buffer area. 0083: 06 06 LD B,$06 ; 6 entries to check. 0085: 0E 07 LD C,$07 ; Subtraction value. 0087: BE CP (HL) ; Found? 0088: 28 05 JR Z,$8F ; Yes -- done 008A: 2C INC L ; Bump to ... 008B: 2C INC L ; ... next entry 008C: 10 F9 DJNZ $87 ; Check all entries 008E: 41 LD B,C ; Not found -- use 7 as index 008F: 79 LD A,C ; Substract found ... 0090: 90 SUB B ; ... index from 7 0091: C9 RET ; Return index ; Remove entry from buffer 0092: CD 80 00 CALL $0080 ; Find entry 0095: C8 RET Z ; Not found -- out 0096: AF XOR A ; Fast 0 0097: 77 LD (HL),A ; Clear ... 0098: 2C INC L ; ... entry ... 0099: 77 LD (HL),A ; ... from buffer. 009A: C9 RET ; Out ; Initialization continued. ; Clear RAM 009B: 70 LD (HL),B ; Store 0 009C: 23 INC HL ; Bump pointer 009D: 7C LD A,H ; Clear until ... 009E: FE 34 CP $34 ; ... done 00A0: 20 F9 JR NZ,$9B ; Loop back 00A2: F9 LD SP,HL ; Set SP to 3400 00A3: ED 56 IM 1 ; Set interrupt MODE 1 (always vector to 0038) 00A5: 21 00 80 LD HL,$8000 ; All cap filters ... 00A8: 22 0C 30 LD ($300C),HL ; ... (current value) ... 00AB: 77 LD (HL),A ; ... disconnected from channels ; Initialize sound chips 00AC: 0E 00 LD C,$00 ; Value 0 00AE: 16 06 LD D,$06 ; 6 voices 00B0: 7A LD A,D ; Pass to function 00B1: CD 9C 01 CALL $019C ; Amplitude to silence. 00B4: 15 DEC D ; ... 00B5: 20 F9 JR NZ,$B0 ; Silence all voices 00B7: 0E 38 LD C,$38 ; Both IO Ports IN, Tones only on ... 00B9: 3E 07 LD A,$07 ; ... all voices. 00BB: DF RST $18 ; Configure AY38910 chip 0 00BC: 3E 07 LD A,$07 ; "Enable" register again 00BE: E7 RST $20 ; Configure AY38910 chip 1 ;##-MainLoop ; == MAIN PROCESSING LOOP == 00BF: FB EI ; Enable interrupts 00C0: 3E 0F LD A,$0F ; Port B 00C2: CF RST $08 ; Read CHIP0 Port B 00C3: E6 F0 AND $F0 ; Timer value hit? 00C5: 20 F9 JR NZ,$C0 ; No -- keep waiting ; Process Entry Index 1 00C7: F3 DI ; Disable interrupts 00C8: 3E 01 LD A,$01 ; Voice index 1 00CA: 32 0E 30 LD ($300E),A ; Hang onto it 00CD: 3A 01 30 LD A,($3001) ; First voice, 2nd byte 00D0: B7 OR A ; Set flags about 2nd byte 00D1: 3A 00 30 LD A,($3000) ; Get commmand (no flags) 00D4: 28 06 JR Z,$DC ; 2nd byte == 0 00D6: CD 7F 01 CALL $017F ; Continue command 00D9: C3 DF 00 JP $00DF ; Skip over 00DC: CD 69 01 CALL $0169 ; Initialize command 00DF: FB EI ; Enable interrupts 00E0: 00 NOP ; Pause 00E1: 00 NOP ; Pause ; Process Entry Index 2 (see Index 1 above) 00E2: F3 DI ; 00E3: 3E 02 LD A,$02 ; 00E5: 32 0E 30 LD ($300E),A ; 00E8: 3A 03 30 LD A,($3003) ; 00EB: B7 OR A ; 00EC: 3A 02 30 LD A,($3002) ; 00EF: 28 06 JR Z,$F7 ; 00F1: CD 7F 01 CALL $017F ; 00F4: C3 FA 00 JP $00FA ; 00F7: CD 69 01 CALL $0169 ; 00FA: FB EI ; 00FB: 00 NOP ; 00FC: 00 NOP ; ; Process Entry Index 3 (see Index 1 above) 00FD: F3 DI ; 00FE: 3E 03 LD A,$03 ; 0100: 32 0E 30 LD ($300E),A ; 0103: 3A 05 30 LD A,($3005) ; 0106: B7 OR A ; 0107: 3A 04 30 LD A,($3004) ; 010A: 28 06 JR Z,$112 ; 010C: CD 7F 01 CALL $017F ; 010F: C3 15 01 JP $0115 ; 0112: CD 69 01 CALL $0169 ; 0115: FB EI ; 0116: 00 NOP ; 0117: 00 NOP ; ; Process Entry Index 4 (see Index 1 above) 0118: F3 DI ; 0119: 3E 04 LD A,$04 ; 011B: 32 0E 30 LD ($300E),A ; 011E: 3A 07 30 LD A,($3007) ; 0121: B7 OR A ; 0122: 3A 06 30 LD A,($3006) ; 0125: 28 06 JR Z,$12D ; 0127: CD 7F 01 CALL $017F ; 012A: C3 30 01 JP $0130 ; 012D: CD 69 01 CALL $0169 ; 0130: FB EI ; 0131: 00 NOP ; 0132: 00 NOP ; ; Process Entry Index 5 (see Index 1 above) 0133: F3 DI ; 0134: 3E 05 LD A,$05 ; 0136: 32 0E 30 LD ($300E),A ; 0139: 3A 09 30 LD A,($3009) ; 013C: B7 OR A ; 013D: 3A 08 30 LD A,($3008) ; 0140: 28 06 JR Z,$148 ; 0142: CD 7F 01 CALL $017F ; 0145: C3 4B 01 JP $014B ; 0148: CD 69 01 CALL $0169 ; 014B: FB EI ; 014C: 00 NOP ; 014D: 00 NOP ; ; Process Entry Index 6 (see Index 1 above) 014E: F3 DI ; 014F: 3E 06 LD A,$06 ; 0151: 32 0E 30 LD ($300E),A ; 0154: 3A 0B 30 LD A,($300B) ; 0157: B7 OR A ; 0158: 3A 0A 30 LD A,($300A) ; 015B: 28 06 JR Z,$163 ; 015D: CD 7F 01 CALL $017F ; 0160: C3 BF 00 JP $00BF ; 0163: CD 69 01 CALL $0169 ; ; Commands return 0 if still playing or else to remove from buffer 0166: C3 BF 00 JP $00BF ; Continue main loop ; Initialize command and flag it initialized ; Vector to command. If return is 0, set second byte to 1. If return ; is not 0, remove the command from the buffer. 0169: 21 92 0A LD HL,$0A92 ; Jump table 016C: EF RST $28 ; Vector to address A in table HL 016D: B7 OR A ; Test return 016E: 20 17 JR NZ,$187 ; Remove the command 0170: 21 01 30 LD HL,$3001 ; Command buffer (2nd bytes) 0173: 3A 0E 30 LD A,($300E) ; Index of command 0176: 3D DEC A ; Convert to ... 0177: 87 ADD A,A ; ... pointer 0178: 5F LD E,A ; LSB 0179: 16 00 LD D,$00 ; MSB=0 017B: 19 ADD HL,DE ; Pointer to command 2nd byte 017C: 36 01 LD (HL),$01 ; Set second byte to 1 017E: C9 RET ; Done ; Continue processing a command ; Vector to command. If return is 0, leave buffer alone. If return ; is not 0, remove command from buffer. ; The vector table for "continues" does have an entry for "0" even ; though the initialization does (it clears the voice). I would have ; pointed the "continue" for command 0 at a return-zero for consistency. Then ; no special check would be needed here. 017F: B7 OR A ; If slot is empty ... 0180: C8 RET Z ; ... do nothing 0181: 21 D4 0A LD HL,$0AD4 ; Jump table 0184: EF RST $28 ; Vector to address A in table HL 0185: B7 OR A ; Test return 0186: C8 RET Z ; If zero -- out 0187: 21 00 30 LD HL,$3000 ; Command buffer 018A: 3A 0E 30 LD A,($300E) ; Index of command 018D: 3D DEC A ; Convert to ... 018E: 87 ADD A,A ; ... pointer 018F: 4F LD C,A ; LSB 0190: 06 00 LD B,$00 ; MSB=0 0192: 09 ADD HL,BC ; Pointer to command 0193: 70 LD (HL),B ; Clear command type 0194: 2C INC L ; Next byte 0195: 70 LD (HL),B ; Clear second byte 0196: C9 RET ; Done ;##Command00 ; Initialize Routine Vector 00 (Silence the channel) 0197: 0E 00 LD C,$00 ; Silence the voice ; Write to amplitude control of given voice 0199: 3A 0E 30 LD A,($300E) ; Get voice number 019C: FE 04 CP $04 ; Voice 4-6 019E: 30 05 JR NC,$1A5 ; Yes -- do chip 1 01A0: C6 07 ADD A,$07 ; Add 7 (8,9, or 10) 01A2: C3 18 00 JP $0018 ; Write C to reg A chip 0 01A5: C6 04 ADD A,$04 ; Add 4 (8,9, or 10) 01A7: C3 20 00 JP $0020 ; Write C to reg A chip 1 ; Write to tone registers for the specified voice. ; Write HL = value, voice (1-3 Chip0, 4-6 Chip1) 01AA: 3A 0E 30 LD A,($300E) ; Get register 01AD: FE 04 CP $04 ; Register 4-6 01AF: 30 0B JR NC,$1BC ; Yes ... next chip 01B1: 3D DEC A ; -1 01B2: 87 ADD A,A ; *2 01B3: 47 LD B,A ; Hold onto register 01B4: 4D LD C,L ; Value 01B5: DF RST $18 ; Write Chip 0 01B6: 78 LD A,B ; Restore register 01B7: 3C INC A ; Next 01B8: 4C LD C,H ; Value 01B9: C3 18 00 JP $0018 ; Write Chip 0 01BC: D6 04 SUB $04 ; Registers in chip 1 01BE: 87 ADD A,A ; ... 01BF: 47 LD B,A ; ... 01C0: 4D LD C,L ; ... 01C1: E7 RST $20 ; ... 01C2: 78 LD A,B ; ... 01C3: 3C INC A ; ... 01C4: 4C LD C,H ; ... 01C5: C3 20 00 JP $0020 ; Done ;##FilterCaps ; There are two capacitors that can be switched onto each audio channel ; to ground. The MSB bit set to one selects a 0.22 and the LSB bit set selects ; a 0.047 cap. Most effects just switch out the caps (writing 00), but the ; explosion effects switch in one or the other (never both). ; ; V1 1000xxxxAAxxxxxx ; V2 1000xxAAxxxxxxxx ; V3 1000AAxxxxxxxxxx ; V4 1000xxxxxxxxxxAA ; V5 1000xxxxxxxxAAxx ; V6 1000xxxxxxAAxxxx ; Reverse A bits 01C8: 01 FC FF LD BC,$FFFC ; 11111111 11111100 01CB: 21 00 00 LD HL,$0000 ; Clear HL 01CE: 1F RRA ; Bit 0 ... 01CF: CB 15 RL L ; ... into L 01D1: 1F RRA ; Bit 1 ... 01D2: CB 15 RL L ; ... into L ; Move bits and calculate mask ; V=1 HL*=64 BC=1111111100111111 ; 2 HL*=256 BC=1111110011111111 ; 3 HL*=1024 BC=1111001111111111 ; 4 HL*=1 BC=1111111111111100 ; 5 HL*=4 BC=1111111111110011 ; 6 HL*=16 BC=1111111111001111 01D4: 3A 0E 30 LD A,($300E) ; Voice number 01D7: C6 02 ADD A,$02 ; 2 bits in field 01D9: FE 06 CP $06 ; Split the field map 01DB: 38 04 JR C,$1E1 ; ... 01DD: D6 06 SUB $06 ; ... 01DF: 28 0A JR Z,$1EB ; ... 01E1: 87 ADD A,A ; = number of moves 01E2: 29 ADD HL,HL ; HL * 2 01E3: 37 SCF ; Set carry flag 01E4: CB 11 RL C ; Roll ... 01E6: CB 10 RL B ; ... the mask 01E8: 3D DEC A ; Position counter 01E9: 20 F7 JR NZ,$1E2 ; Complete the pattern ; CurrentValue = (CurrentValue & Mask) | HL 01EB: EB EX DE,HL ; HL->DE 01EC: 2A 0C 30 LD HL,($300C) ; Old value 01EF: 7D LD A,L ; LSB 01F0: A1 AND C ; Mask 01F1: B3 OR E ; OR in old value 01F2: 6F LD L,A ; New LSB 01F3: 7C LD A,H ; MSB 01F4: A0 AND B ; Mask 01F5: B2 OR D ; OR in old value 01F6: 67 LD H,A ; New MSB 01F7: 22 0C 30 LD ($300C),HL ; New configuration value ; Write to memory -- why? 01FA: 77 LD (HL),A ; Any write will do (using the ... 01FB: C9 RET ; ... address lines as data.) ;##MusicProcessing ; # ### MUSIC PROCESSING ####################################### ; ; Bytes are loaded from the music pointer. The upper three bits ; define the MSB delay and the lower five bits define a note ; offset from the base note pointer. If the lower five bits are ; all ones, a special command is executed instead and then ; processing continues. ; ; The MSB delay is a power of 2 (ie 128th,64th, ... quarter,half,whole). ; The Running LSB delay is the base counter for note delay. ; The Music Pointer points to the next byte in the song to process. ; The Base Note Table Pointer points to the start of an octave in ; the note table. Subsequent notes are relative to the base. ; The initial amplitude is the initial volume of the note. ; The running amplitude is the current volume level. The modifier is ; used to change the volume ever other MSB delay count. (The volume ; becomes fixed when silenced.) ; The LSB delay is the 128th-note-equals specification. This is used ; to reload the running count. ; The Amplitude Modification is the value added (or subtracted) to ; the amplitude each change. ; ; Music Descriptors ; ; 00 01 02 03 04 05 06 07 08 09 0A ; ; 00 - MSB Note Delay ; 01 - Running LSB Note delay (base delay) ; 02,03 - Music Pointer ; 04,05 - Note Table Base Pointer ; 06 Initial Amplitude ; 07 Running amplitude ; 08 LSB delay reload ; 09 Amplitude modification ; 0A -- not used ; ; # ########################################################### ; Process Music Descriptor ; Amplitude of a note is reduced at a rate of 0.5 the MSB delay. 01FC: DD 35 01 DEC (IX+$01) ; Decrement LSB of delay 01FF: C0 RET NZ ; Not time for new note -- out 0200: DD 7E 08 LD A,(IX+$08) ; Reload ... 0203: DD 77 01 LD (IX+$01),A ; ... LSB of delay 0206: DD 35 00 DEC (IX+$00) ; Decrement MSB of delay 0209: 28 15 JR Z,$220 ; Load next note 020B: DD CB 00 46 BIT 0,(IX+$00) ; Test bit 0 of MSB of delay 020F: C8 RET Z ; Not time to fool with volume 0210: DD 7E 09 LD A,(IX+$09) ; Get volume modifier 0213: B7 OR A ; Test it 0214: C8 RET Z ; No modification ... out 0215: DD 86 07 ADD A,(IX+$07) ; Modify current volume. 0218: F8 RET M ; Ignore it if it wrapped 0219: DD 77 07 LD (IX+$07),A ; New amplitude 021C: 4F LD C,A ; To C 021D: C3 99 01 JP $0199 ; Set amplitude and out ; Load next note 0220: DD 6E 02 LD L,(IX+$02) ; LSB of music pointer 0223: DD 66 03 LD H,(IX+$03) ; MSB of music pointer 0226: 7E LD A,(HL) ; Get next command 0227: 57 LD D,A ; Hang onto it 0228: E6 1F AND $1F ; Mask out note 022A: 28 24 JR Z,$250 ; Note 0? Just set delay 022C: FE 1F CP $1F ; Special command? 022E: 28 37 JR Z,$267 ; Yes ... process special command. 0230: CD 50 02 CALL $0250 ; Regular note -- set delay 0233: 7A LD A,D ; Get note 0234: E6 1F AND $1F ; Mask off upper 3 bits 0236: 3D DEC A ; -1 (0 is not a note) 0237: 07 RLCA ; *2 (2 bytes per note) 0238: 4F LD C,A ; Hold it 0239: DD 6E 04 LD L,(IX+$04) ; Base pointer into ... 023C: DD 66 05 LD H,(IX+$05) ; ... note table 023F: 09 ADD HL,BC ; B got set to 0 in the delay set! 0240: 5E LD E,(HL) ; Get tone ... 0241: 23 INC HL ; ... value ... 0242: 56 LD D,(HL) ; ... from table 0243: EB EX DE,HL ; To HL 0244: CD AA 01 CALL $01AA ; Write tone 0247: DD 4E 06 LD C,(IX+$06) ; Get amplitude 024A: DD 71 07 LD (IX+$07),C ; Initialize running amplitude 024D: C3 99 01 JP $0199 ; Set amplitude and out ; Convert next byte to power of 2 and store as delay MSB 0250: 23 INC HL ; Next byte in music 0251: DD 75 02 LD (IX+$02),L ; Update ... 0254: DD 74 03 LD (IX+$03),H ; ... music pointer 0257: 7A LD A,D ; Restore command 0258: E6 E0 AND $E0 ; Mask off lower 5 bits 025A: 07 RLCA ; Move upper three bits ... 025B: 07 RLCA ; ... 025C: 07 RLCA ; ... to lower bits. 025D: 47 LD B,A ; Save it 025E: 3E 80 LD A,$80 ; One bit 0260: 07 RLCA ; Set bit position ... 0261: 10 FD DJNZ $260 ; ... B 0263: DD 77 00 LD (IX+$00),A ; Store to MSB delay 0266: C9 RET ; Done ; Music byte xxx11111 ; Vector to function xxx and continue processing 0267: 7A LD A,D ; Restore command 0268: E6 E0 AND $E0 ; Mask off lower bits 026A: 07 RLCA ; Move upper ... 026B: 07 RLCA ; ... three bits ... 026C: 07 RLCA ; ... to low end 026D: 11 20 02 LD DE,$0220 ; Return to process ... 0270: D5 PUSH DE ; ... next command 0271: 23 INC HL ; Bump music pointer 0272: 5D LD E,L ; Hold ... 0273: 54 LD D,H ; ... pointer 0274: 23 INC HL ; Next 0275: DD 75 02 LD (IX+$02),L ; Save ... 0278: DD 74 03 LD (IX+$03),H ; ... music pointer 027B: 21 81 02 LD HL,$0281 ; Jump table 027E: C3 28 00 JP $0028 ; Do command and continue with next ; Music commands (DE contains pointer to 2nd byte) 0281: 91 02 ; Load base note table pointer from music 0283: A5 02 ; Load LSB delay from music 0285: B5 02 ; Load amplitude from music 0287: BA 02 ; Load amplitude modification from music 0289: C9 02 ; End sound command 028B: C9 02 ; End sound command 028D: BF 02 ; Jump to new music address 028F: C9 02 ; End sound command ; Music function 00 ; Load base note table pointer 0291: EB EX DE,HL ; Pointer to second byte 0292: 4E LD C,(HL) ; Get second byte 0293: CB 21 SLA C ; *2 0295: 06 00 LD B,$00 ; MSB = 0 0297: 21 CE 02 LD HL,$02CE ; Octave pointers 029A: 09 ADD HL,BC ; Offset into table 029B: 5E LD E,(HL) ; Get byte 029C: 23 INC HL ; Next 029D: 56 LD D,(HL) ; Get byte 029E: DD 73 04 LD (IX+$04),E ; Store ... 02A1: DD 72 05 LD (IX+$05),D ; ... tone pointer 02A4: C9 RET ; ; Music function 01 ; Load delay from table 02A5: EB EX DE,HL ; Second byte pointer 02A6: 4E LD C,(HL) ; Get second byte 02A7: 06 00 LD B,$00 ; MSB = 0 02A9: 21 66 03 LD HL,$0366 ; Data 02AC: 09 ADD HL,BC ; Point to entry 02AD: 7E LD A,(HL) ; Get data 02AE: DD 77 08 LD (IX+$08),A ; Delay 02B1: DD 77 01 LD (IX+$01),A ; Delay 02B4: C9 RET ; Done ; Music function 02 ; Load amplitude 02B5: 1A LD A,(DE) ; Get second byte 02B6: DD 77 06 LD (IX+$06),A ; Store it to amplitude 02B9: C9 RET ; Done ; Music function 03 ; Set 09 Amplitude modification 02BA: 1A LD A,(DE) ; Get second byte 02BB: DD 77 09 LD (IX+$09),A ; Store it to ? 02BE: C9 RET ; Done ; Music function 06 ; Jump to new music address 02BF: 1A LD A,(DE) ; Get second byte 02C0: DD 77 02 LD (IX+$02),A ; Set ... 02C3: 13 INC DE ; ... 02C4: 1A LD A,(DE) ; ... 02C5: DD 77 03 LD (IX+$03),A ; ... new pointer 02C8: C9 RET ; Done ; Music function 04, 05, 07 ; End this music command 02C9: E1 POP HL ; Clear for return ... 02CA: E1 POP HL ; ... from music routine 02CB: 3E FF LD A,$FF ; Flag end of processing 02CD: C9 RET ; Done ;Octave offsets into note table 02CE: EE 02 02D0: F2 02 02D2: F6 02 02D4: FA 02 02D6: FE 02 02D8: 02 03 02DA: 06 03 02DC: 0A 03 02DE: 0E 03 02E0: 12 03 02E2: 16 03 02E4: 1A 03 02E6: 1E 03 02E8: 22 03 02EA: 26 03 02EC: 2A 03 ; Note Table -- tones for notes on the chromatic scale 02EE: FF 0F ; Lowest possible note 02F0: F2 07 02F2: 80 07 02F4: 14 07 02F6: AE 06 02F8: 4E 06 02FA: F3 05 02FC: 9E 05 02FE: 4E 05 0300: 01 05 0302: B9 04 0304: 76 04 0306: 36 04 0308: F9 03 030A: C0 03 030C: 8A 03 030E: 57 03 0310: 27 03 0312: FA 02 0314: CF 02 0316: A7 02 0318: 81 02 031A: 5D 02 031C: 3B 02 031E: 1B 02 0320: FD 01 0322: E0 01 0324: C5 01 0326: AC 01 0328: 94 01 032A: 7D 01 032C: 68 01 032E: 53 01 0330: 40 01 0332: 2E 01 0334: 1D 01 0336: 0D 01 0338: FE 00 033A: F0 00 033C: E3 00 033E: D6 00 0340: CA 00 0342: BE 00 0344: B4 00 0346: AA 00 0348: A0 00 034A: 97 00 034C: 8F 00 034E: 87 00 0350: 7F 00 0352: 78 00 0354: 71 00 0356: 6B 00 0358: 65 00 035A: 5F 00 035C: 5A 00 035E: 55 00 0360: 50 00 0362: 4C 00 0364: 07 00 ; Really high ; Delay table (bytes) 0366: 3C 0367: 38 34 0369: 30 2C 036B: 28 24 036D: 20 1E 036F: 1C 0370: 1A 0371: 18 16 0373: 14 0374: 12 0375: 10 0F 0377: 0E 0D 0379: 0C 037A: 0B 037B: 0A 037C: 09 037D: 08 ; Initialize descriptors for a specified song number 037E: 21 B5 03 LD HL,$03B5 ; Initialization data 0381: 11 0F 30 LD DE,$300F ; First music descriptor 0384: 01 32 00 LD BC,$0032 ; 10*5 = 50 bytes 0387: ED B0 LDIR ; Initialize the data 0389: 87 ADD A,A ; *2 038A: 4F LD C,A ; Hold 038B: 87 ADD A,A ; *4 038C: 87 ADD A,A ; *8 038D: 81 ADD A,C ; *10 038E: 4F LD C,A ; Hold it 038F: 06 00 LD B,$00 ; MSB = 0 0391: 21 6E 0B LD HL,$0B6E ; Data region 0394: 09 ADD HL,BC ; Point to song 0395: 11 11 30 LD DE,$3011 ; Music pointer descriptor 1 0398: ED A0 LDI ; Set ... 039A: ED A0 LDI ; ... pointer 039C: 1E 1B LD E,$1B ; Music pointer descriptor 2 039E: ED A0 LDI ; Set ... 03A0: ED A0 LDI ; ... pointer 03A2: 1E 25 LD E,$25 ; Music pointer descriptor 3 03A4: ED A0 LDI ; Set ... 03A6: ED A0 LDI ; ... pointer 03A8: 1E 2F LD E,$2F ; Music pointer descriptor 4 03AA: ED A0 LDI ; Set ... 03AC: ED A0 LDI ; ... pointer 03AE: 1E 39 LD E,$39 ; Music pointer descriptor 5 03B0: ED A0 LDI ; Set ... 03B2: ED A0 LDI ; ... pointer 03B4: C9 RET ; Done ; Initialization data for music descriptors (10 bytes each) 03B5: 01 01 00 00 00 00 00 00 00 FF 03BF: 01 01 00 00 00 00 00 00 00 FF 03C9: 01 01 00 00 00 00 00 00 00 FF 03D3: 01 01 00 00 00 00 00 00 00 FF 03DD: 01 01 00 00 00 00 00 00 00 FF ; The sounds produced by this code were discovered by modifying ; the game code ROM to play a single sound and go into an infinite ; loop. The modified code was run through the MAME emulator. ;##Command01 ; Initialize Routine Vector 01 (Coin Drop) 03E7: AF XOR A ; 03E8: CD C8 01 CALL $01C8 ; 03EB: 21 6B 00 LD HL,$006B ; Fine=6B, Coars=00 03EE: CD AA 01 CALL $01AA ; Write to tone registers 03F1: 21 41 30 LD HL,$3041 ; 03F4: 36 00 LD (HL),$00 ; 03F6: 2C INC L ; 03F7: 36 47 LD (HL),$47 ; 03F9: 2C INC L ; 03FA: 0E 09 LD C,$09 ; Amplitude 03FC: 71 LD (HL),C ; 03FD: CD 99 01 CALL $0199 ; Set amplitude 0400: AF XOR A ; Return 0 0401: C9 RET ; Done ; Continue Sound Routine Vector 01 (Coin Drop) 0402: 21 41 30 LD HL,$3041 ; 0405: 35 DEC (HL) ; 0406: 7E LD A,(HL) ; 0407: E6 03 AND $03 ; 0409: 20 18 JR NZ,$423 ; 040B: 2C INC L ; 040C: 35 DEC (HL) ; 040D: 7E LD A,(HL) ; 040E: 28 1D JR Z,$42D ; Return 1 0410: E6 07 AND $07 ; 0412: 28 11 JR Z,$425 ; 0414: E6 03 AND $03 ; 0416: 3D DEC A ; 0417: 4F LD C,A ; 0418: 06 00 LD B,$00 ; 041A: 21 2F 04 LD HL,$042F ; 041D: 09 ADD HL,BC ; 041E: 6E LD L,(HL) ; 041F: 60 LD H,B ; 0420: CD AA 01 CALL $01AA ; Write tone registers 0423: AF XOR A ; Return 0 0424: C9 RET ; Out 0425: 2C INC L ; 0426: 35 DEC (HL) ; 0427: 4E LD C,(HL) ; 0428: CD 99 01 CALL $0199 ; Set amplitude 042B: AF XOR A ; Return 0 042C: C9 RET ; Out 042D: 3D DEC A ; Zero becomes FF 042E: C9 RET ; Done 042F: 47 LD B,A ; 0430: 55 LD D,L ; 0431: 6B LD L,E ; ;##Command02 ; Initialization Vector Routine 02 (Plane Fire) 0432: AF XOR A ; A=0 0433: CD C8 01 CALL $01C8 ; No filter caps on channel 0436: 0E 0A LD C,$0A ; Set volume ... 0438: CD 99 01 CALL $0199 ; ... to 10 043B: 3E 80 LD A,$80 ; Loop count ... 043D: 32 44 30 LD ($3044),A ; ... is 128 0440: 21 04 00 LD HL,$0004 ; Initial frequency ... 0443: 22 45 30 LD ($3045),HL ; ... is 4 0446: CD AA 01 CALL $01AA ; Write tone (HL=tone) 0449: AF XOR A ; Return a 0 (continue) 044A: C9 RET ; ; Continue Sound Routine Vector 02 (Plane Fire) 044B: 21 44 30 LD HL,$3044 ; Decrement ... 044E: 35 DEC (HL) ; ... counter 044F: 7E LD A,(HL) ; Stop if ... 0450: 28 0E JR Z,$460 ; ... done 0452: FE 6D CP $6D ; At loop value 6D ... 0454: 28 EA JR Z,$440 ; ... reset frequency to 4 0456: 2A 45 30 LD HL,($3045) ; Current tone value 0459: 01 18 00 LD BC,$0018 ; Add ... 045C: 09 ADD HL,BC ; ... 18 to frequency 045D: C3 43 04 JP $0443 ; Store and play tone 0460: 3D DEC A ; Return ... 0461: C9 RET ; ... -1 (finished) ;##Command03 ; Initialization Routine Vector 03 (1910 Bomb) 0462: AF XOR A ; No filter ... 0463: CD C8 01 CALL $01C8 ; ... caps on channel 0466: 21 C0 00 LD HL,$00C0 ; Inital ... 0469: 22 47 30 LD ($3047),HL ; ... tone 046C: CD AA 01 CALL $01AA ; Write tone 046F: 0E 09 LD C,$09 ; Set ... 0471: CD 99 01 CALL $0199 ; ... volume 0474: AF XOR A ; Set ... 0475: 21 49 30 LD HL,$3049 ; ... 3049 = 0 ... 0478: 77 LD (HL),A ; ... 0479: C9 RET ; ; Continue Sound Routine Vector 03 (1910 Bomb) 047A: 21 49 30 LD HL,$3049 ; Decrement ... 047D: 35 DEC (HL) ; ... counter 047E: 7E LD A,(HL) ; Do nothing ... 047F: E6 07 AND $07 ; ... until MSB ... 0481: 20 12 JR NZ,$495 ; ... is 0 0483: 2A 47 30 LD HL,($3047) ; Add ... 0486: 01 40 00 LD BC,$0040 ; ... 40 ... 0489: 09 ADD HL,BC ; ... to tone 048A: 7C LD A,H ; When MSB is ... 048B: FE 0C CP $0C ; ... 0C ... 048D: 28 08 JR Z,$497 ; ... the effect is done 048F: 22 47 30 LD ($3047),HL ; Store new tone 0492: CD AA 01 CALL $01AA ; Write tone 0495: AF XOR A ; Continue 0496: C9 RET ; 0497: 3E FF LD A,$FF ; Done 0499: C9 RET ; ;##Command04 ; Initialization Routine Vector 04 (Missile Launch) 049A: 3E 01 LD A,$01 ; 049C: CD C8 01 CALL $01C8 ; 049F: 21 4A 30 LD HL,$304A ; 04A2: 36 00 LD (HL),$00 ; 04A4: 2C INC L ; 04A5: 0E 0F LD C,$0F ; 04A7: 71 LD (HL),C ; 04A8: CD 99 01 CALL $0199 ; Set volume 04AB: 21 60 00 LD HL,$0060 ; 04AE: 22 4C 30 LD ($304C),HL ; 04B1: AF XOR A ; 04B2: C9 RET ; ; Continue Sound Routine Vector 04 (Missile Launch) 04B3: 21 4A 30 LD HL,$304A ; 04B6: 35 DEC (HL) ; 04B7: 7E LD A,(HL) ; 04B8: E6 0F AND $0F ; 04BA: 28 16 JR Z,$4D2 ; 04BC: 2A 4C 30 LD HL,($304C) ; 04BF: FE 0C CP $0C ; 04C1: 01 10 00 LD BC,$0010 ; 04C4: 30 03 JR NC,$4C9 ; 04C6: 01 D0 FF LD BC,$FFD0 ; 04C9: 09 ADD HL,BC ; 04CA: 22 4C 30 LD ($304C),HL ; 04CD: CD AA 01 CALL $01AA ; Write tone 04D0: AF XOR A ; 04D1: C9 RET ; 04D2: 2C INC L ; 04D3: 35 DEC (HL) ; 04D4: 4E LD C,(HL) ; 04D5: 20 D1 JR NZ,$4A8 ; 04D7: 3D DEC A ; 04D8: C9 RET ; ;##Command05 ; Initialization Routine Vector 05 (Missile - continuous) 04D9: AF XOR A ; 04DA: CD C8 01 CALL $01C8 ; 04DD: 21 4E 30 LD HL,$304E ; 04E0: 36 B0 LD (HL),$B0 ; 04E2: 2C INC L ; 04E3: 36 0D LD (HL),$0D ; 04E5: 35 DEC (HL) ; 04E6: 4E LD C,(HL) ; 04E7: CD 99 01 CALL $0199 ; Set volume 04EA: 2C INC L ; 04EB: 36 20 LD (HL),$20 ; 04ED: 6E LD L,(HL) ; 04EE: 26 00 LD H,$00 ; 04F0: CD AA 01 CALL $01AA ; Write tone 04F3: AF XOR A ; 04F4: C9 RET ; ; Continue Sound Routine Vector 05 (Missile - continuous) 04F5: 21 4E 30 LD HL,$304E ; 04F8: 35 DEC (HL) ; 04F9: 7E LD A,(HL) ; 04FA: 28 0C JR Z,$508 ; 04FC: 2C INC L ; 04FD: E6 0F AND $0F ; 04FF: 28 E4 JR Z,$4E5 ; 0501: 2C INC L ; 0502: 34 INC (HL) ; 0503: C3 ED 04 JP $04ED ; 0506: AF XOR A ; 0507: C9 RET ; 0508: 3D DEC A ; 0509: C9 RET ; ;##Command06 ; Initialization Routine Vector 06 (UFO shot) 050A: AF XOR A ; 050B: CD C8 01 CALL $01C8 ; 050E: 21 50 00 LD HL,$0050 ; 0511: CD AA 01 CALL $01AA ; Write tone 0514: 21 51 30 LD HL,$3051 ; 0517: 36 40 LD (HL),$40 ; 0519: 2C INC L ; 051A: 0E 05 LD C,$05 ; 051C: 71 LD (HL),C ; 051D: CD 99 01 CALL $0199 ; Set volume 0520: 2C INC L ; 0521: 36 17 LD (HL),$17 ; 0523: 2C INC L ; 0524: 36 50 LD (HL),$50 ; 0526: AF XOR A ; 0527: C9 RET ; ; Continue Sound Routine Vector 06 (UFO shot) 0528: 21 51 30 LD HL,$3051 ; 052B: 35 DEC (HL) ; 052C: 28 E9 JR Z,$517 ; 052E: 7E LD A,(HL) ; 052F: 2C INC L ; 0530: E6 0F AND $0F ; 0532: 20 05 JR NZ,$539 ; 0534: 34 INC (HL) ; 0535: 4E LD C,(HL) ; 0536: CD 99 01 CALL $0199 ; Set volume 0539: 2C INC L ; 053A: 7E LD A,(HL) ; 053B: C6 29 ADD A,$29 ; 053D: 77 LD (HL),A ; 053E: 2C INC L ; 053F: AE XOR (HL) ; 0540: E6 3F AND $3F ; 0542: C6 50 ADD A,$50 ; 0544: 77 LD (HL),A ; 0545: 6F LD L,A ; 0546: 26 00 LD H,$00 ; 0548: CD AA 01 CALL $01AA ; Write tone 054B: AF XOR A ; 054C: C9 RET ; ;##Command07 ; Initialization Routine Vector 07 (User Fire) 054D: AF XOR A ; 054E: CD C8 01 CALL $01C8 ; 0551: 21 56 30 LD HL,$3056 ; 0554: 36 08 LD (HL),$08 ; 0556: 2D DEC L ; 0557: 36 2C LD (HL),$2C ; 0559: 2C INC L ; 055A: 35 DEC (HL) ; 055B: 28 29 JR Z,$586 ; 055D: 4E LD C,(HL) ; 055E: CD 99 01 CALL $0199 ; Set volume 0561: 21 00 00 LD HL,$0000 ; 0564: 22 57 30 LD ($3057),HL ; 0567: CD AA 01 CALL $01AA ; Write tone 056A: AF XOR A ; 056B: C9 RET ; ; Continue Sound Routine Vector 07 (User Fire) 056C: 21 55 30 LD HL,$3055 ; 056F: 35 DEC (HL) ; 0570: 7E LD A,(HL) ; 0571: 28 E4 JR Z,$557 ; 0573: FE 16 CP $16 ; 0575: 28 EA JR Z,$561 ; 0577: 2A 57 30 LD HL,($3057) ; 057A: 01 10 00 LD BC,$0010 ; 057D: 09 ADD HL,BC ; 057E: 22 57 30 LD ($3057),HL ; 0581: CD AA 01 CALL $01AA ; Write tone 0584: AF XOR A ; 0585: C9 RET ; 0586: 3D DEC A ; 0587: C9 RET ; ;##Command08 ; Initialization Routine Vector 08 (Enemy Explosion Component - thud) 0588: 3E 01 LD A,$01 ; 058A: CD C8 01 CALL $01C8 ; 058D: 21 5C 30 LD HL,$305C ; 0590: 36 0C LD (HL),$0C ; 0592: 4E LD C,(HL) ; 0593: CD 99 01 CALL $0199 ; Set volume 0596: 2D DEC L ; 0597: 36 00 LD (HL),$00 ; 0599: 21 80 00 LD HL,$0080 ; 059C: 22 59 30 LD ($3059),HL ; 059F: CD AA 01 CALL $01AA ; Write tone 05A2: AF XOR A ; 05A3: C9 RET ; ; Continue Sound Routine Vector 08 (Enemy Explosion Component - thud) 05A4: 21 5B 30 LD HL,$305B ; 05A7: 34 INC (HL) ; 05A8: 7E LD A,(HL) ; 05A9: FE 59 CP $59 ; 05AB: 28 0F JR Z,$5BC ; 05AD: 4F LD C,A ; 05AE: 06 00 LD B,$00 ; 05B0: 2A 59 30 LD HL,($3059) ; 05B3: 09 ADD HL,BC ; 05B4: 22 59 30 LD ($3059),HL ; 05B7: CD AA 01 CALL $01AA ; Write tone 05BA: AF XOR A ; 05BB: C9 RET ; 05BC: 2C INC L ; 05BD: 7E LD A,(HL) ; 05BE: D6 04 SUB $04 ; 05C0: 28 04 JR Z,$5C6 ; 05C2: 77 LD (HL),A ; 05C3: C3 92 05 JP $0592 ; 05C6: 3D DEC A ; 05C7: C9 RET ; ;##Command09 ; Initialization Routine Vector 09 (Enemy Explosion Component white-noise) 05C8: 3E 01 LD A,$01 ; 05CA: CD C8 01 CALL $01C8 ; 05CD: 21 5D 30 LD HL,$305D ; 05D0: 36 00 LD (HL),$00 ; 05D2: 2C INC L ; 05D3: 36 E0 LD (HL),$E0 ; 05D5: 2C INC L ; 05D6: 0E 0D LD C,$0D ; 05D8: 71 LD (HL),C ; 05D9: CD 99 01 CALL $0199 ; Set volume 05DC: 2C INC L ; 05DD: 36 93 LD (HL),$93 ; 05DF: 2C INC L ; 05E0: 36 D5 LD (HL),$D5 ; 05E2: 21 C0 00 LD HL,$00C0 ; 05E5: CD AA 01 CALL $01AA ; Write tone 05E8: AF XOR A ; 05E9: C9 RET ; ; Continue Sound Routine Vector 09 (Enemy Explosion Component white-noise) 05EA: 21 5D 30 LD HL,$305D ; 05ED: 35 DEC (HL) ; 05EE: CB 46 BIT 0,(HL) ; 05F0: 20 25 JR NZ,$617 ; 05F2: 2C INC L ; 05F3: 35 DEC (HL) ; 05F4: 7E LD A,(HL) ; 05F5: 28 22 JR Z,$619 ; 05F7: FE D0 CP $D0 ; 05F9: 28 DA JR Z,$5D5 ; 05FB: 2C INC L ; 05FC: E6 0F AND $0F ; 05FE: 20 05 JR NZ,$605 ; 0600: 35 DEC (HL) ; 0601: 4E LD C,(HL) ; 0602: CD 99 01 CALL $0199 ; Set volume 0605: 2C INC L ; 0606: 7E LD A,(HL) ; 0607: C6 53 ADD A,$53 ; 0609: 77 LD (HL),A ; 060A: 2C INC L ; 060B: AE XOR (HL) ; 060C: 77 LD (HL),A ; 060D: 6F LD L,A ; 060E: FE E0 CP $E0 ; 0610: 38 01 JR C,$613 ; 0612: AF XOR A ; 0613: 67 LD H,A ; 0614: CD AA 01 CALL $01AA ; Write tone 0617: AF XOR A ; 0618: C9 RET ; 0619: 3D DEC A ; 061A: C9 RET ; ;##Command0A ; Initialization Routine Vector 0A (Traker or Bomb Explosion) 061B: AF XOR A ; 061C: CD C8 01 CALL $01C8 ; 061F: 21 62 30 LD HL,$3062 ; 0622: 36 00 LD (HL),$00 ; 0624: 2C INC L ; 0625: 36 C0 LD (HL),$C0 ; 0627: 2C INC L ; 0628: 36 0D LD (HL),$0D ; 062A: 35 DEC (HL) ; 062B: 4E LD C,(HL) ; 062C: CD 99 01 CALL $0199 ; Set volume 062F: 21 20 00 LD HL,$0020 ; 0632: 22 65 30 LD ($3065),HL ; 0635: CD AA 01 CALL $01AA ; Write tone 0638: AF XOR A ; 0639: C9 RET ; ; Continue Sound Routine Vector 0A (Traker or Bomb Explosion) 063A: 21 62 30 LD HL,$3062 ; 063D: 35 DEC (HL) ; 063E: 7E LD A,(HL) ; 063F: E6 01 AND $01 ; 0641: 20 17 JR NZ,$65A ; 0643: 2C INC L ; 0644: 35 DEC (HL) ; 0645: 7E LD A,(HL) ; 0646: 28 14 JR Z,$65C ; 0648: 2C INC L ; 0649: E6 0F AND $0F ; 064B: 28 DD JR Z,$62A ; 064D: 2A 65 30 LD HL,($3065) ; 0650: 01 40 00 LD BC,$0040 ; 0653: 09 ADD HL,BC ; 0654: 22 65 30 LD ($3065),HL ; 0657: CD AA 01 CALL $01AA ; Write tone 065A: AF XOR A ; 065B: C9 RET ; 065C: 3D DEC A ; 065D: C9 RET ; ;##Command0B ; Initialization Routine Vector 0B (Squad appears) 065E: AF XOR A ; No filter ... 065F: CD C8 01 CALL $01C8 ; ... caps on channel 0662: 0E 0C LD C,$0C ; Set ... 0664: CD 99 01 CALL $0199 ; ... volume 0667: 21 67 30 LD HL,$3067 ; Set ... 066A: 36 B8 LD (HL),$B8 ; ... 3067 = B8 066C: 2C INC L ; Set ... 066D: 36 1F LD (HL),$1F ; ... 3068 = 1F 066F: 21 1F 00 LD HL,$001F ; Initial tone 0672: CD AA 01 CALL $01AA ; Write tone 0675: AF XOR A ; Continue 0676: C9 RET ; ; Continue Sound Routine Vector 0B (Squad appears) 0677: 21 67 30 LD HL,$3067 ; (3067) = (3067) - 1 067A: 35 DEC (HL) ; ... 067B: 7E LD A,(HL) ; End when MSB ... 067C: 28 15 JR Z,$693 ; ... is 0 067E: FE 60 CP $60 ; 0680: 28 EA JR Z,$66C ; 0682: E6 03 AND $03 ; 0684: 20 0B JR NZ,$691 ; 0686: 2C INC L ; 0687: 7E LD A,(HL) ; 0688: C6 20 ADD A,$20 ; 068A: 77 LD (HL),A ; 068B: 6F LD L,A ; 068C: 26 00 LD H,$00 ; 068E: CD AA 01 CALL $01AA ; Write tone 0691: AF XOR A ; 0692: C9 RET ; 0693: 3D DEC A ; 0694: C9 RET ; ;##Command0C ; Initialization Routine Vector 0C (1st boss - blimp) 0695: 3E 01 LD A,$01 ; 0697: CD C8 01 CALL $01C8 ; 069A: 21 C0 00 LD HL,$00C0 ; 069D: CD AA 01 CALL $01AA ; Write tone 06A0: 0E 0F LD C,$0F ; 06A2: CD 99 01 CALL $0199 ; Set volume 06A5: AF XOR A ; 06A6: 21 69 30 LD HL,$3069 ; 06A9: 77 LD (HL),A ; 06AA: 2C INC L ; 06AB: 36 53 LD (HL),$53 ; 06AD: 2C INC L ; 06AE: 36 09 LD (HL),$09 ; 06B0: 2C INC L ; 06B1: 36 37 LD (HL),$37 ; 06B3: C9 RET ; ; Continue Sound Routine Vector 0C (1st boss - blimp) 06B4: 21 69 30 LD HL,$3069 ; 06B7: 35 DEC (HL) ; 06B8: 56 LD D,(HL) ; 06B9: 2C INC L ; 06BA: 7E LD A,(HL) ; 06BB: C6 D5 ADD A,$D5 ; 06BD: 77 LD (HL),A ; 06BE: 2C INC L ; 06BF: CB 42 BIT 0,D ; 06C1: 20 09 JR NZ,$6CC ; 06C3: AE XOR (HL) ; 06C4: 77 LD (HL),A ; 06C5: E6 EF AND $EF ; 06C7: 4F LD C,A ; 06C8: CD 99 01 CALL $0199 ; Set volume 06CB: 79 LD A,C ; 06CC: 2C INC L ; 06CD: AE XOR (HL) ; 06CE: 77 LD (HL),A ; 06CF: F6 80 OR $80 ; 06D1: 6F LD L,A ; 06D2: 26 00 LD H,$00 ; 06D4: CD AA 01 CALL $01AA ; Write tone 06D7: AF XOR A ; 06D8: C9 RET ; ;##Command0D ; Initialization Routine Vector 0D (2nd boss - jet) 06D9: 3E 01 LD A,$01 ; 06DB: CD C8 01 CALL $01C8 ; 06DE: 21 6D 30 LD HL,$306D ; 06E1: 36 28 LD (HL),$28 ; 06E3: 2C INC L ; 06E4: 36 05 LD (HL),$05 ; 06E6: 2C INC L ; 06E7: 36 30 LD (HL),$30 ; 06E9: 21 00 06 LD HL,$0600 ; 06EC: CD AA 01 CALL $01AA ; Write tone 06EF: 0E 08 LD C,$08 ; 06F1: CD 99 01 CALL $0199 ; Set volume 06F4: AF XOR A ; 06F5: C9 RET ; ; Continue Sound Routine Vector 0D (2nd boss - jet) 06F6: 21 6D 30 LD HL,$306D ; 06F9: 35 DEC (HL) ; 06FA: 28 E5 JR Z,$6E1 ; 06FC: 7E LD A,(HL) ; 06FD: E6 07 AND $07 ; 06FF: C6 08 ADD A,$08 ; 0701: 4F LD C,A ; 0702: CD 99 01 CALL $0199 ; Set volume 0705: 2C INC L ; 0706: 7E LD A,(HL) ; 0707: C6 B9 ADD A,$B9 ; 0709: 77 LD (HL),A ; 070A: 2C INC L ; 070B: AE XOR (HL) ; 070C: 77 LD (HL),A ; 070D: 6F LD L,A ; 070E: 26 06 LD H,$06 ; 0710: CD AA 01 CALL $01AA ; Write tone 0713: AF XOR A ; 0714: C9 RET ; ;##Command0E ; Initialization Routine Vector 0E (3rd boss - helicopter) 0715: 3E 01 LD A,$01 ; 0717: CD C8 01 CALL $01C8 ; 071A: 21 00 01 LD HL,$0100 ; 071D: CD AA 01 CALL $01AA ; Write tone 0720: 21 70 30 LD HL,$3070 ; 0723: 36 00 LD (HL),$00 ; 0725: 2C INC L ; 0726: 0E 0F LD C,$0F ; 0728: 71 LD (HL),C ; 0729: CD 99 01 CALL $0199 ; Set volume 072C: AF XOR A ; 072D: 2C INC L ; 072E: 77 LD (HL),A ; 072F: 2C INC L ; 0730: 77 LD (HL),A ; 0731: C9 RET ; ; Continue Sound Routine Vector 0E (3rd boss - helicopter) 0732: 21 70 30 LD HL,$3070 ; 0735: 35 DEC (HL) ; 0736: 7E LD A,(HL) ; 0737: CB 47 BIT 0,A ; 0739: 23 INC HL ; 073A: 20 0B JR NZ,$747 ; 073C: 35 DEC (HL) ; 073D: E6 10 AND $10 ; 073F: 20 02 JR NZ,$743 ; 0741: 34 INC (HL) ; 0742: 34 INC (HL) ; 0743: 4E LD C,(HL) ; 0744: CD 99 01 CALL $0199 ; Set volume 0747: 2C INC L ; 0748: 7E LD A,(HL) ; 0749: C6 D3 ADD A,$D3 ; 074B: 77 LD (HL),A ; 074C: 2C INC L ; 074D: AE XOR (HL) ; 074E: 77 LD (HL),A ; 074F: E6 7F AND $7F ; 0751: C6 A8 ADD A,$A8 ; 0753: 6F LD L,A ; 0754: E6 07 AND $07 ; 0756: 67 LD H,A ; 0757: CD AA 01 CALL $01AA ; Write tone 075A: AF XOR A ; 075B: C9 RET ; ;##Command0F ; Initialization Routine Vector 0F (4th boss - super jet) 075C: 3E 01 LD A,$01 ; 075E: CD C8 01 CALL $01C8 ; 0761: 21 00 01 LD HL,$0100 ; 0764: CD AA 01 CALL $01AA ; Write tone 0767: 0E 0C LD C,$0C ; 0769: CD 99 01 CALL $0199 ; Set volume 076C: AF XOR A ; 076D: 21 74 30 LD HL,$3074 ; 0770: 77 LD (HL),A ; 0771: 2C INC L ; 0772: 77 LD (HL),A ; 0773: C9 RET ; ; Continue Sound Routine Vector 0F (4th boss - super jet) 0774: 21 74 30 LD HL,$3074 ; 0777: 7E LD A,(HL) ; 0778: C6 97 ADD A,$97 ; 077A: 77 LD (HL),A ; 077B: 2C INC L ; 077C: AE XOR (HL) ; 077D: 77 LD (HL),A ; 077E: E6 7F AND $7F ; 0780: C6 C0 ADD A,$C0 ; 0782: 6F LD L,A ; 0783: 26 01 LD H,$01 ; 0785: CD AA 01 CALL $01AA ; Write tone 0788: AF XOR A ; 0789: C9 RET ; ;##Command10 ; Initialization Routine Vector 10 (5th boss - mother ship) 078A: 3E 01 LD A,$01 ; 078C: CD C8 01 CALL $01C8 ; 078F: 0E 0A LD C,$0A ; 0791: CD 99 01 CALL $0199 ; Set volume 0794: 21 76 30 LD HL,$3076 ; 0797: 36 30 LD (HL),$30 ; 0799: 2C INC L ; 079A: 36 02 LD (HL),$02 ; 079C: 2C INC L ; 079D: 3E E0 LD A,$E0 ; 079F: 77 LD (HL),A ; 07A0: 2C INC L ; 07A1: 77 LD (HL),A ; 07A2: 6F LD L,A ; 07A3: 26 00 LD H,$00 ; 07A5: CD AA 01 CALL $01AA ; Write tone 07A8: AF XOR A ; 07A9: C9 RET ; ; Continue Sound Routine Vector 10 (5th boss - mother ship) 07AA: 21 76 30 LD HL,$3076 ; 07AD: 35 DEC (HL) ; 07AE: 7E LD A,(HL) ; 07AF: 28 E6 JR Z,$797 ; 07B1: 2C INC L ; 07B2: E6 0F AND $0F ; 07B4: 28 07 JR Z,$7BD ; 07B6: 7E LD A,(HL) ; 07B7: 2C INC L ; 07B8: 2C INC L ; 07B9: 86 ADD A,(HL) ; 07BA: C3 A1 07 JP $07A1 ; 07BD: 34 INC (HL) ; 07BE: 34 INC (HL) ; 07BF: 2C INC L ; 07C0: 7E LD A,(HL) ; 07C1: D6 20 SUB $20 ; 07C3: C3 9F 07 JP $079F ; ;##Command11 ; Initialization Routine Vector 11 (User Explosion Component) 07C6: 3E 01 LD A,$01 ; 07C8: CD C8 01 CALL $01C8 ; 07CB: 21 00 00 LD HL,$0000 ; 07CE: CD AA 01 CALL $01AA ; Write tone 07D1: 21 7A 30 LD HL,$307A ; 07D4: 36 00 LD (HL),$00 ; 07D6: 2C INC L ; 07D7: 0E 0F LD C,$0F ; 07D9: 71 LD (HL),C ; 07DA: CD 99 01 CALL $0199 ; Set volume 07DD: 2C INC L ; 07DE: 36 45 LD (HL),$45 ; 07E0: 2C INC L ; 07E1: 36 99 LD (HL),$99 ; 07E3: AF XOR A ; 07E4: C9 RET ; ; Continue Sound Routine Vector 11 (User Explosion Component) 07E5: 21 7A 30 LD HL,$307A ; 07E8: 35 DEC (HL) ; 07E9: 7E LD A,(HL) ; 07EA: CB 47 BIT 0,A ; 07EC: 20 19 JR NZ,$807 ; 07EE: 2C INC L ; 07EF: E6 3F AND $3F ; 07F1: 20 07 JR NZ,$7FA ; 07F3: 35 DEC (HL) ; 07F4: 28 13 JR Z,$809 ; 07F6: 4E LD C,(HL) ; 07F7: CD 99 01 CALL $0199 ; Set volume 07FA: 2C INC L ; 07FB: 7E LD A,(HL) ; 07FC: C6 D3 ADD A,$D3 ; 07FE: 77 LD (HL),A ; 07FF: 2C INC L ; 0800: AE XOR (HL) ; 0801: 77 LD (HL),A ; 0802: 6F LD L,A ; 0803: 67 LD H,A ; 0804: CD AA 01 CALL $01AA ; Write tone 0807: AF XOR A ; 0808: C9 RET ; 0809: 3D DEC A ; 080A: C9 RET ; ;##Command12 ; Initialization Routine Vector 12 (User Explosion Component) 080B: 3E 01 LD A,$01 ; 080D: CD C8 01 CALL $01C8 ; 0810: 21 00 00 LD HL,$0000 ; 0813: 22 81 30 LD ($3081),HL ; 0816: CD AA 01 CALL $01AA ; Write tone 0819: 21 7E 30 LD HL,$307E ; 081C: 36 00 LD (HL),$00 ; 081E: 2C INC L ; 081F: 0E 0F LD C,$0F ; 0821: 71 LD (HL),C ; 0822: CD 99 01 CALL $0199 ; Set volume 0825: 2C INC L ; 0826: AF XOR A ; 0827: 77 LD (HL),A ; 0828: C9 RET ; ; Continue Sound Routine Vector 12 (User Explosion Component) 0829: 21 7E 30 LD HL,$307E ; 082C: 35 DEC (HL) ; 082D: 7E LD A,(HL) ; 082E: 57 LD D,A ; 082F: 2C INC L ; 0830: E6 1F AND $1F ; 0832: 20 07 JR NZ,$83B ; 0834: 35 DEC (HL) ; 0835: 28 1E JR Z,$855 ; 0837: 4E LD C,(HL) ; 0838: CD 99 01 CALL $0199 ; Set volume 083B: 2C INC L ; 083C: 7E LD A,(HL) ; 083D: C6 C5 ADD A,$C5 ; 083F: 77 LD (HL),A ; 0840: 2A 81 30 LD HL,($3081) ; 0843: AA XOR D ; 0844: AD XOR L ; 0845: 6F LD L,A ; 0846: 67 LD H,A ; 0847: FE 80 CP $80 ; 0849: 30 02 JR NC,$84D ; 084B: 26 01 LD H,$01 ; 084D: 22 81 30 LD ($3081),HL ; 0850: CD AA 01 CALL $01AA ; Write tone 0853: AF XOR A ; 0854: C9 RET ; 0855: 3D DEC A ; 0856: C9 RET ; ;##Command13 ; Initialization Routine Vector 13 (User Explosion Component) 0857: 3E 02 LD A,$02 ; 0859: CD C8 01 CALL $01C8 ; 085C: 21 00 00 LD HL,$0000 ; 085F: CD AA 01 CALL $01AA ; Write tone 0862: 21 83 30 LD HL,$3083 ; 0865: 0E 0F LD C,$0F ; 0867: 71 LD (HL),C ; 0868: CD 99 01 CALL $0199 ; Set volume 086B: 2C INC L ; 086C: 36 30 LD (HL),$30 ; 086E: 2C INC L ; 086F: 36 95 LD (HL),$95 ; 0871: 2C INC L ; 0872: 36 3D LD (HL),$3D ; 0874: 21 70 00 LD HL,$0070 ; 0877: 22 87 30 LD ($3087),HL ; 087A: 22 89 30 LD ($3089),HL ; 087D: AF XOR A ; 087E: C9 RET ; ; Continue Sound Routine Vector 13 (User Explosion Component) 087F: 21 84 30 LD HL,$3084 ; 0882: 35 DEC (HL) ; 0883: 7E LD A,(HL) ; 0884: 28 28 JR Z,$8AE ; 0886: FE 10 CP $10 ; 0888: 38 10 JR C,$89A ; 088A: 2C INC L ; 088B: 7E LD A,(HL) ; 088C: C6 C9 ADD A,$C9 ; 088E: 77 LD (HL),A ; 088F: 2C INC L ; 0890: AE XOR (HL) ; 0891: 77 LD (HL),A ; 0892: 6F LD L,A ; 0893: 26 01 LD H,$01 ; 0895: CD AA 01 CALL $01AA ; Write tone 0898: AF XOR A ; 0899: C9 RET ; 089A: D6 10 SUB $10 ; 089C: ED 44 NEG ; 089E: 87 ADD A,A ; 089F: 4F LD C,A ; 08A0: 06 00 LD B,$00 ; 08A2: 2A 89 30 LD HL,($3089) ; 08A5: 09 ADD HL,BC ; 08A6: 22 89 30 LD ($3089),HL ; 08A9: CD AA 01 CALL $01AA ; Write tone 08AC: AF XOR A ; 08AD: C9 RET ; 08AE: 2D DEC L ; 08AF: 35 DEC (HL) ; 08B0: 28 1C JR Z,$8CE ; 08B2: 4E LD C,(HL) ; 08B3: CD 99 01 CALL $0199 ; Set volume 08B6: 2C INC L ; 08B7: 3A 85 30 LD A,($3085) ; 08BA: E6 3F AND $3F ; 08BC: C6 30 ADD A,$30 ; 08BE: 77 LD (HL),A ; 08BF: 2A 87 30 LD HL,($3087) ; 08C2: 01 60 00 LD BC,$0060 ; 08C5: 09 ADD HL,BC ; 08C6: 22 87 30 LD ($3087),HL ; 08C9: 22 89 30 LD ($3089),HL ; 08CC: AF XOR A ; 08CD: C9 RET ; 08CE: 3D DEC A ; 08CF: C9 RET ; ;##Command14 ; Initialization Routine Vector 14 (User Explosion Component) 08D0: 3E 02 LD A,$02 ; 08D2: CD C8 01 CALL $01C8 ; 08D5: 21 00 00 LD HL,$0000 ; 08D8: CD AA 01 CALL $01AA ; Write tone 08DB: 21 8B 30 LD HL,$308B ; 08DE: 0E 0F LD C,$0F ; 08E0: 71 LD (HL),C ; 08E1: CD 99 01 CALL $0199 ; Set volume 08E4: 2C INC L ; 08E5: 36 30 LD (HL),$30 ; 08E7: 2C INC L ; 08E8: 36 95 LD (HL),$95 ; 08EA: 2C INC L ; 08EB: 36 3D LD (HL),$3D ; 08ED: 21 38 00 LD HL,$0038 ; 08F0: 22 8F 30 LD ($308F),HL ; 08F3: 22 91 30 LD ($3091),HL ; 08F6: AF XOR A ; 08F7: C9 RET ; ; Continue Sound Routine Vector 14 (User Explosion Component) 08F8: 21 8C 30 LD HL,$308C ; 08FB: 35 DEC (HL) ; 08FC: 7E LD A,(HL) ; 08FD: 28 23 JR Z,$922 ; 08FF: FE 10 CP $10 ; 0901: 38 10 JR C,$913 ; 0903: 2C INC L ; 0904: 7E LD A,(HL) ; 0905: C6 D3 ADD A,$D3 ; 0907: 77 LD (HL),A ; 0908: 2C INC L ; 0909: AE XOR (HL) ; 090A: 77 LD (HL),A ; 090B: 6F LD L,A ; 090C: 26 01 LD H,$01 ; 090E: CD AA 01 CALL $01AA ; Write tone 0911: AF XOR A ; 0912: C9 RET ; 0913: 2A 91 30 LD HL,($3091) ; 0916: 01 30 00 LD BC,$0030 ; 0919: 09 ADD HL,BC ; 091A: 22 91 30 LD ($3091),HL ; 091D: CD AA 01 CALL $01AA ; Write tone 0920: AF XOR A ; 0921: C9 RET ; 0922: 2D DEC L ; 0923: 35 DEC (HL) ; 0924: 28 1C JR Z,$942 ; 0926: 4E LD C,(HL) ; 0927: CD 99 01 CALL $0199 ; Set volume 092A: 2C INC L ; 092B: 3A 8D 30 LD A,($308D) ; 092E: E6 3F AND $3F ; 0930: C6 30 ADD A,$30 ; 0932: 77 LD (HL),A ; 0933: 2A 8F 30 LD HL,($308F) ; 0936: 01 06 00 LD BC,$0006 ; 0939: 09 ADD HL,BC ; 093A: 22 8F 30 LD ($308F),HL ; 093D: 22 91 30 LD ($3091),HL ; 0940: AF XOR A ; 0941: C9 RET ; 0942: 3D DEC A ; 0943: C9 RET ; ;##Command15 ; Initialization Routine Vector 15 (User Explosion Component) 0944: 3E 01 LD A,$01 ; 0946: CD C8 01 CALL $01C8 ; 0949: 21 93 30 LD HL,$3093 ; 094C: 36 00 LD (HL),$00 ; 094E: 2C INC L ; 094F: 36 D0 LD (HL),$D0 ; 0951: 2C INC L ; 0952: 0E 0D LD C,$0D ; 0954: 71 LD (HL),C ; 0955: CD 99 01 CALL $0199 ; Set volume 0958: 2C INC L ; 0959: 36 93 LD (HL),$93 ; 095B: 2C INC L ; 095C: 36 D5 LD (HL),$D5 ; 095E: 21 C0 00 LD HL,$00C0 ; 0961: CD AA 01 CALL $01AA ; Write tone 0964: AF XOR A ; 0965: C9 RET ; ; Continue Sound Routine Vector 15 (User Explosion Component) 0966: 21 93 30 LD HL,$3093 ; 0969: 35 DEC (HL) ; 096A: 7E LD A,(HL) ; 096B: E6 03 AND $03 ; 096D: 20 29 JR NZ,$998 ; 096F: 2C INC L ; 0970: 35 DEC (HL) ; 0971: 28 27 JR Z,$99A ; 0973: 7E LD A,(HL) ; 0974: FE 98 CP $98 ; 0976: 28 D9 JR Z,$951 ; 0978: FE 80 CP $80 ; 097A: 28 D5 JR Z,$951 ; 097C: 2C INC L ; 097D: E6 0F AND $0F ; 097F: 20 05 JR NZ,$986 ; 0981: 35 DEC (HL) ; 0982: 4E LD C,(HL) ; 0983: CD 99 01 CALL $0199 ; Set volume 0986: 2C INC L ; 0987: 7E LD A,(HL) ; 0988: C6 53 ADD A,$53 ; 098A: 77 LD (HL),A ; 098B: 2C INC L ; 098C: AE XOR (HL) ; 098D: 77 LD (HL),A ; 098E: 6F LD L,A ; 098F: FE E0 CP $E0 ; 0991: 38 01 JR C,$994 ; 0993: AF XOR A ; 0994: 67 LD H,A ; 0995: CD AA 01 CALL $01AA ; Write tone 0998: AF XOR A ; 0999: C9 RET ; 099A: 3D DEC A ; 099B: C9 RET ; ;##Command16 ; Initialization Routine Vector 16 (Pickup Parachute) 099C: AF XOR A ; 099D: CD C8 01 CALL $01C8 ; 09A0: 0E 09 LD C,$09 ; 09A2: CD 99 01 CALL $0199 ; Set volume 09A5: 21 99 30 LD HL,$3099 ; 09A8: 3E F6 LD A,$F6 ; 09AA: D6 06 SUB $06 ; 09AC: 77 LD (HL),A ; 09AD: D6 7E SUB $7E ; 09AF: 28 1E JR Z,$9CF ; 09B1: 2D DEC L ; 09B2: 36 30 LD (HL),$30 ; 09B4: 21 30 00 LD HL,$0030 ; 09B7: CD AA 01 CALL $01AA ; Write tone 09BA: AF XOR A ; 09BB: C9 RET ; ; Continue Sound Routine Vector 16 (Pickup Parachute) 09BC: 21 98 30 LD HL,$3098 ; 09BF: 7E LD A,(HL) ; 09C0: C6 06 ADD A,$06 ; 09C2: 77 LD (HL),A ; 09C3: 2C INC L ; 09C4: BE CP (HL) ; 09C5: 28 E3 JR Z,$9AA ; 09C7: 6F LD L,A ; 09C8: 26 00 LD H,$00 ; 09CA: CD AA 01 CALL $01AA ; Write tone 09CD: AF XOR A ; 09CE: C9 RET ; 09CF: 3D DEC A ; 09D0: C9 RET ; ;##Command17 ; Initialization Routine Vector 17 (Free Man) 09D1: 3E 01 LD A,$01 ; 09D3: CD C8 01 CALL $01C8 ; 09D6: 0E 0F LD C,$0F ; 09D8: CD 99 01 CALL $0199 ; Set volume 09DB: 21 9A 30 LD HL,$309A ; 09DE: 36 1D LD (HL),$1D ; 09E0: 2C INC L ; 09E1: 2D DEC L ; 09E2: 35 DEC (HL) ; 09E3: 7E LD A,(HL) ; 09E4: 28 1A JR Z,$A00 ; 09E6: 2C INC L ; 09E7: 77 LD (HL),A ; 09E8: 87 ADD A,A ; 09E9: 6F LD L,A ; 09EA: 26 00 LD H,$00 ; 09EC: CD AA 01 CALL $01AA ; Write tone 09EF: AF XOR A ; 09F0: C9 RET ; ; Continue Sound Routine Vector 17 (Free Man) 09F1: 21 9B 30 LD HL,$309B ; 09F4: 35 DEC (HL) ; 09F5: 28 EA JR Z,$9E1 ; 09F7: 6E LD L,(HL) ; 09F8: 26 00 LD H,$00 ; 09FA: 29 ADD HL,HL ; 09FB: CD AA 01 CALL $01AA ; Write tone 09FE: AF XOR A ; 09FF: C9 RET ; 0A00: 3D DEC A ; 0A01: C9 RET ; ;##Command18 ; Initialization Routine Vector 18 (Time Jump 1) 0A02: AF XOR A ; 0A03: CD C8 01 CALL $01C8 ; 0A06: 0E 0A LD C,$0A ; 0A08: CD 99 01 CALL $0199 ; Set volume 0A0B: 3E 80 LD A,$80 ; 0A0D: 32 9E 30 LD ($309E),A ; 0A10: 21 9C 30 LD HL,$309C ; 0A13: 36 00 LD (HL),$00 ; 0A15: 2C INC L ; 0A16: 36 C0 LD (HL),$C0 ; 0A18: 21 C0 00 LD HL,$00C0 ; 0A1B: CD AA 01 CALL $01AA ; Write tone 0A1E: AF XOR A ; 0A1F: C9 RET ; ; Continue Sound Routine Vector 18 (Time Jump 1) 0A20: 21 9C 30 LD HL,$309C ; 0A23: 35 DEC (HL) ; 0A24: CB 46 BIT 0,(HL) ; 0A26: 23 INC HL ; 0A27: 7E LD A,(HL) ; 0A28: 20 15 JR NZ,$A3F ; 0A2A: 35 DEC (HL) ; 0A2B: 7E LD A,(HL) ; 0A2C: FE 20 CP $20 ; 0A2E: 28 18 JR Z,$A48 ; 0A30: 2C INC L ; 0A31: BE CP (HL) ; 0A32: 3A 9D 30 LD A,($309D) ; 0A35: 20 09 JR NZ,$A40 ; 0A37: 7E LD A,(HL) ; 0A38: C6 05 ADD A,$05 ; 0A3A: 77 LD (HL),A ; 0A3B: 2D DEC L ; 0A3C: C3 16 0A JP $0A16 ; 0A3F: 1F RRA ; 0A40: 6F LD L,A ; 0A41: 26 00 LD H,$00 ; 0A43: CD AA 01 CALL $01AA ; Write tone 0A46: AF XOR A ; 0A47: C9 RET ; 0A48: 3E FF LD A,$FF ; 0A4A: C9 RET ; ;##Command19 ; Initialization Routine Vector 19 (Time Jump 2) 0A4B: AF XOR A ; 0A4C: CD C8 01 CALL $01C8 ; 0A4F: 21 C0 00 LD HL,$00C0 ; 0A52: CD AA 01 CALL $01AA ; Write tone 0A55: 0E 0F LD C,$0F ; 0A57: CD 99 01 CALL $0199 ; Set volume 0A5A: 21 9F 30 LD HL,$309F ; 0A5D: 36 00 LD (HL),$00 ; 0A5F: 2C INC L ; 0A60: 36 10 LD (HL),$10 ; 0A62: 2C INC L ; 0A63: 36 03 LD (HL),$03 ; 0A65: 2C INC L ; 0A66: 36 05 LD (HL),$05 ; 0A68: AF XOR A ; 0A69: C9 RET ; ; Continue Sound Routine Vector 19 (Time Jump 2) 0A6A: 21 9F 30 LD HL,$309F ; 0A6D: 35 DEC (HL) ; 0A6E: 7E LD A,(HL) ; 0A6F: 2C INC L ; 0A70: E6 3F AND $3F ; 0A72: 20 03 JR NZ,$A77 ; 0A74: 35 DEC (HL) ; 0A75: 28 19 JR Z,$A90 ; 0A77: E6 03 AND $03 ; 0A79: 20 13 JR NZ,$A8E ; 0A7B: 56 LD D,(HL) ; 0A7C: 2C INC L ; 0A7D: 7E LD A,(HL) ; 0A7E: C6 05 ADD A,$05 ; 0A80: 77 LD (HL),A ; 0A81: 2C INC L ; 0A82: AE XOR (HL) ; 0A83: E6 0F AND $0F ; 0A85: 77 LD (HL),A ; 0A86: BA CP D ; 0A87: 38 01 JR C,$A8A ; 0A89: AF XOR A ; 0A8A: 4F LD C,A ; 0A8B: CD 99 01 CALL $0199 ; Set volume 0A8E: AF XOR A ; 0A8F: C9 RET ; 0A90: 3D DEC A ; 0A91: C9 RET ; ;##CommandTable ; Initialize sound routines 0A92: 97 01 ; 0 Write 0 to voice 0A94: E7 03 ; 1 0 Coin Drop 0A96: 32 04 ; 2 0 Plane Fire 0A98: 62 04 ; 3 0 1910 Bomb 0A9A: 9A 04 ; 4 1 Missile launch 0A9C: D9 04 ; 5 0 Missile (continuous) 0A9E: 0A 05 ; 6 0 UFO shot 0AA0: 4D 05 ; 7 0 User Fire 0AA2: 88 05 ; 8 1 Enemy Explosion Component (thud) 0AA4: C8 05 ; 9 1 Enemy Explosion Component (white-noise) 0AA6: 1B 06 ; A 0 Tracker or Bomb Explosion 0AA8: 5E 06 ; B 0 Squad Appears 0AAA: 95 06 ; C 1 1st Boss 0AAC: D9 06 ; D 1 2nd Boss 0AAE: 15 07 ; E 1 3rd Boss 0AB0: 5C 07 ; F 1 4th Boss 0AB2: 8A 07 ; 10 1 5th Boss 0AB4: C6 07 ; 11 1 User Explosion Component 0AB6: 0B 08 ; 12 1 User Explosion Component 0AB8: 57 08 ; 13 2 User Explosion Component 0ABA: D0 08 ; 14 2 User Explosion Component 0ABC: 44 09 ; 15 1 User Explosion Component 0ABE: 9C 09 ; 16 0 Pickup Parachute 0AC0: D1 09 ; 17 1 Free Man 0AC2: 02 0A ; 18 0 Time Jump 1 0AC4: 4B 0A ; 19 0 Time Jump 2 0AC6: 16 0B ; 1A 0 Initialize song 2 0AC8: 1A 0B ; 1B 1 Initialize song 1 0ACA: 3B 0B ; 1C 0 Initialize music D1 0ACC: 3B 0B ; 1D 0 Initialize music D2 0ACE: 3B 0B ; 1E 0 Initialize music D3 0AD0: 3B 0B ; 1F 0 Initialize music D4 0AD2: 3B 0B ; 20 0 Initialize music D5 ; Continue sound routines 0AD4: 00 00 ; 0 Place holder for initialize command 0AD6: 02 04 ; 1 0AD8: 4B 04 ; 2 0ADA: 7A 04 ; 3 0ADC: B3 04 ; 4 0ADE: F5 04 ; 5 0AE0: 28 05 ; 6 0AE2: 6C 05 ; 7 0AE4: A4 05 ; 8 0AE6: EA 05 ; 9 0AE8: 3A 06 ; A 0AEA: 77 06 ; B 0AEC: B4 06 ; C 0AEE: F6 06 ; D 0AF0: 32 07 ; E 0AF2: 74 07 ; F 0AF4: AA 07 ; 10 0AF6: E5 07 ; 11 0AF8: 29 08 ; 12 0AFA: 7F 08 ; 13 0AFC: F8 08 ; 14 0AFE: 66 09 ; 15 0B00: BC 09 ; 16 0B02: F1 09 ; 17 0B04: 20 0A ; 18 0B06: 6A 0A ; 19 0B08: 00 00 ; 1A -- Playing song 0 (never kept in buffer) 0B0A: 00 00 ; 1B -- Playing song 1 (never kept in buffer) 0B0C: 41 0B ; 1C Continue music D1 0B0E: 4A 0B ; 1D Continue music D2 0B10: 53 0B ; 1E Continue music D3 0B12: 5C 0B ; 1F Continue music D4 0B14: 65 0B ; 20 Continue music D5 ;##Command1A ; Initialization Routine Vector 1A 0B16: AF XOR A ; Play song 0 0B17: C3 1C 0B JP $0B1C ; Play it ;##Command1B ; Initialization Routine Vector 1B 0B1A: 3E 01 LD A,$01 ; Play song 1 0B1C: CD 7E 03 CALL $037E ; Initialize music descriptors 0B1F: 11 00 30 LD DE,$3000 ; Command table 0B22: 21 2F 0B LD HL,$0B2F ; Fill ... 0B25: 01 0C 00 LD BC,$000C ; ... symultaneous 0B28: ED B0 LDIR ; ... commands 0B2A: E1 POP HL ; Clean ... 0B2B: E1 POP HL ; ... stack frame 0B2C: C3 BF 00 JP $00BF ; Goto main loop ; Play song command buffer 0B2F: 1C 00 ; All five music processors playing 0B31: 1D 00 ; ... 0B33: 1E 00 ; ... 0B35: 1F 00 ; ... 0B37: 20 00 ; ... 0B39: 00 00 ; ; Initialization Routine Vector 1C,1D,1E,1F,20 Music ; Do nothing. 0B3B: AF XOR A ; 0B3C: CD C8 01 CALL $01C8 ; That mysterious routine ? 0B3F: AF XOR A ; Initialized 0B40: C9 RET ; Done ; Continue Sound Routine Vector 1C 0B41: DD 21 0F 30 LD IX,$300F ; Descriptor 1 0B45: CD FC 01 CALL $01FC ; Process 0B48: AF XOR A ; Continue flag 0B49: C9 RET ; Done ; Continue Sound Routine Vector 1D 0B4A: DD 21 19 30 LD IX,$3019 ; Descriptor 2 0B4E: CD FC 01 CALL $01FC ; Process 0B51: AF XOR A ; Continue flag 0B52: C9 RET ; Done ; Continue Sound Routine Vector 1E 0B53: DD 21 23 30 LD IX,$3023 ; Descriptor 3 0B57: CD FC 01 CALL $01FC ; Process 0B5A: AF XOR A ; Continue flag 0B5B: C9 RET ; Done ; Continue Sound Routine Vector 1F 0B5C: DD 21 2D 30 LD IX,$302D ; Descriptor 4 0B60: CD FC 01 CALL $01FC ; Process 0B63: AF XOR A ; Continue flag 0B64: C9 RET ; Done ; Continue Sound Routine Vector 20 0B65: DD 21 37 30 LD IX,$3037 ; Descriptor 5 0B69: CD FC 01 CALL $01FC ; Process 0B6C: AF XOR A ; Continue flag 0B6D: C9 RET ; Done ;##MusicData ; Descriptor pointers for songs (10 bytes each) ; Song 0 0B6E: 82 0B 0B70: B2 0B 0B72: E2 0B 0B74: 08 0C 0B76: 2D 0C ; Song 1 0B78: 2E 0C 0B7A: 70 0C 0B7C: AD 0C 0B7E: EB 0C 0B80: 04 0D ;Song data ; Song 0 Descriptor 0 0B82: 1F 0E 3F 16 5F 00 81 60 5F 08 66 A8 AD 92 7F 0B91: 00 B1 91 7F FF B1 B2 91 7F 00 D4 B4 7F FF B4 0BA0: 60 74 3F 13 77 76 74 74 73 71 71 70 6D 6D 70 0BAF: 71 AD FF ; Song 0 Descriptor 1 0BB2: 1F 02 3F 16 5F 00 81 60 5F 08 66 A8 AD 92 7F 0BC1: 00 B1 91 7F FF B1 B2 91 7F 00 D4 B4 7F FF B4 0BD0: 60 74 3F 13 77 76 74 74 73 71 71 70 6D 6D 70 0BDF: 71 AD FF ; Song 0 Descriptor 2 0BE2: 1F 0E 3F 13 5F 08 8D 6D 8D 6D 8D 6D 8D 6D 8D 0BF1: 6D 8D 6D 8D 6D 8D 6D 88 68 85 60 86 60 87 60 0C00: 7F 00 CB 7F FF AB AD FF ; Song 0 Descriptor 3 0C08: 1F 02 3F 13 5F 08 8D 6D 8D 6D 8D 6D 8D 6D 8D 0C17: 6D 8D 6D 8D 6D 8D 6D 88 68 85 60 86 60 87 60 0C26: 7F 00 CB 7F FF AB AD ; Song 0 Descriptor 4 0C2D: FF ; Song 1 Descriptor 0 0C2E: 1F 0E 3F 15 5F 00 81 5F 07 65 65 25 25 25 25 0C3D: A5 85 65 85 65 65 80 65 65 25 25 25 25 A5 85 0C4C: 65 61 68 6C 6F 80 6A 6A 2A 2A 2A 2A AA 8A 6A 0C5B: 8A 6A 6A 80 6A 6A 2A 2A 2A 2A AA 8A 68 68 68 0C6A: 6A 6A 80 DF 37 0C ; Song 1 Descriptor 1 0C70: 1F 0E 3F 15 5F 00 81 5F 07 68 68 28 28 28 28 0C7F: A8 88 68 88 68 68 80 68 68 28 28 28 28 A8 88 0C8E: A8 60 80 6D 6D 2D 2D 2D 2D AD 8D 6D 8D 6D 6D 0C9D: 80 6D 6D 2D 2D 2D 2D AD 8D 6D 6D 6D AD DF 79 0CAC: 0C ; Song 1 Descriptor 2 0CAD: 1F 0E 3F 15 5F 00 81 5F 07 6C 6C 2C 2C 2C 2C 0CBC: AC 8C 6C 8C 6C 6C 80 6C 6C 2C 2C 2C 2C AC 8C 0CCB: AC 60 80 72 72 32 32 32 32 B2 92 72 92 72 72 0CDA: 80 72 72 32 32 32 32 B2 92 72 72 72 92 80 DF 0CE9: B6 0C ; Song 1 Descriptor 3 0CEB: 1F 0E 3F 15 5F 00 E1 E0 E0 C0 A0 5F 07 78 74 0CFA: 79 76 E0 E0 E0 C0 A0 DF F8 0C ; Song 1 Descriptor 4 0D04: 1F 02 3F 15 5F 07 8D 60 6D 88 60 6D 60 6D 60 0D13: 6D 28 28 28 28 88 60 8D 60 6D 88 60 6D 60 6D 0D22: 60 6D 88 6D 68 8F 60 6F 8A 60 6F 60 6F 60 6F 0D31: 2A 2A 2A 2A 8A 60 8F 60 6F 8A 60 8F 8F 6F 6A 0D40: 6F 6A 6E DF 0A 0D 1F 0E 3F 16 5F 09 BF B3 B2 0D4F: A9 B0 B9 BB BA AE E2 B7 B3 B4 C1 B5 B9 FF 0D5D: FF FF FF 0D60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0D70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0D80: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0D90: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0DA0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0DB0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0DC0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0DD0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0DE0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0DF0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E00: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E80: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0E90: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0EA0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0EB0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0EC0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0ED0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0EE0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0EF0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F00: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F40: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F80: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0F90: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0FA0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0FB0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0FC0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0FD0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0FE0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0FF0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF