;*************************************** ; ; Note: Markers like [1] indicate bytes that can be ; saved by obvious (or nearly so) optimizations, ; and [0] indicates that cycles can be saved. ; ; Some of the optimizations can't be made because ; they will change locked address, and some are ; so non-obvious that I can't figure out what I ; was thinking when I marked them! ; ;*************************************** ; LOCKED ADDRESSES -- THESE *MUST* BE CORRECT OR SOME CARTRIDGES WILL NOT RUN! ; ; In order to allow easy verification, these addresses have labels ; starting with an 'A' and containing the locked address. ; ; These are the important addresses (like vectors), plus a few used by the ; small-time offenders. ; ; 0000 0066 080B 18A3 ; 0008 0069 08C0 18D4. ; 0010 006A 143B 18F7* ; 0018 006C 144D 1968 ; 0020 01B1* 1463 196B ; 0028 01D5 14B4 1CCA. ; 0030 023B. 14C1 1D43 ; 0038 02EE 14C3 1D47 ; 003B. 07E8* 15A3 1F61 ; 158B* ; ; ...and these are the addresses used by three of the four Interphase ; games, most of which have vectors available. ; ; 0213. 114A*. 1BAA* 1D3E*. ; 025E. 18E9. 1C27. 1D57. ; 027F. 1979*. 1C4F* 1D5A. ; 0300. 1B1D*. 1C82*. 1D60*. ; 1105* 1BA3. 1D01*. 1D66*. ; ; These two were called from Boulder Dash, but the call instructions ; themselves may be unreachable from the rest of the game. ; ; 01C1* 026A* ; ; Any address with a '*' is only referenced by ONE game that I can find. ; Note that Interphase games account for 11 out of 15 of these. Any address ; with a '.' has a vector available. Note also that all but two Interphase- ; only addresses (18 of 20) have vectors! Oh the humanity! ; ; These are in the "OS7SYM" file which was provided to Adam programmers: ; ;FREQ_SWEEP EQU 000FCH ! ;ATN_SWEEP EQU 0012FH ! ;DECLSN EQU 00190H ! ;DECMSN EQU 0019BH ! ;MSNTOLSN EQU 001A6H ! = 00FF O EQU 0FFH ; filler for unused bytes ;*************************************** ; RAM usage ;*************************************** 7000 ORG 7000H 7000 (000C) DS 12 ; default CtlState storage? 700C (0014) DS 20 7020 (0002) SndArray DS 2 ; music array pointer? 7022 (0002) NoiseP DS 2 ; Pointer to program for noise generator 7024 (0002) Tone1P DS 2 ; Pointer to program for tone1 generator 7026 (0002) Tone2P DS 2 ; Pointer to program for tone2 generator 7028 (0002) Tone3P DS 2 ; Pointer to program for tone3 generator 702A (0001) NoiseCtlShad DS 1 ; Noise control register shadow 73B9 ORG 73B9H 73B9 (0001) Stack DS 1 ; Default initial stack pointer 73BA (0009) ParmArea DS 9 ; Parameter storage for PCOPY parameters 73C3 (0001) VDP0Shad DS 1 ; VDP register 0 shadow 73C4 (0001) VDP1Shad DS 1 ; VDP register 1 shadow 73C5 (0001) DS 1 ; unused? 73C6 (0001) D73C6 DS 1 ; flag byte? 73C7 (0001) WrtRAMSprt DS 1 ; BlkWrtVRAM to RAM sprite attr table if =1 73C8 (0002) RandSeed DS 2 ; Random number seed 73CA (0001) D73CA DS 1 ; unknown 73CB (0001) D73CB DS 1 ; unknown 73CC (0001) D73CC DS 1 ; unknown 73CD (0002) D73CD DS 2 ; unknown 73CF (0002) D73CF DS 2 ; unknown 73D1 (0002) D73D1 DS 2 ; unknown 73D3 (0002) TimerList DS 2 ; Pointer to timer list 73D5 (0002) TimerAux DS 2 ; Pointer to end of timer aux storage 73D7 (0014) RawCtlState DS 20 ; Raw controller state table (2 x 10 bytes) 73EB (0001) PulseCnt1 DS 1 ; Pulse counter #1 73EC (0001) PulseCnt2 DS 1 ; Pulse counter #2 73ED (0001) DS 1 ; unused? 73EE (0001) Joy1Shad DS 1 ; shadow for joystick #1 73EF (0001) Joy2Shad DS 1 ; shadow for joystick #2 73F0 (0001) Key1Shad DS 1 ; shadow for keypad #1 73F1 (0001) Key2Shad DS 1 ; shadow for keypad #2 = 73F2 VDPBaseShad EQU $ ; shadow for VDP table base addresses 73F2 (0002) SprtTabShad DS 2 ; shadow for sprite table VRAM base addr 73F4 (0002) SprtPatTabShad DS 2 ; shadow for sprite pattern generator VRAM base addr 73F6 (0002) NameTabShad DS 2 ; shadow for name table VRAM base address 73F8 (0002) PatGenTabShad DS 2 ; shadow for pattern generator VRAM base addr 73FA (0002) ClrTabShad DS 2 ; shadow for color table VRAM base address 73FC (0002) DS 2 ; unused? 73FE (0002) D73FE DS 2 ; temp3 ;*************************************** ; Cartridge header addresses ;*************************************** 8000 ORG 8000H 8000 (0002) Cart_Sig DS 2 ; AA55 = title screen, 55AA = no screen 8002 (0002) RamSprtTab DS 2 ; RAM sprite attribute table pointer 8004 (0002) RAMSprtIdx DS 2 ; sprite index table pointer 8006 (0002) VDP_Temp DS 2 ; pointer to temp image storage (up to 40 bytes used) 8008 (0002) CtlState DS 2 ; pointer to controller state table (2 + 2x5 bytes) 800A (0002) Cart_Start DS 2 ; start of cart code 800C (0003) V_RST_08H DS 3 ; RST 08H vector 800F (0003) V_RST_10H DS 3 ; RST 10H vector 8012 (0003) V_RST_18H DS 3 ; RST 18H vector 8015 (0003) V_RST_20H DS 3 ; RST 20H vector 8018 (0003) V_RST_28H DS 3 ; RST 28H vector 801B (0003) V_RST_30H DS 3 ; RST 30H vector 801E (0003) V_RST_38H DS 3 ; RST 38H vector 8021 (0003) V_NMI DS 3 ; NMI vector (vertical blank interrupt) 8024 (0000) Cart_Title DS 0 ; Title string "LINE 3/LINE 2/yyyy" ;*************************************** ; Offsets into data blocks ;*************************************** ; Offsets into RawCtlState = 0000 RawCtlLeft EQU 00H ; raw left controller state = 000A RawCtlRight EQU 0AH ; raw right controller state ; Offsets into RawCtlLeft and RawCtlRight = 0000 RawCtlLFBit EQU 00H ; previous left fire bit = 0001 RawCtlLFState EQU 01H ; left fire button state = 0002 RawCtlDBits EQU 02H ; previous directional bits = 0003 RawCtlDState EQU 03H ; directionals state ; EQU 04H ; unused? ; EQU 05H ; unused? = 0006 RawCtlRFBit EQU 06H ; previous right fire bit = 0007 RawCtlRFState EQU 07H ; right fire button state = 0008 RawCtlKPBit EQU 08H ; previous keypad bits = 0009 RawCtlKPState EQU 09H ; keypad state ; Offsets into CtlState table = 0000 CtlStateLFlag EQU 00H ; left controller flags = 0001 CtlStateRFlag EQU 01H ; right controller flags = 0002 CtlStateLeft EQU 02H ; left controller state = 0007 CtlStateRight EQU 07H ; right controller state ; CtlStateLF/CtlStateRF bits = 0080 CtlCheckMe EQU 80H ; 7 ; if =0, do not check this ctrl at all ; EQU 40H ; 6 ; unused? ; EQU 20H ; 5 ; unused? = 0010 CtlCheckKP EQU 10H ; 4 ; check keypad = 0008 CtlCheckRFire EQU 08H ; 3 ; check right fire button = 0004 CtlCheckSpinner EQU 04H ; 2 ; check spinner = 0002 CtlCheckDir EQU 02H ; 1 ; check directionals = 0001 CtlCheckLFire EQU 01H ; 0 ; check left fire button ; Offsets into CtlStateLeft and CtlStateRight = 0000 CtlStateLFire EQU 00H ; left fire button = 0001 CtlStateDir EQU 01H ; directionals = 0002 CtlStateSpin EQU 02H ; spinner value = 0003 CtlStateRFire EQU 03H ; right fire button = 0004 CtlStateKey EQU 04H ; key code ;*************************************** ; I/O port addresses ;*************************************** = 0080 IO_KP_Select EQU 080H ; Keypad select output port = 00C0 IO_Joy_Select EQU 0C0H ; Joystick select output port = 00FC IO_Joy1 EQU 0FCH ; Joystick 1 input port = 00FF IO_Joy2 EQU 0FFH ; Joystick 2 input port = 00FF IO_Sound EQU 0FFH ; Sound chip output port = 00BE IO_VDP_Data EQU 0BEH ; VDP data port = 00BF IO_VDP_Addr EQU 0BFH ; VDP VRAM address output port = 00BF IO_VDP_Status EQU 0BFH ; VDP status input port 0000 ORG 0000H ;*************************************** ; Everything starts here ;*************************************** 0000 31 B973 A0000 LD SP,Stack ; Initialize stack pointer 0003 18 69 JR L006E ; Go to rest of cold-start code ;*************************************** ; These are the RST vectors, mixed with some (formerly) wasted bytes ;*************************************** 0005 P_AddSound 0005 P_StopTimer 0005 P_TestTimer 0005 P_InitRAMSprt 0005 01 P_CopyRAMSprt DB 1 0006 0100 DW 1 0008 C3 0C80 A0008 JP V_RST_08H 000B P_InitSound 000B P_StartTimer 000B 02 P_BaseLoad DB 2 000C 01000200 DW 1,2 0010 C3 0F80 A0010 JP V_RST_10H 0013 02 D0482 DB 2 0014 FEFF0100 DW -2,1 0018 C3 1280 A0018 JP V_RST_18H 001B 02 D064F DB 2 001C 0100FEFF DW 1,-2 0020 C3 1580 A0020 JP V_RST_20H 0023 02 D06C1 DB 2 0024 02000100 DW 2,1 0028 C3 1880 A0028 JP V_RST_28H 002B 02 P_InitTimers DB 2 002C 02000200 DW 2,2 0030 C3 1B80 A0030 JP V_RST_30H 0033 02 P_WriteReg DB 2 0034 01000100 DW 1,1 0038 C3 1E80 A0038 JP V_RST_38H ;*************************************** ; 1FFD Random ; ; Returns a random number in A. This routine apparently ; uses a pseudo-random shift register algorithm based on ; the XOR of bits 8 and 15. ;*************************************** 003B A003B 003B 2A C873 _Random LD HL,(RandSeed) 003E CB7C BIT 7,H ; Set the carry flag to 0040 28 0E JR Z,L0048 ; bit 8 XOR bit 15 0042 CB44 BIT 0,H 0044 28 0E JR Z,L004C 0046 B7 L004F OR A ; Clear carry flag 0047 CB15 L0050 RL L ; Rotate the carry into HL 0049 CB14 RL H 004B 22 C873 LD (RandSeed),HL ; Update the random number seed 004E 7D LD A,L ; Return the LSB 004F C9 RET 0050 CB44 L0048 BIT 0,H 0052 28 F2 JR Z,L004F 0054 D1AC4 ; DB '7' 0054 37 L004C SCF ; Set carry flag 0055 18 F0 JR L0050 ; DE = DE + IX 0057 DDE5 L0478 PUSH IX 0059 E3 EX (SP),HL 005A 19 L047C ADD HL,DE 005B EB EX DE,HL 005C E1 POP HL 005D C9 RET 005E P_WrtVRAM 005E 03 P_ReadVRAM DB 3 005F FEFF0200 0200 DW -2,2,2 0065 FF DB O ;*************************************** ; NMI vector ;*************************************** 0066 C3 2180 A0066 JP V_NMI ;*************************************** ; I'm not really sure what these are for, but aside from the ; jump vectors at the end of the ROM, they are probably the ; only ROM addresses that you should reference directly. ;*************************************** 0069 3C A0069 DB 60 ; this might mean a 60hz display (NTSC) 006A AB16 A006A DW D16AB ; this points to the font bitmap for 'A' 006C 2316 A006C DW D1623 ; this points to the font bitmap for '0' ;*************************************** ; ; First part of cold start code ; ;*************************************** 006E 2A 0080 L006E LD HL,(Cart_Sig) ; Check first word of cart for 55AAH 0071 7D LD A,L ; 8000=55H and 8001=AAH 0072 FE 55 CP 55H 0074 20 09 JR NZ,L0081 0076 7C LD A,H 0077 FE AA CP 0AAH 0079 20 04 JR NZ,L0081 007B 2A 0A80 LD HL,(Cart_Start) ; If 55H/AAH, jump into cartridge 007E E9 JP (HL) 007F CD D61F L0081 CALL NoSound ; Turn off sound = 0083 D1AC0 EQU $+1 ; DB '3' 0082 21 3300 LD HL,0033H ; Initialize random seed 0085 22 C873 LD (RandSeed),HL 0088 CD 0511 CALL InitCtlState ; Clear all controller state flags ; XOR A ; (A-reg is already = 00H) 008B D1ABF ; DB '2' 008B 32 C673 LD (D73C6),A ; Clear some unknown flags 008E 32 C773 LD (WrtRAMSprt),A ; Clear BlkWrtVRAM RAM sprite attr flag 0091 C3 AE07 JP L1319 ; Go display copyright screen ;*************************************** ; PCopy ; ; This routine copies in-line paramters for the subroutines. ; ; The descriptor table entries are 2 bytes each. The first word ; of the descriptor list is the number of descriptors in the list. ; ; (Note: for optimization purposes, the number of descriptors is now a byte) ; ; If an entry is positive, it contains the number of bytes to copy ; to the storage area. ; ; The parameters are 2 bytes each and normally contain the ; address of the data to be copied into the storage area. ; ; If a descriptor table entry is negative, the next parameter ; is taken as a 2-byte literal and stored directly in the data area. ; ; If a parameter word is zero, the next parameter word contains the ; address of the real parameter word to use. This is done before ; checking for a negative descriptor table entry. ; ; ENTRY BC points to parameter descriptor table ; DE points to parameter storage area ; (SP+2) = return address of calling routine ; EXIT: DE points to first unused byte of storage area ;*************************************** 0094 E1 PCopy POP HL ; Swap caller's return address 0095 E3 EX (SP),HL ; (the parameter pointer) to 0096 E5 PUSH HL ; the top of the stack 0097 0A LD A,(BC) ; HL = first descriptor table word 0098 6F LD L,A 0099 03 INC BC 009A 26 00 LD H,00H 009C E3 EX (SP),HL ; Swap parameter pointer 009D D5 PUSH DE ; with storage pointer ; Get next parameter word 009E 5E L00A3 LD E,(HL) ; DE = next parameter word 009F 23 INC HL 00A0 56 LD D,(HL) 00A1 23 INC HL 00A2 E5 PUSH HL ; Save parameter pointer 00A3 7B LD A,E ; Check if parameter = 0 00A4 B2 OR D 00A5 20 0A JR NZ,L00B7 ; Branch if = 0 ; Handle zero parameter word 00A7 E1 POP HL ; Get back parameter pointer 00A8 5E LD E,(HL) ; DE = next parameter word 00A9 23 INC HL 00AA 56 LD D,(HL) 00AB 23 INC HL 00AC E5 PUSH HL ; Save parameter pointer 00AD EB EX DE,HL ; DE = (DE) 00AE 5E LD E,(HL) 00AF 23 INC HL 00B0 56 LD D,(HL) ; Check sign of descriptor word 00B1 03 L00B7 INC BC ; Get MSB of descriptor 00B2 0A LD A,(BC) 00B3 07 RLCA 00B4 30 17 JR NC,L00DA ; Branch if positive ; Handle negative descriptor word 00B6 03 INC BC ; Point to next descriptor word 00B7 E1 POP HL ; HL = parameter pointer 00B8 E3 EX (SP),HL ; Swap with storage pointer 00B9 73 LD (HL),E ; Store DE in storage area 00BA 23 INC HL 00BB 72 LD (HL),D 00BC 23 INC HL 00BD D1 L00C4 POP DE ; DE = storage pointer 00BE E3 EX (SP),HL ; Swap it with parameter counter 00BF 2B DEC HL ; Decrement count 00C0 7C LD A,H ; Test for zero count 00C1 B5 OR L 00C2 28 05 JR Z,L00D6 00C4 E3 L00D0 EX (SP),HL ; Swap counter back on stack 00C5 E5 PUSH HL ; Put storage pointer back on stack 00C6 EB EX DE,HL ; HL = parameter pointer 00C7 18 D5 JR L00A3 ; Go back for next parameter 00C9 E1 L00D6 POP HL ; Get storage pointer 00CA EB EX DE,HL ; DE = storage pointer, HL = parm pointer 00CB E3 EX (SP),HL ; Put parm pointer back on stack 00CC E9 JP (HL) ; Return to caller ; Handle positive descriptor word 00CD E1 L00DA POP HL ; Swap parameter pointer 00CE E3 EX (SP),HL ; and storage pointer 00CF E5 PUSH HL 00D0 0F RRCA ; Restore value of MSB 00D1 67 LD H,A ; H = MSB 00D2 0B DEC BC ; L = LSB 00D3 0A LD A,(BC) 00D4 6F LD L,A 00D5 E3 EX (SP),HL ; HL = storage pointer, TOS = count 00D6 03 INC BC ; Point to next descriptor 00D7 03 INC BC 00D8 1A L00E5 LD A,(DE) ; Copy next parameter byte 00D9 77 LD (HL),A 00DA 23 INC HL 00DB 13 INC DE 00DC E3 EX (SP),HL ; HL = count, TOS = storage pointer 00DD 2B DEC HL ; Decrement counter 00DE 7C LD A,H ; Loop until count is zero 00DF B5 OR L 00E0 28 03 JR Z,L00F8 ; Branch if count = 0 00E2 E3 L00F4 EX (SP),HL ; HL = storage pointer, TOS = count 00E3 18 F3 JR L00E5 ; Go back to copy next byte 00E5 E1 L00F8 POP HL ; HL = storage pointer 00E6 18 D5 JR L00C4 ; Go check for end of parameter list ;*************************************** ; ; SOUND ROUTINES BEGIN HERE ; ;*************************************** ; Process the duration and twang values? 00E8 DD7E 07 L00FC LD A,(IX+07H) 00EB B7 OR A 00EC 20 09 JR NZ,L010C 00EE DD7E 05 LD A,(IX+05H) 00F1 3D DEC A 00F2 C8 RET Z 00F3 DD77 05 LD (IX+05H),A 00F6 C9 RET 00F7 DDE5 L010C PUSH IX 00F9 E1 POP HL 00FA 11 0600 LD DE,0006H 00FD 19 ADD HL,DE 00FE CD E31C CALL L0190 0101 C0 RET NZ 0102 CD 021C CALL L01A6 0105 2B DEC HL 0106 7E LD A,(HL) 0107 3D DEC A 0108 C8 RET Z 0109 77 LD (HL),A 010A 2B DEC HL 010B 2B DEC HL 010C DD7E 07 LD A,(IX+07H) 010F CD B101 CALL A01B1 0112 23 INC HL 0113 CB96 RES 2,(HL) 0115 18 2B JR L015D ; Process the decay? 0117 DD7E 08 L012F LD A,(IX+08H) 011A B7 OR A 011B C8 RET Z 011C DDE5 PUSH IX 011E E1 POP HL 011F 11 0900 LD DE,0009H 0122 19 ADD HL,DE 0123 CD E31C CALL L0190 0126 C0 RET NZ 0127 CD 021C CALL L01A6 012A 2B DEC HL 012B CD E31C CALL L0190 012E 28 15 JR Z,L0161 0130 7E LD A,(HL) 0131 E6 F0 AND 0F0H 0133 5F LD E,A 0134 2B DEC HL 0135 2B DEC HL 0136 2B DEC HL 0137 2B DEC HL 0138 7E LD A,(HL) 0139 E6 F0 AND 0F0H 013B 83 ADD A,E 013C 5F LD E,A 013D 7E LD A,(HL) 013E E6 0F AND 0FH 0140 B3 OR E 0141 77 LD (HL),A 0142 F6 FF L015D OR 0FFH 0144 C9 RET 0145 D1AC3 ; DB '6' 0145 36 00 L0161 LD (HL),00H 0147 C9 RET ;*************************************** ; ; Put up the introduction screen ; ;*************************************** 0148 E1 L1352 POP HL ; End of list, clean up 0149 21 181D LD HL,Title_Msgs ; Put up "COLECOVISION" title screen 014C CD 661A CALL ScrnMsgs 014F 21 3B14 LD HL,A143B ; Point to color table ; LD DE,0000H ; Table index 0152 50 LD D,B ; (BC=0 from ScrnMsgs) 0153 59 LD E,C 0154 FD21 1200 LD IY,0012H ; Byte count 0158 CD 481C CALL _BlkWrtVRAM4 ; Color table 015B 01 C001 LD BC,01C0H ; Unblank the screen 015E CD CA1C CALL _WriteReg 0161 21 0080 LD HL,Cart_Sig ; Check first 2 bytes of cartridge 0164 7E LD A,(HL) ; If 8000<>AA or 8001<>55, 0165 FE AA CP 0AAH 0167 20 04 JR NZ,L13B7 ; put up "please turn machine off 0169 23 INC HL ; before inserting cartridge" msg 016A 7E LD A,(HL) 016B FE 55 CP 55H 016D C2 431A L13B7 JP NZ,L13FF 0170 21 2480 LD HL,Cart_Title ; Find name string 0173 54 LD D,H ; Display address = first string 0174 5D LD E,L 0175 CD 3C19 CALL L1946 ; Scan for first '/' 0178 E5 PUSH HL ; Save address of first '/' 0179 21 0102 LD HL,0201H ; Screen address for first string 017C CD 4719 CALL L1951 ; Display first string centered 017F E1 POP HL ; Recover address of first '/' 0180 23 INC HL ; Adjust for second string 0181 54 LD D,H ; Display address = second string 0182 5D LD E,L 0183 CD 3C19 CALL L1946 ; Scan for second '/' 0186 E5 PUSH HL ; Save address of second '/' 0187 21 C101 LD HL,01C1H ; Screen address for second string 018A CD 4719 CALL L1951 ; Display second string centered 018D E1 POP HL ; Recover address of second '/' 018E 23 INC HL ; Adjust for third string 018F 11 AC02 LD DE,02ACH ; Screen address for copyright date 0192 FD21 0400 LD IY,0004H ; 4 bytes 0196 CD 251C CALL _BlkWrtVRAM2 0199 CD 6819 CALL A1968 ; "Respect the seven second delay we ; use" - Donald Fagen, "The Nightfly" 019C 01 8001 LD BC,0180H ; Blank screen 019F CD CA1C CALL _WriteReg 01A2 2A 0A80 LD HL,(Cart_Start) ; Get start address 01A5 E9 JP (HL) ; Jump into cartridge 01A6 FFFFFFFF FFFFFFFF DB O,O,O,O,O,O,O,O,O,O 01AE FFFF 01B0 FF DB O ; Add A (signed byte) to (HL) 01B1 06 00 A01B1 LD B,00H ; sign-extend A -> BA 01B3 CB7F BIT 7,A 01B5 28 01 JR Z,L01B9 01B7 05 DEC B 01B8 86 L01B9 ADD A,(HL) 01B9 77 LD (HL),A 01BA 23 INC HL 01BB 7E LD A,(HL) 01BC 88 ADC A,B 01BD 77 LD (HL),A 01BE 2B DEC HL 01BF C9 RET 01C0 FF DB O ; Index into the 7020H array using B as the index ; B = 1 returns HL = (7020H)+2 and IX = (HL) 01C1 2A 2070 A01C1 LD HL,(SndArray) ; HL = (7020H)-2 + B*4 01C4 2B DEC HL 01C5 2B DEC HL 01C6 48 LD C,B 01C7 06 00 LD B,00H 01C9 09 ADD HL,BC 01CA 09 ADD HL,BC 01CB 09 ADD HL,BC 01CC 09 ADD HL,BC 01CD 5E LD E,(HL) ; IX = (HL) 01CE 23 INC HL 01CF 56 LD D,(HL) 01D0 D5 PUSH DE 01D1 DDE1 POP IX 01D3 C9 RET 01D4 FF DB O ; Update function code? (Used by Carnival!) 01D5 DD75 01 A01D5 LD (IX+01H),L 01D8 DD74 02 LD (IX+02H),H 01DB 1A LD A,(DE) 01DC E6 3F AND 3FH 01DE 47 LD B,A 01DF DD7E 00 LD A,(IX+00H) 01E2 E6 C0 AND 0C0H 01E4 B0 OR B 01E5 DD77 00 LD (IX+00H),A 01E8 C9 RET ; Get command list pointer? 01E9 DD7E 00 L01E9 LD A,(IX+00H) 01EC FE FF CP 0FFH 01EE C8 RET Z 01EF E6 3F AND 3FH 01F1 FE 3E CP 3EH 01F3 C0 RET NZ 01F4 DDE5 PUSH IX 01F6 E1 POP HL 01F7 23 INC HL 01F8 5E LD E,(HL) 01F9 23 INC HL 01FA 56 LD D,(HL) 01FB EB EX DE,HL 01FC C9 RET 01FD FFFFFFFF FFFF DB O,O,O,O,O,O ;*************************************** ; 1FB2 PInitSound ; ; Parameter block version of 1FEE ; ; Parm 1 (byte) = number of array elements ; Parm 2 (word) = pointer to array of pointers ; ;*************************************** 0203 01 0B00 _PInitSound LD BC,P_InitSound 0206 11 BA73 LD DE,ParmArea 0209 CD 9400 CALL PCopy 020C 3A BA73 LD A,(ParmArea) 020F 47 LD B,A 0210 2A BB73 LD HL,(ParmArea+1) ;*************************************** ; 1FEE InitSound ; ; Initializes 7020 with HL, clears out the array pointed to by ; (HL+2) to contain an FF every ten bytes for B times, then stores ; a zero at the end. Then the sound variables are initialized and ; the sound chip is silenced. ; ; Array at 7020H contains a list of four-byte entries. The ; second word of the list contains a pointer to a list of ; 10-byte blocks, and the second word of each other entry ; probably contains a pointer into this list as well. The ; first word of each four-byte entry is apparently a pointer ; to a list of command bytes. ; ; Each 10 byte block has the following format: ; ; +0 bits 0-5 = function code (3EH is special) ; bits 6-7 = channel code (0=noise, else tone channel number) ; +1,+2 pointer to list of command bytes ; +3 low 8 bits of frequency ; +4 bits 0-3 = high 2 bits of frequency or noise control ; bits 4-7 = amplitude (00H=max, 0FH=off) ; +5 duration counter? ; +6 bits 0-3 = twang time counter? ; bits 4-7 = twang time? ; +7 twang offset? (signed byte) ; +8 bits 0-3 = decay high counter? ; bits 4-7 = decay high nibble? ; +9 bits 0-3 = decay low counter? ; bits 4-7 = decay low nibble? ; ; ENTRY B = number of array elements ; HL = pointer to array of pointers ;*************************************** 0213 A0213 0213 22 2070 _InitSound LD (SndArray),HL 0216 23 INC HL 0217 23 INC HL 0218 5E LD E,(HL) 0219 23 INC HL 021A 56 LD D,(HL) 021B EB EX DE,HL 021C 11 0A00 LD DE,000AH = 0220 NoSoundP EQU $+1 ; null sound program = single FFH byte 021F 36 FF L0220 LD (HL),0FFH 0221 19 ADD HL,DE 0222 10 FB DJNZ L0220 0224 72 LD (HL),D 0225 CD D402 CALL L0297 0228 7E LD A,(HL) ; = 0FFH 0229 32 2A70 LD (NoiseCtlShad),A 022C 18 0D JR A023B 022E FFFFFFFF FFFFFFFF DB O,O,O,O,O,O,O,O,O,O 0236 FFFF 0238 FFFFFF DB O,O,O ;*************************************** ; 1FD6 NoSound ; ; This routine silences the sound chip. ;*************************************** 023B A023B 023B 3E 9F _NoSound LD A,9FH 023D D3 FF OUT (IO_Sound),A 023F 3E BF LD A,0BFH 0241 D3 FF OUT (IO_Sound),A 0243 3E DF LD A,0DFH 0245 D3 FF OUT (IO_Sound),A 0247 3E FF LD A,0FFH 0249 D3 FF OUT (IO_Sound),A 024B C9 RET 024C FFFFFFFF FF DB O,O,O,O,O ;*************************************** ; 1FB5 PAddSound ; ; Parameter block version of 1FF1 ; ; Parm 1 (byte) = index into array at 7020H ;*************************************** 0251 01 0500 _PAddSound LD BC,P_AddSound 0254 11 BA73 LD DE,ParmArea 0257 CD 9400 CALL PCopy 025A 3A BA73 LD A,(ParmArea) 025D 47 LD B,A ;*************************************** ; 1FF1 AddSound ; ; This routine seets up a new entry in the sound list. (?) ; ; ENTRY B = index into array at 7020H, 1 = first entry ;*************************************** 025E A025E 025E C5 _AddSound PUSH BC 025F CD C101 CALL A01C1 0262 DD7E 00 LD A,(IX+00H) 0265 E6 3F AND 3FH 0267 C1 POP BC 0268 B8 CP B 0269 C8 RET Z 026A DD70 00 A026A LD (IX+00H),B 026D 2B DEC HL 026E 2B DEC HL 026F 56 LD D,(HL) 0270 2B DEC HL 0271 5E LD E,(HL) 0272 DD73 01 LD (IX+01H),E 0275 DD72 02 LD (IX+02H),D 0278 CD 7903 CALL L035F 027B 18 16 JR L0295 027D FFFF DB O,O ;*************************************** ; 1FF4 UpdateSound ; ; This routine updates the current sound pointers ; by searching through the sound list. ;*************************************** 027F A027F 027F 06 01 _UpdateSound LD B,01H 0281 CD C101 CALL A01C1 0284 AF L0284 XOR A 0285 DDBE 00 CP (IX+00H) 0288 C8 RET Z 0289 CD C502 CALL L02D6 028C 11 0A00 LD DE,000AH 028F DD19 ADD IX,DE 0291 18 F1 JR L0284 ; Update stream pointers 0293 CD D402 L0295 CALL L0297 0296 DDE5 PUSH IX 0298 06 01 LD B,01H 029A CD C101 CALL A01C1 029D DD7E 00 L02AB LD A,(IX+00H) 02A0 B7 OR A 02A1 28 1F JR Z,L02D3 02A3 3C INC A 02A4 28 15 JR Z,L02CB 02A6 DD7E 00 LD A,(IX+00H) 02A9 E6 C0 AND 0C0H 02AB 07 RLCA 02AC 07 RLCA 02AD 07 RLCA 02AE 5F LD E,A 02AF 16 00 LD D,00H 02B1 21 2270 LD HL,NoiseP 02B4 19 ADD HL,DE 02B5 DDE5 PUSH IX 02B7 D1 POP DE 02B8 73 LD (HL),E 02B9 23 INC HL 02BA 72 LD (HL),D 02BB 11 0A00 L02CB LD DE,000AH 02BE DD19 ADD IX,DE 02C0 18 DB JR L02AB 02C2 DDE1 L02D3 POP IX 02C4 C9 RET 02C5 CD E901 L02D6 CALL L01E9 02C8 FE FF CP 0FFH 02CA C8 RET Z 02CB FE 3E CP 3EH 02CD 20 18 JR NZ,L02E6 02CF 11 0700 LD DE,0007H 02D2 19 ADD HL,DE 02D3 E9 JP (HL) 02D4 21 2002 L0297 LD HL,NoSoundP 02D7 22 2270 LD (NoiseP),HL 02DA 22 2470 LD (Tone1P),HL 02DD 22 2670 LD (Tone2P),HL 02E0 22 2870 LD (Tone3P),HL 02E3 C9 RET 02E4 FFFFFF DB O,O,O 02E7 CD 1701 L02E6 CALL L012F 02EA CD E800 CALL L00FC 02ED C0 RET NZ 02EE DD7E 00 A02EE LD A,(IX+00H) ; (called by Carnival) 02F1 F5 PUSH AF 02F2 CD 7903 CALL L035F 02F5 C1 POP BC 02F6 DD7E 00 LD A,(IX+00H) 02F9 B8 CP B 02FA C8 RET Z 02FB 18 96 JR L0295 02FD 54574F D1AC6 DB 'TWO' ;*************************************** ; 1F61 DoSound ; ; This updates the sound chip registers based on the ; current sound array pointers for each channel. ;*************************************** 0300 A0300 0300 3E 9F _DoSound LD A,9FH 0302 0E 90 LD C,90H = 0305 D0587 EQU $+1 0304 16 80 LD D,80H 0306 DD2A 2470 LD IX,(Tone1P) 030A CD 5603 CALL L034E 030D 3E BF LD A,0BFH 030F 0E B0 LD C,0B0H 0311 16 A0 LD D,0A0H 0313 DD2A 2670 LD IX,(Tone2P) 0317 CD 5603 CALL L034E 031A 3E DF LD A,0DFH 031C 0E D0 LD C,0D0H 031E 16 C0 LD D,0C0H 0320 DD2A 2870 LD IX,(Tone3P) 0324 CD 5603 CALL L034E 0327 3E FF LD A,0FFH 0329 0E F0 LD C,0F0H 032B DD2A 2270 LD IX,(NoiseP) 032F DD5E 00 LD E,(IX+00H) 0332 1C INC E 0333 28 1E JR Z,L0335 0335 CD 4503 CALL L0164 0338 DD7E 04 LD A,(IX+04H) 033B E6 0F AND 0FH 033D 21 2A70 LD HL,NoiseCtlShad 0340 BE CP (HL) 0341 C8 RET Z 0342 77 LD (HL),A 0343 0E E0 LD C,0E0H ; Send amplitude or noise control to sound chip 0345 DD7E 04 L0164 LD A,(IX+04H) 0348 CB61 BIT 4,C 034A 28 04 JR Z,L016F 034C 0F RRCA 034D 0F RRCA 034E 0F RRCA 034F 0F RRCA 0350 E6 0F L016F AND 0FH 0352 B1 OR C 0353 D3 FF L0335 OUT (IO_Sound),A 0355 C9 RET 0356 DD5E 00 L034E LD E,(IX+00H) 0359 1C INC E 035A 28 F7 JR Z,L0335 035C CD 4503 CALL L0164 ; Send freqency to sound chip 035F DD7E 03 L0175 LD A,(IX+03H) 0362 E6 0F AND 0FH 0364 B2 OR D 0365 D3 FF OUT (IO_Sound),A 0367 DD7E 03 LD A,(IX+03H) 036A E6 F0 AND 0F0H 036C 57 LD D,A 036D DD7E 04 LD A,(IX+04H) 0370 E6 0F AND 0FH 0372 B2 OR D 0373 0F RRCA 0374 0F RRCA 0375 0F RRCA 0376 0F RRCA 0377 18 DA JR L0335 0379 DD7E 00 L035F LD A,(IX+00H) 037C E6 3F AND 3FH 037E F5 PUSH AF 037F DD36 00 FF LD (IX+00H),0FFH 0383 DD6E 01 LD L,(IX+01H) 0386 DD66 02 LD H,(IX+02H) 0389 7E LD A,(HL) 038A 47 LD B,A 038B CB6F BIT 5,A 038D 28 13 JR Z,L0391 038F C5 PUSH BC 0390 E6 1F AND 1FH 0392 23 INC HL 0393 DD75 01 LD (IX+01H),L 0396 DD74 02 LD (IX+02H),H 0399 DD36 04 F0 LD (IX+04H),0F0H 039D DD77 05 LD (IX+05H),A 03A0 18 5A JR L03F0 03A2 CB67 L0391 BIT 4,A 03A4 28 0D JR Z,L03A4 03A6 CB5F BIT 3,A 03A8 28 04 JR Z,L039E 03AA C1 POP BC 03AB C3 5E02 JP _AddSound 03AE 3E FF L039E LD A,0FFH 03B0 F5 PUSH AF 03B1 18 51 JR L03F8 03B3 E6 3C L03A4 AND 3CH 03B5 FE 04 CP 04H 03B7 20 27 JR NZ,L03D2 03B9 FDE1 POP IY 03BB FDE5 PUSH IY 03BD C5 PUSH BC 03BE 23 INC HL 03BF 5E LD E,(HL) 03C0 DD73 01 LD (IX+01H),E 03C3 23 INC HL 03C4 56 LD D,(HL) 03C5 DD72 02 LD (IX+02H),D 03C8 23 INC HL 03C9 FDE5 PUSH IY 03CB F1 POP AF 03CC D5 PUSH DE 03CD FDE1 POP IY 03CF 11 D503 LD DE,L03C6 03D2 D5 PUSH DE 03D3 FDE9 JP (IY) 03D5 11 0700 L03C6 LD DE,0007H 03D8 FD19 ADD IY,DE 03DA 11 5C04 LD DE,L0461 03DD D5 PUSH DE 03DE FDE9 JP (IY) 03E0 C5 L03D2 PUSH BC 03E1 78 LD A,B 03E2 E6 03 AND 03H 03E4 20 20 JR NZ,L03FA 03E6 23 INC HL 03E7 23 INC HL 03E8 23 INC HL 03E9 23 INC HL 03EA DD75 01 LD (IX+01H),L 03ED DD74 02 LD (IX+02H),H 03F0 2B DEC HL 03F1 11 0500 LD DE,0005H 03F4 CD 5700 CALL L0478 ; DE = DE + IX 03F7 01 0300 LD BC,0003H 03FA EDB8 LDDR 03FC DD36 07 00 L03F0 LD (IX+07H),00H 0400 DD36 08 00 L03F4 LD (IX+08H),00H 0404 18 56 L03F8 JR L0461 0406 3D L03FA DEC A ; CP 01H 0407 20 16 JR NZ,L0419 0409 11 0600 LD DE,0006H 040C 19 ADD HL,DE 040D DD75 01 LD (IX+01H),L 0410 DD74 02 LD (IX+02H),H 0413 2B DEC HL 0414 1C INC E 0415 CD 5700 CALL L0478 ; DE = DE + IX 0418 01 0500 LD BC,0005H 041B EDB8 LDDR 041D 18 E1 JR L03F4 041F 3D L0419 DEC A ; CP 02H 0420 20 26 JR NZ,L0445 0422 11 0600 LD DE,0006H 0425 19 ADD HL,DE 0426 F1 POP AF 0427 F5 PUSH AF 0428 E6 C0 AND 0C0H 042A 20 01 JR NZ,L0429 042C 2B DEC HL 042D DD75 01 L0429 LD (IX+01H),L 0430 DD74 02 LD (IX+02H),H 0433 2B DEC HL 0434 1E 09 LD E,09H 0436 CD 5700 CALL L0478 ; DE = DE + IX 0439 01 0200 LD BC,0002H 043C EDB8 LDDR 043E AF XOR A 043F 12 LD (DE),A 0440 1B DEC DE 0441 1B DEC DE 0442 0E 03 LD C,03H 0444 EDB8 LDDR 0446 18 14 JR L0461 0448 11 0800 L0445 LD DE,0008H 044B 19 ADD HL,DE 044C DD75 01 LD (IX+01H),L 044F DD74 02 LD (IX+02H),H 0452 2B DEC HL 0453 1C INC E 0454 CD 5700 CALL L0478 ; DE = DE + IX 0457 01 0700 LD BC,0007H 045A EDB8 LDDR 045C DDE5 L0461 PUSH IX 045E E1 POP HL 045F F1 POP AF 0460 C1 POP BC 0461 FE FF CP 0FFH 0463 C8 RET Z 0464 57 LD D,A 0465 E6 3F AND 3FH 0467 FE 04 CP 04H 0469 20 02 JR NZ,L0472 046B 06 3E LD B,3EH 046D 7A L0472 LD A,D 046E E6 C0 AND 0C0H 0470 B0 OR B 0471 77 LD (HL),A 0472 C9 RET ;*************************************** ; ; VIDEO ROUTINES BEGIN HERE ; ;*************************************** ;*************************************** ; 1F64 ; ; Parameter block version of 1FF7 ; ; Parm 1 (lit) = ? ; Parm 2 (byte) = ? ;*************************************** 0473 01 1300 L0488 LD BC,D0482 0476 11 BA73 LD DE,ParmArea 0479 CD 9400 CALL PCopy 047C 2A BA73 LD HL,(ParmArea) 047F 5E LD E,(HL) 0480 23 INC HL 0481 56 LD D,(HL) 0482 EB EX DE,HL 0483 3A BC73 LD A,(ParmArea+2) 0486 B7 OR A ; (clears carry) 0487 28 01 JR Z,L04A3 0489 37 SCF ;*************************************** ; 1FF7 ; ; ENTRY HL = ? ; C-flag = ? ;*************************************** 048A 5E L04A3 LD E,(HL) 048B 23 INC HL 048C 56 LD D,(HL) 048D 23 INC HL 048E 4E LD C,(HL) 048F 23 INC HL 0490 46 LD B,(HL) 0491 23 INC HL 0492 3E 00 LD A,00H ; note: must preserve carry here! 0494 02 LD (BC),A 0495 1A LD A,(DE) 0496 F5 PUSH AF 0497 E6 0F AND 0FH 0499 28 5E JR Z,L04E7 049B 3D DEC A 049C 28 2A JR Z,L05F1 049E 3D DEC A 049F 28 36 JR Z,L0600 04A1 3D DEC A 04A2 28 33 JR Z,L0600 04A4 3D DEC A 04A5 20 1F JR NZ,L04E5 ; 04A3/1FF7 Function 4 04A7 1A L04C6 LD A,(DE) 04A8 1F RRA 04A9 1F RRA 04AA 1F RRA 04AB 1F RRA 04AC E6 0F AND 0FH 04AE 47 LD B,A 04AF 5E LD E,(HL) 04B0 23 INC HL 04B1 56 LD D,(HL) 04B2 23 INC HL 04B3 B7 OR A 04B4 28 10 JR Z,L04E5 04B6 F1 L04D5 POP AF 04B7 F5 PUSH AF 04B8 E5 PUSH HL 04B9 C5 PUSH BC 04BA EB EX DE,HL 04BB CD 8A04 CALL L04A3 04BE C1 POP BC 04BF E1 POP HL 04C0 5E LD E,(HL) 04C1 23 INC HL 04C2 56 LD D,(HL) 04C3 23 INC HL 04C4 10 F0 DJNZ L04D5 04C6 F1 L04E5 POP AF 04C7 C9 RET ; 04A3/1FF7 Function 1 04C8 CD BB05 L05F1 CALL L0572 04CB 13 INC DE 04CC 1A LD A,(DE) 04CD FD77 05 LD (IY+05H),A 04D0 13 INC DE 04D1 1A LD A,(DE) 04D2 FD77 06 LD (IY+06H),A 04D5 F1 POP AF 04D6 C9 RET ; 04A3/1FF7 Functions 2 & 3 04D7 03 L0600 INC BC 04D8 03 INC BC 04D9 03 INC BC 04DA 03 INC BC 04DB 03 INC BC 04DC EB EX DE,HL 04DD 23 INC HL 04DE 7E LD A,(HL) 04DF 5F LD E,A 04E0 16 00 LD D,00H 04E2 D5 PUSH DE 04E3 23 INC HL 04E4 5E LD E,(HL) 04E5 23 INC HL 04E6 56 LD D,(HL) 04E7 23 INC HL 04E8 86 ADD A,(HL) 04E9 02 LD (BC),A 04EA 4E LD C,(HL) 04EB 06 00 LD B,00H 04ED C5 PUSH BC 04EE FDE1 POP IY 04F0 EB EX DE,HL 04F1 D1 POP DE 04F2 F1 POP AF 04F3 D0 RET NC 04F4 3E 01 LD A,01H ; Sprite pattern gen table 04F6 C3 271C JP _BlkWrtVRAM ; 04A3/1FF7 Function 0 04F9 CD BB05 L04E7 CALL L0572 04FC 1A LD A,(DE) 04FD 6F LD L,A 04FE 13 INC DE 04FF 1A LD A,(DE) 0500 85 ADD A,L 0501 FD77 05 LD (IY+05H),A 0504 26 00 LD H,00H 0506 F1 POP AF 0507 D0 RET NC ; this is the carry flag from L04A3 0508 F5 PUSH AF 0509 3A C373 LD A,(VDP0Shad) ; Check for hi-res graphics 050C CB4F BIT 1,A 050E 28 48 JR Z,L0530 ; Branch if not 0510 EB EX DE,HL 0511 44 LD B,H 0512 4D LD C,L 0513 6E LD L,(HL) 0514 26 00 LD H,00H 0516 E5 PUSH HL 0517 29 ADD HL,HL 0518 29 ADD HL,HL 0519 29 ADD HL,HL 051A E5 PUSH HL 051B 03 INC BC 051C 0A LD A,(BC) 051D 6F LD L,A 051E 03 INC BC 051F 0A LD A,(BC) 0520 67 LD H,A 0521 C1 POP BC 0522 FDE1 POP IY 0524 F1 POP AF 0525 CB7F BIT 7,A 0527 C4 3405 CALL NZ,L0594 052A 14 INC D ; DE = DE + 0100H 052B CB77 BIT 6,A 052D C4 3405 CALL NZ,L0594 0530 14 INC D ; DE = DE + 0100H 0531 CB6F BIT 5,A 0533 C8 RET Z 0534 F5 L0594 PUSH AF 0535 C5 PUSH BC 0536 FDE5 PUSH IY 0538 D5 PUSH DE 0539 E5 PUSH HL 053A CD 451C CALL _BlkWrtVRAM3 ; Pattern generator table 053D E1 POP HL 053E D1 POP DE 053F FDE1 POP IY 0541 C1 POP BC 0542 F1 POP AF 0543 F5 PUSH AF 0544 C5 PUSH BC 0545 FDE5 PUSH IY 0547 D5 PUSH DE 0548 E5 PUSH HL 0549 CB67 BIT 4,A 054B 20 49 JR NZ,L05BC 054D 09 ADD HL,BC 054E CD 481C CALL _BlkWrtVRAM4 ; Color table 0551 E1 L05B5 POP HL 0552 D1 POP DE 0553 FDE1 POP IY 0555 C1 POP BC 0556 F1 POP AF 0557 C9 RET 0558 EB L0530 EX DE,HL 0559 4E LD C,(HL) 055A 06 00 LD B,00H 055C C5 PUSH BC 055D FDE1 POP IY 055F 23 INC HL 0560 7E LD A,(HL) 0561 23 INC HL 0562 66 LD H,(HL) 0563 6F LD L,A 0564 E5 PUSH HL 0565 C5 PUSH BC 0566 D5 PUSH DE 0567 FDE5 PUSH IY 0569 CD 451C CALL _BlkWrtVRAM3 ; Pattern generator table 056C C1 POP BC 056D E1 POP HL 056E 5D LD E,L 056F 54 LD D,H 0570 09 ADD HL,BC 0571 2B DEC HL 0572 CB3C SRL H 0574 CB1D RR L 0576 CB3C SRL H 0578 CB1D RR L 057A CB3C SRL H 057C CB1D RR L 057E CB2B SRA E 0580 CB2B SRA E 0582 CB2B SRA E 0584 B7 OR A 0585 ED52 SBC HL,DE 0587 23 INC HL 0588 E5 PUSH HL 0589 FDE1 POP IY 058B E1 POP HL 058C 29 ADD HL,HL 058D 29 ADD HL,HL 058E 29 ADD HL,HL 058F C1 POP BC 0590 09 ADD HL,BC 0591 CD 481C CALL _BlkWrtVRAM4 ; Color table 0594 F1 POP AF 0595 C9 RET 0596 09 L05BC ADD HL,BC 0597 4D LD C,L 0598 44 LD B,H 0599 FDE5 PUSH IY 059B E1 POP HL 059C E5 L05C2 PUSH HL 059D 0A LD A,(BC) 059E C5 PUSH BC 059F 01 0800 LD BC,0008H 05A2 2A 0680 LD HL,(VDP_Temp) 05A5 09 ADD HL,BC 05A6 41 LD B,C 05A7 2B L05CE DEC HL 05A8 77 LD (HL),A 05A9 10 FC DJNZ L05CE 05AB D5 PUSH DE 05AC CD 831E CALL L1EA5 ; LD A,04H LD IY,0001H JP _BlkWrtVRAM 05AF D1 POP DE 05B0 C1 POP BC 05B1 13 INC DE 05B2 03 INC BC 05B3 E1 POP HL 05B4 2B DEC HL 05B5 7C LD A,H 05B6 B5 OR L 05B7 20 E3 JR NZ,L05C2 05B9 18 96 JR L05B5 05BB C5 L0572 PUSH BC 05BC FDE1 POP IY 05BE D5 PUSH DE 05BF 5E LD E,(HL) 05C0 23 INC HL 05C1 56 LD D,(HL) 05C2 CB7A BIT 7,D 05C4 20 13 JR NZ,L0591 05C6 7A LD A,D 05C7 FE 70 CP 70H 05C9 38 05 JR C,L0588 05CB 3E 80 LD A,80H 05CD 12 LD (DE),A 05CE 18 09 JR L0591 05D0 21 0503 L0588 LD HL,D0587 05D3 01 0100 LD BC,0001H 05D6 CD 011D CALL _WrtVRAM 05D9 D1 L0591 POP DE 05DA 13 INC DE 05DB C9 RET ;*************************************** ; 1F67 ; ; Parameter block version of 1FFA ; ; Parm 1 (word) = ??? ; Parm 2 (byte) = ??? ;*************************************** 05DC 01 2300 L06C7 LD BC,D06C1 05DF 11 BA73 LD DE,ParmArea 05E2 CD 9400 CALL PCopy 05E5 DD2A BA73 LD IX,(ParmArea) 05E9 3A BC73 LD A,(ParmArea+2) 05EC 47 LD B,A ;*************************************** ; 1FFA ; ; ENTRY IX = ??? ; A = ??? ;*************************************** 05ED 3A C673 L06D8 LD A,(D73C6) 05F0 3D DEC A 05F1 20 23 JR NZ,L06E3 05F3 DDE5 L0623 PUSH IX 05F5 2A CD73 LD HL,(73CDH) 05F8 D1 POP DE 05F9 73 LD (HL),E 05FA 23 INC HL 05FB 72 LD (HL),D 05FC 23 INC HL 05FD 70 LD (HL),B 05FE 23 INC HL 05FF EB EX DE,HL 0600 3A CB73 LD A,(73CBH) 0603 3C INC A 0604 21 CA73 LD HL,73CAH 0607 BE CP (HL) 0608 EB EX DE,HL 0609 20 04 JR NZ,L0669 060B AF XOR A 060C 2A D173 LD HL,(73D1H) 060F 22 CD73 L0669 LD (73CDH),HL 0612 32 CB73 LD (73CBH),A 0615 C9 RET 0616 DD6E 00 L06E3 LD L,(IX+00H) 0619 DD66 01 LD H,(IX+01H) 061C 7E LD A,(HL) 061D 4F LD C,A 061E E6 0F AND 0FH 0620 28 19 JR Z,L06FF 0622 3D DEC A 0623 CA EB08 JP Z,L0A87 0626 3D DEC A 0627 28 07 JR Z,L08DF 0629 3D DEC A 062A CA D808 JP Z,L0955 062D C3 A90C JP L0EA2 0630 1E F9 L08DF LD E,0F9H 0632 CD 1B07 CALL L08E0 0635 21 0800 LD HL,0008H 0638 C3 E008 JP L0999 063B DD5E 02 L06FF LD E,(IX+02H) 063E DD56 03 LD D,(IX+03H) 0641 D5 PUSH DE 0642 FDE1 POP IY 0644 FD5E 01 LD E,(IY+01H) 0647 FD56 02 LD D,(IY+02H) 064A CD E807 CALL A07E8 064D 4B LD C,E 064E FD5E 03 LD E,(IY+03H) 0651 FD56 04 LD D,(IY+04H) 0654 CD E807 CALL A07E8 0657 43 LD B,E 0658 FD5E 00 LD E,(IY+00H) 065B 16 00 LD D,00H 065D 19 ADD HL,DE 065E 19 ADD HL,DE 065F 1E 05 LD E,05H 0661 19 ADD HL,DE 0662 5E LD E,(HL) 0663 23 INC HL 0664 56 LD D,(HL) 0665 EB EX DE,HL 0666 C5 PUSH BC 0667 D1 POP DE 0668 4E LD C,(HL) 0669 23 INC HL 066A 46 LD B,(HL) 066B 23 INC HL 066C DD7E 05 LD A,(IX+05H) 066F CB7F BIT 7,A 0671 C2 0B08 JP NZ,A080B 0674 C5 PUSH BC 0675 D5 PUSH DE 0676 E5 PUSH HL 0677 FE 70 CP 70H 0679 28 02 JR Z,L0744 067B 38 06 JR C,L074B 067D 67 L0744 LD H,A 067E DD6E 04 LD L,(IX+04H) 0681 18 34 JR L0780 0683 2A 0680 L074B LD HL,(VDP_Temp) 0686 DD5E 04 LD E,(IX+04H) 0689 DD56 05 LD D,(IX+05H) 068C E5 PUSH HL 068D D5 PUSH DE 068E E5 PUSH HL 068F 01 0400 LD BC,0004H 0692 CD 3E1D CALL _ReadVRAM 0695 E1 POP HL 0696 7E LD A,(HL) 0697 FE 80 CP 80H 0699 20 03 JR NZ,L0766 069B D1 POP DE 069C 18 18 JR L077F 069E 23 L0766 INC HL 069F 23 INC HL 06A0 46 LD B,(HL) 06A1 23 INC HL 06A2 5E LD E,(HL) 06A3 16 00 LD D,00H 06A5 23 INC HL 06A6 EB EX DE,HL 06A7 FE DB 0FEH ; CP n - skips the ADD HL,HL 06A8 29 L0771 ADD HL,HL 06A9 10 FD DJNZ L0771 06AB E5 PUSH HL 06AC C1 POP BC 06AD EB EX DE,HL 06AE D1 POP DE 06AF 13 INC DE 06B0 13 INC DE 06B1 13 INC DE 06B2 13 INC DE 06B3 CD 3E1D CALL _ReadVRAM 06B6 E1 L077F POP HL 06B7 7E L0780 LD A,(HL) 06B8 FE 80 CP 80H 06BA 28 0F JR Z,L0794 06BC 5E LD E,(HL) 06BD 23 INC HL 06BE 56 LD D,(HL) 06BF 23 INC HL 06C0 4E LD C,(HL) 06C1 23 INC HL 06C2 46 LD B,(HL) 06C3 23 INC HL 06C4 DDE5 PUSH IX 06C6 CD 0B08 CALL A080B 06C9 DDE1 POP IX 06CB E1 L0794 POP HL 06CC D1 POP DE 06CD C1 POP BC 06CE C5 PUSH BC 06CF D5 PUSH DE 06D0 E5 PUSH HL 06D1 DD6E 04 LD L,(IX+04H) 06D4 DD66 05 LD H,(IX+05H) 06D7 3E 70 LD A,70H 06D9 BC CP H 06DA 38 03 JR C,L07A8 06DC 2A 0680 LD HL,(VDP_Temp) 06DF 73 L07A8 LD (HL),E 06E0 23 INC HL 06E1 72 LD (HL),D 06E2 23 INC HL 06E3 71 LD (HL),C 06E4 23 INC HL 06E5 70 LD (HL),B 06E6 23 INC HL 06E7 DDE5 PUSH IX 06E9 CD 9508 CALL L0898 06EC DDE1 POP IX 06EE E1 POP HL 06EF D1 POP DE 06F0 C1 POP BC 06F1 DDE5 PUSH IX 06F3 CD 0B08 CALL A080B 06F6 DDE1 POP IX 06F8 DD56 05 LD D,(IX+05H) 06FB 3E 70 LD A,70H 06FD BA CP D 06FE C8 RET Z 06FF D8 RET C 0700 DD5E 04 LD E,(IX+04H) 0703 D9 EXX 0704 2A 0680 LD HL,(VDP_Temp) 0707 E5 PUSH HL 0708 23 INC HL 0709 23 INC HL 070A 5E LD E,(HL) 070B 16 00 LD D,00H 070D 23 INC HL 070E 46 LD B,(HL) 070F EB EX DE,HL 0710 FE DB 0FEH ; CP n - skips the ADD HL,HL 0711 29 L07DD ADD HL,HL 0712 10 FD DJNZ L07DD 0714 E5 PUSH HL 0715 D9 EXX 0716 C1 POP BC 0717 E1 POP HL 0718 C3 011D JP _WrtVRAM 071B FD2A 0680 L08E0 LD IY,(VDP_Temp) 071F DD6E 02 LD L,(IX+02H) 0722 DD66 03 LD H,(IX+03H) 0725 23 INC HL 0726 4E LD C,(HL) 0727 23 INC HL 0728 46 LD B,(HL) 0729 78 LD A,B 072A B7 OR A 072B 28 08 JR Z,L0900 072D 3C INC A 072E 20 56 JR NZ,L0A54 0730 79 LD A,C 0731 BB CP E 0732 FA 8607 JP M,L0A54 0735 23 L0900 INC HL 0736 4E LD C,(HL) 0737 23 INC HL 0738 46 LD B,(HL) 0739 78 LD A,B 073A B7 OR A 073B 28 08 JR Z,L0914 073D 3C INC A 073E 20 46 JR NZ,L0A54 0740 79 LD A,C 0741 BB CP E 0742 FA 8607 JP M,L0A54 0745 2B L0914 DEC HL 0746 2B DEC HL 0747 7E LD A,(HL) 0748 B7 OR A 0749 28 05 JR Z,L09CA 074B 2B DEC HL 074C 4E LD C,(HL) 074D 23 INC HL 074E 46 LD B,(HL) 074F C9 RET 0750 E1 L09CA POP HL ; get rid of return address 0751 DD6E 02 LD L,(IX+02H) 0754 DD66 03 LD H,(IX+03H) 0757 23 INC HL 0758 7E LD A,(HL) 0759 CD 0014 CALL L09D5 075C 7E LD A,(HL) 075D FD77 03 L09FD LD (IY+03H),A 0760 DD6E 02 L0A00 LD L,(IX+02H) 0763 DD66 03 LD H,(IX+03H) 0766 23 INC HL 0767 23 INC HL 0768 23 INC HL 0769 7E LD A,(HL) 076A FD77 00 LD (IY+00H),A 076D CD 0314 CALL L09D8 0770 23 INC HL 0771 7E LD A,(HL) 0772 DD6E 00 LD L,(IX+00H) 0775 DD66 01 LD H,(IX+01H) 0778 23 INC HL 0779 86 ADD A,(HL) 077A FD77 02 LD (IY+02H),A 077D AF XOR A ; Sprite attribute table 077E 57 LD D,A 077F DD5E 04 LD E,(IX+04H) 0782 FDE5 PUSH IY 0784 18 24 JR L0A7E 0786 D1 L0A54 POP DE ; get rid of return address 0787 FDE5 PUSH IY 0789 DDE5 PUSH IX 078B FDE5 PUSH IY 078D FDE5 PUSH IY 078F AF XOR A ; Sprite attribute table 0790 57 LD D,A 0791 DD5E 04 LD E,(IX+04H) 0794 E1 POP HL 0795 CD 751E CALL L1E92 ; LD IY,0001H / JP _BlkReadVRAM 0798 AF XOR A 0799 FDE1 POP IY 079B FD77 01 LD (IY+01H),A 079E 3E 80 LD A,80H 07A0 FD77 03 LD (IY+03H),A 07A3 AF XOR A ; Sprite attribute table 07A4 57 LD D,A 07A5 DDE1 POP IX 07A7 DD5E 04 LD E,(IX+04H) 07AA E1 L0A7E POP HL 07AB C3 851E JP L1EA7 ; LD IY,0001H / JP _BlkWrtVRAM ;*************************************** ; ; Initialize the video chip ; ;*************************************** 07AE CD CF07 L1319 CALL InitScrn ; Initialize the character cells for "COLECOVISION" 07B1 21 A318 LD HL,A18A3 ; Point to character cell usage list 07B4 11 6000 LD DE,0060H ; Starting character code = 60H 07B7 E5 L1330 PUSH HL 07B8 7E LD A,(HL) ; Get block ID 07B9 07 RLCA ; Multiply index by 8 07BA DA 4801 JP C,L1352 ; Check for end of list 07BD 07 RLCA 07BE 07 RLCA 07BF 4F LD C,A ; Load BC with block offset 07C0 42 LD B,D ; (D-reg = 00H here) 07C1 21 C314 LD HL,A14C3 ; Point to block data 07C4 09 L1356 ADD HL,BC ; Point HL to block image 07C5 D5 PUSH DE 07C6 CD 3719 CALL _BlkWrtVRAM31 ; LD A,03H LD IY,0001H JP _BlkWrtVRAM 07C9 D1 POP DE 07CA E1 POP HL 07CB 13 INC DE 07CC 23 INC HL 07CD 18 E8 JR L1330 07CF AF InitScrn XOR A ; Fill VRAM from address 0000H 07D0 67 LD H,A ; with 00H 07D1 6F LD L,A ; 07D2 11 0040 LD DE,4000H ; length 4000H 07D5 CD D418 CALL _FillVRAM ; Do the fill 07D8 CD E918 CALL _InitVDP ; Initialize the video chip 07DB C3 2419 JP _InitFont ; Initialize the text font 07DE FFFFFFFF FFFFFFFF DB O,O,O,O,O,O,O,O,O,O 07E6 FFFF 07E8 E5 A07E8 PUSH HL 07E9 CB2A SRA D 07EB CB1B RR E 07ED CB2A SRA D 07EF CB1B RR E 07F1 CB2A SRA D 07F3 CB1B RR E 07F5 CB7A BIT 7,D 07F7 21 80FF LD HL,0FF80H 07FA 20 06 JR NZ,L0802 07FC 19 ADD HL,DE 07FD E1 POP HL 07FE D0 RET NC 07FF 1E 7F LD E,7FH 0801 C9 RET 0802 26 00 L0802 LD H,00H ; LD HL,0080H 0804 19 ADD HL,DE 0805 E1 POP HL 0806 D8 RET C 0807 1E 80 LD E,80H 0809 C9 RET 080A FF DB O 080B C5 A080B PUSH BC ; (called by Antarctic Adventure and Destructor) 080C D5 PUSH DE 080D E5 PUSH HL 080E D9 EXX 080F E1 POP HL 0810 D1 POP DE 0811 C1 POP BC 0812 CD C008 CALL A08C0 0815 D9 EXX 0816 7B LD A,E 0817 CB7F BIT 7,A 0819 20 03 JR NZ,L081E 081B FE 20 CP 20H 081D D0 RET NC 081E 81 L081E ADD A,C 081F CB7F BIT 7,A 0821 C0 RET NZ 0822 B7 OR A 0823 C8 RET Z 0824 CB7B BIT 7,E 0826 28 20 JR Z,L0848 0828 79 LD A,C 0829 83 ADD A,E 082A D5 PUSH DE 082B FE 21 CP 21H 082D 38 02 JR C,L0831 082F 3E 20 LD A,20H 0831 5F L0831 LD E,A 0832 16 00 LD D,00H 0834 D5 PUSH DE 0835 FDE1 POP IY 0837 D1 POP DE 0838 7B LD A,E 0839 D9 EXX 083A C5 PUSH BC 083B ED44 NEG 083D 4F LD C,A 083E 06 00 LD B,00H 0840 09 ADD HL,BC 0841 EB EX DE,HL 0842 09 ADD HL,BC 0843 EB EX DE,HL 0844 C1 POP BC 0845 D9 EXX 0846 18 1C JR L0864 0848 7B L0848 LD A,E 0849 81 ADD A,C 084A FE 1F CP 1FH 084C 28 0F JR Z,L085D 084E 38 0D JR C,L085D 0850 3E 20 LD A,20H 0852 93 SUB E 0853 D5 PUSH DE 0854 5F LD E,A 0855 16 00 LD D,00H 0857 D5 PUSH DE 0858 FDE1 POP IY 085A D1 POP DE 085B 18 07 JR L0864 085D C5 L085D PUSH BC 085E 06 00 LD B,00H 0860 C5 PUSH BC 0861 FDE1 POP IY 0863 C1 POP BC 0864 1E 00 L0864 LD E,00H 0866 7A L0866 LD A,D 0867 83 ADD A,E 0868 CB7F BIT 7,A 086A 20 17 JR NZ,L0885 086C FE 18 CP 18H 086E 30 13 JR NC,L0885 0870 C5 PUSH BC 0871 D5 PUSH DE 0872 D9 EXX 0873 C5 PUSH BC 0874 D5 PUSH DE 0875 E5 PUSH HL 0876 FDE5 PUSH IY 0878 CD 251C CALL _BlkWrtVRAM2 087B FDE1 POP IY 087D E1 POP HL 087E D1 POP DE 087F C1 POP BC 0880 D9 EXX 0881 D1 POP DE 0882 C1 POP BC 0883 D9 L0885 EXX 0884 C5 PUSH BC 0885 06 00 LD B,00H 0887 09 ADD HL,BC 0888 EB EX DE,HL 0889 0E 20 LD C,20H 088B 09 ADD HL,BC 088C EB EX DE,HL 088D C1 POP BC 088E D9 EXX 088F 1C INC E 0890 7B LD A,E 0891 B8 CP B 0892 20 D2 JR NZ,L0866 0894 C9 RET 0895 CD C008 L0898 CALL A08C0 0898 C5 PUSH BC 0899 06 00 LD B,00H 089B C5 PUSH BC 089C FDE1 POP IY 089E C1 POP BC 089F C5 L08A2 PUSH BC 08A0 D5 PUSH DE 08A1 E5 PUSH HL 08A2 FDE5 PUSH IY 08A4 3E 02 LD A,02H ; Name table 08A6 CD A31B CALL _BlkReadVRAM 08A9 FDE1 POP IY 08AB E1 POP HL 08AC D1 POP DE 08AD C1 POP BC 08AE C5 PUSH BC 08AF 06 00 LD B,00H 08B1 09 ADD HL,BC 08B2 0E 20 LD C,20H 08B4 EB EX DE,HL 08B5 09 ADD HL,BC 08B6 EB EX DE,HL 08B7 C1 POP BC 08B8 05 DEC B 08B9 20 E4 JR NZ,L08A2 08BB C9 RET 08BC FFFFFFFF DB O,O,O,O 08C0 E5 A08C0 PUSH HL 08C1 26 00 LD H,00H ; sign-extend D -> HL 08C3 CB7A BIT 7,D 08C5 28 01 JR Z,L08CB 08C7 25 DEC H 08C8 6A L08CB LD L,D 08C9 29 ADD HL,HL ; HL = D * 32 (signed multiply) 08CA 29 ADD HL,HL 08CB 29 ADD HL,HL 08CC 29 ADD HL,HL 08CD 29 ADD HL,HL 08CE 16 00 LD D,00H ; sign-extend E -> DE 08D0 CB7B BIT 7,E 08D2 28 01 JR Z,L08DB 08D4 15 DEC D 08D5 C3 5A00 L08DB JP L047C ; DE = (D * 32) + E (signed arithmetic) 08D8 1E E1 L0955 LD E,0E1H 08DA CD 1B07 CALL L08E0 08DD 21 2000 LD HL,0020H 08E0 09 L0999 ADD HL,BC 08E1 7D LD A,L 08E2 CD 0014 CALL L09D5 08E5 7E LD A,(HL) 08E6 F6 80 OR 80H 08E8 C3 5D07 JP L09FD 08EB FD2A 0680 L0A87 LD IY,(VDP_Temp) 08EF 3A C373 LD A,(VDP0Shad) ; Check for hi-res graphics 08F2 CB4F BIT 1,A 08F4 CBF8 SET 7,B 08F6 20 02 JR NZ,L0A98 ; Branch if so 08F8 CBB8 RES 7,B 08FA FD70 03 L0A98 LD (IY+03H),B 08FD E5 PUSH HL 08FE DD6E 02 LD L,(IX+02H) 0901 DD66 03 LD H,(IX+03H) 0904 7E LD A,(HL) 0905 FD77 04 LD (IY+04H),A 0908 EE 80 XOR 80H 090A 77 LD (HL),A 090B 23 INC HL 090C 5E LD E,(HL) 090D 7B LD A,E 090E E6 07 AND 07H 0910 ED44 NEG 0912 C6 08 ADD A,08H 0914 FD77 01 LD (IY+01H),A 0917 23 INC HL 0918 56 LD D,(HL) 0919 CD E807 CALL A07E8 091C FD73 11 LD (IY+11H),E 091F 23 INC HL 0920 5E LD E,(HL) 0921 7B LD A,E 0922 E6 07 AND 07H 0924 FD77 00 LD (IY+00H),A 0927 23 INC HL 0928 56 LD D,(HL) 0929 CD E807 CALL A07E8 092C FD73 12 LD (IY+12H),E 092F 2A 0680 LD HL,(VDP_Temp) 0932 11 1300 LD DE,0013H 0935 19 ADD HL,DE 0936 FD5E 11 LD E,(IY+11H) 0939 FD56 12 LD D,(IY+12H) 093C 01 0303 LD BC,0303H 093F CD 9508 CALL L0898 0942 DD5E 04 LD E,(IX+04H) 0945 DD56 05 LD D,(IX+05H) 0948 DD7E 06 LD A,(IX+06H) 094B DDE1 POP IX 094D FD2A 0680 LD IY,(VDP_Temp) 0951 FD77 05 LD (IY+05H),A 0954 D5 PUSH DE 0955 2A 0680 LD HL,(VDP_Temp) 0958 01 0600 LD BC,0006H 095B 09 ADD HL,BC 095C 0E 0B LD C,0BH 095E 7A LD A,D 095F FE 70 CP 70H 0961 30 05 JR NC,L0B07 0963 CD 3E1D CALL _ReadVRAM 0966 18 03 JR L0B0A 0968 EB L0B07 EX DE,HL 0969 EDB0 LDIR 096B 2A 0680 L0B0A LD HL,(VDP_Temp) 096E E5 PUSH HL 096F 11 1300 LD DE,0013H 0972 19 ADD HL,DE 0973 D9 EXX 0974 D1 POP DE 0975 21 0800 LD HL,0008H 0978 19 ADD HL,DE 0979 EB EX DE,HL 097A D9 EXX 097B FD2A 0680 LD IY,(VDP_Temp) 097F FD4E 05 LD C,(IY+05H) 0982 06 09 LD B,09H 0984 7E L0B25 LD A,(HL) 0985 91 SUB C 0986 FE 12 CP 12H 0988 30 0E JR NC,L0B39 098A FE 09 CP 09H 098C 38 02 JR C,L0B31 098E D6 09 SUB 09H 0990 D9 L0B31 EXX 0991 6F LD L,A 0992 26 00 LD H,00H 0994 19 ADD HL,DE 0995 7E LD A,(HL) 0996 D9 EXX 0997 77 LD (HL),A 0998 23 L0B39 INC HL 0999 10 E9 DJNZ L0B25 099B D1 POP DE 099C 2A 0680 LD HL,(VDP_Temp) 099F E5 PUSH HL 09A0 01 1100 LD BC,0011H 09A3 09 ADD HL,BC 09A4 0E 0B LD C,0BH 09A6 7A LD A,D 09A7 FE 70 CP 70H 09A9 30 04 JR NC,L0B51 09AB CD 011D CALL _WrtVRAM 09AE 11 DB 11H ; LD DE,n - skips LDIR instruction 09AF EDB0 L0B51 LDIR 09B1 D1 POP DE 09B2 DDE5 PUSH IX 09B4 21 1300 LD HL,0013H 09B7 19 ADD HL,DE 09B8 EB EX DE,HL 09B9 01 1400 LD BC,0014H 09BC 09 ADD HL,BC 09BD 06 09 LD B,09H 09BF 1A L0B64 LD A,(DE) 09C0 13 INC DE 09C1 D5 PUSH DE 09C2 11 0800 LD DE,0008H 09C5 19 ADD HL,DE 09C6 E5 PUSH HL 09C7 5F LD E,A ; LD D,00H 09C8 4F LD C,A 09C9 C5 PUSH BC 09CA 3E 09 LD A,09H 09CC 90 SUB B 09CD 42 LD B,D 09CE D6 03 L0B76 SUB 03H 09D0 38 03 JR C,L0B7D 09D2 04 INC B 09D3 18 F9 JR L0B76 09D5 78 L0B7D LD A,B 09D6 FD2A 0680 LD IY,(VDP_Temp) 09DA FD86 12 ADD A,(IY+12H) 09DD FDCB 03 7E BIT 7,(IY+03H) 09E1 20 1D JR NZ,L0BB8 09E3 3E 03 LD A,03H ; Pattern generator table 09E5 CD 751E CALL L1E92 ; LD IY,0001H / JP _BlkReadVRAM 09E8 C1 POP BC 09E9 2A 0680 LD HL,(VDP_Temp) 09EC C5 PUSH BC 09ED 11 8400 LD DE,0084H 09F0 19 ADD HL,DE 09F1 59 LD E,C 09F2 CB3B SRL E 09F4 CB3B SRL E 09F6 CB3B SRL E ; LD D,00H 09F8 3E 09 LD A,09H 09FA 90 SUB B 09FB 4F LD C,A 09FC 42 LD B,D 09FD 09 ADD HL,BC 09FE 18 18 JR L0BD6 0A00 CB2F L0BB8 SRA A 0A02 CB2F SRA A 0A04 CB2F SRA A 0A06 FE 03 CP 03H 0A08 30 11 JR NC,L0BD9 0A0A 57 LD D,A 0A0B D5 PUSH DE 0A0C E5 PUSH HL 0A0D 3E 03 LD A,03H ; Pattern generator table 0A0F CD 751E CALL L1E92 ; LD IY,0001H / JP _BlkReadVRAM 0A12 E1 POP HL 0A13 11 6800 LD DE,0068H 0A16 19 ADD HL,DE 0A17 D1 POP DE 0A18 CD 731E L0BD6 CALL L1E90 ; LD A,04H LD IY,0001H JP _BlkReadVRAM 0A1B C1 L0BD9 POP BC 0A1C E1 POP HL 0A1D D1 POP DE 0A1E 10 9F DJNZ L0B64 0A20 DDE1 POP IX 0A22 D9 EXX 0A23 DD5E 02 LD E,(IX+02H) 0A26 DD56 03 LD D,(IX+03H) 0A29 DD4E 04 LD C,(IX+04H) 0A2C DD46 05 LD B,(IX+05H) 0A2F D9 EXX 0A30 DDE5 PUSH IX 0A32 E1 POP HL 0A33 FD2A 0680 LD IY,(VDP_Temp) 0A37 FD7E 04 LD A,(IY+04H) 0A3A 87 ADD A,A 0A3B 4F LD C,A 0A3C 11 0600 LD DE,0006H 0A3F 42 LD B,D 0A40 19 ADD HL,DE 0A41 09 ADD HL,BC 0A42 5E LD E,(HL) 0A43 23 INC HL 0A44 56 LD D,(HL) 0A45 2A 0680 LD HL,(VDP_Temp) 0A48 01 7C00 LD BC,007CH 0A4B 09 ADD HL,BC 0A4C E5 PUSH HL 0A4D C5 PUSH BC 0A4E 0E 05 LD C,05H 0A50 7A LD A,D 0A51 FE 70 CP 70H 0A53 30 05 JR NC,L0C1A 0A55 CD 3E1D CALL _ReadVRAM 0A58 18 03 JR L0C1D 0A5A EB L0C1A EX DE,HL 0A5B EDB0 LDIR 0A5D FD2A 0680 L0C1D LD IY,(VDP_Temp) 0A61 C1 POP BC 0A62 FD09 ADD IY,BC 0A64 FD7E 04 LD A,(IY+04H) 0A67 FD2A 0680 LD IY,(VDP_Temp) 0A6B FD77 02 LD (IY+02H),A 0A6E D1 POP DE 0A6F 2A 0680 LD HL,(VDP_Temp) 0A72 01 6400 LD BC,0064H 0A75 09 ADD HL,BC 0A76 06 04 LD B,04H 0A78 1A L0C38 LD A,(DE) 0A79 DDBE 01 CP (IX+01H) 0A7C D5 PUSH DE 0A7D D9 EXX 0A7E 26 00 LD H,00H 0A80 30 12 JR NC,L0C55 0A82 87 ADD A,A 0A83 87 ADD A,A 0A84 87 ADD A,A 0A85 6F LD L,A 0A86 09 ADD HL,BC 0A87 E5 PUSH HL 0A88 D9 EXX 0A89 D1 POP DE 0A8A EB L0C7C EX DE,HL 0A8B C5 PUSH BC 0A8C 01 0800 LD BC,0008H 0A8F EDB0 LDIR 0A91 EB EX DE,HL 0A92 18 20 JR L0C84 0A94 DD96 01 L0C55 SUB (IX+01H) 0A97 87 ADD A,A 0A98 87 ADD A,A 0A99 87 ADD A,A 0A9A 6F LD L,A 0A9B 19 ADD HL,DE 0A9C E5 PUSH HL 0A9D D9 EXX 0A9E D1 POP DE 0A9F 7A LD A,D 0AA0 FE 70 CP 70H 0AA2 30 E6 JR NC,L0C7C 0AA4 C5 PUSH BC 0AA5 E5 PUSH HL 0AA6 D5 PUSH DE 0AA7 01 0800 LD BC,0008H 0AAA C5 PUSH BC 0AAB CD 3E1D CALL _ReadVRAM 0AAE C1 POP BC 0AAF E1 POP HL 0AB0 09 ADD HL,BC 0AB1 EB EX DE,HL 0AB2 E1 POP HL 0AB3 09 ADD HL,BC 0AB4 C1 L0C84 POP BC 0AB5 D1 POP DE 0AB6 13 INC DE 0AB7 10 BF DJNZ L0C38 0AB9 FD2A 0680 LD IY,(VDP_Temp) 0ABD ED5B 0680 LD DE,(VDP_Temp) 0AC1 21 1C00 LD HL,001CH 0AC4 19 ADD HL,DE 0AC5 FD4E 00 LD C,(IY+00H) 0AC8 06 00 LD B,00H 0ACA 09 ADD HL,BC 0ACB E5 PUSH HL 0ACC DDE1 POP IX 0ACE 21 6400 LD HL,0064H 0AD1 19 ADD HL,DE 0AD2 E5 PUSH HL 0AD3 3E 10 LD A,10H 0AD5 08 L0CA5 EX AF,AF' 0AD6 E1 POP HL 0AD7 56 LD D,(HL) 0AD8 23 INC HL 0AD9 E5 PUSH HL 0ADA 01 0F00 LD BC,000FH 0ADD 09 ADD HL,BC 0ADE 5E LD E,(HL) 0ADF EB EX DE,HL 0AE0 FD46 01 LD B,(IY+01H) 0AE3 AF XOR A 0AE4 05 L0CB4 DEC B ; cheap HL=HL< 169B 3C66060C 18001800 HEX 3C 66 06 0C 18 00 18 00 ; ? 16A3 3E63676B 6E603E00 HEX 3E 63 67 6B 6E 60 3E 00 ; @ 16AB 1C366363 7F636300 D16AB HEX 1C 36 63 63 7F 63 63 00 ; A 16B3 7E63637E 63637E00 HEX 7E 63 63 7E 63 63 7E 00 ; B 16BB 1E336060 60331E00 HEX 1E 33 60 60 60 33 1E 00 ; C 16C3 7C666363 63667C00 HEX 7C 66 63 63 63 66 7C 00 ; D 16CB 7F60607E 60607F00 HEX 7F 60 60 7E 60 60 7F 00 ; E 16D3 7F60607E 60606000 HEX 7F 60 60 7E 60 60 60 00 ; F 16DB 1F306067 63331F00 HEX 1F 30 60 67 63 33 1F 00 ; G 16E3 6363637F 63636300 HEX 63 63 63 7F 63 63 63 00 ; H 16EB 3F0C0C0C 0C0C3F00 HEX 3F 0C 0C 0C 0C 0C 3F 00 ; I 16F3 03030303 03633E00 HEX 03 03 03 03 03 63 3E 00 ; J 16FB 63666C78 7C6E6700 HEX 63 66 6C 78 7C 6E 67 00 ; K 1703 60606060 60607F00 HEX 60 60 60 60 60 60 7F 00 ; L 170B 63777F7F 6B636300 HEX 63 77 7F 7F 6B 63 63 00 ; M 1713 63737B7F 6F676300 HEX 63 73 7B 7F 6F 67 63 00 ; N 171B 3E636363 63633E00 HEX 3E 63 63 63 63 63 3E 00 ; O 1723 7E636363 7E606000 HEX 7E 63 63 63 7E 60 60 00 ; P 172B 3E636363 6F663D00 HEX 3E 63 63 63 6F 66 3D 00 ; Q 1733 7E636367 7C6E6700 HEX 7E 63 63 67 7C 6E 67 00 ; R 173B 3C66603E 03633E00 HEX 3C 66 60 3E 03 63 3E 00 ; S 1743 3F0C0C0C 0C0C0C00 HEX 3F 0C 0C 0C 0C 0C 0C 00 ; T 174B 63636363 63633E00 HEX 63 63 63 63 63 63 3E 00 ; U 1753 63636377 3E1C0800 HEX 63 63 63 77 3E 1C 08 00 ; V 175B 63636B7F 7F776300 HEX 63 63 6B 7F 7F 77 63 00 ; W 1763 63773E1C 3E776300 HEX 63 77 3E 1C 3E 77 63 00 ; X 176B 3333331E 0C0C0C00 HEX 33 33 33 1E 0C 0C 0C 00 ; Y 1773 7F070E1C 38707F00 HEX 7F 07 0E 1C 38 70 7F 00 ; Z 177B 1E181818 18181E00 HEX 1E 18 18 18 18 18 1E 00 ; [ 1783 00603018 0C060300 HEX 00 60 30 18 0C 06 03 00 ; \ 178B 3C0C0C0C 0C0C3C00 HEX 3C 0C 0C 0C 0C 0C 3C 00 ; ] 1793 081C3663 00000000 HEX 08 1C 36 63 00 00 00 00 ; ^ 179B 00000000 00007F00 HEX 00 00 00 00 00 00 7F 00 ; _ 17A3 18180C00 00000000 HEX 18 18 0C 00 00 00 00 00 ; ` 17AB 00003C06 3E663E00 HEX 00 00 3C 06 3E 66 3E 00 ; a 17B3 60607C66 66667C00 HEX 60 60 7C 66 66 66 7C 00 ; b 17BB 00003C66 60663C00 HEX 00 00 3C 66 60 66 3C 00 ; c 17C3 06063E66 66663E00 HEX 06 06 3E 66 66 66 3E 00 ; d 17CB 00003C66 7E603C00 HEX 00 00 3C 66 7E 60 3C 00 ; e 17D3 1C363078 30303000 HEX 1C 36 30 78 30 30 30 00 ; f 17DB 00003E66 663E063C HEX 00 00 3E 66 66 3E 06 3C ; g 17E3 60607C66 66666600 HEX 60 60 7C 66 66 66 66 00 ; h 17EB 18003818 18183C00 HEX 18 00 38 18 18 18 3C 00 ; i 17F3 06000E06 06663C00 HEX 06 00 0E 06 06 66 3C 00 ; j 17FB 6060666C 786C6600 HEX 60 60 66 6C 78 6C 66 00 ; k 1803 38181818 18183C00 HEX 38 18 18 18 18 18 3C 00 ; l 180B 0000767F 6B636300 HEX 00 00 76 7F 6B 63 63 00 ; m 1813 00007C66 66666600 HEX 00 00 7C 66 66 66 66 00 ; n 181B 00003C66 66663C00 HEX 00 00 3C 66 66 66 3C 00 ; o 1823 00007C66 667C6060 HEX 00 00 7C 66 66 7C 60 60 ; p 182B 00003E66 663E0603 HEX 00 00 3E 66 66 3E 06 03 ; q 1833 00007C66 60606000 HEX 00 00 7C 66 60 60 60 00 ; r 183B 00003E60 3C067C00 HEX 00 00 3E 60 3C 06 7C 00 ; s 1843 00183C18 18180C00 HEX 00 18 3C 18 18 18 0C 00 ; t 184B 00006666 66663E00 HEX 00 00 66 66 66 66 3E 00 ; u 1853 00006666 663C1800 HEX 00 00 66 66 66 3C 18 00 ; v 185B 00006363 6B7F3600 HEX 00 00 63 63 6B 7F 36 00 ; w 1863 0000663C 183C6600 HEX 00 00 66 3C 18 3C 66 00 ; x 186B 00006666 663E067C HEX 00 00 66 66 66 3E 06 7C ; y 1873 00007E0C 18307E00 HEX 00 00 7E 0C 18 30 7E 00 ; z 187B 0C181830 18180C00 HEX 0C 18 18 30 18 18 0C 00 ; { 1883 18181800 18181800 HEX 18 18 18 00 18 18 18 00 ; | 188B 3018180C 18183000 HEX 30 18 18 0C 18 18 30 00 ; } 1893 305A0C00 00000000 HEX 30 5A 0C 00 00 00 00 00 ; ~ 189B 54285428 54285400 HEX 54 28 54 28 54 28 54 00 ; del ; Character cell to font data mapping for COLECOVISION 18A3 01020E0F 08091213 A18A3 HEX 01 02 0E 0F 08 09 12 13 ; CV 18AB 03040E0F 05140000 HEX 03 04 0E 0F 05 14 00 00 ; OI 18B3 05001011 0A0B1516 HEX 05 00 10 11 0A 0B 15 16 ; LS 18BB 06071011 05140000 HEX 06 07 10 11 05 14 00 00 ; EI 18C3 01020E0F 03040E0F HEX 01 02 0E 0F 03 04 0E 0F ; CO 18CB 03040E0F 0C0D1718 HEX 03 04 0E 0F 0C 0D 17 18 ; ON 18D3 FF HEX FF ; end of list ;*************************************** ; 1F82 FillVRAM ; ; Fills a block of VRAM with the same byte ; ; ENTRY HL = start VRAM address ; DE = count ; A = fill byte ; EXIT AF, C, DE destroyed ;*************************************** 18D4 A18D4 18D4 4F _FillVRAM LD C,A ; Save fill byte 18D5 7D LD A,L ; Output low byte of VRAM address 18D6 D3 BF OUT (IO_VDP_Addr),A 18D8 7C LD A,H ; Output high byte of VRAM address 18D9 F6 40 OR 40H ; set "this is an address" bit 18DB D3 BF OUT (IO_VDP_Addr),A 18DD 79 L18DD LD A,C ; Get back fill byte (and delay?) 18DE D3 BE OUT (IO_VDP_Data),A ; Store data byte 18E0 1B DEC DE ; Decrement count 18E1 7A LD A,D 18E2 B3 OR E 18E3 20 F8 JR NZ,L18DD ; Store bytes until done 18E5 C3 571D JP _VDP_Status ; Read VDP status register 18E8 FF DB O ;*************************************** ; 1F85 InitVDP ; ; Initialize the VDP chip ;*************************************** 18E9 A18E9 18E9 01 0000 _InitVDP LD BC,0000H ; Register 0: half-text 32x24 mode 18EC CD CA1C CALL _WriteReg 18EF 01 8001 LD BC,0180H ; Reg 1, 32x24 mode, 16K DRAM, blank 18F2 CD CA1C CALL _WriteReg 18F5 00 NOP 18F6 00 NOP 18F7 A18F7 ; (called by Tomarc the Barbarian) 18F7 3E 03 LD A,03H ; Pattern generator table 18F9 21 0000 LD HL,0000H ; VRAM address 0000H 18FC CD 1D1B CALL _BaseLoad 18FF 3E 02 LD A,02H ; Name table (display) 1901 21 0018 LD HL,1800H ; VRAM address 1800H 1904 CD 1D1B CALL _BaseLoad 1907 AF XOR A ; Sprite attribute table 1908 21 001B LD HL,1B00H ; VRAM address 1B00H 190B CD 1D1B CALL _BaseLoad 190E 3E 04 LD A,04H ; Color table 1910 21 0020 LD HL,2000H ; VRAM address 2000H 1913 CD 1D1B CALL _BaseLoad 1916 3E 01 LD A,01H ; Sprite pattern generator = 191A D1AC5 EQU $+2 ; DB '8' 1918 21 0038 LD HL,3800H ; VRAM address 3800H 191B CD 1D1B CALL _BaseLoad 191E 01 0007 LD BC,0700H ; Reg 7 (FG/BG color), set both to 0 1921 C3 CA1C JP _WriteReg ;*************************************** ; 1F7F InitFont ; ; Initialize pattern generator (font) table ;*************************************** 1924 21 8B15 _InitFont LD HL,A158B ; Point to main ASCII bitmaps 1927 11 1D00 LD DE,001DH ; First character code = 1DH 192A FD21 6300 LD IY,0063H ; bug fixed (was 0060) 192E CD 451C CALL _BlkWrtVRAM3 ; Pattern generator table 1931 21 A315 LD HL,A15A3 ; Point to blank bitmap 1934 11 0000 LD DE,0000H ; First character code = 00H 1937 3E 03 _BlkWrtVRAM31 LD A,03H ; Pattern generator table 1939 C3 851E JP L1EA7 ; LD IY,0001H / JP _BlkWrtVRAM ;*************************************** ; ; Search for '/' character in text pointed to by HL. ; ; ENTRY HL points to text ; ; EXIT: HL points to '/' character ; BC = number of bytes before '/' character ; ;*************************************** 193C 01 0000 L1946 LD BC,0000H ; Initialize count to zero 193F 7E L1949 LD A,(HL) ; Get next byte 1940 FE 2F CP '/' ; Return if '/' character 1942 C8 RET Z 1943 23 INC HL ; Point to next byte 1944 03 INC BC ; Increment count 1945 18 F8 JR L1949 ; Go back for more ;*************************************** ; ; Center a line of text on the screen. ; ; ENTRY BC = length of text ; DE = pointer to text ; HL = screen position at left end of line ; ;*************************************** 1947 C5 L1951 PUSH BC ; Move BC to IY (count) 1948 FDE1 POP IY 194A 3E 20 LD A,20H ; A = (20H - C) / 2 194C 99 SBC A,C ; (centering offset) 194D 1F RRA 194E 06 00 LD B,00H 1950 4F LD C,A 1951 09 ADD HL,BC ; HL = HL + BC 1952 EB EX DE,HL ; HL = text ptr, DE = scrn position 1953 C3 251C JP _BlkWrtVRAM2 ; LD A,02H / JP _BlkWrtVRAM ;*************************************** ; ; Delay routines ; ; 1968 is the infamous "seven second delay" and is apparently ; not called elsewhere in the ROM and shouldn't be called by ; "well behaved" cartridges. Which means that it would be safe ; to change, except that some Xonox cartridges call it. However, ; shortening the delay would probably make some of those games ; more playable, so we can change it in the name of humanity. ; ; 196B delays using a count in the HL register. The delay is ; approximately H/3 seconds. ; ;*************************************** ;A1968 LD HL,1700H ; Too long ;A196B LD DE,00FFH ; Load inner loop count ;L196E DEC DE ; LD A,D ; OR E ; JR NZ,L196E ; DEC HL ; LD A,H ; OR L ; JR NZ,A196B ; RET ; This replacement is based on Kev's patch. Every outer loop it checks ; both left fire buttons and aborts the delay loop if either is pressed. ; ; The main difference is that I save the AF and BC registers on the ; assumption that anyone "byte-fisted" enough to call the ROM instead of ; spending a few bytes to write his own might also expect it not to mess ; with the A register or B register. ; ; The other side-effect of this replacement delay routine is that the ; joystick ports are left in stick mode, but this is probably okay. 1956 28 0D L196C JR Z,L1978 ; exit if pressed 1958 11 E800 LD DE,00E8H ; load inner loop counter (about 10% less) 195B 1B L196E DEC DE ; do inner loop 195C 7A LD A,D 195D B3 OR E 195E 20 FB JR NZ,L196E 1960 2B DEC HL ; do outer loop 1961 7C LD A,H 1962 B5 OR L 1963 20 08 JR NZ,L196B 1965 C1 L1978 POP BC ; restore regs & return 1966 F1 POP AF 1967 C9 RET 1968 21 0017 A1968 LD HL,1700H ; startup screen delay timer 196B F5 A196B PUSH AF ; original routine didn't mess with A or B! 196C C5 PUSH BC 196D D3 C0 L196B OUT (0C0H),A ; select left fire/stick mode 196F DB FC IN A,(0FCH) ; read left fire button 1971 47 LD B,A 1972 DB FF IN A,(0FFH) ; read right fire button 1974 A0 AND B ; OR the two sticks together 1975 E6 40 AND 40H ; mask out the fire button bit 1977 18 DD JR L196C ;*************************************** ; 1F7C SkillScrn ; ; Displays the skill select screen and returns ;*************************************** 1979 A1979 1979 CD CF07 _SkillScrn CALL InitScrn ; Clear VRAM and initialize the VDP 197C 01 040F LD BC,0F04H ; Reg 0FH (FG/BG color), value = 4 197F CD CA1C CALL _WriteReg ; write it 1982 21 C519 LD HL,Skill_Msgs ; Put up skill screen messages 1985 CD 661A CALL ScrnMsgs 1988 2A FA73 LD HL,(ClrTabShad) ; Get color table VRAM addr 198B 11 2000 LD DE,0020H ; 32 bytes 198E 3E F4 LD A,0F4H ; Fill with F4H 1990 CD D418 CALL _FillVRAM ; fill it 1993 01 C001 LD BC,01C0H ; Unblank the screen 1996 C3 CA1C JP _WriteReg = 199C D1AC9 EQU $+3 ; DB 'S' 1999 544F2053 454C4543 D1A7C DB 'TO SELECT GAME OPTION,' 19A1 54204741 4D45204F 19A9 5054494F 4E2C 19AF 31203D20 534B494C D1AA9 DB '1 = SKILL 1/ONE PLAYER' 19B7 4C20312F 4F4E4520 19BF 504C4159 4552 ; HL=msg,IY=len,DE=scrn 19C5 99192558 Skill_Msgs DW D1A7C,22*1024+0025H ; 'TO SELECT GAME OPTION,' 19C9 2314655C DW D1A92,23*1024+0065H ; 'PRESS BUTTON ON KEYPAD.' 19CD AF19C558 DW D1AA9,22*1024+00C5H ; '1 = SKILL 1/ONE PLAYER' 19D1 AF190559 DW D1AA9,22*1024+0105H ; '1 = SKILL 1/ONE PLAYER' 19D5 AF194559 DW D1AA9,22*1024+0145H ; '1 = SKILL 1/ONE PLAYER' 19D9 AF198559 DW D1AA9,22*1024+0185H ; '1 = SKILL 1/ONE PLAYER' 19DD AF19E559 DW D1AA9,22*1024+01E5H ; '1 = SKILL 1/ONE PLAYER' 19E1 AF19255A DW D1AA9,22*1024+0225H ; '1 = SKILL 1/ONE PLAYER' 19E5 AF19655A DW D1AA9,22*1024+0265H ; '1 = SKILL 1/ONE PLAYER' 19E9 AF19A55A DW D1AA9,22*1024+02A5H ; '1 = SKILL 1/ONE PLAYER' 19ED 8B000505 DW D1ABF,01*1024+0105H ; '2' 19F1 83004505 DW D1AC0,01*1024+0145H ; '3' 19F5 BA1A8505 DW D1AC1,01*1024+0185H ; '4' 19F9 C412E505 DW D1AC2,01*1024+01E5H ; '5' 19FD 45012506 DW D1AC3,01*1024+0225H ; '6' 1A01 54006506 DW D1AC4,01*1024+0265H ; '7' 1A05 1A19A506 DW D1AC5,01*1024+02A5H ; '8' 1A09 8B000F05 DW D1ABF,01*1024+010FH ; '2' 1A0D 83004F05 DW D1AC0,01*1024+014FH ; '3' 1A11 BA1A8F05 DW D1AC1,01*1024+018FH ; '4' 1A15 FD02F10D DW D1AC6,03*1024+01F1H ; 'TWO' 1A19 FD02310E DW D1AC6,03*1024+0231H ; 'TWO' 1A1D FD02710E DW D1AC6,03*1024+0271H ; 'TWO' 1A21 FD02B10E DW D1AC6,03*1024+02B1H ; 'TWO' 1A25 8B002F06 DW D1ABF,01*1024+022FH ; '2' 1A29 83006F06 DW D1AC0,01*1024+026FH ; '3' 1A2D BA1AAF06 DW D1AC1,01*1024+02AFH ; '4' 1A31 9C19FB05 DW D1AC9,01*1024+01FBH ; 'S' 1A35 9C193B06 DW D1AC9,01*1024+023BH ; 'S' 1A39 9C197B06 DW D1AC9,01*1024+027BH ; 'S' 1A3D 9C19BB06 DW D1AC9,01*1024+02BBH ; 'S' 1A41 0000 DW 0 ; End of table ;*************************************** ; Put up the "no cartridge" message ;*************************************** 1A43 21 581A L13FF LD HL,No_Cart_Msgs ; Put up "TURN GAME OFF" messages 1A46 CD 661A CALL ScrnMsgs 1A49 21 008A LD HL,8A00H ; Wait a long time for the user to see 1A4C CD 6B19 CALL A196B 1A4F 01 8001 LD BC,0180H ; Then blank the screen 1A52 CD CA1C CALL _WriteReg 1A55 18 FE L1439 JR L1439 ; and go to sleep 1A57 00 NOP ; to allow for patching ; HL=msg,IY=len,DE=scrn 1A58 7914AA35 No_Cart_Msgs DW D1479,13*1024+01AAH ; 'TURN GAME OFF' 1A5C 8614E469 DW D1486,26*1024+01E4H ; 'BEFORE INSERTING CARTRIDGE' 1A60 A0142752 DW D14A0,20*1024+0227H ; 'OR EXPANSION MODULE.' 1A64 0000 DW 0 ; End of table ;*************************************** ; Display a bunch of text all over the screen ; ; ENTRY: HL=table pointer ; EXIT: BC=0 ; ; The table is a bunch of 4-byte entries: ; 0-1 address of message text data ; 2 low byte of screen address ; 3 high byte of screen address in low 2 bits ; message text length in high 6 bits ;*************************************** 1A66 4E ScrnMsgs LD C,(HL) ; Get message address to BC 1A67 23 INC HL 1A68 46 LD B,(HL) 1A69 23 INC HL 1A6A 79 LD A,C ; Test for end of table 1A6B B0 OR B 1A6C C8 RET Z 1A6D 5E LD E,(HL) ; Get display address to DE 1A6E 23 INC HL 1A6F 7E LD A,(HL) 1A70 E6 03 AND 03H 1A72 57 LD D,A 1A73 7E LD A,(HL) ; Get message length to A 1A74 23 INC HL 1A75 0F RRCA 1A76 0F RRCA 1A77 E6 3F AND 3FH 1A79 C5 PUSH BC ; Save message address 1A7A E3 EX (SP),HL ; Msg addr to HL, save table pointer 1A7B 4F LD C,A ; Move message length to IY 1A7C 06 00 LD B,0 1A7E C5 PUSH BC 1A7F FDE1 POP IY 1A81 CD 251C CALL _BlkWrtVRAM2 ; LD A,02H/JP _BlkWrtVRAM 1A84 E1 POP HL ; Recover table pointer 1A85 18 DF JR ScrnMsgs ; Loop for next message ;*************************************** ; 1FAF ; ; Parameter block version of 1FE5 ; ; Parm 1 (byte) = ? ; Parm 2 (lit) = ? ;*************************************** 1A87 01 1B00 L0655 LD BC,D064F 1A8A 11 BA73 LD DE,ParmArea 1A8D CD 9400 CALL PCopy 1A90 3A BA73 LD A,(ParmArea) 1A93 2A BB73 LD HL,(ParmArea+1) ;*************************************** ; 1FE5 ; ; ENTRY A = ? ; HL = ? ;*************************************** 1A96 32 CA73 L0664 LD (73CAH),A 1A99 AF XOR A ; LD (73CBH),A 1A9A 32 CC73 LD (73CCH),A 1A9D 22 D173 LD (73D1H),HL ; LD (73CDH),HL 1AA0 22 CF73 LD (73CFH),HL 1AA3 C3 0F06 JP L0669 ;*************************************** ; 1F88 ReadSpinner ; ; This was included to support the "spinner" control that ; was originally planned to be in the regular controllers. ; It was later included in the Super Action controllers. ; Early versions of the controller circuit board even have ; circuit traces and holes for the spinner parts. ; ; Apparently the 20H bit is a direction bit, and the 10H ; bit is a "pulse" bit. ;*************************************** 1AA6 21 EB73 _ReadSpinner LD HL,PulseCnt1 ; Point to first pulse counter 1AA9 DB FC IN A,(IO_Joy1) ; Read joystick 1 1AAB CD B11A CALL L117D ; Do first pulse counter 1AAE 23 INC HL ; Point to second pulse counter 1AAF DB FF IN A,(IO_Joy2) ; Read joystick 2 1AB1 CB67 L117D BIT 4,A ; Test 10H bit 1AB3 C0 RET NZ ; Return if set (no pulse) 1AB4 CB6F L1182 BIT 5,A ; Test 20H bit 1AB6 20 02 JR NZ,L1189 ; Inc counter if set 1AB8 35 DEC (HL) ; Dec counter if clear 1AB9 C9 RET 1ABA D1AC1 ; DB '4' 1ABA 34 L1189 INC (HL) 1ABB C9 RET ;*************************************** ; 1FE8 ; ; ;*************************************** 1ABC 3A C673 L0679 LD A,(D73C6) 1ABF F5 PUSH AF 1AC0 AF XOR A 1AC1 32 C673 LD (D73C6),A 1AC4 3A CC73 L0682 LD A,(73CCH) 1AC7 21 CB73 LD HL,73CBH 1ACA BE CP (HL) 1ACB 28 2D JR Z,L06BC 1ACD 2A CF73 LD HL,(73CFH) 1AD0 5E LD E,(HL) 1AD1 23 INC HL 1AD2 56 LD D,(HL) 1AD3 23 INC HL 1AD4 46 LD B,(HL) 1AD5 23 INC HL 1AD6 D5 PUSH DE 1AD7 DDE1 POP IX 1AD9 E5 PUSH HL 1ADA CD 1606 CALL L06E3 1ADD 3A CC73 LD A,(73CCH) 1AE0 3C INC A 1AE1 21 CA73 LD HL,73CAH 1AE4 BE CP (HL) 1AE5 20 0A JR NZ,L06B3 1AE7 AF XOR A 1AE8 2A D173 LD HL,(73D1H) 1AEB 22 CF73 LD (73CFH),HL 1AEE E1 POP HL 1AEF 18 04 JR L06B9 1AF1 E1 L06B3 POP HL 1AF2 22 CF73 LD (73CFH),HL 1AF5 32 CC73 L06B9 LD (73CCH),A 1AF8 18 CA JR L0682 1AFA F1 L06BC POP AF 1AFB 32 C673 LD (D73C6),A 1AFE C9 RET 1AFF FFFFFFFF FFFFFFFF DB O,O,O,O,O,O,O,O,O,O 1B07 FFFF 1B09 FFFFFFFF FF DB O,O,O,O,O ;*************************************** ; 1F8B PBaseLoad ; ; Parameter block version of 1FB8 ; ; P1 (byte) = base register code ; P2 (word) = raw unshifted VRAM address ;*************************************** 1B0E 01 0B00 _PBaseLoad LD BC,P_BaseLoad 1B11 11 BA73 LD DE,ParmArea 1B14 CD 9400 CALL PCopy 1B17 3A BA73 LD A,(ParmArea) 1B1A 2A BB73 LD HL,(ParmArea+1) ;*************************************** ; 1FB8 BaseLoad ; ; This routine loads a VDP base register with the ; specified base address. The base address is stored ; in one of the shadow registers at 73F2. ; ; ENTRY A = base register code ; HL = raw unshifted VRAM address ;*************************************** 1B1D A1B1D 1B1D 4F _BaseLoad LD C,A ; VDP register code to BC 1B1E 06 00 LD B,00H 1B20 DD21 F273 LD IX,VDPBaseShad 1B24 DD09 ADD IX,BC ; Index into shadow address table 1B26 DD09 ADD IX,BC 1B28 DD75 00 LD (IX+00H),L ; Store shadow copy of base address 1B2B DD74 01 LD (IX+01H),H 1B2E 3A C373 LD A,(VDP0Shad) ; Get current graphics mode 1B31 CB4F BIT 1,A 1B33 28 21 JR Z,L1B5C ; If not in hi-res graphics, go shift 1B35 79 LD A,C 1B36 FE 03 CP 03H ; Special handling for pattern gen 1B38 28 10 JR Z,L1B40 1B3A FE 04 CP 04H ; and color tables 1B3C 20 18 JR NZ,L1B5C ; Else branch to go shift ; Set color table base address in hi-res graphics mode 1B3E 06 03 LD B,03H ; VDP register 3 = color table 1B40 7D LD A,L ; If VRAM addr = 0, 1B41 B4 OR H 1B42 0E 7F LD C,7FH ; set base register to 7FH (1FC0H) 1B44 28 26 JR Z,L1B72 1B46 0E FF LD C,0FFH ; Else set it to FFH (3FC0H) 1B48 18 22 JR L1B72 ; Set pattern generator base address in hi-res graphics mode 1B4A 06 04 L1B40 LD B,04H ; VDP register 4 = pattern generator 1B4C 7D LD A,L ; If VRAM addr = 0, 1B4D B4 OR H 1B4E 0E 03 LD C,03H ; set base register to 03H (1800H) 1B50 28 1A JR Z,L1B72 1B52 0E 07 LD C,07H ; Else set it to 07H (3800H) 1B54 18 16 JR L1B72 1B56 FD21 6F1B L1B5C LD IY,D1B76 ; Get address of shift table 1B5A FD09 ADD IY,BC ; Index into it 1B5C FD09 ADD IY,BC 1B5E FD7E 00 LD A,(IY+00H) ; Get shift count 1B61 FD46 01 LD B,(IY+01H) ; Get VDP register number 1B64 CB3C L1B6A SRL H ; Shift the base address right 1B66 CB1D RR L ; to adjust for VDP register 1B68 3D DEC A 1B69 20 F9 JR NZ,L1B6A 1B6B 4D LD C,L ; Get shifted VDP register data 1B6C C3 CA1C L1B72 JP _WriteReg ; Write it to the VDP chip ; Shift table for VDP base addresses (shift, reg num) 1B6F 0705 D1B76 DB 7,5 ; 0 = Sprite attribute table 1B71 0B06 DB 11,6 ; 1 = Sprite pattern generator 1B73 0A02 DB 10,2 ; 2 = Name table 1B75 0B04 DB 11,4 ; 3 = Pattern generator 1B77 0603 DB 6,3 ; 4 = Color table ; ReadVRAM with the bug fixed 1B79 79 XReadVRAM LD A,C ; no bug if C=00H 1B7A B7 OR A 1B7B 28 01 JR Z,XReadVRAM_a 1B7D 04 INC B ; else account for the missing page 1B7E C3 E21F XReadVRAM_a JP ReadVRAM ;*************************************** ; 1F8E PBlkReadVRAM ; ; Parameter block version of 1FBB ; ; Parm 1 (byte) = VDP table number (0-4) ; Parm 2 (byte) = VDP table index LSB ; Parm 3 (byte) = VDP table index MSB ; Parm 4 (lit) = pointer to data buffer ; Parm 5 (word) = VDP table entry count ;*************************************** 1B81 P_BlkReadVRAM 1B81 05 P_BlkWrtVRAM DB 5 1B82 01000100 0100FEFF DW 1,1,1,-2,2 1B8A 0200 1B8C 01 811B _PBlkReadVRAM LD BC,P_BlkReadVRAM 1B8F 11 BA73 LD DE,ParmArea 1B92 CD 9400 CALL PCopy 1B95 3A BA73 LD A,(ParmArea) 1B98 ED5B BB73 LD DE,(ParmArea+1) 1B9C FD2A BF73 LD IY,(ParmArea+5) 1BA0 2A BD73 LD HL,(ParmArea+3) ;*************************************** ; 1FBB BlkReadVRAM ; ; ENTRY A = VDP table number (0-4) ; DE = VDP table index ; HL points to data buffer ; IY = VDP table entry count ;*************************************** 1BA3 A1BA3 1BA3 CD AA1B _BlkReadVRAM CALL VRAM_Index 1BA6 18 D1 JR XReadVRAM 1BA8 FFFF DB O,O ;*************************************** ; VRAM_Index ; ; This routine returns the actual VRAM address and size ; of a block of VDP table entries. ; ; ENTRY DE = VDP table index ; IY = number of VDP table entries ; A = VDP table number (0-4) ; ; EXIT: BC = number of bytes to move to VRAM ; DE = VRAM address ; HL register is not changed ;*************************************** 1BAA A1BAA 1BAA FD22 FE73 VRAM_Index LD (D73FE),IY ; Save byte count 1BAE DD21 F273 LD IX,VDPBaseShad ; VDP base addr shadow array 1BB2 4F LD C,A ; BC = VRAM table index 1BB3 06 00 LD B,00H 1BB5 FE 04 CP 04H ; Check if color table 1BB7 20 07 JR NZ,L1BC0 1BB9 3A C373 LD A,(VDP0Shad) ; Yes, check for hi-res graphics 1BBC CB4F BIT 1,A ; Don't shift color table unless 1BBE 28 2A JR Z,L1BEC ; using hi-res graphics 1BC0 FD21 FD1B L1BC0 LD IY,D1BFF ; Point to shift table 1BC4 FD09 ADD IY,BC ; Index into shift table 1BC6 FD7E 00 LD A,(IY+00H) ; Get shift value 1BC9 B7 OR A 1BCA 28 1E JR Z,L1BEC ; Branch if no shift 1BCC CB23 L1BCD SLA E ; Shift VRAM offset 1BCE CB12 RL D 1BD0 3D DEC A 1BD1 20 F9 JR NZ,L1BCD ; until done 1BD3 C5 PUSH BC ; Save VRAM table index 1BD4 ED4B FE73 LD BC,(D73FE) ; Get original byte count 1BD8 FD7E 00 LD A,(IY+00H) ; Get shift value 1BDB B7 OR A 1BDC 28 0B JR Z,L1BEB ; Branch if no shift 1BDE CB21 L1BE0 SLA C ; Shift byte count 1BE0 CB10 RL B 1BE2 3D DEC A 1BE3 20 F9 JR NZ,L1BE0 ; until done 1BE5 ED43 FE73 LD (D73FE),BC ; Save shifted byte count 1BE9 C1 L1BEB POP BC ; Get back VRAM table index 1BEA E5 L1BEC PUSH HL ; Save HL 1BEB DD09 ADD IX,BC ; Index into base addr shadow array 1BED DD09 ADD IX,BC 1BEF DD6E 00 LD L,(IX+00H) ; Get base VRAM address from shadow 1BF2 DD66 01 LD H,(IX+01H) 1BF5 19 ADD HL,DE ; Add shifted offset to base addr 1BF6 EB EX DE,HL ; Put VRAM address in DE 1BF7 E1 POP HL ; Restore HL 1BF8 ED4B FE73 LD BC,(D73FE) ; Get byte count 1BFC C9 RET ; Shift table for indexes into VDP tables (1, 4, or 8 bytes per entry) 1BFD 02 D1BFF DB 2 ; 0 = Sprite attribute table 1BFE 03 DB 3 ; 1 = Sprite pattern generator table 1BFF 00 DB 0 ; 2 = Name table 1C00 03 DB 3 ; 3 = Pattern generator table 1C01 03 DB 3 ; 4 = Color table ; Copy high 4 bits of (HL) into low 4 bits of (HL) 1C02 7E L01A6 LD A,(HL) 1C03 E6 F0 AND 0F0H 1C05 47 LD B,A 1C06 0F RRCA 1C07 0F RRCA 1C08 0F RRCA 1C09 0F RRCA 1C0A B0 OR B 1C0B 77 LD (HL),A 1C0C C9 RET ;*************************************** ; 1F91 PBlkWrtVRAM ; ; Parameter block version of 1FBE ; ; Parm 1 (byte) = VDP table number (0-4) ; Parm 2 (byte) = VDP table index LSB ; Parm 3 (byte) = VDP table index MSB ; Parm 4 (lit) = pointer to data to be written ; Parm 5 (word) = VDP table entry count ;*************************************** 1C0D 01 811B _PBlkWrtVRAM LD BC,P_BlkWrtVRAM 1C10 11 BA73 LD DE,ParmArea 1C13 CD 9400 CALL PCopy 1C16 3A BA73 LD A,(ParmArea) 1C19 ED5B BB73 LD DE,(ParmArea+1) 1C1D FD2A BF73 LD IY,(ParmArea+5) 1C21 2A BD73 LD HL,(ParmArea+3) 1C24 01 DB 01H ; LD BC,nnnn 1C25 3E 02 _BlkWrtVRAM2 LD A,02H ; name table (character cells) ;*************************************** ; 1FBE BlkWrtVRAM ; ; ENTRY A = VDP table number (0-4) ; DE = VDP table index ; HL points to data to be written ; IY = VDP table entry count ; 73C7H = 01H to write to RAM sprite attr table ;*************************************** 1C27 A1C27 1C27 F5 _BlkWrtVRAM PUSH AF ; Save VDP table number 1C28 B7 OR A ; If not sprite attribute table, 1C29 20 23 JR NZ,L1C4E ; always write to the VDP 1C2B 3A C773 LD A,(WrtRAMSprt) ; Check RAM sprite attr table flag 1C2E 3D DEC A 1C2F 20 1D JR NZ,L1C4E ; Write to VDP if not 01H 1C31 E3 EX (SP),HL ; Clean up stack and save data pointer 1C32 2A 0280 LD HL,(RamSprtTab) ; Get pointer at 8002H 1C35 19 ADD HL,DE ; DE*4 = sprite table 1C36 19 ADD HL,DE 1C37 19 ADD HL,DE 1C38 19 ADD HL,DE ; dest addr = (8002H) + DE 1C39 EB EX DE,HL 1C3A FDE5 PUSH IY ; BC = table entry count 1C3C C1 POP BC 1C3D CB21 SLA C ; C = C * 4 for sprite table 1C3F CB21 SLA C ; I hope BC was <= 3FH! 1C41 E1 POP HL ; Restore (source) data pointer 1C42 EDB0 LDIR ; Copy it 1C44 C9 RET 1C45 3E 03 _BlkWrtVRAM3 LD A,03H ; Pattern generator table 1C47 01 DB 01H ; LD BC,nnnn 1C48 3E 04 _BlkWrtVRAM4 LD A,04H ; Color table 1C4A 18 DB JR _BlkWrtVRAM 1C4C FFFF DB O,O 1C4E F1 L1C4E POP AF ; Restore VDP table number 1C4F A1C4F ; (Called by Aquattack) 1C4F CD AA1B CALL VRAM_Index ; Adjust for VDP table size 1C52 18 18 JR XWrtVRAM ; Write the data to VRAM ;*************************************** ; 1F94 PInitRAMSprt ; ; Parameter block version of 1FC1 ; ; Parm 1 (byte) = number of sprites ;*************************************** 1C54 01 0500 _PInitRAMSprt LD BC,P_InitRAMSprt 1C57 11 BA73 LD DE,ParmArea 1C5A CD 9400 CALL PCopy 1C5D 3A BA73 LD A,(ParmArea) ;*************************************** ; 1FC1 InitRAMSprt ; ; This routine initializes the RAM sprite index table ; pointed to by 8004H with values from 00H to A-1 ; ; ENTRY A = number of sprites ;*************************************** 1C60 47 _InitRAMSprt LD B,A ; B = count 1C61 AF XOR A ; Init fill to zero 1C62 2A 0480 LD HL,(RAMSprtIdx) ; Get pointer to RAM sprite index table 1C65 77 L1C6B LD (HL),A ; Initialize array entry 1C66 23 INC HL ; Increment array pointer 1C67 3C INC A ; Increment fill value 1C68 B8 CP B ; Go back until done 1C69 20 FA JR NZ,L1C6B 1C6B C9 RET ; WrtVRAM with the bug fixed 1C6C 79 XWrtVRAM LD A,C ; no bug if C=00H 1C6D B7 OR A 1C6E 28 01 JR Z,XWrtVRAM_a 1C70 04 INC B ; else account for the missing page 1C71 C3 011D XWrtVRAM_a JP _WrtVRAM 1C74 FFFF DB O,O ;*************************************** ; 1F97 PCopyRAMSprt ; ; Parameter block version of 1FC4 ; ; Parm 1 (byte) = number of sprites ;*************************************** 1C76 01 0500 _PCopyRAMSprt LD BC,P_CopyRAMSprt 1C79 11 BA73 LD DE,ParmArea 1C7C CD 9400 CALL PCopy 1C7F 3A BA73 LD A,(ParmArea) ;*************************************** ; 1FC4 CopyRAMSprt ; ; This routine copies data from the RAM sprite attribute ; table at (8002H) to VRAM. The RAM sprite index table at ; (8004H) contains a list of one byte indexes into the RAM ; sprite attribute table. Each byte corresponds to one real ; (VRAM) sprite attr table entry and references one RAM ; sprite attr table entry to use as a template. ; ; ENTRY A = number of sprites ;*************************************** 1C82 A1C82 1C82 DD2A 0480 _CopyRAMSprt LD IX,(RAMSprtIdx) ; Get pointer to RAM sprite index table 1C86 F5 PUSH AF 1C87 FD21 F273 LD IY,SprtTabShad ; Get sprite table base VRAM address 1C8B FD5E 00 LD E,(IY+00H) 1C8E FD56 01 LD D,(IY+01H) 1C91 7B LD A,E ; Send LSB of address 1C92 D3 BF OUT (IO_VDP_Addr),A 1C94 7A LD A,D 1C95 F6 40 OR 40H ; Set write flag 1C97 D3 BF OUT (IO_VDP_Addr),A ; Send MSB of address 1C99 F1 POP AF 1C9A 2A 0280 L1C9A LD HL,(RamSprtTab) ; Get pointer at 8002H 1C9D DD4E 00 LD C,(IX+00H) ; Get next index byte from 8004H table 1CA0 DD23 INC IX 1CA2 06 00 LD B,00H ; HL = (8002H) + (IX)*4 1CA4 09 ADD HL,BC 1CA5 09 ADD HL,BC 1CA6 09 ADD HL,BC 1CA7 09 ADD HL,BC 1CA8 06 04 LD B,04H ; B = count for 4 bytes of data 1CAA 0E BE LD C,IO_VDP_Data ; C = output port 1CAC EDA3 L1CAC OUTI ; Output a byte of data 1CAE 00 NOP ; Wait for the VDP to catch up 1CAF 00 NOP 1CB0 20 FA JR NZ,L1CAC ; Loop until 4 bytes copied 1CB2 3D DEC A 1CB3 20 E5 JR NZ,L1C9A ; Loop until all sprites copied 1CB5 C9 RET 1CB6 FFFFFFFF FFFF DB O,O,O,O,O,O ;*************************************** ; 1FA6 PWriteReg ; ; Parameter block version of 1FD9 ; ; Parm 1 (byte) = VDP register number ; Parm 2 (byte) = data to write to register ;*************************************** 1CBC 01 3300 _PWriteReg LD BC,P_WriteReg 1CBF 11 BA73 LD DE,ParmArea 1CC2 CD 9400 CALL PCopy 1CC5 2A BA73 LD HL,(ParmArea) 1CC8 4C LD C,H 1CC9 45 LD B,L ;*************************************** ; 1FD9 WriteReg ; ; ENTRY B = VDP register number ; C = data to write to register ;*************************************** 1CCA A1CCA 1CCA 79 _WriteReg LD A,C ; Send VDP register data 1CCB D3 BF OUT (IO_VDP_Addr),A 1CCD 78 LD A,B 1CCE C6 80 ADD A,80H ; Set "write register" bit 1CD0 D3 BF OUT (IO_VDP_Addr),A ; Send register number 1CD2 78 LD A,B ; If register 0... 1CD3 B7 OR A 1CD4 20 04 JR NZ,L1CDB 1CD6 79 LD A,C 1CD7 32 C373 LD (VDP0Shad),A ; ...update register 0 shadow 1CDA 78 L1CDB LD A,B ; If register 1... 1CDB FE 01 CP 01H ; If this is changed to DEC A, Smurf won't work! 1CDD C0 RET NZ 1CDE 79 LD A,C 1CDF 32 C473 LD (VDP1Shad),A ; ...update register 1 shadow 1CE2 C9 RET ; Decrement low 4 bits of (HL) 1CE3 AF L0190 XOR A 1CE4 ED67 RRD 1CE6 D6 01 SUB 01H 1CE8 F5 PUSH AF 1CE9 ED6F RLD 1CEB F1 POP AF 1CEC C9 RET ; Decrement high 4 bits of (HL) (NOT USED!) ; ;L019B XOR A ; RLD ; SUB 01H ; PUSH AF ; RRD ; POP AF ; RET ;*************************************** ; 1FA9 PWrtVRAM ; ; Parameter block version of 1FDF ; ; Parm 1 (lit) = pointer to data to be written ; Parm 2 (word) = VRAM address ; Parm 3 (word) = byte count ;*************************************** 1CED 01 5E00 _PWrtVRam LD BC,P_WrtVRAM 1CF0 11 BA73 LD DE,ParmArea 1CF3 CD 9400 CALL PCopy 1CF6 2A BA73 LD HL,(ParmArea) 1CF9 ED5B BC73 LD DE,(ParmArea+2) 1CFD ED4B BE73 LD BC,(ParmArea+4) ;*************************************** ; 1FDF WrtVRAM ; ; ENTRY HL points to data to be written ; DE = VRAM address ; BC = byte count (see note) ; EXIT: HL = first byte after data that was written ; AF, B, D destroyed ; ; Note: there is a bug which causes 256 too few bytes to be ; copied if the B and C registers are both non-zero, ; and there are games which do depend on this! ; BlkWrtVRAM is also affected by this, but is ; probably never called with enough bytes to matter. ;*************************************** 1D01 A1D01 1D01 7B _WrtVRAM LD A,E ; Send LSB of address 1D02 D3 BF OUT (IO_VDP_Addr),A 1D04 7A LD A,D 1D05 C6 40 ADD A,40H ; Send MSB of address + 40H 1D07 D3 BF OUT (IO_VDP_Addr),A 1D09 50 LD D,B ; D = MSB of byte count 1D0A 41 LD B,C ; B = LSB of byte count 1D0B 0E BE LD C,IO_VDP_Data ; C = port address 1D0D EDA3 L1D14 OUTI ; Output a byte of data 1D0F 00 NOP ; Wait for the VDP to catch up 1D10 00 NOP 1D11 20 FA JR NZ,L1D14 ; LSB loop 1D13 15 DEC D ; Decrement MSB of count 1D14 F8 RET M ; MSB loop 1D15 20 F6 JR NZ,L1D14 ; BUG: should have been JR L1D14 1D17 C9 RET ; HL=msg,IY=len,DE=scrn 1D18 4D148558 Title_Msgs DW A144D,22*1024+0085H ; first row of COLECOVISION 1D1C 6314A558 DW A1463,22*1024+00A5H ; second row of COLECOVISION 1D20 C1149B08 DW A14C1,02*1024+009BH ; TM 1D24 B414AA36 DW A14B4,13*1024+02AAH ; 'c 1982 COLECO' 1D28 0000 DW 0 ; End of table ;*************************************** ; 1FAC PReadVRAM ; ; Parameter block version of 1FE2 ; ; Parm 1 (lit) = pointer to data buffer ; Parm 2 (word) = VRAM address ; Parm 3 (word) = byte count ;*************************************** 1D2A 01 5E00 _PReadVRAM LD BC,P_ReadVRam 1D2D 11 BA73 LD DE,ParmArea 1D30 CD 9400 CALL PCopy 1D33 2A BA73 LD HL,(ParmArea) 1D36 ED5B BC73 LD DE,(ParmArea+2) 1D3A ED4B BE73 LD BC,(ParmArea+4) ;*************************************** ; 1FE2 ReadVRAM ; ; ENTRY HL points to data buffer ; DE = VRAM address ; BC = byte count (see note) ; EXIT: HL = first byte after data that was read ; AF, B, D destroyed ; ; Note: there is a bug which causes 256 too few bytes to be ; copied if the B and C registers are both non-zero, ; and there are games which do depend on this! ; BlkReadVRAM is also affected by this, but is ; probably never called with enough bytes to matter. ;*************************************** 1D3E A1D3E 1D3E 7B _ReadVRAM LD A,E ; Send LSB of address 1D3F D3 BF OUT (IO_VDP_Addr),A 1D41 7A LD A,D ; Send MSB of address = 1D43 A1D43 EQU $+1 ; (Used by many Coleco carts) 1D42 D3 BF OUT (IO_VDP_Addr),A 1D44 50 LD D,B ; D = MSB of byte count 1D45 41 LD B,C ; B = LSB of byte count = 1D47 A1D47 EQU $+1 ; (Used by many Coleco carts) 1D46 0E BE LD C,IO_VDP_Data ; C = port address 1D48 EDA2 L1D49 INI ; Input a byte of data 1D4A 00 NOP ; Wait for the VDP to catch up 1D4B 00 NOP 1D4C 20 FA JR NZ,L1D49 ; LSB loop 1D4E 15 DEC D ; Decrement MSB of count 1D4F F8 RET M ; MSB loop 1D50 20 F6 JR NZ,L1D49 ; BUG: should have been JR L1D49 1D52 C9 RET 1D53 FFFFFFFF DB O,O,O,O ;*************************************** ; 1FDC VDP_Status ; ; This routine returns the VDP status byte in A. ; ; EXIT: A = VDP status byte ;*************************************** 1D57 A1D57 1D57 DB BF _VDP_Status IN A,(IO_VDP_Status) ; Get VDP status 1D59 C9 RET ; and return ;*************************************** ; 1F6A FlipRL ; ; Right/Left flip a list of images ; ; ENTRY A = VDP table code (0-4) ; BC = number of VDP table entries ; DE = source VDP table index ; HL = destination VDP table index ;*************************************** 1D5A A1D5A 1D5A DD21 A51D _FlipRL LD IX,__FlipRL 1D5E 18 10 JR L1D70 ;*************************************** ; 1F6D FlipUD ; ; Up/Down flip a list of images ; ; ENTRY A = VDP table code (0-4) ; BC = number of VDP table entries ; DE = source VDP table index ; HL = destination VDP table index ;*************************************** 1D60 A1D60 1D60 DD21 C31D _FlipUD LD IX,__FlipUD 1D64 18 0A JR L1D70 ;*************************************** ; 1F70 Rotate ; ; Rotate a list of images by 90 degrees clockwise ; ; ENTRY A = VDP table code (0-4) ; BC = number of VDP table entries ; DE = source VDP table index ; HL = destination VDP table index ;*************************************** 1D66 A1D66 1D66 DD21 881D _Rotate LD IX,__Rotate 1D6A 18 04 JR L1D70 ;*************************************** ; 1F73 Expand ; ; Expand a list of 8x8 images to 16x16 ; ; ENTRY A = VDP table code (0-4) ; BC = number of VDP table entries ; DE = source VDP table index ; HL = destination VDP table index ;*************************************** 1D6C DD21 F71D _Expand LD IX,__Expand 1D70 D9 L1D70 EXX ; Swap register sets 1D71 08 EX AF,AF' ; AF' = VDP table 1D72 DDE5 PUSH IX ; Save routine address 1D74 08 L1D74 EX AF,AF' ; AF = VDP table 1D75 F5 PUSH AF 1D76 08 EX AF,AF' 1D77 F1 POP AF 1D78 D9 EXX ; DE = original DE 1D79 D5 PUSH DE 1D7A D9 EXX 1D7B D1 POP DE 1D7C 2A 0680 LD HL,(VDP_Temp) ; HL = (VDP_Temp) 1D7F CD 751E CALL L1E92 ; LD IY,0001H / JP _BlkReadVRAM 1D82 DDE1 POP IX ; IX = routine address 1D84 DDE5 PUSH IX 1D86 DDE9 JP (IX) ; Jump into the routine 1D88 2A 0680 __Rotate LD HL,(VDP_Temp) ; HL = temp 1D8B 01 0800 LD BC,0008H ; DE = temp + 8 1D8E 5D LD E,L 1D8F 54 LD D,H 1D90 09 ADD HL,BC 1D91 EB EX DE,HL 1D92 CD EA1E CALL DoRotate ; Rotate the image 1D95 CD 5B1E CALL L1E72 ; Copy the image back to VRAM 1D98 CD 491E CALL L1E5D ; Check for hi-res graphics 1D9B 28 06 JR Z,L1E02 ; Exit if not hi-res graphics 1D9D CD 6C1E CALL L1E89 ; Read the source color table entry 1DA0 CD 7C1E CALL L1E9A ; Write the dest color table entry 1DA3 18 46 L1E02 JR L1D8CEXX ; Done with routine 1DA5 2A 0680 __FlipRL LD HL,(VDP_Temp) ; DE = temp 1DA8 01 0800 LD BC,0008H ; HL = temp + 8 1DAB 5D LD E,L 1DAC 54 LD D,H 1DAD 09 ADD HL,BC 1DAE EB EX DE,HL 1DAF CD DA1E CALL DoFlipLR ; Flip the image 1DB2 CD 5B1E CALL L1E72 ; Copy the image back to VRAM 1DB5 CD 491E CALL L1E5D ; Check for hi-res grahpics 1DB8 28 06 JR Z,L1DB3 ; Exit if not hi-res graphics 1DBA CD 6C1E CALL L1E89 ; Read source color table entry 1DBD CD 7C1E CALL L1E9A ; Write dest color table entry 1DC0 D9 L1DB3 EXX ; Swap register set 1DC1 18 29 JR L1D8CHL ; Done with routine 1DC3 2A 0680 __FlipUD LD HL,(VDP_Temp) ; DE = temp 1DC6 01 0800 LD BC,0008H ; HL = temp + 8 1DC9 5D LD E,L 1DCA 54 LD D,H 1DCB 09 ADD HL,BC 1DCC EB EX DE,HL 1DCD CD 241F CALL DoFlipUD ; Flip the image 1DD0 CD 5B1E CALL L1E72 ; Copy the image back to VRAM 1DD3 CD 491E CALL L1E5D ; Check for hi-res graphics 1DD6 28 13 JR Z,L1D8CEXX ; Exit if not hi-res graphics 1DD8 CD 6C1E CALL L1E89 ; Read source color table entry 1DDB 2A 0680 LD HL,(VDP_Temp) ; HL = temp 1DDE 01 0800 LD BC,0008H ; DE = temp + 8 1DE1 5D LD E,L 1DE2 54 LD D,H 1DE3 09 ADD HL,BC 1DE4 EB EX DE,HL 1DE5 CD 241F CALL DoFlipUD ; Flip the color table 1DE8 CD 7C1E CALL L1E9A ; Write dest color table entry 1DEB D9 L1D8CEXX EXX ; Swap register set 1DEC 23 L1D8CHL INC HL ; Increment dest index 1DED 13 L1D8C INC DE ; Increment VDP table index 1DEE 0B DEC BC ; Decrement count 1DEF 78 LD A,B ; Check for count = 0 1DF0 B1 OR C 1DF1 D9 EXX ; Swap register set 1DF2 20 80 JR NZ,L1D74 ; Go back until count = 0 1DF4 DDE1 POP IX ; Clean up stack 1DF6 C9 RET 1DF7 2A 0680 __Expand LD HL,(VDP_Temp) ; HL = temp 1DFA 01 0800 LD BC,0008H ; DE = temp + 8 1DFD 5D LD E,L 1DFE 54 LD D,H 1DFF 09 ADD HL,BC 1E00 EB EX DE,HL 1E01 CD 8C1E CALL DoExpand ; Expand the image 1E04 08 EX AF,AF' ; A = VDP table code 1E05 F5 PUSH AF 1E06 08 EX AF,AF' 1E07 F1 POP AF 1E08 D9 EXX ; DE = dest index 1E09 E5 PUSH HL 1E0A D9 EXX 1E0B D1 POP DE 1E0C 2A 0680 LD HL,(VDP_Temp) ; HL = temp + 8 1E0F 01 0800 LD BC,0008H 1E12 09 ADD HL,BC 1E13 FD21 0400 LD IY,0004H ; Write 4 entries 1E17 CD 271C CALL _BlkWrtVRAM ; to the VRAM table 1E1A CD 491E CALL L1E5D ; Check for hi-res graphics 1E1D 28 24 JR Z,L1E55 ; Exit if not hi-res graphics 1E1F CD 6C1E CALL L1E89 ; Read source color table entry 1E22 2A 0680 LD HL,(VDP_Temp) ; HL = temp 1E25 01 0800 LD BC,0008H ; DE = temp + 8 1E28 5D LD E,L 1E29 54 LD D,H 1E2A 09 ADD HL,BC 1E2B EB EX DE,HL 1E2C CD C71E CALL DoExpandCT ; Expand the color table 1E2F 3E 04 LD A,04H ; A = VDP color table code 1E31 D9 EXX ; DE = dest index 1E32 E5 PUSH HL 1E33 D9 EXX 1E34 D1 POP DE 1E35 2A 0680 LD HL,(VDP_Temp) ; HL = temp + 8 1E38 01 0800 LD BC,0008H 1E3B 09 ADD HL,BC 1E3C FD21 0400 LD IY,0004H ; Write 4 entries back 1E40 CD 271C CALL _BlkWrtVRAM 1E43 D9 L1E55 EXX ; Swap register set 1E44 23 INC HL ; Increment dest index 1E45 23 INC HL ; four times 1E46 23 INC HL ; 1E47 18 A3 JR L1D8CHL ; Done with routine 1E49 08 L1E5D EX AF,AF' ; A = VDP table code 1E4A F5 PUSH AF 1E4B 08 EX AF,AF' 1E4C F1 POP AF 1E4D FE 03 CP 03H ; Pattern generator table? 1E4F C2 F313 JP NZ,L10E6 ; Return zero if not 1E52 21 C373 LD HL,VDP0Shad ; Check for hi-res mode 1E55 AF XOR A ; Prepare to return zero 1E56 CB4E BIT 1,(HL) 1E58 C8 RET Z ; Return zero if not 1E59 3C INC A ; Return 1 if in hi-res mode 1E5A C9 RET ; (Z-flag set according to A-reg) 1E5B 08 L1E72 EX AF,AF' ; A = VDP table code 1E5C F5 PUSH AF 1E5D 08 EX AF,AF' 1E5E F1 POP AF 1E5F D9 EXX ; DE = dest index 1E60 E5 PUSH HL 1E61 D9 EXX 1E62 D1 POP DE 1E63 2A 0680 LD HL,(VDP_Temp) ; HL = temp + 8 1E66 01 0800 LD BC,0008H 1E69 09 ADD HL,BC 1E6A 18 19 JR L1EA7 1E6C D9 L1E89 EXX ; DE = source index 1E6D D5 PUSH DE 1E6E D9 EXX 1E6F D1 POP DE 1E70 2A 0680 LD HL,(VDP_Temp) ; HL = temp 1E73 3E 04 L1E90 LD A,04H ; A = VDP color table code 1E75 FD21 0100 L1E92 LD IY,0001H ; Read one entry 1E79 C3 A31B JP _BlkReadVRAM ; from the color table 1E7C D9 L1E9A EXX ; DE = dest index 1E7D E5 PUSH HL 1E7E D9 EXX 1E7F D1 POP DE 1E80 2A 0680 LD HL,(VDP_Temp) ; HL = temp 1E83 3E 04 L1EA5 LD A,04H ; A = VDP color table code 1E85 FD21 0100 L1EA7 LD IY,0001H ; Write one entry 1E89 C3 271C JP _BlkWrtVRAM ; to the color table 1E8C E5 DoExpand PUSH HL ; IX = source 1E8D DDE1 POP IX 1E8F D5 PUSH DE ; IY = dest 1E90 FDE1 POP IY 1E92 06 08 LD B,08H ; Initialize count 1E94 DD7E 00 L1EB4 LD A,(IX+00H) ; Get source byte 1E97 DD23 INC IX 1E99 57 LD D,A ; Copy source byte into D 1E9A 1E 04 LD E,04H ; Initialize bit count 1E9C CB17 L1EBC RL A ; Shift source bit into H 1E9E CB14 RL H 1EA0 CB12 RL D ; Shift copy of bit into H 1EA2 CB14 RL H 1EA4 1D DEC E ; Loop for four bits 1EA5 20 F5 JR NZ,L1EBC 1EA7 1E 04 LD E,04H ; Initialize bit count 1EA9 CB17 L1EC9 RL A ; Shift source bit into L 1EAB CB15 RL L 1EAD CB12 RL D ; Shift copy of bit into L 1EAF CB15 RL L 1EB1 1D DEC E ; Loop for four bits 1EB2 20 F5 JR NZ,L1EC9 1EB4 FD74 00 LD (IY+00H),H ; Store bits in first row 1EB7 FD75 10 LD (IY+10H),L 1EBA FD23 INC IY 1EBC FD74 00 LD (IY+00H),H ; Store bits in second row 1EBF FD75 10 LD (IY+10H),L 1EC2 FD23 INC IY 1EC4 10 CE DJNZ L1EB4 ; Loop until done 1EC6 C9 RET 1EC7 06 10 DoExpandCT LD B,10H ; Initialize count 1EC9 E5 PUSH HL ; Save source addr 1ECA 7E L1EEE LD A,(HL) ; Get next source byte 1ECB 23 INC HL 1ECC 12 LD (DE),A ; Store it twice 1ECD 13 INC DE 1ECE 12 LD (DE),A 1ECF 13 INC DE 1ED0 0B DEC BC ; Decrement count 1ED1 78 LD A,B 1ED2 FE 08 CP 08H ; If count = 8 1ED4 20 01 JR NZ,L1EFB 1ED6 E1 POP HL ; get back source addr 1ED7 10 F1 L1EFB DJNZ L1EEE ; Loop until done 1ED9 C9 RET 1EDA 06 08 DoFlipLR LD B,08H ; Initialize count 1EDC 4E L1F03 LD C,(HL) ; Get next byte 1EDD 3E 80 LD A,80H ; Set terminator bit 1EDF CB11 L1F06 RL C ; Shift a bit out 1EE1 1F RRA ; Shift it in 1EE2 30 FB JR NC,L1F06 ; Loop until done 1EE4 12 LD (DE),A ; Save byte 1EE5 23 INC HL ; Point to next bytes 1EE6 13 INC DE 1EE7 10 F3 DJNZ L1F03 ; Loop until done 1EE9 C9 RET 1EEA E5 DoRotate PUSH HL ; IX = source 1EEB DDE1 POP IX 1EED EB EX DE,HL ; HL = destination 1EEE 06 08 LD B,08H ; Initialize count 1EF0 DDCB 00 16 L1F19 RL (IX+00H) ; Shift a column of bits from the 1EF4 CB1E RR (HL) ; source into a row of bits in 1EF6 DDCB 01 16 RL (IX+01H) ; the destination 1EFA CB1E RR (HL) 1EFC DDCB 02 16 RL (IX+02H) 1F00 CB1E RR (HL) 1F02 DDCB 03 16 RL (IX+03H) 1F06 CB1E RR (HL) 1F08 DDCB 04 16 RL (IX+04H) 1F0C CB1E RR (HL) 1F0E DDCB 05 16 RL (IX+05H) 1F12 CB1E RR (HL) 1F14 DDCB 06 16 RL (IX+06H) 1F18 CB1E RR (HL) 1F1A DDCB 07 16 RL (IX+07H) 1F1E CB1E RR (HL) 1F20 23 INC HL ; Increment destination 1F21 10 CD DJNZ L1F19 ; Loop until done 1F23 C9 RET 1F24 01 0800 DoFlipUD LD BC,0008H ; Dest = dest + 8 1F27 09 ADD HL,BC 1F28 41 LD B,C ; Initialize count = 8 1F29 2B L1F53 DEC HL ; Decrement source 1F2A 7E LD A,(HL) ; Get source byte 1F2B 12 LD (DE),A ; Store in destination 1F2C 13 INC DE ; Increment destination 1F2D 10 FA DJNZ L1F53 ; Loop until done 1F2F C9 RET ;*************************************** ; 1F79 ReadCtl ; ; Read a joystick or keypad controller and a fire button ; ; ENTRY H = 0 for left control, 1 for right ; L = 0 for joystick/left fire, 1 for keypad/right fire ; EXIT: H = fire button in 40H bit ; L = joystick directionals or key code ; E = old pulse counter (only if L=0) ;*************************************** 1F30 7D _ReadCtl LD A,L ; Check if reading keypad 1F31 FE 01 CP 01H 1F33 28 15 JR Z,L11AA ; Branch if reading keypad 1F35 01 EB73 LD BC,PulseCnt1 ; Point BC to pulse counter 1F38 7C LD A,H 1F39 B7 OR A 1F3A 28 01 JR Z,L1199 ; branch if left controller 1F3C 03 INC BC ; Point BC to PulseCnt2 1F3D 0A L1199 LD A,(BC) ; E = old pulse counter value 1F3E 5F LD E,A 1F3F AF XOR A ; Clear pulse counter 1F40 02 LD (BC),A 1F41 CD 6911 CALL L113D ; Read joystick port 1F44 57 LD D,A ; Save port bits in D 1F45 E6 0F AND 0FH 1F47 6F LD L,A ; L = directional bits 1F48 18 12 JR L11BC ; Read the keypad 1F4A D3 80 L11AA OUT (IO_KP_Select),A ; Select keypad mode 1F4C CD 6911 CALL L113D ; Read joystick port 1F4F 57 LD D,A ; Save port bits in D 1F50 D3 C0 OUT (IO_Joy_Select),A ; Select joystick mode 1F52 E6 0F AND 0FH ; Mask off keypad bits 1F54 21 3911 LD HL,Keypad_Table ; Index into keypad table 1F57 06 00 LD B,00H 1F59 4F LD C,A 1F5A 09 ADD HL,BC 1F5B 6E LD L,(HL) ; L = key code (or 0FH if none) 1F5C 7A L11BC LD A,D 1F5D E6 40 AND 40H 1F5F 67 LD H,A ; H = right fire button bit 1F60 C9 RET ; Jump vectors. Please call these instead of using addresses ; within the ROM itself. Since the code is so sloppy that ; hundreds of bytes can be squeezed out of it, it's too tempting ; to reassemble an optimized ROM with room to add something cool. 1F61 A1F61 1F61 C3 0003 DoSound JP _DoSound 1F64 C3 7304 L1F64 JP L0488 ; video P04A3 1F67 C3 DC05 L1F67 JP L06C7 ; video P06D8 1F6A C3 5A1D FlipRL JP _FlipRL 1F6D C3 601D FlipUD JP _FlipUD 1F70 C3 661D Rotate JP _Rotate 1F73 C3 6C1D Expand JP _Expand 1F76 C3 4A11 ReadCtlRaw JP _ReadCtlRaw 1F79 18 B5 ReadCtl JR _ReadCtl 1F7B FF DB O 1F7C C3 7919 SkillScrn JP _SkillScrn 1F7F C3 2419 InitFont JP _InitFont 1F82 C3 D418 FillVRAM JP _FillVRAM 1F85 C3 E918 InitVDP JP _InitVDP 1F88 C3 A61A ReadSpinner JP _ReadSpinner 1F8B C3 0E1B PBaseLoad JP _PBaseLoad 1F8E C3 8C1B PBlkReadVRAM JP _PBlkReadVRAM 1F91 C3 0D1C PBlkWrtVRAM JP _PBlkWrtVRAM 1F94 C3 541C PInitRAMSprt JP _PInitRAMSprt 1F97 C3 761C PCopyRAMSprt JP _PCopyRAMSprt 1F9A C3 DB12 PInitTimers JP _PInitTimers 1F9D C3 F512 PStopTimer JP _PStopTimer 1FA0 C3 6813 PStartTimer JP _PStartTimer 1FA3 C3 CD13 PTestTimer JP _PTestTimer 1FA6 C3 BC1C PWriteReg JP _PWriteReg 1FA9 C3 ED1C PWrtVRAM JP _PWrtVRam 1FAC C3 2A1D PReadVRAM JP _PReadVRAM 1FAF C3 871A L1FAF JP L0655 ; video P0664 1FB2 C3 0302 PInitSound JP _PInitSound 1FB5 C3 5102 PAddSound JP _PAddSound 1FB8 C3 1D1B BaseLoad JP _BaseLoad 1FBB C3 A31B BlkReadVRAM JP _BlkReadVRAM 1FBE C3 271C BlkWrtVRAM JP _BlkWrtVRAM 1FC1 C3 601C InitRAMSprt JP _InitRAMSprt 1FC4 C3 821C CopyRAMSprt JP _CopyRAMSprt 1FC7 C3 EB12 InitTimers JP _InitTimers 1FCA C3 0113 StopTimer JP _StopTimer 1FCD C3 7713 StartTimer JP _StartTimer 1FD0 C3 D913 TestTimer JP _TestTimer 1FD3 C3 8312 RunTimers JP _RunTimers 1FD6 C3 3B02 NoSound JP _NoSound 1FD9 C3 CA1C WriteReg JP _WriteReg 1FDC C3 571D VDP_Status JP _VDP_Status 1FDF C3 011D WrtVRAM JP _WrtVRAM 1FE2 C3 3E1D ReadVRAM JP _ReadVRAM 1FE5 C3 961A L1FE5 JP L0664 ; video 1FE8 C3 BC1A L1FE8 JP L0679 ; video (no P) 1FEB C3 7511 ReadCtlState JP _ReadCtlState 1FEE C3 1302 InitSound JP _InitSound 1FF1 C3 5E02 AddSound JP _AddSound 1FF4 C3 7F02 UpdateSound JP _UpdateSound 1FF7 C3 8A04 L1FF7 JP L04A3 ; video 1FFA C3 ED05 L1FFA JP L06D8 ; video 1FFD C3 3B00 Random JP _Random 2000 D2000 END 00000 Total Error(s) A0000 0000 A0008 0008 A0010 0010 A0018 0018 A0020 0020 A0028 0028 A0030 0030 A0038 0038 A003B 003B A0066 0066 A0069 0069 A006A 006A A006C 006C A01B1 01B1 A01C1 01C1 A01D5 01D5 A0213 0213 A023B 023B A025E 025E A026A 026A A027F 027F A02EE 02EE A0300 0300 A07E8 07E8 A080B 080B A08C0 08C0 A1105 1105 A114A 114A A143B 143B A144D 144D A1463 1463 A14B4 14B4 A14C1 14C1 A14C3 14C3 A158B 158B A15A3 15A3 A18A3 18A3 A18D4 18D4 A18E9 18E9 A18F7 18F7 A1968 1968 A196B 196B A1979 1979 A1B1D 1B1D A1BA3 1BA3 A1BAA 1BAA A1C27 1C27 A1C4F 1C4F A1C82 1C82 A1CCA 1CCA A1D01 1D01 A1D3E 1D3E A1D43 1D43 E A1D47 1D47 E A1D57 1D57 A1D5A 1D5A A1D60 1D60 A1D66 1D66 A1F61 1F61 ADDSOUND 1FF1 BASELOAD 1FB8 BLKREADVRAM 1FBB BLKWRTVRAM 1FBE CART_SIG 8000 CART_START 800A CART_TITLE 8024 CLRTABSHAD 73FA COPYRAMSPRT 1FC4 CTLCHECKDIR 0002 E CTLCHECKKP 0010 E CTLCHECKLFIRE 0001 E CTLCHECKME 0080 E CTLCHECKRFIRE 0008 E CTLCHECKSPINNER 0004 E CTLSTATE 8008 CTLSTATEDIR 0001 E CTLSTATEKEY 0004 E CTLSTATELEFT 0002 E CTLSTATELFIRE 0000 E CTLSTATELFLAG 0000 E CTLSTATERFIRE 0003 E CTLSTATERFLAG 0001 E CTLSTATERIGHT 0007 E CTLSTATESPIN 0002 E D0482 0013 D0587 0305 E D064F 001B D06C1 0023 D1479 1479 D1486 1486 D14A0 14A0 D1623 1623 D16AB 16AB D1A7C 1999 D1A92 1423 D1AA9 19AF D1ABF 008B D1AC0 0083 E D1AC1 1ABA D1AC2 12C4 D1AC3 0145 D1AC4 0054 D1AC5 191A E D1AC6 02FD D1AC9 199C E D1B76 1B6F D1BFF 1BFD D2000 2000 D73C6 73C6 D73CA 73CA D73CB 73CB D73CC 73CC D73CD 73CD D73CF 73CF D73D1 73D1 D73FE 73FE DOEXPAND 1E8C DOEXPANDCT 1EC7 DOFLIPLR 1EDA DOFLIPUD 1F24 DOROTATE 1EEA DOSOUND 1F61 EXPAND 1F73 FILLVRAM 1F82 FLIPRL 1F6A FLIPUD 1F6D INITCTLSTATE 1105 INITFONT 1F7F INITRAMSPRT 1FC1 INITSCRN 07CF INITSOUND 1FEE INITTIMERS 1FC7 INITVDP 1F85 IO_JOY1 00FC E IO_JOY2 00FF E IO_JOY_SELECT 00C0 E IO_KP_SELECT 0080 E IO_SOUND 00FF E IO_VDP_ADDR 00BF E IO_VDP_DATA 00BE E IO_VDP_STATUS 00BF E JBITS 1225 JFIRE 1252 JJOYSTICK 122A JOY1SHAD 73EE JOY2SHAD 73EF KBITS 11CC KEY1SHAD 73F0 KEY2SHAD 73F1 KEYPAD_TABLE 1139 KFIRE 11D1 KKEYPAD 11F8 L0048 0050 L004C 0054 L004F 0046 L0050 0047 L006E 006E L0081 007F L00A3 009E L00B7 00B1 L00C4 00BD L00D0 00C4 L00D6 00C9 L00DA 00CD L00E5 00D8 L00F4 00E2 L00F8 00E5 L00FC 00E8 L010C 00F7 L012F 0117 L015D 0142 L0161 0145 L0164 0345 L016F 0350 L0175 035F L0190 1CE3 L01A6 1C02 L01B9 01B8 L01E9 01E9 L0220 021F L0284 0284 L0295 0293 L0297 02D4 L02AB 029D L02CB 02BB L02D3 02C2 L02D6 02C5 L02E6 02E7 L0335 0353 L034E 0356 L035F 0379 L0391 03A2 L039E 03AE L03A4 03B3 L03C6 03D5 L03D2 03E0 L03F0 03FC L03F4 0400 L03F8 0404 L03FA 0406 L0419 041F L0429 042D L0445 0448 L0461 045C L0472 046D L0478 0057 L047C 005A L0488 0473 L04A3 048A L04C6 04A7 L04D5 04B6 L04E5 04C6 L04E7 04F9 L0530 0558 L0572 05BB L0588 05D0 L0591 05D9 L0594 0534 L05B5 0551 L05BC 0596 L05C2 059C L05CE 05A7 L05F1 04C8 L0600 04D7 L0623 05F3 L0655 1A87 L0664 1A96 L0669 060F L0679 1ABC L0682 1AC4 L06B3 1AF1 L06B9 1AF5 L06BC 1AFA L06C7 05DC L06D8 05ED L06E3 0616 L06FF 063B L0744 067D L074B 0683 L0766 069E L0771 06A8 L077F 06B6 L0780 06B7 L0794 06CB L07A8 06DF L07DD 0711 L0802 0802 L081E 081E L0831 0831 L0848 0848 L085D 085D L0864 0864 L0866 0866 L0885 0883 L0898 0895 L08A2 089F L08CB 08C8 L08DB 08D5 L08DF 0630 L08E0 071B L0900 0735 L0914 0745 L0955 08D8 L0999 08E0 L09CA 0750 L09D5 1400 L09D8 1403 L09FD 075D L0A00 0760 L0A54 0786 L0A7E 07AA L0A87 08EB L0A98 08FA L0B07 0968 L0B0A 096B L0B25 0984 L0B31 0990 L0B39 0998 L0B51 09AF L0B64 09BF L0B76 09CE L0B7D 09D5 L0BB8 0A00 L0BD6 0A18 L0BD9 0A1B L0C1A 0A5A L0C1D 0A5D L0C38 0A78 L0C55 0A94 L0C7C 0A8A L0C84 0AB4 L0CA5 0AD5 L0CB4 0AE4 L0CBC 0AEC L0CCF 0AFF L0CD4 0B04 L0CDD 0B0A L0CFC 0B26 L0D03 0B2D L0D0E 0B38 L0D18 0B42 L0D4C 0B71 L0D60 0B84 L0D69 0B8D L0D87 0BA5 L0D96 0BAF L0D98 0BAF L0DA5 0BBB L0DAC 0BC2 L0DE3 0BF5 L0DEA 0BFC L0E17 0C26 L0E28 0C37 L0E2F 0C3D L0E4B 0C56 L0E51 0C5C L0E58 0C63 L0E5C 0C67 L0E5F 0C6A L0E7B 0C82 L0E87 0C8E L0E93 0C9A L0E9F 0CA6 L0EA2 0CA9 L0ED3 0CDA L0EF2 0CF9 L0F1C 0D23 L0F3A 1286 L0F49 1293 L0F5F 12A9 L0F79 12C3 L0F8B 12D2 L0F8D 12D4 L0F8F 12D6 L0FCF 1307 L0FD7 1310 L0FEE 1323 L0FFD 1330 L100D 1340 L1019 134A L1020 134D L105A 137E L106E 1390 L1074 1396 L1095 13B6 L109C 13BF L10A6 13C9 L10B6 13BA L10D6 13E3 L10DE 13EB L10E6 13F3 L10E9 13F5 L10EF 13FB L1116 1116 L1137 1165 L113D 1169 L1146 1171 L1148 1173 L117D 1AB1 L1182 1AB4 L1189 1ABA L1199 1F3D L11AA 1F4A L11BC 1F5C L11E8 119B L11F3 11A6 L1214 11C5 L1229 124E L1231 1276 L1248 11F5 L127A 1219 L127E 121C L1282 1220 L1285 1223 L12AB 126A L12AF 126D L12B3 1271 L12B6 1274 L12DB 1242 L12DF 1245 L12E3 1249 L12E6 124C L130B 11E9 L130F 11EC L1313 11F0 L1316 11F3 L1319 07AE L1330 07B7 L1352 0148 L1356 07C4 L13B7 016D L13FF 1A43 L1439 1A55 L18DD 18DD L1946 193C L1949 193F L1951 1947 L196B 196D L196C 1956 L196E 195B L1978 1965 L1B40 1B4A L1B5C 1B56 L1B6A 1B64 L1B72 1B6C L1BC0 1BC0 L1BCD 1BCC L1BE0 1BDE L1BEB 1BE9 L1BEC 1BEA L1C4E 1C4E L1C6B 1C65 L1C9A 1C9A L1CAC 1CAC L1CDB 1CDA L1D14 1D0D L1D49 1D48 L1D70 1D70 L1D74 1D74 L1D8C 1DED L1D8CEXX 1DEB L1D8CHL 1DEC L1DB3 1DC0 L1E02 1DA3 L1E55 1E43 L1E5D 1E49 L1E72 1E5B L1E89 1E6C L1E90 1E73 L1E92 1E75 L1E9A 1E7C L1EA5 1E83 L1EA7 1E85 L1EB4 1E94 L1EBC 1E9C L1EC9 1EA9 L1EEE 1ECA L1EFB 1ED7 L1F03 1EDC L1F06 1EDF L1F19 1EF0 L1F53 1F29 L1F64 1F64 L1F67 1F67 L1FAF 1FAF L1FE5 1FE5 L1FE8 1FE8 L1FF7 1FF7 L1FFA 1FFA NAMETABSHAD 73F6 NOISECTLSHAD 702A NOISEP 7022 NOSOUND 1FD6 NOSOUNDP 0220 E NO_CART_MSGS 1A58 O 00FF E PADDSOUND 1FB5 PARMAREA 73BA PATGENTABSHAD 73F8 PBASELOAD 1F8B PBLKREADVRAM 1F8E PBLKWRTVRAM 1F91 PCOPY 0094 PCOPYRAMSPRT 1F97 PINITRAMSPRT 1F94 PINITSOUND 1FB2 PINITTIMERS 1F9A PREADVRAM 1FAC PSTARTTIMER 1FA0 PSTOPTIMER 1F9D PTESTTIMER 1FA3 PULSECNT1 73EB PULSECNT2 73EC PWRITEREG 1FA6 PWRTVRAM 1FA9 P_ADDSOUND 0005 P_BASELOAD 000B P_BLKREADVRAM 1B81 P_BLKWRTVRAM 1B81 P_COPYRAMSPRT 0005 P_INITRAMSPRT 0005 P_INITSOUND 000B P_INITTIMERS 002B P_READVRAM 005E P_STARTTIMER 000B P_STOPTIMER 0005 P_TESTTIMER 0005 P_WRITEREG 0033 P_WRTVRAM 005E RAMSPRTIDX 8004 RAMSPRTTAB 8002 RANDOM 1FFD RANDSEED 73C8 RAWCTLDBITS 0002 E RAWCTLDSTATE 0003 E RAWCTLKPBIT 0008 E RAWCTLKPSTATE 0009 E RAWCTLLEFT 0000 E RAWCTLLFBIT 0000 E RAWCTLLFSTATE 0001 E RAWCTLRFBIT 0006 E RAWCTLRFSTATE 0007 E RAWCTLRIGHT 000A E RAWCTLSTATE 73D7 READCTL 1F79 READCTLRAW 1F76 READCTLSTATE 1FEB READSPINNER 1F88 READVRAM 1FE2 ROTATE 1F70 RUNTIMERS 1FD3 SCRNMSGS 1A66 SKILLSCRN 1F7C SKILL_MSGS 19C5 SNDARRAY 7020 SPRTPATTABSHAD 73F4 SPRTTABSHAD 73F2 STACK 73B9 STARTTIMER 1FCD STOPTIMER 1FCA TESTTIMER 1FD0 TIMERAUX 73D5 TIMERLIST 73D3 TITLE_MSGS 1D18 TONE1P 7024 TONE2P 7026 TONE3P 7028 UPDATESOUND 1FF4 VDP0SHAD 73C3 VDP1SHAD 73C4 VDPBASESHAD 73F2 E VDP_STATUS 1FDC VDP_TEMP 8006 VRAM_INDEX 1BAA V_NMI 8021 V_RST_08H 800C V_RST_10H 800F V_RST_18H 8012 V_RST_20H 8015 V_RST_28H 8018 V_RST_30H 801B V_RST_38H 801E WRITEREG 1FD9 WRTRAMSPRT 73C7 WRTVRAM 1FDF XREADVRAM 1B79 XREADVRAM_A 1B7E XWRTVRAM 1C6C XWRTVRAM_A 1C71 _ADDSOUND 025E _BASELOAD 1B1D _BLKREADVRAM 1BA3 _BLKWRTVRAM 1C27 _BLKWRTVRAM2 1C25 _BLKWRTVRAM3 1C45 _BLKWRTVRAM31 1937 _BLKWRTVRAM4 1C48 _COPYRAMSPRT 1C82 _DOSOUND 0300 _EXPAND 1D6C _FILLVRAM 18D4 _FLIPRL 1D5A _FLIPUD 1D60 _INITFONT 1924 _INITRAMSPRT 1C60 _INITSOUND 0213 _INITTIMERS 12EB _INITVDP 18E9 _NOSOUND 023B _PADDSOUND 0251 _PBASELOAD 1B0E _PBLKREADVRAM 1B8C _PBLKWRTVRAM 1C0D _PCOPYRAMSPRT 1C76 _PINITRAMSPRT 1C54 _PINITSOUND 0203 _PINITTIMERS 12DB _PREADVRAM 1D2A _PSTARTTIMER 1368 _PSTOPTIMER 12F5 _PTESTTIMER 13CD _PWRITEREG 1CBC _PWRTVRAM 1CED _RANDOM 003B _READCTL 1F30 _READCTLRAW 114A _READCTLSTATE 1175 _READSPINNER 1AA6 _READVRAM 1D3E _ROTATE 1D66 _RUNTIMERS 1283 _SKILLSCRN 1979 _STARTTIMER 1377 _STOPTIMER 1301 _TESTTIMER 13D9 _UPDATESOUND 027F _VDP_STATUS 1D57 _WRITEREG 1CCA _WRTVRAM 1D01 __EXPAND 1DF7 __FLIPRL 1DA5 __FLIPUD 1DC3 __ROTATE 1D88