ROM:0000 ; ROM:0000 ; +-------------------------------------------------------------------------+ ROM:0000 ; | This file is generated by The Interactive Disassembler (IDA) | ROM:0000 ; | Copyright (c) 2007 by DataRescue sa/nv, <ida@datarescue.com> | ROM:0000 ; | Licensed to: Chris Lomont | ROM:0000 ; +-------------------------------------------------------------------------+ ROM:0000 ; ROM:0000 ; Input MD5 : FADD0697D0D7969106505B5AB0CFF312 ROM:0000 ROM:0000 ;============================================================================ ROM:0000 ; Pac-Man Commented Disassembly, Chris Lomont, 2008, www.lomont.org ROM:0000 ;============================================================================ ROM:0000 ; File Name : pacman.rom ROM:0000 ; Format : Binary file ROM:0000 ; Base Address: 0000h Range: 0000h - 5100h Loaded length: 5100h ROM:0000 ; Pac-Man Commented Disassembly Version 0.1 ROM:0000 ; Chris Lomont, Nov 2008 ROM:0000 ; TODO - sources ROM:0000 ; ROM:0000 ;============================================================================ ROM:0000 ; ROM:0000 ;Program starts here, at address 0000 ROM:0000 ROM:0000 ; Processor : z80 [] ROM:0000 ; Target assembler: Zilog Macro Assembler ROM:0000 ROM:0000 ; =========================================================================== ROM:0000 ROM:0000 ; Segment type: Pure code ROM:0000 segment ROM ROM:0000 ROM:0000 ; =============== S U B R O U T I N E ======================================= ROM:0000 ROM:0000 ROM:0000 ProgramStart: ROM:0000 ROM:0000 ; FUNCTION CHUNK AT ROM:230B SIZE 0000009D BYTES ROM:0000 ROM:0000 di ; Disable interrupts ROM:0001 ld a, 3Fh ; '?' ; Set page 3F00h for interrupt mode 2 vector ROM:0003 ld i, a ; Interrupt register prefix is 3Fh ROM:0005 jp StartupTests ; Jump to start location ROM:0005 ; End of function ProgramStart ROM:0005 ROM:0008 ; =========================================================================== ROM:0008 ; memset ROM:0008 ; rst 8 = memset ROM:0008 ; Fill (HL) to (HL+B) with value in A ROM:0008 ; Modifies B,HL ROM:0008 ; =========================================================================== ROM:0008 ROM:0008 ; =============== S U B R O U T I N E ======================================= ROM:0008 ROM:0008 ROM:0008 memset: ROM:0008 ld (hl), a ; write A to (HL) ROM:0009 inc hl ; next HL ROM:000A djnz memset ; Decrement B, jump if B != 0 ROM:000C ROM:000C RetOpcode: ; This return called from many places ROM:000C ret ROM:000C ; End of function memset ROM:000C ROM:000D ; --------------------------------------------------------------------------- ROM:000D jp PrepareDifficulty ; TODO - This is called in MAME runs, - who calls it? ROM:0010 ; =========================================================================== ROM:0010 ;rst 10 (dereference pointer to bytes) ROM:0010 ;HL points to table base ROM:0010 ;a contains index ROM:0010 ;HL += A; A = (HL); ROM:0010 ;Modifies: HL, A ROM:0010 ; =========================================================================== ROM:0010 ROM:0010 ; =============== S U B R O U T I N E ======================================= ROM:0010 ROM:0010 ROM:0010 LookupByteA: ROM:0010 add a, l ; Add A to HL (one byte, then carry) ROM:0011 ld l, a ; store back into L ROM:0012 ld a, 0 ; prepare to propogate carry ROM:0014 adc a, h ; and do it ROM:0015 ld h, a ; HL = HL+A ROM:0016 ld a, (hl) ; Lookup A=(HL) ROM:0017 ret ROM:0017 ; End of function LookupByteA ROM:0017 ROM:0018 ;======================= ROM:0018 ; Lookup Word (HL) ROM:0018 ;rst 18 ROM:0018 ;Dereference pointer to word ROM:0018 ;HL = base address of table ROM:0018 ;b contains index ROM:0018 ;HL = (HL+2B) ROM:0018 ;======================= ROM:0018 ROM:0018 ; =============== S U B R O U T I N E ======================================= ROM:0018 ROM:0018 ROM:0018 LookupWordHL: ROM:0018 ld a, b ROM:0019 add a, a ; A=2B ROM:001A rst 10h ; get HL=HL+A ROM:001B ld e, a ; Low byte of word to lookup ROM:001C inc hl ; Next byte ROM:001D ld d, (hl) ; high byte ROM:001E ex de, hl ; store in HL ROM:001F ret ROM:001F ; End of function LookupWordHL ROM:001F ROM:0020 ;====================== ROM:0020 ;Call with rst 20h ROM:0020 ;Jump Table ROM:0020 ;Calls function pointed to by (stack) + 2A, ROM:0020 ;return returns to address on stack ROM:0020 ;Called with rst 20 followed by ROM:0020 ;table of function address ROM:0020 ; TODO - make sure all rst 20 followed with table ROM:0020 ;====================== ROM:0020 ROM:0020 ROM:0020 ; =============== S U B R O U T I N E ======================================= ROM:0020 ROM:0020 ROM:0020 CallFunction: ROM:0020 pop hl ; get table address ROM:0021 add a, a ; a = 2*a - spacing out values for jumping to a function ROM:0022 rst 10h ; dereference byte A = (HL+A) ROM:0023 ld e, a ; E=low byte of address to jump to ROM:0024 inc hl ROM:0025 ld d, (hl) ; D = high address of address to jump to ROM:0026 ex de, hl ; Prepare to jump ROM:0027 jp (hl) ; jump away! return address on stack ROM:0027 ; End of function CallFunction ROM:0027 ROM:0028 ;======================= ROM:0028 ; rst 28, data ROM:0028 ; Write the task into the TaskList ROM:0028 ; The task routine is the byte following the ROM:0028 ; instruction, and the parameter is the ROM:0028 ; byte after that ROM:0028 ; TODO - get list of tasks ROM:0028 ;======================= ROM:0028 ROM:0028 ; =============== S U B R O U T I N E ======================================= ROM:0028 ROM:0028 ROM:0028 InsertTask: ROM:0028 ROM:0028 ; FUNCTION CHUNK AT ROM:0051 SIZE 00000014 BYTES ROM:0028 ROM:0028 pop hl ; get value on stack (address to return to, example holds : 11h, see location 8A5) ROM:0029 ld b, (hl) ; get routine number (todo - or is thie parameter?) ROM:002A inc hl ROM:002B ld c, (hl) ; get parameter (or is this routine #?) ROM:002C inc hl ROM:002D push hl ; save address pass command ROM:002E jr ContinueTask ; skip the other rst instruction spaces ROM:0030 ; --------------------------------------------------------------------------- ROM:0030 ;=========================================================================== ROM:0030 ; InsertIRQTask ROM:0030 ; inserts a task into the IRQ task list if possible ROM:0030 ; call with rst 30, data ROM:0030 ; where data is the three bytes to store in task list ROM:0030 ; Tasks list 4C90-4CBF (runs in IRQ) ROM:0030 ; 16 entries, 3 bytes each ROM:0030 ; byte 0 - scheduled time ROM:0030 ; byte 1 - index for jump table ROM:0030 ; byte 2 - parameter passed in B ROM:0030 ;=========================================================================== ROM:0030 ROM:0030 ROM:0030 InsertIRQTask: ; first IRQ task address ROM:0030 ld de, 4C90h ROM:0033 ld b, 10h ; look at 16 tasks in IRQ list ROM:0035 jp IRQTaskLoop ; skip space for other rst handlers ROM:0038 ; --------------------------------------------------------------------------- ROM:0038 ;============================ ROM:0038 ;Bogus Interrupt mode 2 handler ROM:0038 ; infinite loops, until watchdog timer ROM:0038 ; restarts machine ROM:0038 ; happens if IM2 interrupt vector ROM:0038 ; is not set before machine hangs ROM:0038 ;============================ ROM:0038 ROM:0038 BogusIM2Handler: ; zero A ROM:0038 xor a ROM:0039 ld (InterruptEnable), a ; disable interrupts ROM:003C ld (CoinCounter), a ; clear coins ROM:003F jp BogusIM2Handler ; infinite loop ROM:0042 ; --------------------------------------------------------------------------- ROM:0042 ROM:0042 ContinueTask: ; get next space to place task ROM:0042 ld hl, (TaskListEndPtr) ROM:0045 ld (hl), b ; save routine ROM:0046 inc l ROM:0047 ld (hl), c ; save parameter ROM:0048 inc l ; next task location ROM:0049 jr nz, noOverflow ; did task pointer overflow? ROM:004B ld l, 0C0h ; '+' ; yes, start at the table top ROM:004D ROM:004D noOverflow: ; save location to put next task ROM:004D ld (TaskListEndPtr), hl ROM:0050 ret ; and jump back to instruction following the rst 28, dw that called this ROM:0050 ; End of function InsertTask ROM:0050 ROM:0051 ; --------------------------------------------------------------------------- ROM:0051 ; START OF FUNCTION CHUNK FOR InsertTask ROM:0051 ROM:0051 IRQTaskLoop: ; Get task launch time ROM:0051 ld a, (de) ROM:0052 and a ; is there a task in this slot? ROM:0053 jr z, InsertIRQTask2 ; no, jump to add task ROM:0055 inc e ; increment 3 bytes to next task ROM:0056 inc e ROM:0057 inc e ROM:0058 djnz IRQTaskLoop ; if not done, continue with next task ROM:005A ret ; no more tasks ROM:005B ; --------------------------------------------------------------------------- ROM:005B ROM:005B InsertIRQTask2: ; Get the return address where the task to insert is ROM:005B pop hl ROM:005C ld b, 3 ; copy 3 bytes into the IRQ task list ROM:005E ROM:005E IRQTaskRunLoop: ; get a byte ROM:005E ld a, (hl) ROM:005F ld (de), a ; store in task list ROM:0060 inc hl ; next source byte ROM:0061 inc e ; next dest byte ROM:0062 djnz IRQTaskRunLoop ; continue for all 3 bytes ROM:0064 jp (hl) ; jump to address following the data after the rst 30 ROM:0064 ; END OF FUNCTION CHUNK FOR InsertTask ROM:0065 ROM:0065 ; =============== S U B R O U T I N E ======================================= ROM:0065 ROM:0065 ; Attributes: thunk ROM:0065 ROM:0065 sub_65: ROM:0065 jp sub_202D ROM:0065 ; End of function sub_65 ROM:0065 ROM:0065 ; --------------------------------------------------------------------------- ROM:0068 ;=============================== ROM:0068 ; Difficulty tables, value per level ROM:0068 ; until top value ROM:0068 ;=============================== ROM:0068 NormalDiff: db 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh, 10h ROM:0068 db 11h, 12h, 13h, 14h ROM:007D HardDiff: db 1, 3, 4, 6, 7, 8, 9, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh, 10h, 11h ROM:007D db 14h ROM:008D ;============================ ROM:008D ; Interrupt handler - ROM:008D ; Called every time VBLANK fires during the game ROM:008D ; which is 60.61 times per second ROM:008D ;============================ ROM:008D ROM:008D ; =============== S U B R O U T I N E ======================================= ROM:008D ROM:008D ; Interrupt vector ROM:008D ROM:008D Interrupt2: ROM:008D push af ; save these ROM:008E ld (WatchdogReset), a ; kick the dog ROM:0091 xor a ; clear a ROM:0092 ld (InterruptEnable), a ; disable hardware interrupts ROM:0095 di ; disable CPU interupts ROM:0096 push bc ; save all registers ROM:0097 push de ROM:0098 push hl ROM:0099 push ix ROM:009B push iy ROM:009D ;================================ ROM:009D ;VBLANK (SOUND) ROM:009D ; ROM:009D ;Load the sound into the hardware ROM:009D ;================================ ROM:009D ld hl, 4E8Ch ; pointer to frequencies and volumes of the 3 voices ROM:00A0 ld de, 5050h ; sound hardware addresses ROM:00A3 ld bc, 10h ; 16 bytes ROM:00A6 ldir ; copy ROM:00A8 ;Voice 1 wave select ROM:00A8 ld a, (CH1_W_NUM) ; if we play a wave ROM:00AB and a ROM:00AC ld a, (CH1_W_SEL) ; then WaveSelect = CH1_W_SEL ROM:00AF jr nz, loc_B4 ; write WaveSelect to hardware ROM:00B1 ld a, (CH1_E_TABLE0) ; else then WaveSelect = CH1_E_TABLE0 ROM:00B4 ROM:00B4 loc_B4: ; write WaveSelect to hardware ROM:00B4 ld (Voice1Waveform), a ROM:00B7 ld a, (CH2_W_NUM) ROM:00BA and a ROM:00BB ld a, (byte_4EDF) ROM:00BE jr nz, loc_C3 ROM:00C0 ld a, (byte_4EAF) ROM:00C3 ROM:00C3 loc_C3: ROM:00C3 ld (Voice2Waveform), a ROM:00C6 ;Voice 3 wave select ROM:00C6 ld a, (CH3_W_NUM) ROM:00C9 and a ROM:00CA ld a, (byte_4EEF) ROM:00CD jr nz, loc_D2 ROM:00CF ld a, (byte_4EBF) ROM:00D2 ROM:00D2 loc_D2: ROM:00D2 ld (Voice3Waveform), a ROM:00D5 ; copy last frame sprite data into sprite buffer ROM:00D5 ld hl, 4C02h ; source data ROM:00D8 ld de, 4C22h ; dest data ROM:00DB ld bc, 1Ch ; 28 bytes to copy ROM:00DE ldir ; copy it ROM:00E0 ; copy sprite data to hardware ROM:00E0 ld ix, 4C20h ROM:00E4 ld a, (ix+2) ; move up for flip hardware ROM:00E7 rlca ROM:00E8 rlca ROM:00E9 ld (ix+2), a ROM:00EC ld a, (ix+4) ; move sprite number 2 bits up ROM:00EF rlca ROM:00F0 rlca ROM:00F1 ld (ix+4), a ROM:00F4 ld a, (ix+6) ROM:00F7 rlca ROM:00F8 rlca ROM:00F9 ld (ix+6), a ROM:00FC ld a, (ix+8) ROM:00FF rlca ROM:0100 rlca ROM:0101 ld (ix+8), a ROM:0104 ld a, (ix+0Ah) ROM:0107 rlca ROM:0108 rlca ROM:0109 ld (ix+0Ah), a ROM:010C ld a, (ix+0Ch) ROM:010F rlca ROM:0110 rlca ROM:0111 ld (ix+0Ch), a ROM:0114 ld a, (byte_4DD1) ; ghost being killed? ROM:0117 cp 1 ROM:0119 jr nz, loc_153 ROM:011B ld ix, 4C20h ROM:011F ld a, (DeadGhostIndex) ROM:0122 add a, a ROM:0123 ld e, a ROM:0124 ld d, 0 ROM:0126 add ix, de ROM:0128 ld hl, (word_4C24) ROM:012B ld de, (word_4C34) ROM:012F ld a, (ix+0) ROM:0132 ld (word_4C24), a ROM:0135 ld a, (ix+1) ROM:0138 ld (word_4C24+1), a ROM:013B ld a, (ix+10h) ROM:013E ROM:013E loc_13E: ROM:013E ld (word_4C34), a ROM:0141 ld a, (ix+11h) ROM:0144 ld (word_4C34+1), a ROM:0147 ld (ix+0), l ROM:014A ld (ix+1), h ROM:014D ld (ix+10h), e ROM:0150 ld (ix+11h), d ROM:0153 ROM:0153 loc_153: ROM:0153 ld a, (PillEffect) ROM:0156 and a ROM:0157 jp z, loc_176 ROM:015A ld bc, (SpriteBuffer) ROM:015E ld de, (word_4C32) ROM:0162 ld hl, (word_4C2A) ROM:0165 ld (SpriteBuffer), hl ROM:0168 ld hl, (word_4C3A) ROM:016B ld (word_4C32), hl ROM:016E ld (word_4C2A), bc ROM:0172 ld (word_4C3A), de ROM:0176 ROM:0176 loc_176: ; copy data to sprite hardware ROM:0176 ld hl, 4C22h ROM:0179 ld de, 4FF2h ; sprite hardware location ROM:017C ld bc, 0Ch ; 12 bytes ROM:017F ldir ; copy ROM:0181 ld hl, 4C32h ; more data to copy ROM:0184 ld de, 5062h ; more sprite hardware ROM:0187 ld bc, 0Ch ; 12 more bytes ROM:018A ldir ; copy ROM:018C call UpdateTimers ; update all timers and some related items ROM:018F call MoveCutSceneSprites ROM:0192 call sub_3C8 ROM:0195 ld a, (MainMode) ROM:0198 and a ROM:0199 jr z, loc_1AD ROM:019B call DrawBigPacMan ROM:019E call DrawSprites ROM:01A1 call sub_141F ROM:01A4 call sub_267 ROM:01A7 call sub_2AD ROM:01AA call sub_2FD ROM:01AD ROM:01AD loc_1AD: ROM:01AD ld a, (MainMode) ROM:01B0 dec a ROM:01B1 jr nz, loc_1B9 ROM:01B3 ld (CH2_DATA), a ROM:01B6 ld (CH3_DATA), a ROM:01B9 ROM:01B9 loc_1B9: ROM:01B9 call ProcessEffect ROM:01BC call ProcessWave ROM:01BF pop iy ; restore registers ROM:01C1 pop ix ROM:01C3 pop hl ROM:01C4 pop de ROM:01C5 pop bc ROM:01C6 ld a, (MainMode) ; get main mode (TODO - or is this number of players?) ROM:01C9 and a ; see if it is 0 = init ROM:01CA jr z, NoInit ; if not init, continue ROM:01CC ld a, (Voice1Acc) ; get the sound register ROM:01CF and 10h ; check low nibble ROM:01D1 jp z, ProgramStart ; if no sound yet, restart machine? ROM:01D4 ROM:01D4 NoInit: ; prepare to enable hardware interrupts ROM:01D4 ld a, 1 ROM:01D6 ld (InterruptEnable), a ; enable hardware interrupts ROM:01D9 ei ; enable CPU interrupts ROM:01DA pop af ; restore final registers ROM:01DB ret ; return from interrupt routine ROM:01DB ; End of function Interrupt2 ROM:01DB ROM:01DC ;========================= ROM:01DC ;UpdateTimers ROM:01DC ;TODO - document ROM:01DC ; Count8BitsUp: db 0 ; 8 bit counter (00 to FF) used by sound ROM:01DC ;ROM:4C85 Count8BitsDown: db 0 ; 8 but unused counter - TODO? FF to 00 ROM:01DC ;ROM:4C86 Timer60: db 0 ; 60ths of a second ROM:01DC ;ROM:4C87 TimerSec: db 0 ; seconds timer ROM:01DC ;ROM:4C88 TimerMin: db 0 ; minute timer ROM:01DC ;ROM:4C89 TimerHours: db 0 ; hour timer ROM:01DC ;========================= ROM:01DC ROM:01DC ROM:01DC ; =============== S U B R O U T I N E ======================================= ROM:01DC ROM:01DC ROM:01DC UpdateTimers: ROM:01DC ld hl, 4C84h ; upwards counter address ROM:01DF inc (hl) ; increment it ROM:01E0 inc hl ; point to down counter ROM:01E1 dec (hl) ; decrement it ROM:01E2 inc hl ; point to 60ths of a second counter ROM:01E3 ld de, 219h ; address of TimerTable ROM:01E6 ld bc, 401h ; B=check up to 4 bytes, count bytes read in C ROM:01E9 ROM:01E9 TimerLoop: ; increment timer byte ROM:01E9 inc (hl) ROM:01EA ld a, (hl) ; read byte ROM:01EB and 0Fh ; get lower 4 bits ROM:01ED ex de, hl ; swap timer table and timer address ROM:01EE cp (hl) ; compare lower nibble to table entry ROM:01EF jr nz, TimerCorrect ; if not there yet, jump ROM:01F1 inc c ; another nibble overflow ROM:01F2 ld a, (de) ; Get next timer entry ROM:01F3 add a, 10h ; add 1 to high nibble ROM:01F5 and 0F0h ; '=' ; clear low nibble ROM:01F7 ld (de), a ; write back ROM:01F8 inc hl ; next timer table entry ROM:01F9 cp (hl) ; is the high nibble maxed out? ROM:01FA jr nz, TimerCorrect ; if not, jump out ROM:01FC inc c ; another nibble overflow ROM:01FD ex de, hl ; swap timers and table addresses ROM:01FE ld (hl), 0 ; clear timer byte, we'll go to the next one ROM:0200 inc hl ; next timer byte ROM:0201 inc de ; next table byte ROM:0202 djnz TimerLoop ; loop again ROM:0204 ROM:0204 TimerCorrect: ; address for timer limits ROM:0204 ld hl, 4C8Ah ROM:0207 ld (hl), c ; save the overflow count ROM:0208 inc l ; Point to unused random seed ROM:0209 ld a, (hl) ; read seed ROM:020A add a, a ; A=2A ROM:020B add a, a ; A=2A ROM:020C add a, (hl) ; A=A+seed ROM:020D inc a ; A=5*A+1 ROM:020E ld (hl), a ; save back - result is (HL)=5*(HL)+1, a random number generator ROM:020F inc l ; Next seed ROM:0210 ld a, (hl) ; A=seed ROM:0211 add a, a ; A=2A ; A=2*seed ROM:0212 add a, (hl) ; A=A+seed ; A=3*seed ROM:0213 add a, a ; A=2A ; A=6*seed ROM:0214 add a, a ; A=2A ; A=12*seed ROM:0215 add a, (hl) ; A=A+seed ; A=13*seed ROM:0216 inc a ; A=A+1 ; A=13*seed+1 ROM:0217 ld (hl), a ; save back ROM:0218 ret ; and return from timer update ROM:0218 ; End of function UpdateTimers ROM:0218 ROM:0218 ; --------------------------------------------------------------------------- ROM:0219 ;========================= ROM:0219 ; TimerTable used in UpdateTimer routine ROM:0219 ; each value tells when a nibble ROM:0219 ; overflows to the next value ROM:0219 ;========================= ROM:0219 TimerTable: db 6 ; when we count six 60ths of a second, roll over next nibble ROM:021A db 0A0h ; when we count 10 in the high nibble, increment a second counter ROM:021B db 0Ah ROM:021C db 60h ROM:021D db 0Ah ROM:021E db 60h ROM:021F db 0Ah ROM:0220 db 0A0h ROM:0221 ; TODO - is this right? ROM:0221 ROM:0221 ; =============== S U B R O U T I N E ======================================= ROM:0221 ROM:0221 ROM:0221 MoveCutSceneSprites: ROM:0221 ld hl, 4C90h ; IRQ Task List ROM:0224 ld a, (TimerLimits) ; Number of nibble overflows last tick, 0-9 ROM:0227 ld c, a ROM:0228 ld b, 10h ; check 16 tasks ROM:022A ROM:022A loc_22A: ; get task ROM:022A ld a, (hl) ROM:022B and a ; test if there is a task in this slot ROM:022C jr z, loc_25D ; if not, jump to next task ROM:022E and 0C0h ; '+' ROM:0230 rlca ROM:0231 rlca ROM:0232 cp c ROM:0233 jr nc, loc_25D ROM:0235 dec (hl) ; decrease task timer ROM:0236 ld a, (hl) ROM:0237 and 3Fh ; '?' ROM:0239 jr nz, loc_25D ROM:023B ld (hl), a ROM:023C push bc ; save these through subroutine ROM:023D push hl ROM:023E inc l ROM:023F ld a, (hl) ROM:0240 inc l ROM:0241 ld b, (hl) ROM:0242 ld hl, 25Bh ; return to this address (past table) ROM:0245 push hl ROM:0246 rst 20h ROM:0246 ; --------------------------------------------------------------------------- ROM:0247 dw 894h ; A=0, increment LevelComplete ROM:0249 dw 6A3h ; Increment MainSub2 ROM:024B dw 58Eh ; Increment MainSub1 ROM:024D dw 1272h ROM:024F dw 1000h ; Clear fruit pointer and position ROM:0251 dw 100Bh ROM:0253 dw 263h ; draw message ROM:0255 dw 212Bh ; Increment cut scene1 state ROM:0257 dw 21F0h ; Increment cut scene 2 state ROM:0259 dw 22B9h ; A=9 Increment cutscene 3 state ROM:025B ; --------------------------------------------------------------------------- ROM:025B pop hl ; restore ROM:025C pop bc ROM:025D ROM:025D loc_25D: ; go to next task ROM:025D inc l ROM:025E inc l ROM:025F inc l ROM:0260 djnz loc_22A ; repeat till all 16 tasks have been scanned ROM:0262 ret ROM:0262 ; End of function MoveCutSceneSprites ROM:0262 ROM:0263 ROM:0263 ; =============== S U B R O U T I N E ======================================= ROM:0263 ROM:0263 ROM:0263 sub_263: ROM:0263 rst 28h ROM:0263 ; --------------------------------------------------------------------------- ROM:0264 db 1Ch ; DrawMessage ROM:0265 db 86h ROM:0266 ; --------------------------------------------------------------------------- ROM:0266 ret ROM:0266 ; End of function sub_263 ROM:0266 ROM:0267 ROM:0267 ; =============== S U B R O U T I N E ======================================= ROM:0267 ROM:0267 ROM:0267 sub_267: ROM:0267 ld a, (Credits) ROM:026A cp 99h ; 'Ö' ROM:026C rla ROM:026D ld (CoinLockout), a ROM:0270 rra ROM:0271 ret nc ROM:0272 ROM:0272 CoinDebounce: ROM:0272 ld a, (InterruptEnable) ROM:0275 ld b, a ROM:0276 rlc b ROM:0278 ld a, (CoinState) ; Coin state shifted left 1 ROM:027B rla ROM:027C and 0Fh ROM:027E ld (CoinState), a ; Coin state shifted left 1 ROM:0281 sub 0Ch ROM:0283 call z, CoinsToCredits ROM:0286 rlc b ROM:0288 ld a, (byte_4E67) ROM:028B rla ROM:028C and 0Fh ROM:028E ld (byte_4E67), a ROM:0291 sub 0Ch ROM:0293 jp nz, loc_29A ROM:0296 ld hl, 4E69h ROM:0299 inc (hl) ROM:029A ROM:029A loc_29A: ROM:029A rlc b ROM:029C ld a, (byte_4E68) ROM:029F rla ROM:02A0 and 0Fh ROM:02A2 ld (byte_4E68), a ROM:02A5 sub 0Ch ROM:02A7 ret nz ROM:02A8 ld hl, 4E69h ROM:02AB inc (hl) ROM:02AC ret ROM:02AC ; End of function sub_267 ROM:02AC ROM:02AD ROM:02AD ; =============== S U B R O U T I N E ======================================= ROM:02AD ROM:02AD ROM:02AD sub_2AD: ROM:02AD ld a, (byte_4E69) ROM:02B0 and a ROM:02B1 ret z ROM:02B2 ld b, a ROM:02B3 ld a, (byte_4E6A) ROM:02B6 ld e, a ROM:02B7 cp 0 ROM:02B9 jp nz, loc_2C4 ROM:02BC ld a, 1 ROM:02BE ld (CoinCounter), a ROM:02C1 call CoinsToCredits ROM:02C4 ROM:02C4 loc_2C4: ROM:02C4 ld a, e ROM:02C5 cp 8 ROM:02C7 jp nz, loc_2CE ROM:02CA xor a ROM:02CB ld (CoinCounter), a ROM:02CE ROM:02CE loc_2CE: ROM:02CE inc e ROM:02CF ld a, e ROM:02D0 ld (byte_4E6A), a ROM:02D3 sub 10h ROM:02D5 ret nz ROM:02D6 ld (byte_4E6A), a ROM:02D9 dec b ROM:02DA ld a, b ROM:02DB ld (byte_4E69), a ROM:02DE ret ROM:02DE ; End of function sub_2AD ROM:02DE ROM:02DF ROM:02DF ; =============== S U B R O U T I N E ======================================= ROM:02DF ROM:02DF ROM:02DF CoinsToCredits: ROM:02DF ld a, (CoinPerCredit) ; coins needed per credit ROM:02E2 ld hl, 4E6Ch ; partial credits ROM:02E5 inc (hl) ; add a coin ROM:02E6 sub (hl) ; see if it is enough ROM:02E7 ret nz ; if not enough, return ROM:02E8 ld (hl), a ; clear partial credits ROM:02E9 ld a, (CreditsPerCoin) ROM:02EC ld hl, 4E6Eh ; credits ROM:02EF add a, (hl) ; one more credit ROM:02F0 daa ; convert to binary coded decimal (BCD) ROM:02F1 jp nc, loc_2F6 ; no overflow, no need to cap ROM:02F4 ld a, 99h ; 'Ö' ; capped 99 DECIMAL credits ROM:02F6 ROM:02F6 loc_2F6: ; store back into credits ROM:02F6 ld (hl), a ROM:02F7 ld hl, 4E9Ch ; channel 1 sound ROM:02FA set 1, (hl) ; play an effect ROM:02FC ret ROM:02FC ; End of function CoinsToCredits ROM:02FC ROM:02FD ROM:02FD ; =============== S U B R O U T I N E ======================================= ROM:02FD ROM:02FD ROM:02FD sub_2FD: ROM:02FD ld hl, 4DCEh ROM:0300 inc (hl) ROM:0301 ld a, (hl) ROM:0302 and 0Fh ROM:0304 jr nz, loc_325 ROM:0306 ld a, (hl) ROM:0307 rrca ROM:0308 rrca ROM:0309 rrca ROM:030A rrca ROM:030B ld b, a ROM:030C ld a, (LEDState) ROM:030F cpl ROM:0310 or b ROM:0311 ld c, a ROM:0312 ld a, (Credits) ROM:0315 sub 1 ROM:0317 jr nc, loc_31B ROM:0319 xor a ROM:031A ld c, a ROM:031B ROM:031B loc_31B: ROM:031B jr z, loc_31E ROM:031D ld a, c ROM:031E ROM:031E loc_31E: ROM:031E ld (Player2Lamp), a ROM:0321 ld a, c ROM:0322 ld (Player1Lamp), a ROM:0325 ROM:0325 loc_325: ROM:0325 ld ix, 43D8h ROM:0329 ld iy, 43C5h ROM:032D ld a, (MainMode) ROM:0330 cp 3 ROM:0332 jp z, loc_344 ROM:0335 ld a, (MainSub2) ROM:0338 cp 2 ROM:033A jp nc, loc_344 ROM:033D call sub_369 ROM:0340 call sub_376 ROM:0343 ret ROM:0344 ; --------------------------------------------------------------------------- ROM:0344 ROM:0344 loc_344: ROM:0344 ld a, (PlayerNumber) ROM:0347 and a ROM:0348 ld a, (byte_4DCE) ROM:034B jp nz, loc_359 ROM:034E bit 4, a ROM:0350 call z, sub_369 ROM:0353 call nz, sub_383 ROM:0356 jp loc_361 ROM:0359 ; --------------------------------------------------------------------------- ROM:0359 ROM:0359 loc_359: ROM:0359 bit 4, a ROM:035B call z, sub_376 ROM:035E call nz, sub_390 ROM:0361 ROM:0361 loc_361: ROM:0361 ld a, (byte_4E70) ROM:0364 and a ROM:0365 call z, sub_390 ROM:0368 ret ROM:0368 ; End of function sub_2FD ROM:0368 ROM:0369 ROM:0369 ; =============== S U B R O U T I N E ======================================= ROM:0369 ROM:0369 ROM:0369 sub_369: ROM:0369 ld (ix+0), 50h ; 'P' ROM:036D ld (ix+1), 55h ; 'U' ROM:0371 ld (ix+2), 31h ; '1' ROM:0375 ret ROM:0375 ; End of function sub_369 ROM:0375 ROM:0376 ROM:0376 ; =============== S U B R O U T I N E ======================================= ROM:0376 ROM:0376 ROM:0376 sub_376: ROM:0376 ld (iy+0), 50h ; 'P' ROM:037A ld (iy+1), 55h ; 'U' ROM:037E ld (iy+2), 32h ; '2' ROM:0382 ret ROM:0382 ; End of function sub_376 ROM:0382 ROM:0383 ROM:0383 ; =============== S U B R O U T I N E ======================================= ROM:0383 ROM:0383 ROM:0383 sub_383: ROM:0383 ld (ix+0), 40h ; '@' ROM:0387 ld (ix+1), 40h ; '@' ROM:038B ld (ix+2), 40h ; '@' ROM:038F ret ROM:038F ; End of function sub_383 ROM:038F ROM:0390 ROM:0390 ; =============== S U B R O U T I N E ======================================= ROM:0390 ROM:0390 ROM:0390 sub_390: ROM:0390 ld (iy+0), 40h ; '@' ROM:0394 ld (iy+1), 40h ; '@' ROM:0398 ld (iy+2), 40h ; '@' ROM:039C ret ROM:039C ; End of function sub_390 ROM:039C ROM:039D ROM:039D ; =============== S U B R O U T I N E ======================================= ROM:039D ROM:039D ROM:039D DrawBigPacMan: ROM:039D ld a, (CutSceneState1) ; if less than 5, normal PacMan ROM:03A0 sub 5 ROM:03A2 ret c ROM:03A3 ld hl, (PacManYPos) ROM:03A6 ld b, 8 ROM:03A8 ld c, 10h ROM:03AA ld a, l ROM:03AB ld (OrangeYPos), a ROM:03AE ld (FruitPosition), a ROM:03B1 sub c ROM:03B2 ld (PinkYPos), a ROM:03B5 ld (BlueYPos), a ROM:03B8 ld a, h ROM:03B9 add a, b ROM:03BA ld (PinkXPos), a ROM:03BD ld (OrangeXPos), a ROM:03C0 sub c ROM:03C1 ld (BlueXPos), a ROM:03C4 ld (FruitPosition+1), a ROM:03C7 ret ROM:03C7 ; End of function DrawBigPacMan ROM:03C7 ROM:03C8 ROM:03C8 ; =============== S U B R O U T I N E ======================================= ROM:03C8 ROM:03C8 ROM:03C8 sub_3C8: ROM:03C8 ld a, (MainMode) ; game mode ROM:03CB rst 20h ; jump to table for Mode ROM:03CB ; End of function sub_3C8 ROM:03CB ROM:03CB ; --------------------------------------------------------------------------- ROM:03CC dw 3D4h ; 4E00 <- 0 ROM:03CE dw 3FEh ; 4E00 <- 1 ALL ATTRACT MODES ROM:03D0 dw 5E5h ; 4E00 <- 2 PLAYER 1 OR 2 SCREEN ROM:03D2 dw 6BEh ; 4E00 <- 3 Player 1 or 2 playing ROM:03D4 ; --------------------------------------------------------------------------- ROM:03D4 This gets called on MainMode = 0 ROM:03D4 ROM:03D4 Mode0: ROM:03D4 ld a, (MainSub0) ROM:03D7 rst 20h ROM:03D7 ; --------------------------------------------------------------------------- ROM:03D8 dw 3DCh ; TODO - decode this table, some of it is code ROM:03DA dw 0Ch ; return ROM:03DC ; --------------------------------------------------------------------------- ROM:03DC rst 28h ROM:03DC ; --------------------------------------------------------------------------- ROM:03DD db 0 ROM:03DE db 0 ROM:03DF ; --------------------------------------------------------------------------- ROM:03DF rst 28h ROM:03DF ; --------------------------------------------------------------------------- ROM:03E0 db 6 ROM:03E1 db 0 ROM:03E2 ; --------------------------------------------------------------------------- ROM:03E2 rst 28h ROM:03E2 ; --------------------------------------------------------------------------- ROM:03E3 db 1 ; ColorMaze, 0 ROM:03E4 db 0 ROM:03E5 ; --------------------------------------------------------------------------- ROM:03E5 rst 28h ROM:03E5 ; --------------------------------------------------------------------------- ROM:03E6 db 14h ROM:03E7 db 0 ROM:03E8 ; --------------------------------------------------------------------------- ROM:03E8 rst 28h ROM:03E8 ; --------------------------------------------------------------------------- ROM:03E9 db 18h ROM:03EA db 0 ROM:03EB ; --------------------------------------------------------------------------- ROM:03EB rst 28h ROM:03EB ; --------------------------------------------------------------------------- ROM:03EC db 4 ROM:03ED db 0 ROM:03EE ; --------------------------------------------------------------------------- ROM:03EE rst 28h ROM:03EE ; --------------------------------------------------------------------------- ROM:03EF db 1Eh ; ClearPositions ROM:03F0 db 0 ROM:03F1 ; --------------------------------------------------------------------------- ROM:03F1 rst 28h ROM:03F1 ; --------------------------------------------------------------------------- ROM:03F2 db 7 ; StartDemo ROM:03F3 db 0 ROM:03F4 ; --------------------------------------------------------------------------- ROM:03F4 ld hl, 4E01h ROM:03F7 inc (hl) ROM:03F8 ld hl, 5001h ; enable sound ROM:03FB ld (hl), 1 ROM:03FD ret ROM:03FE ; --------------------------------------------------------------------------- ROM:03FE ;============= ROM:03FE ;MainMode 1 - ROM:03FE ; check for credits, if found, ROM:03FE ; end level in demo, and set to main mode 2, ROM:03FE ; sub function 0 ROM:03FE ;============= ROM:03FE ROM:03FE Mode1: ; write credits on screen ROM:03FE call DrawCredits ROM:0401 ld a, (Credits) ; get credits ROM:0404 and a ; test zero ROM:0405 jr z, NoCredits ; no credits->0x413 ROM:0407 xor a ; zero value to mark end of level ROM:0408 ld (LevelComplete), a ; level complete ROM:040B ld (MainSub1), a ; store function 0 in MainSub1 ROM:040E ld hl, 4E00h ; start game mode ROM:0411 inc (hl) ; Set MainMode to 2 ROM:0412 ret ; and return ROM:0413 ; --------------------------------------------------------------------------- ROM:0413 ROM:0413 NoCredits: ROM:0413 ld a, (MainSub1) ROM:0416 rst 20h ROM:0416 ; --------------------------------------------------------------------------- ROM:0417 ;=================== ROM:0417 ; address table based off 4E02 ROM:0417 ; draw the attract screen ROM:0417 ;=================== ROM:0417 dw 45Fh ; (4e02)=0 ROM:0419 dw 0Ch ; (4e02)=1 return ROM:041B dw 471h ; ... ROM:041D dw 0Ch ; TODO - this table needs vetted ROM:041F dw 47Fh ROM:0421 dw 0Ch ROM:0423 dw 485h ROM:0425 dw 0Ch ROM:0427 dw 48Bh ROM:0429 dw 0Ch ROM:042B dw 499h ROM:042D dw 0Ch ROM:042F dw 49Fh ROM:0431 dw 0Ch ROM:0433 dw 4A5h ROM:0435 dw 0Ch ; return ROM:0437 dw 4B3h ROM:0439 dw 0Ch ROM:043B dw 4B9h ROM:043D dw 0Ch ROM:043F dw 4BFh ROM:0441 dw 0Ch ROM:0443 dw 4CDh ROM:0445 dw 0Ch ROM:0447 dw 4D3h ROM:0449 dw 0Ch ROM:044B dw 4D8h ROM:044D dw 0Ch ROM:044F dw 4E0h ROM:0451 dw 0Ch ROM:0453 dw 51Ch ROM:0455 dw 54Bh ROM:0457 dw 556h ROM:0459 dw 561h ROM:045B dw 56Ch ROM:045D dw 57Ch ROM:045F ; --------------------------------------------------------------------------- ROM:045F rst 28h ROM:045F ; --------------------------------------------------------------------------- ROM:0460 db 0 ; ClearVideo ROM:0461 db 1 ROM:0462 ; --------------------------------------------------------------------------- ROM:0462 rst 28h ROM:0462 ; --------------------------------------------------------------------------- ROM:0463 db 1 ; ColorMaze ROM:0464 db 0 ROM:0465 ; --------------------------------------------------------------------------- ROM:0465 rst 28h ROM:0465 ; --------------------------------------------------------------------------- ROM:0466 db 4 ROM:0467 db 0 ROM:0468 ; --------------------------------------------------------------------------- ROM:0468 rst 28h ROM:0468 ; --------------------------------------------------------------------------- ROM:0469 db 1Eh ; ClearPositions ROM:046A db 0 ROM:046B ; --------------------------------------------------------------------------- ROM:046B ld c, 0Ch ROM:046D call sub_585 ROM:0470 ret ROM:0471 ROM:0471 ; =============== S U B R O U T I N E ======================================= ROM:0471 ROM:0471 ROM:0471 sub_471: ROM:0471 ld hl, 4304h ROM:0474 ld a, 1 ROM:0476 call sub_5BF ROM:0479 ld c, 0Ch ROM:047B call sub_585 ROM:047E ret ROM:047E ; End of function sub_471 ROM:047E ROM:047F ROM:047F ; =============== S U B R O U T I N E ======================================= ROM:047F ROM:047F ROM:047F sub_47F: ROM:047F ld c, 14h ROM:0481 call sub_593 ROM:0484 ret ROM:0484 ; End of function sub_47F ROM:0484 ROM:0485 ROM:0485 ; =============== S U B R O U T I N E ======================================= ROM:0485 ROM:0485 ROM:0485 sub_485: ROM:0485 ld c, 0Dh ROM:0487 call sub_593 ROM:048A ret ROM:048A ; End of function sub_485 ROM:048A ROM:048B ROM:048B ; =============== S U B R O U T I N E ======================================= ROM:048B ROM:048B ROM:048B sub_48B: ROM:048B ld hl, 4307h ROM:048E ld a, 3 ROM:0490 call sub_5BF ROM:0493 ld c, 0Ch ROM:0495 call sub_585 ROM:0498 ret ROM:0498 ; End of function sub_48B ROM:0498 ROM:0499 ROM:0499 ; =============== S U B R O U T I N E ======================================= ROM:0499 ROM:0499 ROM:0499 sub_499: ROM:0499 ld c, 16h ROM:049B call sub_593 ROM:049E ret ROM:049E ; End of function sub_499 ROM:049E ROM:049F ROM:049F ; =============== S U B R O U T I N E ======================================= ROM:049F ROM:049F ROM:049F sub_49F: ROM:049F ld c, 0Fh ROM:04A1 call sub_593 ROM:04A4 ret ROM:04A4 ; End of function sub_49F ROM:04A4 ROM:04A5 ROM:04A5 ; =============== S U B R O U T I N E ======================================= ROM:04A5 ROM:04A5 ROM:04A5 sub_4A5: ROM:04A5 ld hl, 430Ah ROM:04A8 ld a, 5 ROM:04AA call sub_5BF ROM:04AD ld c, 0Ch ROM:04AF call sub_585 ROM:04B2 ret ROM:04B2 ; End of function sub_4A5 ROM:04B2 ROM:04B3 ROM:04B3 ; =============== S U B R O U T I N E ======================================= ROM:04B3 ROM:04B3 ROM:04B3 sub_4B3: ROM:04B3 ld c, 33h ; '3' ROM:04B5 call sub_593 ROM:04B8 ret ROM:04B8 ; End of function sub_4B3 ROM:04B8 ROM:04B9 ROM:04B9 ; =============== S U B R O U T I N E ======================================= ROM:04B9 ROM:04B9 ROM:04B9 sub_4B9: ROM:04B9 ld c, 2Fh ; '/' ROM:04BB call sub_593 ROM:04BE ret ROM:04BE ; End of function sub_4B9 ROM:04BE ROM:04BF ROM:04BF ; =============== S U B R O U T I N E ======================================= ROM:04BF ROM:04BF ROM:04BF sub_4BF: ROM:04BF ld hl, 430Dh ROM:04C2 ld a, 7 ROM:04C4 call sub_5BF ROM:04C7 ld c, 0Ch ROM:04C9 call sub_585 ROM:04CC ret ROM:04CC ; End of function sub_4BF ROM:04CC ROM:04CD ROM:04CD ; =============== S U B R O U T I N E ======================================= ROM:04CD ROM:04CD ROM:04CD sub_4CD: ROM:04CD ld c, 35h ; '5' ROM:04CF call sub_593 ROM:04D2 ret ROM:04D2 ; End of function sub_4CD ROM:04D2 ROM:04D3 ROM:04D3 ; =============== S U B R O U T I N E ======================================= ROM:04D3 ROM:04D3 ROM:04D3 sub_4D3: ROM:04D3 ROM:04D3 ; FUNCTION CHUNK AT ROM:0580 SIZE 00000005 BYTES ROM:04D3 ROM:04D3 ld c, 31h ; '1' ROM:04D5 jp loc_580 ROM:04D5 ; End of function sub_4D3 ROM:04D5 ROM:04D8 ; --------------------------------------------------------------------------- ROM:04D8 rst 28h ROM:04D8 ; --------------------------------------------------------------------------- ROM:04D9 db 1Ch ; DrawMessage ROM:04DA db 11h ROM:04DB ; --------------------------------------------------------------------------- ROM:04DB ld c, 12h ROM:04DD jp sub_585 ROM:04E0 ; --------------------------------------------------------------------------- ROM:04E0 ld c, 13h ROM:04E2 call sub_585 ROM:04E5 call sub_879 ROM:04E8 dec (hl) ROM:04E9 rst 28h ROM:04E9 ; --------------------------------------------------------------------------- ROM:04EA db 11h ; ZeroGameState ROM:04EB db 0 ROM:04EC ; --------------------------------------------------------------------------- ROM:04EC rst 28h ROM:04EC ; --------------------------------------------------------------------------- ROM:04ED db 5 ROM:04EE db 1 ROM:04EF ; --------------------------------------------------------------------------- ROM:04EF rst 28h ROM:04EF ; --------------------------------------------------------------------------- ROM:04F0 db 10h ROM:04F1 db 14h ROM:04F2 ; --------------------------------------------------------------------------- ROM:04F2 rst 28h ROM:04F2 ; --------------------------------------------------------------------------- ROM:04F3 db 4 ROM:04F4 db 1 ROM:04F5 ; --------------------------------------------------------------------------- ROM:04F5 ld a, 1 ROM:04F7 ld (LivesNumber), a ROM:04FA xor a ROM:04FB ld (byte_4E70), a ROM:04FE ld (LivesDisplay), a ROM:0501 ld hl, 4332h ROM:0504 ld (hl), 14h ROM:0506 ROM:0506 ; =============== S U B R O U T I N E ======================================= ROM:0506 ROM:0506 ROM:0506 sub_506: ROM:0506 ld a, 0FCh ; 'n' ROM:0508 ld de, 20h ; ' ' ROM:050B ld b, 1Ch ROM:050D ld ix, 4040h ROM:0511 ROM:0511 loc_511: ROM:0511 ld (ix+11h), a ROM:0514 ld (ix+13h), a ROM:0517 add ix, de ROM:0519 djnz loc_511 ROM:051B ret ROM:051B ; End of function sub_506 ROM:051B ROM:051C check for moving through a tunnel ROM:051C ROM:051C ; =============== S U B R O U T I N E ======================================= ROM:051C ROM:051C ROM:051C sub_51C: ROM:051C ld hl, 4DA0h ROM:051F ld b, 21h ; '!' ROM:0521 ld a, (PacPosition+1) ROM:0524 ROM:0524 loc_524: ROM:0524 sub b ROM:0525 jr nz, loc_52C ROM:0527 ld (hl), 1 ROM:0529 jp loc_58E ROM:052C ; --------------------------------------------------------------------------- ROM:052C ROM:052C loc_52C: ROM:052C call sub_1017 ROM:052F call sub_1017 ROM:0532 call IncAnimFrame ROM:0535 call sub_C0D ROM:0538 call sub_BD6 ROM:053B call sub_5A5 ROM:053E call sub_1EFE ROM:0541 call sub_1F25 ROM:0544 call sub_1F4C ROM:0547 call sub_1F73 ROM:054A ret ROM:054A ; End of function sub_51C ROM:054A ROM:054B ROM:054B ; =============== S U B R O U T I N E ======================================= ROM:054B ROM:054B ROM:054B sub_54B: ROM:054B ld hl, 4DA1h ROM:054E ld b, 20h ; ' ' ROM:0550 ld a, (word_4D31+1) ROM:0553 jp loc_524 ROM:0553 ; End of function sub_54B ROM:0553 ROM:0556 ROM:0556 ; =============== S U B R O U T I N E ======================================= ROM:0556 ROM:0556 ROM:0556 sub_556: ROM:0556 ld hl, 4DA2h ROM:0559 ld b, 22h ; '"' ROM:055B ld a, (word_4D31+1) ROM:055E jp loc_524 ROM:055E ; End of function sub_556 ROM:055E ROM:0561 ROM:0561 ; =============== S U B R O U T I N E ======================================= ROM:0561 ROM:0561 ROM:0561 sub_561: ROM:0561 ld hl, 4DA3h ROM:0564 ld b, 24h ; '$' ROM:0566 ld a, (word_4D31+1) ROM:0569 jp loc_524 ROM:0569 ; End of function sub_561 ROM:0569 ROM:056C ROM:056C ; =============== S U B R O U T I N E ======================================= ROM:056C ROM:056C ROM:056C sub_56C: ROM:056C ld a, (byte_4DD0) ROM:056F ld b, a ROM:0570 ld a, (byte_4DD1) ROM:0573 add a, b ROM:0574 cp 6 ROM:0576 jp z, loc_58E ROM:0579 jp loc_52C ROM:0579 ; End of function sub_56C ROM:0579 ROM:057C ROM:057C ; =============== S U B R O U T I N E ======================================= ROM:057C ROM:057C ROM:057C sub_57C: ROM:057C call Mode3 ROM:057F ret ROM:057F ; End of function sub_57C ROM:057F ROM:0580 ; --------------------------------------------------------------------------- ROM:0580 ; START OF FUNCTION CHUNK FOR sub_4D3 ROM:0580 ROM:0580 loc_580: ROM:0580 ld a, (GhostNames) ROM:0583 add a, c ROM:0584 ld c, a ROM:0584 ; END OF FUNCTION CHUNK FOR sub_4D3 ROM:0585 ROM:0585 ; =============== S U B R O U T I N E ======================================= ROM:0585 ROM:0585 ROM:0585 sub_585: ROM:0585 ld b, 1Ch ROM:0587 call ContinueTask ROM:058A rst 30h ; store IRQ task ROM:058A ; --------------------------------------------------------------------------- ROM:058B db 4Ah ROM:058C db 2 ROM:058D db 0 ROM:058E ; --------------------------------------------------------------------------- ROM:058E ROM:058E loc_58E: ROM:058E ld hl, 4E02h ROM:0591 inc (hl) ROM:0592 ret ROM:0592 ; End of function sub_585 ROM:0592 ROM:0593 ROM:0593 ; =============== S U B R O U T I N E ======================================= ROM:0593 ROM:0593 ROM:0593 sub_593: ROM:0593 ld a, (GhostNames) ROM:0596 add a, c ROM:0597 ld c, a ROM:0598 ld b, 1Ch ROM:059A call ContinueTask ROM:059D rst 30h ; store IRQ task ROM:059D ; End of function sub_593 ROM:059D ROM:059D ; --------------------------------------------------------------------------- ROM:059E db 45h ROM:059F db 2 ROM:05A0 db 0 ROM:05A1 ; --------------------------------------------------------------------------- ROM:05A1 call loc_58E ROM:05A4 ret ROM:05A5 ROM:05A5 ; =============== S U B R O U T I N E ======================================= ROM:05A5 ROM:05A5 ROM:05A5 sub_5A5: ROM:05A5 ld a, (byte_4DB5) ROM:05A8 and a ROM:05A9 ret z ROM:05AA xor a ROM:05AB ld (byte_4DB5), a ROM:05AE ld a, (byte_4D30) ROM:05B1 xor 2 ROM:05B3 ld (byte_4D3C), a ROM:05B6 ld b, a ROM:05B7 ld hl, 32FFh ROM:05BA rst 18h ROM:05BB ld (word_4D26), hl ROM:05BE ret ROM:05BE ; End of function sub_5A5 ROM:05BE ROM:05BF ROM:05BF ; =============== S U B R O U T I N E ======================================= ROM:05BF ROM:05BF ROM:05BF sub_5BF: ROM:05BF ld (hl), 0B1h ; '¦' ROM:05C1 inc l ROM:05C2 ld (hl), 0B3h ; '¦' ROM:05C4 inc l ROM:05C5 ld (hl), 0B5h ; '¦' ROM:05C7 ld bc, 1Eh ROM:05CA add hl, bc ROM:05CB ld (hl), 0B0h ; '¦' ROM:05CD inc l ROM:05CE ld (hl), 0B2h ; '¦' ROM:05D0 inc l ROM:05D1 ld (hl), 0B4h ; '¦' ROM:05D3 ld de, 400h ROM:05D6 add hl, de ROM:05D7 ld (hl), a ROM:05D8 dec l ROM:05D9 ld (hl), a ROM:05DA dec l ROM:05DB ld (hl), a ROM:05DC and a ROM:05DD sbc hl, bc ROM:05DF ld (hl), a ROM:05E0 dec l ROM:05E1 ld (hl), a ROM:05E2 dec l ROM:05E3 ld (hl), a ROM:05E4 ret ROM:05E4 ; End of function sub_5BF ROM:05E4 ROM:05E5 ; --------------------------------------------------------------------------- ROM:05E5 ;============= ROM:05E5 ;MainMode 2 - ROM:05E5 ;TODO ROM:05E5 ;Player 1 or 2 screen ROM:05E5 ;============= ROM:05E5 ROM:05E5 Mode2: ; get subroutine number ROM:05E5 ld a, (MainSub2) ROM:05E8 rst 20h ; and run it ROM:05E8 ; --------------------------------------------------------------------------- ROM:05E9 dw 5F3h ; TODO - is this right? ROM:05EB dw 61Bh ROM:05ED dw 674h ROM:05EF dw 0Ch ; return ROM:05F1 dw 6A8h ; DrawLives ROM:05F3 ; --------------------------------------------------------------------------- ROM:05F3 call DrawCredits ROM:05F6 rst 28h ROM:05F6 ; --------------------------------------------------------------------------- ROM:05F7 db 0 ; ClearVideo ROM:05F8 db 1 ROM:05F9 ; --------------------------------------------------------------------------- ROM:05F9 rst 28h ROM:05F9 ; --------------------------------------------------------------------------- ROM:05FA db 1 ; ColorMaze ROM:05FB db 0 ROM:05FC ; --------------------------------------------------------------------------- ROM:05FC rst 28h ROM:05FC ; --------------------------------------------------------------------------- ROM:05FD db 1Ch ; DrawMessage ROM:05FE db 7 ROM:05FF ; --------------------------------------------------------------------------- ROM:05FF rst 28h ROM:05FF ; --------------------------------------------------------------------------- ROM:0600 db 1Ch ; DrawMessage ROM:0601 db 0Bh ROM:0602 ; --------------------------------------------------------------------------- ROM:0602 rst 28h ROM:0602 ; --------------------------------------------------------------------------- ROM:0603 db 1Eh ; ClearPositions ROM:0604 db 0 ROM:0605 ; --------------------------------------------------------------------------- ROM:0605 ld hl, 4E03h ROM:0608 inc (hl) ROM:0609 ld a, 1 ROM:060B ld (LEDState), a ROM:060E ld a, (BonusLifeVal) ROM:0611 cp 0FFh ROM:0613 ret z ROM:0614 rst 28h ROM:0614 ; --------------------------------------------------------------------------- ROM:0615 db 1Ch ; DrawMessage ROM:0616 db 0Ah ROM:0617 ; --------------------------------------------------------------------------- ROM:0617 rst 28h ROM:0617 ; --------------------------------------------------------------------------- ROM:0618 db 1Fh ; ShowBonusScore ROM:0619 db 0 ROM:061A ; --------------------------------------------------------------------------- ROM:061A ret ROM:061B ROM:061B ; =============== S U B R O U T I N E ======================================= ROM:061B ROM:061B ROM:061B sub_61B: ROM:061B call DrawCredits ROM:061E ld a, (Credits) ROM:0621 cp 1 ROM:0623 ld b, 9 ROM:0625 jr nz, loc_629 ROM:0627 ld b, 8 ; "1 PLAYER ONLY" message ROM:0629 ROM:0629 loc_629: ROM:0629 call DrawMessage ROM:062C ld a, (Credits) ROM:062F cp 1 ROM:0631 ld a, (Voice1Acc) ROM:0634 jr z, loc_642 ROM:0636 bit 6, a ROM:0638 jr nz, loc_642 ROM:063A ld a, 1 ROM:063C ld (byte_4E70), a ROM:063F jp loc_649 ROM:0642 ; --------------------------------------------------------------------------- ROM:0642 ROM:0642 loc_642: ROM:0642 bit 5, a ROM:0644 ret nz ROM:0645 xor a ROM:0646 ld (byte_4E70), a ROM:0649 ROM:0649 loc_649: ROM:0649 ld a, (CoinPerCredit) ROM:064C and a ROM:064D jr z, loc_664 ROM:064F ld a, (byte_4E70) ROM:0652 and a ROM:0653 ld a, (Credits) ROM:0656 jr z, loc_65B ROM:0658 add a, 99h ; 'Ö' ROM:065A daa ROM:065B ROM:065B loc_65B: ROM:065B add a, 99h ; 'Ö' ROM:065D daa ROM:065E ld (Credits), a ROM:0661 call DrawCredits ROM:0664 ROM:0664 loc_664: ROM:0664 ld hl, 4E03h ROM:0667 inc (hl) ROM:0668 xor a ROM:0669 ld (LEDState), a ROM:066C inc a ROM:066D ld (CH1_W_NUM), a ROM:0670 ld (CH2_W_NUM), a ROM:0673 ret ROM:0673 ; End of function sub_61B ROM:0673 ROM:0674 ; --------------------------------------------------------------------------- ROM:0674 rst 28h ROM:0674 ; --------------------------------------------------------------------------- ROM:0675 db 0 ; ClearVideo ROM:0676 db 1 ROM:0677 ; --------------------------------------------------------------------------- ROM:0677 rst 28h ROM:0677 ; --------------------------------------------------------------------------- ROM:0678 db 1 ROM:0679 db 1 ROM:067A ; --------------------------------------------------------------------------- ROM:067A rst 28h ROM:067A ; --------------------------------------------------------------------------- ROM:067B db 2 ROM:067C db 0 ROM:067D ; --------------------------------------------------------------------------- ROM:067D rst 28h ROM:067D ; --------------------------------------------------------------------------- ROM:067E db 12h ROM:067F db 0 ROM:0680 ; --------------------------------------------------------------------------- ROM:0680 rst 28h ROM:0680 ; --------------------------------------------------------------------------- ROM:0681 db 3 ROM:0682 db 0 ROM:0683 ; --------------------------------------------------------------------------- ROM:0683 rst 28h ROM:0683 ; --------------------------------------------------------------------------- ROM:0684 db 1Ch ROM:0685 db 3 ROM:0686 ; --------------------------------------------------------------------------- ROM:0686 rst 28h ROM:0686 ; --------------------------------------------------------------------------- ROM:0687 db 1Ch ROM:0688 db 6 ROM:0689 ; --------------------------------------------------------------------------- ROM:0689 rst 28h ROM:0689 ; --------------------------------------------------------------------------- ROM:068A db 18h ROM:068B db 0 ROM:068C ; --------------------------------------------------------------------------- ROM:068C rst 28h ROM:068C ; --------------------------------------------------------------------------- ROM:068D db 1Bh ROM:068E db 0 ROM:068F ; --------------------------------------------------------------------------- ROM:068F xor a ROM:0690 ld (LevelNumber), a ROM:0693 ld a, (LivesPerGame) ROM:0696 ld (LivesNumber), a ROM:0699 ld (LivesDisplay), a ROM:069C rst 28h ROM:069C ; --------------------------------------------------------------------------- ROM:069D db 1Ah ROM:069E db 0 ROM:069F ; --------------------------------------------------------------------------- ROM:069F rst 30h ; store IRQ task ROM:069F ; --------------------------------------------------------------------------- ROM:06A0 db 57h ROM:06A1 db 1 ROM:06A2 db 0 ROM:06A3 ; --------------------------------------------------------------------------- ROM:06A3 ld hl, 4E03h ROM:06A6 inc (hl) ROM:06A7 ret ROM:06A8 ;Draw lives on screen ROM:06A8 ROM:06A8 ; =============== S U B R O U T I N E ======================================= ROM:06A8 ROM:06A8 ROM:06A8 DrawLives: ROM:06A8 ld hl, 4E15h ; Get number of lives to display ROM:06AB dec (hl) ; remove one ROM:06AC call sub_2B6A ROM:06AF xor a ; zero a ROM:06B0 ld (MainSub2), a ; store as subroutine number for Modes 1 and 2 ROM:06B3 ld (MainSub1), a ROM:06B6 ld (LevelComplete), a ROM:06B9 ld hl, 4E00h ; increment game mode ROM:06BC inc (hl) ROM:06BD ret ROM:06BD ; End of function DrawLives ROM:06BD ROM:06BE ;============= ROM:06BE ;MainMode 3 - ROM:06BE ;TODO ROM:06BE ; ROM:06BE ;============= ROM:06BE ROM:06BE ; =============== S U B R O U T I N E ======================================= ROM:06BE ROM:06BE ROM:06BE Mode3: ROM:06BE ld a, (LevelComplete) ROM:06C1 rst 20h ROM:06C1 ; --------------------------------------------------------------------------- ROM:06C2 dw 879h ROM:06C4 dw 899h ROM:06C6 dw 0Ch ; return ROM:06C8 dw 8CDh ROM:06CA dw 90Dh ROM:06CC dw 0Ch ROM:06CE dw 940h ROM:06D0 dw 0Ch ROM:06D2 dw 972h ROM:06D4 dw 988h ROM:06D6 dw 0Ch ROM:06D8 dw 9D2h ROM:06DA dw 9D8h ROM:06DC dw 0Ch ROM:06DE dw 9E8h ROM:06E0 dw 0Ch ROM:06E2 dw 9FEh ROM:06E4 dw 0Ch ROM:06E6 dw 0A02h ROM:06E8 dw 0Ch ROM:06EA dw 0A04h ROM:06EC dw 0Ch ROM:06EE dw 0A06h ROM:06F0 dw 0Ch ROM:06F2 dw 0A08h ROM:06F4 dw 0Ch ROM:06F6 dw 0A0Ah ROM:06F8 dw 0Ch ROM:06FA dw 0A0Ch ROM:06FC dw 0Ch ROM:06FE dw 0A0Eh ROM:0700 dw 0Ch ROM:0702 dw 0A2Ch ROM:0704 dw 0Ch ROM:0706 dw 0A7Ch ROM:0708 dw 0AA0h ROM:070A dw 0Ch ROM:070C dw 0AA3h ROM:070E ; --------------------------------------------------------------------------- ROM:070E ROM:070E PrepareDifficulty: ROM:070E ld a, b ROM:070F and a ROM:0710 jr nz, loc_716 ROM:0712 ld hl, (DifficultyPtr) ROM:0715 ld a, (hl) ROM:0716 ROM:0716 loc_716: ROM:0716 ld ix, 796h ROM:071A ld b, a ROM:071B add a, a ROM:071C add a, a ROM:071D add a, b ROM:071E add a, b ROM:071F ld e, a ROM:0720 ld d, 0 ROM:0722 add ix, de ROM:0724 ld a, (ix+0) ROM:0727 add a, a ROM:0728 ld b, a ROM:0729 add a, a ROM:072A add a, a ROM:072B ld c, a ROM:072C add a, a ROM:072D add a, a ROM:072E add a, c ROM:072F add a, b ROM:0730 ld e, a ROM:0731 ld d, 0 ROM:0733 ld hl, 330Fh ROM:0736 add hl, de ROM:0737 call sub_814 ROM:073A ld a, (ix+1) ROM:073D ld (byte_4DB0), a ROM:0740 ld a, (ix+2) ROM:0743 ld b, a ROM:0744 add a, a ROM:0745 add a, b ROM:0746 ld e, a ROM:0747 ld d, 0 ROM:0749 ld hl, 843h ; Hard/Easy data check ROM:074C add hl, de ROM:074D call sub_83A ROM:0750 ld a, (ix+3) ROM:0753 add a, a ROM:0754 ld e, a ROM:0755 ld d, 0 ROM:0757 ld iy, 84Fh ROM:075B add iy, de ROM:075D ld l, (iy+0) ROM:0760 ld h, (iy+1) ROM:0763 ld (PillLimit1), hl ROM:0766 ld a, (ix+4) ROM:0769 add a, a ROM:076A ld e, a ROM:076B ld d, 0 ROM:076D ld iy, 861h ROM:0771 add iy, de ROM:0773 ld l, (iy+0) ROM:0776 ld h, (iy+1) ROM:0779 ld (GhostTime2), hl ROM:077C ld a, (ix+5) ROM:077F add a, a ROM:0780 ld e, a ROM:0781 ld d, 0 ROM:0783 ld iy, 873h ROM:0787 add iy, de ROM:0789 ld l, (iy+0) ROM:078C ld h, (iy+1) ROM:078F ld (word_4D95), hl ROM:0792 call UpdateFruit ROM:0795 ret ROM:0795 ; End of function Mode3 ROM:0795 ROM:0795 ; --------------------------------------------------------------------------- ROM:0796 ; -- difficulty related table ROM:0796 ; each entry is 6 bytes ROM:0796 ; byte 0: (0..6) movement bit patterns and orientation changes (table at 330F) ROM:0796 ; byte 1: (00, 01, 02) stored at 4DB0 - seems to be unused ROM:0796 ; byte 2: (0..3) ghost counter table to exit home (table at 0843) ROM:0796 ; byte 3: (0..7) remaining number of pills to set difficulty flags (table at 084F) ROM:0796 ; byte 4: (0..8) ghost time to stay blue when pacman eats the big pill (table at 0861) ROM:0796 ; byte 5: (0..2) number of units before a ghost goes out of home (table at 0873) ROM:0796 DifficultyTable:db 3, 1, 1, 0, 2, 0 ; Referenced from 716 ROM:0796 db 4, 1, 2, 1, 3, 0 ROM:0796 db 4, 1, 3, 2, 4, 1 ROM:0796 db 4, 2, 3, 2, 5, 1 ROM:0796 db 5, 0, 3, 2, 6, 2 ROM:0796 db 5, 1, 3, 3, 3, 2 ROM:0796 db 5, 2, 3, 3, 6, 2 ROM:0796 db 5, 2, 3, 3, 6, 2 ROM:0796 db 5, 0, 3, 4, 7, 2 ROM:0796 db 5, 1, 3, 4, 3, 2 ROM:0796 db 5, 2, 3, 4, 6, 2 ROM:0796 db 5, 2, 3, 5, 7, 2 ROM:0796 db 5, 0, 3, 5, 7, 2 ROM:0796 db 5, 2, 3, 5, 5, 2 ROM:0796 db 5, 1, 3, 6, 7, 2 ROM:0796 db 5, 2, 3, 6, 7, 2 ROM:0796 db 5, 2, 3, 6, 8, 2 ROM:0796 db 5, 2, 3, 6, 7, 2 ROM:0796 db 5, 2, 3, 7, 8, 2 ROM:0796 db 5, 2, 3, 7, 8, 2 ROM:0796 db 6, 2, 3, 7, 8, 2 ROM:0814 ROM:0814 ; =============== S U B R O U T I N E ======================================= ROM:0814 ROM:0814 ROM:0814 sub_814: ROM:0814 ld de, 4D46h ROM:0817 ld bc, 1Ch ROM:081A ldir ROM:081C ld bc, 0Ch ROM:081F and a ROM:0820 sbc hl, bc ROM:0822 ldir ROM:0824 ld bc, 0Ch ROM:0827 and a ROM:0828 sbc hl, bc ROM:082A ldir ROM:082C ld bc, 0Ch ROM:082F and a ROM:0830 sbc hl, bc ROM:0832 ldir ROM:0834 ld bc, 0Eh ROM:0837 ldir ROM:0839 ret ROM:0839 ; End of function sub_814 ROM:0839 ROM:083A ROM:083A ; =============== S U B R O U T I N E ======================================= ROM:083A ROM:083A ROM:083A sub_83A: ROM:083A ld de, 4DB8h ROM:083D ld bc, 3 ROM:0840 ldir ROM:0842 ret ROM:0842 ; End of function sub_83A ROM:0842 ROM:0842 ; --------------------------------------------------------------------------- ROM:0843 ;-- table related to difficulty - each entry is 3 bytes ROM:0843 ; b0: when counter at 4E0F reaches this value, pink ghost goes out of home ROM:0843 ; b1: when counter at 4E10 reaches this value, blue ghost goes out of home ROM:0843 ; b2: when counter at 4E11 reaches this value, orange ghost goes out of home ROM:0843 DifficultyTable2:db 14h, 1Eh, 46h ROM:0843 db 0, 1Eh, 3Ch ROM:0843 db 0, 0, 32h ROM:0843 db 0, 0, 0 ROM:0843 db 14h, 0Ah, 1Eh ROM:0843 db 0Fh, 28h, 14h ROM:0843 db 32h, 19h, 3Ch ROM:0843 db 1Eh, 50h, 28h ROM:0843 db 64h, 32h, 78h ROM:0843 db 3Ch, 8Ch, 46h ROM:0861 ; time ghosts stay blue when energizer eaten ROM:0861 GhostTime: dw 3C0h ; 960 ROM:0863 dw 348h ; 840 ROM:0865 dw 2D0h ; 720 ROM:0867 dw 258h ; 600 ROM:0869 dw 1E0h ; 480 ROM:086B dw 168h ; 360 ROM:086D dw 0F0h ; 240 ROM:086F dw 78h ; 120 ROM:0871 dw 1 ; 1 ROM:0873 ; number of units before ghosts leave home ROM:0873 HomeDiffTable: dw 0F0h ; 240 ROM:0875 dw 0F0h ; 240 ROM:0877 dw 0B4h ; 180 ROM:0879 ROM:0879 ; =============== S U B R O U T I N E ======================================= ROM:0879 ROM:0879 ROM:0879 sub_879: ROM:0879 ld hl, 4E09h ROM:087C xor a ROM:087D ld b, 0Bh ROM:087F rst 8 ROM:0880 call ResetPills ROM:0883 ld hl, (word_4E73) ROM:0886 ld (DifficultyPtr), hl ROM:0889 ld hl, 4E0Ah ROM:088C ld de, 4E38h ROM:088F ld bc, 2Eh ; '.' ROM:0892 ldir ROM:0894 ROM:0894 loc_894: ROM:0894 ld hl, 4E04h ROM:0897 inc (hl) ROM:0898 ret ROM:0898 ; End of function sub_879 ROM:0898 ROM:0899 ; --------------------------------------------------------------------------- ROM:0899 ld a, (MainMode) ROM:089C dec a ROM:089D jr nz, loc_8A5 ROM:089F ld a, 9 ROM:08A1 ld (LevelComplete), a ROM:08A4 ret ROM:08A5 ; --------------------------------------------------------------------------- ROM:08A5 ROM:08A5 loc_8A5: ROM:08A5 rst 28h ROM:08A5 ; --------------------------------------------------------------------------- ROM:08A6 db 11h ROM:08A7 db 0 ROM:08A8 ; --------------------------------------------------------------------------- ROM:08A8 rst 28h ROM:08A8 ; --------------------------------------------------------------------------- ROM:08A9 db 1Ch ROM:08AA db 83h ROM:08AB ; --------------------------------------------------------------------------- ROM:08AB rst 28h ROM:08AB ; --------------------------------------------------------------------------- ROM:08AC db 4 ROM:08AD db 0 ROM:08AE ; --------------------------------------------------------------------------- ROM:08AE rst 28h ROM:08AE ; --------------------------------------------------------------------------- ROM:08AF db 5 ROM:08B0 db 0 ROM:08B1 ; --------------------------------------------------------------------------- ROM:08B1 rst 28h ROM:08B1 ; --------------------------------------------------------------------------- ROM:08B2 db 10h ROM:08B3 db 0 ROM:08B4 ; --------------------------------------------------------------------------- ROM:08B4 rst 28h ROM:08B4 ; --------------------------------------------------------------------------- ROM:08B5 db 1Ah ROM:08B6 db 0 ROM:08B7 ; --------------------------------------------------------------------------- ROM:08B7 rst 30h ; store IRQ task ROM:08B7 ; --------------------------------------------------------------------------- ROM:08B8 db 54h ROM:08B9 db 0 ROM:08BA db 0 ROM:08BB ; --------------------------------------------------------------------------- ROM:08BB rst 30h ; store IRQ task ROM:08BB ; --------------------------------------------------------------------------- ROM:08BC db 54h ROM:08BD db 6 ROM:08BE db 0 ROM:08BF ; --------------------------------------------------------------------------- ROM:08BF ld a, (CocktailMode) ROM:08C2 ld b, a ROM:08C3 ld a, (PlayerNumber) ROM:08C6 and b ROM:08C7 ld (FlipScreen), a ROM:08CA jp loc_894 ROM:08CD ROM:08CD ; =============== S U B R O U T I N E ======================================= ROM:08CD ROM:08CD ROM:08CD sub_8CD: ROM:08CD ld a, (InterruptEnable) ROM:08D0 bit 4, a ; rack test ROM:08D2 jp nz, PelletCount ROM:08D5 ld hl, 4E04h ROM:08D8 ld (hl), 0Eh ROM:08DA rst 28h ROM:08DA ; --------------------------------------------------------------------------- ROM:08DB db 13h ROM:08DC db 0 ROM:08DD ; --------------------------------------------------------------------------- ROM:08DD ret ROM:08DE ; --------------------------------------------------------------------------- ROM:08DE Routine to determine number of pellets to eat ROM:08DE ROM:08DE PelletCount: ; number eaten ROM:08DE ld a, (PelletsEaten) ROM:08E1 cp 0F4h ; '(' ; compare to 244 ROM:08E3 jr nz, loc_8EB ; jump if not done ROM:08E5 ld hl, 4E04h ; set level complete ROM:08E8 ld (hl), 0Ch ROM:08EA ret ROM:08EB ; --------------------------------------------------------------------------- ROM:08EB ROM:08EB loc_8EB: ROM:08EB call sub_1017 ROM:08EE call sub_1017 ROM:08F1 call sub_13DD ROM:08F4 call sub_C42 ROM:08F7 call IncAnimFrame ROM:08FA call sub_E36 ROM:08FD call sub_AC3 ROM:0900 call sub_BD6 ROM:0903 call sub_C0D ROM:0906 call sub_E6C ROM:0909 call sub_EAD ROM:090C ret ROM:090C ; End of function sub_8CD ROM:090C ROM:090D ROM:090D ; =============== S U B R O U T I N E ======================================= ROM:090D ROM:090D ROM:090D sub_90D: ROM:090D ld a, 1 ROM:090F ld (byte_4E12), a ROM:0912 call ScreenPillsToRAM ROM:0915 ld hl, 4E04h ROM:0918 inc (hl) ROM:0919 ld a, (LivesNumber) ROM:091C and a ROM:091D jr nz, loc_93E ROM:091F ld a, (byte_4E70) ROM:0922 and a ROM:0923 jr z, loc_93E ROM:0925 ld a, (byte_4E42) ROM:0928 and a ROM:0929 jr z, loc_93E ROM:092B ld a, (PlayerNumber) ROM:092E add a, 3 ROM:0930 ld c, a ROM:0931 ld b, 1Ch ROM:0933 call ContinueTask ROM:0936 rst 28h ROM:0936 ; --------------------------------------------------------------------------- ROM:0937 db 1Ch ROM:0938 db 5 ROM:0939 ; --------------------------------------------------------------------------- ROM:0939 rst 30h ROM:0939 ; --------------------------------------------------------------------------- ROM:093A db 54h ROM:093B db 0 ROM:093C db 0 ROM:093D ; --------------------------------------------------------------------------- ROM:093D ret ROM:093E ; --------------------------------------------------------------------------- ROM:093E ROM:093E loc_93E: ROM:093E inc (hl) ROM:093F ret ROM:093F ; End of function sub_90D ROM:093F ROM:0940 ROM:0940 ; =============== S U B R O U T I N E ======================================= ROM:0940 ROM:0940 ROM:0940 sub_940: ROM:0940 ld a, (byte_4E70) ROM:0943 and a ROM:0944 jr z, loc_94C ROM:0946 ld a, (byte_4E42) ROM:0949 and a ROM:094A jr nz, loc_961 ROM:094C ROM:094C loc_94C: ROM:094C ld a, (LivesNumber) ROM:094F and a ROM:0950 jr nz, loc_96C ROM:0952 call DrawCredits ROM:0955 rst 28h ROM:0955 ; --------------------------------------------------------------------------- ROM:0956 db 1Ch ROM:0957 db 5 ROM:0958 ; --------------------------------------------------------------------------- ROM:0958 rst 30h ROM:0958 ; --------------------------------------------------------------------------- ROM:0959 db 54h ROM:095A db 0 ROM:095B db 0 ROM:095C ; --------------------------------------------------------------------------- ROM:095C ld hl, 4E04h ROM:095F inc (hl) ROM:0960 ret ROM:0961 ; --------------------------------------------------------------------------- ROM:0961 ROM:0961 loc_961: ROM:0961 call sub_AA6 ROM:0964 ld a, (PlayerNumber) ROM:0967 xor 1 ROM:0969 ld (PlayerNumber), a ROM:096C ROM:096C loc_96C: ROM:096C ld a, 9 ROM:096E ld (LevelComplete), a ROM:0971 ret ROM:0971 ; End of function sub_940 ROM:0971 ROM:0972 ROM:0972 ; =============== S U B R O U T I N E ======================================= ROM:0972 ROM:0972 ROM:0972 sub_972: ROM:0972 xor a ROM:0973 ld (MainSub1), a ROM:0976 ld (LevelComplete), a ROM:0979 ld (byte_4E70), a ROM:097C ld (PlayerNumber), a ROM:097F ld (FlipScreen), a ROM:0982 ld a, 1 ROM:0984 ld (MainMode), a ROM:0987 ret ROM:0987 ; End of function sub_972 ROM:0987 ROM:0988 ; --------------------------------------------------------------------------- ROM:0988 ROM:0988 loc_988: ROM:0988 rst 28h ROM:0988 ; --------------------------------------------------------------------------- ROM:0989 db 0 ROM:098A db 1 ROM:098B ; --------------------------------------------------------------------------- ROM:098B rst 28h ROM:098B ; --------------------------------------------------------------------------- ROM:098C db 1 ROM:098D db 1 ROM:098E ; --------------------------------------------------------------------------- ROM:098E rst 28h ROM:098E ; --------------------------------------------------------------------------- ROM:098F db 2 ROM:0990 db 0 ROM:0991 ; --------------------------------------------------------------------------- ROM:0991 rst 28h ROM:0991 ; --------------------------------------------------------------------------- ROM:0992 db 11h ROM:0993 db 0 ROM:0994 ; --------------------------------------------------------------------------- ROM:0994 rst 28h ROM:0994 ; --------------------------------------------------------------------------- ROM:0995 db 13h ROM:0996 db 0 ROM:0997 ; --------------------------------------------------------------------------- ROM:0997 rst 28h ROM:0997 ; --------------------------------------------------------------------------- ROM:0998 db 3 ROM:0999 db 0 ROM:099A ; --------------------------------------------------------------------------- ROM:099A rst 28h ROM:099A ; --------------------------------------------------------------------------- ROM:099B db 4 ROM:099C db 0 ROM:099D ; --------------------------------------------------------------------------- ROM:099D rst 28h ROM:099D ; --------------------------------------------------------------------------- ROM:099E db 5 ROM:099F db 0 ROM:09A0 ; --------------------------------------------------------------------------- ROM:09A0 rst 28h ROM:09A0 ; --------------------------------------------------------------------------- ROM:09A1 db 10h ROM:09A2 db 0 ROM:09A3 ; --------------------------------------------------------------------------- ROM:09A3 rst 28h ROM:09A3 ; --------------------------------------------------------------------------- ROM:09A4 db 1Ah ROM:09A5 db 0 ROM:09A6 ; --------------------------------------------------------------------------- ROM:09A6 rst 28h ROM:09A6 ; --------------------------------------------------------------------------- ROM:09A7 db 1Ch ROM:09A8 db 6 ROM:09A9 ; --------------------------------------------------------------------------- ROM:09A9 ld a, (MainMode) ROM:09AC cp 3 ROM:09AE jr z, loc_9B6 ROM:09B0 rst 28h ROM:09B0 ; --------------------------------------------------------------------------- ROM:09B1 db 1Ch ROM:09B2 db 5 ROM:09B3 ; --------------------------------------------------------------------------- ROM:09B3 rst 28h ROM:09B3 ; --------------------------------------------------------------------------- ROM:09B4 db 1Dh ROM:09B5 db 0 ROM:09B6 ; --------------------------------------------------------------------------- ROM:09B6 ROM:09B6 loc_9B6: ; store IRQ task ROM:09B6 rst 30h ROM:09B6 ; --------------------------------------------------------------------------- ROM:09B7 db 54h ROM:09B8 db 0 ROM:09B9 db 0 ROM:09BA ; --------------------------------------------------------------------------- ROM:09BA ld a, (MainMode) ROM:09BD dec a ROM:09BE jr z, loc_9C4 ROM:09C0 rst 30h ; store IRQ task ROM:09C0 ; --------------------------------------------------------------------------- ROM:09C1 db 54h ROM:09C2 db 6 ROM:09C3 db 0 ROM:09C4 ; --------------------------------------------------------------------------- ROM:09C4 ROM:09C4 loc_9C4: ROM:09C4 ld a, (CocktailMode) ROM:09C7 ld b, a ROM:09C8 ld a, (PlayerNumber) ROM:09CB and b ROM:09CC ld (FlipScreen), a ROM:09CF jp loc_894 ROM:09D2 ROM:09D2 ; =============== S U B R O U T I N E ======================================= ROM:09D2 ROM:09D2 ROM:09D2 sub_9D2: ROM:09D2 ld a, 3 ROM:09D4 ld (LevelComplete), a ROM:09D7 ret ROM:09D7 ; End of function sub_9D2 ROM:09D7 ROM:09D8 ; --------------------------------------------------------------------------- ROM:09D8 rst 30h ; store IRQ task ROM:09D8 ; --------------------------------------------------------------------------- ROM:09D9 db 54h ROM:09DA db 0 ROM:09DB db 0 ROM:09DC ; --------------------------------------------------------------------------- ROM:09DC ld hl, 4E04h ROM:09DF inc (hl) ROM:09E0 xor a ROM:09E1 ld (CH2_DATA), a ROM:09E4 ld (CH3_DATA), a ROM:09E7 ret ROM:09E8 ROM:09E8 ; =============== S U B R O U T I N E ======================================= ROM:09E8 ROM:09E8 ROM:09E8 sub_9E8: ROM:09E8 ld c, 2 ROM:09EA ROM:09EA loc_9EA: ROM:09EA ld b, 1 ROM:09EC call ContinueTask ROM:09EF rst 30h ; store IRQ task ROM:09EF ; End of function sub_9E8 ROM:09EF ROM:09EF ; --------------------------------------------------------------------------- ROM:09F0 db 42h ROM:09F1 db 0 ROM:09F2 db 0 ROM:09F3 ; --------------------------------------------------------------------------- ROM:09F3 ld hl, 0 ROM:09F6 call sub_267E ROM:09F9 ld hl, 4E04h ROM:09FC inc (hl) ROM:09FD ret ROM:09FE ROM:09FE ; =============== S U B R O U T I N E ======================================= ROM:09FE ROM:09FE ROM:09FE sub_9FE: ROM:09FE ld c, 0 ROM:0A00 jr loc_9EA ROM:0A00 ; End of function sub_9FE ROM:0A00 ROM:0A02 ROM:0A02 ; =============== S U B R O U T I N E ======================================= ROM:0A02 ROM:0A02 ; Attributes: thunk ROM:0A02 ROM:0A02 sub_A02: ROM:0A02 jr sub_9E8 ROM:0A02 ; End of function sub_A02 ROM:0A02 ROM:0A04 ROM:0A04 ; =============== S U B R O U T I N E ======================================= ROM:0A04 ROM:0A04 ; Attributes: thunk ROM:0A04 ROM:0A04 sub_A04: ROM:0A04 jr sub_9FE ROM:0A04 ; End of function sub_A04 ROM:0A04 ROM:0A06 ROM:0A06 ; =============== S U B R O U T I N E ======================================= ROM:0A06 ROM:0A06 ; Attributes: thunk ROM:0A06 ROM:0A06 sub_A06: ROM:0A06 jr sub_9E8 ROM:0A06 ; End of function sub_A06 ROM:0A06 ROM:0A08 ROM:0A08 ; =============== S U B R O U T I N E ======================================= ROM:0A08 ROM:0A08 ; Attributes: thunk ROM:0A08 ROM:0A08 sub_A08: ROM:0A08 jr sub_9FE ROM:0A08 ; End of function sub_A08 ROM:0A08 ROM:0A0A ROM:0A0A ; =============== S U B R O U T I N E ======================================= ROM:0A0A ROM:0A0A ; Attributes: thunk ROM:0A0A ROM:0A0A sub_A0A: ROM:0A0A jr sub_9E8 ROM:0A0A ; End of function sub_A0A ROM:0A0A ROM:0A0C ROM:0A0C ; =============== S U B R O U T I N E ======================================= ROM:0A0C ROM:0A0C ; Attributes: thunk ROM:0A0C ROM:0A0C sub_A0C: ROM:0A0C jr sub_9FE ROM:0A0C ; End of function sub_A0C ROM:0A0C ROM:0A0E ; --------------------------------------------------------------------------- ROM:0A0E rst 28h ROM:0A0E ; --------------------------------------------------------------------------- ROM:0A0F db 0 ROM:0A10 db 1 ROM:0A11 ; --------------------------------------------------------------------------- ROM:0A11 rst 28h ROM:0A11 ; --------------------------------------------------------------------------- ROM:0A12 db 6 ROM:0A13 db 0 ROM:0A14 ; --------------------------------------------------------------------------- ROM:0A14 rst 28h ROM:0A14 ; --------------------------------------------------------------------------- ROM:0A15 db 11h ROM:0A16 db 0 ROM:0A17 ; --------------------------------------------------------------------------- ROM:0A17 rst 28h ROM:0A17 ; --------------------------------------------------------------------------- ROM:0A18 db 13h ROM:0A19 db 0 ROM:0A1A ; --------------------------------------------------------------------------- ROM:0A1A rst 28h ROM:0A1A ; --------------------------------------------------------------------------- ROM:0A1B db 4 ROM:0A1C db 1 ROM:0A1D ; --------------------------------------------------------------------------- ROM:0A1D rst 28h ROM:0A1D ; --------------------------------------------------------------------------- ROM:0A1E db 5 ROM:0A1F db 1 ROM:0A20 ; --------------------------------------------------------------------------- ROM:0A20 rst 28h ROM:0A20 ; --------------------------------------------------------------------------- ROM:0A21 db 10h ROM:0A22 db 13h ROM:0A23 ; --------------------------------------------------------------------------- ROM:0A23 rst 30h ; store IRQ task ROM:0A23 ; --------------------------------------------------------------------------- ROM:0A24 db 43h ROM:0A25 db 0 ROM:0A26 db 0 ROM:0A27 ; --------------------------------------------------------------------------- ROM:0A27 ld hl, 4E04h ROM:0A2A inc (hl) ROM:0A2B ret ROM:0A2C ; --------------------------------------------------------------------------- ROM:0A2C xor a ROM:0A2D ld (CH2_DATA), a ; silence channels 2 and 3? ROM:0A30 ld (CH3_DATA), a ROM:0A33 ld a, 2 ROM:0A35 ld (CH1_W_NUM), a ROM:0A38 ld (CH2_W_NUM), a ROM:0A3B ld a, (LevelNumber) ; see what level just finished ROM:0A3E cp 14h ; is it over 20? ROM:0A40 jr c, loc_A44 ; if not, jump to routine ROM:0A42 ld a, 14h ; else cap level number at 20, and do that level end routine ROM:0A44 ROM:0A44 loc_A44: ROM:0A44 rst 20h ROM:0A44 ; --------------------------------------------------------------------------- ROM:0A45 EndLvlJumpTable:dw 0A6Fh ; increment level state and stop sound ROM:0A47 dw 2108h ; cut scene 1 ROM:0A49 dw 0A6Fh ; increment level state and stop sound ROM:0A4B dw 0A6Fh ; ... ROM:0A4D dw 219Eh ; cut scene 2 ROM:0A4F dw 0A6Fh ROM:0A51 dw 0A6Fh ROM:0A53 dw 0A6Fh ROM:0A55 dw 2297h ; cut scene 3 ROM:0A57 dw 0A6Fh ROM:0A59 dw 0A6Fh ROM:0A5B dw 0A6Fh ROM:0A5D dw 2297h ; cut scene 4 ROM:0A5F dw 0A6Fh ROM:0A61 dw 0A6Fh ROM:0A63 dw 0A6Fh ROM:0A65 dw 2297h ; cut scene 5 ROM:0A67 dw 0A6Fh ROM:0A69 dw 0A6Fh ROM:0A6B dw 0A6Fh ROM:0A6D dw 0A6Fh ROM:0A6F ;===================== ROM:0A6F ; Increment level state by 2 and stop sound ROM:0A6F ;===================== ROM:0A6F ROM:0A6F ; =============== S U B R O U T I N E ======================================= ROM:0A6F ROM:0A6F ROM:0A6F NextLevel: ROM:0A6F ld hl, 4E04h ROM:0A72 inc (hl) ROM:0A73 inc (hl) ROM:0A74 xor a ROM:0A75 ld (CH1_W_NUM), a ; stop sound ROM:0A78 ld (CH2_W_NUM), a ROM:0A7B ret ROM:0A7B ; End of function NextLevel ROM:0A7B ROM:0A7C ROM:0A7C ; =============== S U B R O U T I N E ======================================= ROM:0A7C ROM:0A7C ROM:0A7C sub_A7C: ROM:0A7C xor a ROM:0A7D ld (CH1_W_NUM), a ROM:0A80 ld (CH2_W_NUM), a ROM:0A83 ld b, 7 ROM:0A85 ld hl, 4E0Ch ROM:0A88 rst 8 ; memset ROM:0A89 call ResetPills ROM:0A8C ld hl, 4E04h ROM:0A8F inc (hl) ROM:0A90 ld hl, 4E13h ; level number ROM:0A93 inc (hl) ROM:0A94 ld hl, (DifficultyPtr) ROM:0A97 ld a, (hl) ROM:0A98 cp 14h ; is difficulty table at end? ROM:0A9A ret z ; return if so ROM:0A9B inc hl ; else increment pointer to difficulty ROM:0A9C ld (DifficultyPtr), hl ROM:0A9F ret ROM:0A9F ; End of function sub_A7C ROM:0A9F ROM:0AA0 ROM:0AA0 ; =============== S U B R O U T I N E ======================================= ROM:0AA0 ROM:0AA0 ; Attributes: thunk ROM:0AA0 ROM:0AA0 sub_AA0: ROM:0AA0 jp loc_988 ROM:0AA0 ; End of function sub_AA0 ROM:0AA0 ROM:0AA3 ROM:0AA3 ; =============== S U B R O U T I N E ======================================= ROM:0AA3 ROM:0AA3 ; Attributes: thunk ROM:0AA3 ROM:0AA3 sub_AA3: ROM:0AA3 jp sub_9D2 ROM:0AA3 ; End of function sub_AA3 ROM:0AA3 ROM:0AA6 ROM:0AA6 ; =============== S U B R O U T I N E ======================================= ROM:0AA6 ROM:0AA6 ROM:0AA6 sub_AA6: ROM:0AA6 ld b, 2Eh ; '.' ROM:0AA8 ld ix, 4E0Ah ROM:0AAC ld iy, 4E38h ROM:0AB0 ROM:0AB0 loc_AB0: ROM:0AB0 ld d, (ix+0) ROM:0AB3 ld e, (iy+0) ROM:0AB6 ld (iy+0), d ROM:0AB9 ld (ix+0), e ROM:0ABC inc ix ROM:0ABE inc iy ROM:0AC0 djnz loc_AB0 ROM:0AC2 ret ROM:0AC2 ; End of function sub_AA6 ROM:0AC2 ROM:0AC3 ROM:0AC3 ; =============== S U B R O U T I N E ======================================= ROM:0AC3 ROM:0AC3 ROM:0AC3 sub_AC3: ROM:0AC3 ld a, (DeadGhostIndex) ROM:0AC6 and a ROM:0AC7 ret nz ROM:0AC8 ld ix, 4C00h ROM:0ACC ld iy, 4DC8h ROM:0AD0 ld de, 100h ROM:0AD3 cp (iy+0) ROM:0AD6 jp nz, loc_BD2 ROM:0AD9 ld (iy+0), 0Eh ROM:0ADD ld a, (PillEffect) ROM:0AE0 and a ROM:0AE1 jr z, loc_AFE ROM:0AE3 ld hl, (word_4DCB) ROM:0AE6 and a ROM:0AE7 sbc hl, de ROM:0AE9 jr nc, loc_AFE ROM:0AEB ld hl, 4EACh ROM:0AEE set 7, (hl) ROM:0AF0 ld a, 9 ROM:0AF2 cp (ix+0Bh) ROM:0AF5 jr nz, loc_AFB ROM:0AF7 res 7, (hl) ROM:0AF9 ld a, 9 ROM:0AFB ROM:0AFB loc_AFB: ROM:0AFB ld (PacmanSpriteColor), a ROM:0AFE ROM:0AFE loc_AFE: ROM:0AFE ld a, (RedGhostFlag) ROM:0B01 and a ROM:0B02 jr z, loc_B21 ROM:0B04 ld hl, (word_4DCB) ROM:0B07 and a ROM:0B08 sbc hl, de ROM:0B0A jr nc, loc_B33 ROM:0B0C ld a, 11h ROM:0B0E cp (ix+3) ROM:0B11 jr z, loc_B1A ROM:0B13 ld (ix+3), 11h ROM:0B17 jp loc_B33 ROM:0B1A ; --------------------------------------------------------------------------- ROM:0B1A ROM:0B1A loc_B1A: ROM:0B1A ld (ix+3), 12h ROM:0B1E jp loc_B33 ROM:0B21 ; --------------------------------------------------------------------------- ROM:0B21 ROM:0B21 loc_B21: ROM:0B21 ld a, 1 ROM:0B23 cp (ix+3) ROM:0B26 jr z, loc_B2F ROM:0B28 ld (ix+3), 1 ROM:0B2C jp loc_B33 ROM:0B2F ; --------------------------------------------------------------------------- ROM:0B2F ROM:0B2F loc_B2F: ROM:0B2F ld (ix+3), 1 ROM:0B33 ROM:0B33 loc_B33: ROM:0B33 ld a, (PinkGhostFlag) ROM:0B36 and a ROM:0B37 jr z, loc_B56 ROM:0B39 ld hl, (word_4DCB) ROM:0B3C and a ROM:0B3D sbc hl, de ROM:0B3F jr nc, loc_B68 ROM:0B41 ld a, 11h ROM:0B43 cp (ix+5) ROM:0B46 jr z, loc_B4F ROM:0B48 ld (ix+5), 11h ROM:0B4C jp loc_B68 ROM:0B4F ; --------------------------------------------------------------------------- ROM:0B4F ROM:0B4F loc_B4F: ROM:0B4F ld (ix+5), 12h ROM:0B53 jp loc_B68 ROM:0B56 ; --------------------------------------------------------------------------- ROM:0B56 ROM:0B56 loc_B56: ROM:0B56 ld a, 3 ROM:0B58 cp (ix+5) ROM:0B5B jr z, loc_B64 ROM:0B5D ld (ix+5), 3 ROM:0B61 jp loc_B68 ROM:0B64 ; --------------------------------------------------------------------------- ROM:0B64 ROM:0B64 loc_B64: ROM:0B64 ld (ix+5), 3 ROM:0B68 ROM:0B68 loc_B68: ROM:0B68 ld a, (BlueGhostFlag) ROM:0B6B and a ROM:0B6C jr z, loc_B8B ROM:0B6E ld hl, (word_4DCB) ROM:0B71 and a ROM:0B72 sbc hl, de ROM:0B74 jr nc, loc_B9D ROM:0B76 ld a, 11h ROM:0B78 cp (ix+7) ROM:0B7B jr z, loc_B84 ROM:0B7D ld (ix+7), 11h ROM:0B81 jp loc_B9D ROM:0B84 ; --------------------------------------------------------------------------- ROM:0B84 ROM:0B84 loc_B84: ROM:0B84 ld (ix+7), 12h ROM:0B88 jp loc_B9D ROM:0B8B ; --------------------------------------------------------------------------- ROM:0B8B ROM:0B8B loc_B8B: ROM:0B8B ld a, 5 ROM:0B8D cp (ix+7) ROM:0B90 jr z, loc_B99 ROM:0B92 ld (ix+7), 5 ROM:0B96 jp loc_B9D ROM:0B99 ; --------------------------------------------------------------------------- ROM:0B99 ROM:0B99 loc_B99: ROM:0B99 ld (ix+7), 5 ROM:0B9D ROM:0B9D loc_B9D: ROM:0B9D ld a, (OrangeGhostFlag) ROM:0BA0 and a ROM:0BA1 jr z, loc_BC0 ROM:0BA3 ld hl, (word_4DCB) ROM:0BA6 and a ROM:0BA7 sbc hl, de ROM:0BA9 jr nc, loc_BD2 ROM:0BAB ld a, 11h ROM:0BAD cp (ix+9) ROM:0BB0 jr z, loc_BB9 ROM:0BB2 ld (ix+9), 11h ROM:0BB6 jp loc_BD2 ROM:0BB9 ; --------------------------------------------------------------------------- ROM:0BB9 ROM:0BB9 loc_BB9: ROM:0BB9 ld (ix+9), 12h ROM:0BBD jp loc_BD2 ROM:0BC0 ; --------------------------------------------------------------------------- ROM:0BC0 ROM:0BC0 loc_BC0: ROM:0BC0 ld a, 7 ROM:0BC2 cp (ix+9) ROM:0BC5 jr z, loc_BCE ROM:0BC7 ld (ix+9), 7 ROM:0BCB jp loc_BD2 ROM:0BCE ; --------------------------------------------------------------------------- ROM:0BCE ROM:0BCE loc_BCE: ROM:0BCE ld (ix+9), 7 ROM:0BD2 ROM:0BD2 loc_BD2: ROM:0BD2 dec (iy+0) ROM:0BD5 ret ROM:0BD5 ; End of function sub_AC3 ROM:0BD5 ROM:0BD6 ROM:0BD6 ; =============== S U B R O U T I N E ======================================= ROM:0BD6 ROM:0BD6 ROM:0BD6 sub_BD6: ROM:0BD6 ld b, 19h ROM:0BD8 ld a, (MainSub1) ROM:0BDB cp 22h ; '"' ROM:0BDD jp nz, loc_BE2 ROM:0BE0 ld b, 0 ROM:0BE2 ROM:0BE2 loc_BE2: ROM:0BE2 ld ix, 4C00h ROM:0BE6 ld a, (RedState) ROM:0BE9 and a ROM:0BEA jp z, loc_BF0 ROM:0BED ld (ix+3), b ROM:0BF0 ROM:0BF0 loc_BF0: ROM:0BF0 ld a, (PinkState) ROM:0BF3 and a ROM:0BF4 jp z, loc_BFA ROM:0BF7 ld (ix+5), b ROM:0BFA ROM:0BFA loc_BFA: ROM:0BFA ld a, (BlueState) ROM:0BFD and a ROM:0BFE jp z, sub_C04 ROM:0C01 ROM:0C01 loc_C01: ROM:0C01 ld (ix+7), b ROM:0C01 ; End of function sub_BD6 ROM:0C01 ROM:0C04 ROM:0C04 ; =============== S U B R O U T I N E ======================================= ROM:0C04 ROM:0C04 ROM:0C04 sub_C04: ROM:0C04 ld a, (OrangeState) ROM:0C07 and a ROM:0C08 ret z ROM:0C09 ld (ix+9), b ROM:0C0C ret ROM:0C0C ; End of function sub_C04 ROM:0C0C ROM:0C0D ROM:0C0D ; =============== S U B R O U T I N E ======================================= ROM:0C0D ROM:0C0D ROM:0C0D sub_C0D: ROM:0C0D ld hl, 4DCFh ROM:0C10 inc (hl) ROM:0C11 ld a, 0Ah ROM:0C13 cp (hl) ROM:0C14 ret nz ROM:0C15 ld (hl), 0 ROM:0C17 ld a, (LevelComplete) ROM:0C1A cp 3 ROM:0C1C jr nz, loc_C33 ROM:0C1E ld hl, 4464h ROM:0C21 ROM:0C21 loc_C21: ROM:0C21 ld a, 10h ROM:0C23 cp (hl) ROM:0C24 jr nz, loc_C28 ROM:0C26 ld a, 0 ROM:0C28 ROM:0C28 loc_C28: ROM:0C28 ld (hl), a ROM:0C29 ld (PaletteRAM+78h), a ROM:0C2C ld (PaletteRAM+384h), a ROM:0C2F ld (PaletteRAM+398h), a ROM:0C32 ret ROM:0C33 ; --------------------------------------------------------------------------- ROM:0C33 ROM:0C33 loc_C33: ROM:0C33 ld hl, 4732h ROM:0C36 ld a, 10h ROM:0C38 cp (hl) ROM:0C39 jr nz, loc_C3D ROM:0C3B ld a, 0 ROM:0C3D ROM:0C3D loc_C3D: ROM:0C3D ld (hl), a ROM:0C3E ld (PaletteRAM+278h), a ROM:0C41 ret ROM:0C41 ; End of function sub_C0D ROM:0C41 ROM:0C42 ROM:0C42 ; =============== S U B R O U T I N E ======================================= ROM:0C42 ROM:0C42 ROM:0C42 sub_C42: ROM:0C42 ld a, (DeadGhostIndex) ROM:0C45 and a ROM:0C46 ret nz ROM:0C47 ld a, (byte_4D94) ROM:0C4A rlca ROM:0C4B ld (byte_4D94), a ROM:0C4E ret nc ROM:0C4F ld a, (RedSubstate) ROM:0C52 and a ROM:0C53 jp nz, loc_C90 ROM:0C56 ld ix, 3305h ROM:0C5A ld iy, 4D00h ROM:0C5E call DoubleAdd ROM:0C61 ld (RedYPos), hl ; Red ghost Y position (decreases bottom to top) ROM:0C64 ld a, 3 ROM:0C66 ld (word_4D28), a ROM:0C69 ld (word_4D2C), a ROM:0C6C ld a, (RedYPos) ; Red ghost Y position (decreases bottom to top) ROM:0C6F cp 64h ; 'd' ROM:0C71 jp nz, loc_C90 ROM:0C74 ld hl, 2E2Ch ROM:0C77 ld (RedTileY), hl ROM:0C7A ld hl, 100h ROM:0C7D ld (word_4D14), hl ROM:0C80 ld (word_4D1E), hl ROM:0C83 ld a, 2 ROM:0C85 ld (word_4D28), a ROM:0C88 ld (word_4D2C), a ROM:0C8B ld a, 1 ROM:0C8D ld (RedSubstate), a ROM:0C90 ROM:0C90 loc_C90: ROM:0C90 ld a, (PinkSubstate) ROM:0C93 cp 1 ROM:0C95 jp z, loc_CFB ROM:0C98 cp 0 ROM:0C9A jp nz, loc_CC1 ROM:0C9D ld a, (PinkYPos) ROM:0CA0 cp 78h ; 'x' ROM:0CA2 call z, loc_1F2E ROM:0CA5 cp 80h ; 'Ç' ROM:0CA7 call z, loc_1F2E ROM:0CAA ld a, (word_4D2C+1) ROM:0CAD ld (word_4D28+1), a ROM:0CB0 ld ix, 4D20h ROM:0CB4 ld iy, 4D02h ROM:0CB8 call DoubleAdd ROM:0CBB ld (PinkYPos), hl ROM:0CBE jp loc_CFB ROM:0CC1 ; --------------------------------------------------------------------------- ROM:0CC1 ROM:0CC1 loc_CC1: ROM:0CC1 ld ix, 3305h ROM:0CC5 ld iy, 4D02h ROM:0CC9 call DoubleAdd ROM:0CCC ld (PinkYPos), hl ROM:0CCF ld a, 3 ROM:0CD1 ld (word_4D2C+1), a ROM:0CD4 ld (word_4D28+1), a ROM:0CD7 ld a, (PinkYPos) ROM:0CDA cp 64h ; 'd' ROM:0CDC jp nz, loc_CFB ROM:0CDF ld hl, 2E2Ch ROM:0CE2 ld (PinkTileY), hl ROM:0CE5 ld hl, 100h ROM:0CE8 ld (word_4D16), hl ROM:0CEB ld (word_4D20), hl ROM:0CEE ld a, 2 ROM:0CF0 ld (word_4D28+1), a ROM:0CF3 ld (word_4D2C+1), a ROM:0CF6 ld a, 1 ROM:0CF8 ld (PinkSubstate), a ROM:0CFB ROM:0CFB loc_CFB: ROM:0CFB ld a, (BlueSubstate) ROM:0CFE cp 1 ROM:0D00 jp z, loc_D93 ROM:0D03 cp 0 ROM:0D05 jp nz, loc_D2C ROM:0D05 ; End of function sub_C42 ROM:0D05 ROM:0D08 ROM:0D08 ; =============== S U B R O U T I N E ======================================= ROM:0D08 ROM:0D08 ROM:0D08 sub_D08: ROM:0D08 ld a, (BlueYPos) ROM:0D0B cp 78h ; 'x' ROM:0D0D call z, loc_1F55 ROM:0D10 cp 80h ; 'Ç' ROM:0D12 call z, loc_1F55 ROM:0D15 ld a, (BlueDirection) ROM:0D18 ld (word_4D2A), a ROM:0D1B ld ix, 4D22h ROM:0D1F ld iy, 4D04h ROM:0D23 call DoubleAdd ROM:0D26 ld (BlueYPos), hl ROM:0D29 jp loc_D93 ROM:0D2C ; --------------------------------------------------------------------------- ROM:0D2C ROM:0D2C loc_D2C: ROM:0D2C ld a, (BlueSubstate) ROM:0D2F cp 3 ROM:0D31 jp nz, loc_D59 ROM:0D34 ld ix, 32FFh ROM:0D38 ld iy, 4D04h ROM:0D3C call DoubleAdd ROM:0D3F ld (BlueYPos), hl ROM:0D42 xor a ROM:0D43 ld (word_4D2A), a ROM:0D46 ld (BlueDirection), a ROM:0D49 ld a, (BlueXPos) ROM:0D4C cp 80h ; 'Ç' ROM:0D4E jp nz, loc_D93 ROM:0D51 ld a, 2 ROM:0D53 ld (BlueSubstate), a ROM:0D56 jp loc_D93 ROM:0D59 ; --------------------------------------------------------------------------- ROM:0D59 ROM:0D59 loc_D59: ROM:0D59 ld ix, 3305h ROM:0D5D ld iy, 4D04h ROM:0D61 call DoubleAdd ROM:0D64 ld (BlueYPos), hl ROM:0D67 ld a, 3 ROM:0D69 ld (word_4D2A), a ROM:0D6C ld (BlueDirection), a ROM:0D6F ld a, (BlueYPos) ROM:0D72 cp 64h ; 'd' ROM:0D74 jp nz, loc_D93 ROM:0D77 ld hl, 2E2Ch ROM:0D7A ld (BlueTileY), hl ROM:0D7D ld hl, 100h ROM:0D80 ld (word_4D18), hl ROM:0D83 ld (BlueOffset), hl ROM:0D86 ld a, 2 ROM:0D88 ld (word_4D2A), a ROM:0D8B ld (BlueDirection), a ROM:0D8E ld a, 1 ROM:0D90 ld (BlueSubstate), a ROM:0D93 ROM:0D93 loc_D93: ROM:0D93 ld a, (OrangeSubstate) ROM:0D96 cp 1 ROM:0D98 ret z ROM:0D99 cp 0 ROM:0D9B jp nz, loc_DC0 ROM:0D9E ld a, (OrangeYPos) ROM:0DA1 cp 78h ; 'x' ROM:0DA3 call z, loc_1F7C ROM:0DA6 cp 80h ; 'Ç' ROM:0DA8 call z, loc_1F7C ROM:0DAB ld a, (BlueDirection+1) ROM:0DAE ld (word_4D2A+1), a ROM:0DB1 ld ix, 4D24h ROM:0DB5 ld iy, 4D06h ROM:0DB9 call DoubleAdd ROM:0DBC ld (OrangeYPos), hl ROM:0DBF ret ROM:0DC0 ; --------------------------------------------------------------------------- ROM:0DC0 ROM:0DC0 loc_DC0: ROM:0DC0 ld a, (OrangeSubstate) ROM:0DC3 cp 3 ROM:0DC5 jp nz, loc_DEA ROM:0DC8 ld ix, 3303h ROM:0DCC ld iy, 4D06h ROM:0DD0 call DoubleAdd ROM:0DD3 ld (OrangeYPos), hl ROM:0DD6 ld a, 2 ROM:0DD8 ld (word_4D2A+1), a ROM:0DDB ld (BlueDirection+1), a ROM:0DDE ld a, (OrangeXPos) ROM:0DE1 cp 80h ; 'Ç' ROM:0DE3 ret nz ROM:0DE4 ld a, 2 ROM:0DE6 ld (OrangeSubstate), a ROM:0DE9 ret ROM:0DEA ; --------------------------------------------------------------------------- ROM:0DEA ROM:0DEA loc_DEA: ROM:0DEA ld ix, 3305h ROM:0DEE ld iy, 4D06h ROM:0DF2 call DoubleAdd ROM:0DF5 ld (OrangeYPos), hl ROM:0DF8 ld a, 3 ROM:0DFA ld (word_4D2A+1), a ROM:0DFD ld (BlueDirection+1), a ROM:0E00 ld a, (OrangeYPos) ROM:0E03 cp 64h ; 'd' ROM:0E05 ret nz ROM:0E06 ld hl, 2E2Ch ROM:0E09 ld (OrangeTileY), hl ROM:0E0C ld hl, 100h ROM:0E0F ld (word_4D1A), hl ROM:0E12 ld (word_4D24), hl ROM:0E15 ld a, 2 ROM:0E17 ld (word_4D2A+1), a ROM:0E1A ld (BlueDirection+1), a ROM:0E1D ld a, 1 ROM:0E1F ld (OrangeSubstate), a ROM:0E22 ret ROM:0E22 ; End of function sub_D08 ROM:0E22 ROM:0E23 ROM:0E23 ; =============== S U B R O U T I N E ======================================= ROM:0E23 ROM:0E23 ROM:0E23 IncAnimFrame: ROM:0E23 ld hl, 4DC4h ; counter that updates anim frame every 8 ticks ROM:0E26 inc (hl) ; increment the counter ROM:0E27 ld a, 8 ; is it 8? ROM:0E29 cp (hl) ROM:0E2A ret nz ; if not, return ROM:0E2B ld (hl), 0 ; clear 8 counter ROM:0E2D ld a, (AnimFrame) ; next animation frame ROM:0E30 xor 1 ; toggle low bit ROM:0E32 ld (AnimFrame), a ; and save back ROM:0E35 ret ; return ROM:0E35 ; End of function IncAnimFrame ROM:0E35 ROM:0E36 ROM:0E36 ; =============== S U B R O U T I N E ======================================= ROM:0E36 ROM:0E36 ROM:0E36 sub_E36: ROM:0E36 ld a, (PillEffect) ROM:0E39 and a ROM:0E3A ret nz ROM:0E3B ld a, (byte_4DC1) ROM:0E3E cp 7 ROM:0E40 ret z ROM:0E41 add a, a ROM:0E42 ld hl, (word_4DC2) ROM:0E45 inc hl ROM:0E46 ld (word_4DC2), hl ROM:0E49 ld e, a ROM:0E4A ld d, 0 ROM:0E4C ld ix, 4D86h ROM:0E50 add ix, de ROM:0E52 ld e, (ix+0) ROM:0E55 ld d, (ix+1) ROM:0E58 and a ROM:0E59 sbc hl, de ROM:0E5B ret nz ROM:0E5C srl a ROM:0E5E inc a ROM:0E5F ld (byte_4DC1), a ROM:0E62 ld hl, 101h ROM:0E65 ld (word_4DB1), hl ROM:0E68 ld (word_4DB3), hl ROM:0E6B ret ROM:0E6B ; End of function sub_E36 ROM:0E6B ROM:0E6C Seems to vary items on sound channel 2 ROM:0E6C when death anim, bawsed on number of pellets eaten? ROM:0E6C ROM:0E6C ; =============== S U B R O U T I N E ======================================= ROM:0E6C ROM:0E6C ROM:0E6C sub_E6C: ROM:0E6C ld a, (PacManDeathAnim) ROM:0E6F and a ROM:0E70 jr z, loc_E77 ROM:0E72 xor a ROM:0E73 ld (CH2_DATA), a ; channel 2 off ROM:0E76 ret ROM:0E77 ; --------------------------------------------------------------------------- ROM:0E77 ROM:0E77 loc_E77: ROM:0E77 ld hl, 4EACh ROM:0E7A ld b, 0E0h ; 'a' ROM:0E7C ld a, (PelletsEaten) ROM:0E7F cp 0E4h ; 'S' ROM:0E81 jr c, loc_E89 ROM:0E83 ld a, b ROM:0E84 and (hl) ROM:0E85 set 4, a ROM:0E87 ld (hl), a ROM:0E88 ret ROM:0E89 ; --------------------------------------------------------------------------- ROM:0E89 ROM:0E89 loc_E89: ROM:0E89 cp 0D4h ; '+' ROM:0E8B jr c, loc_E93 ROM:0E8D ld a, b ROM:0E8E and (hl) ROM:0E8F set 3, a ROM:0E91 ld (hl), a ROM:0E92 ret ROM:0E93 ; --------------------------------------------------------------------------- ROM:0E93 ROM:0E93 loc_E93: ROM:0E93 cp 0B4h ; '¦' ROM:0E95 jr c, loc_E9D ROM:0E97 ld a, b ROM:0E98 and (hl) ROM:0E99 set 2, a ROM:0E9B ld (hl), a ROM:0E9C ret ROM:0E9D ; --------------------------------------------------------------------------- ROM:0E9D ROM:0E9D loc_E9D: ROM:0E9D cp 74h ; 't' ROM:0E9F jr c, loc_EA7 ROM:0EA1 ld a, b ROM:0EA2 and (hl) ROM:0EA3 set 1, a ROM:0EA5 ld (hl), a ROM:0EA6 ret ROM:0EA7 ; --------------------------------------------------------------------------- ROM:0EA7 ROM:0EA7 loc_EA7: ROM:0EA7 ld a, b ROM:0EA8 and (hl) ROM:0EA9 set 0, a ROM:0EAB ld (hl), a ROM:0EAC ret ROM:0EAC ; End of function sub_E6C ROM:0EAC ROM:0EAD ROM:0EAD ; =============== S U B R O U T I N E ======================================= ROM:0EAD ROM:0EAD ROM:0EAD sub_EAD: ROM:0EAD ld a, (PacManDeathAnim) ROM:0EB0 and a ROM:0EB1 ret nz ROM:0EB2 ld a, (FruitPointer) ROM:0EB5 and a ROM:0EB6 ret nz ROM:0EB7 ld a, (PelletsEaten) ROM:0EBA cp 46h ; 'F' ROM:0EBC jr z, loc_ECC ROM:0EBE cp 0AAh ; '¬' ROM:0EC0 ret nz ROM:0EC1 ld a, (FruitFlag2) ROM:0EC4 and a ROM:0EC5 ret nz ROM:0EC6 ld hl, 4E0Dh ROM:0EC9 inc (hl) ROM:0ECA jr loc_ED5 ROM:0ECC ; --------------------------------------------------------------------------- ROM:0ECC ROM:0ECC loc_ECC: ROM:0ECC ld a, (FruitFlag1) ROM:0ECF and a ROM:0ED0 ret nz ROM:0ED1 ld hl, 4E0Ch ROM:0ED4 inc (hl) ROM:0ED5 ROM:0ED5 loc_ED5: ROM:0ED5 ld hl, 8094h ROM:0ED8 ld (FruitPosition), hl ROM:0EDB ld hl, 0EFDh ROM:0EDE ld a, (LevelNumber) ROM:0EE1 cp 14h ROM:0EE3 jr c, loc_EE7 ROM:0EE5 ld a, 14h ROM:0EE7 ROM:0EE7 loc_EE7: ROM:0EE7 ld b, a ROM:0EE8 add a, a ROM:0EE9 add a, b ROM:0EEA rst 10h ROM:0EEB ld (FruitSpriteNum), a ROM:0EEE inc hl ROM:0EEF ld a, (hl) ROM:0EF0 ld (FruitSpriteColor), a ROM:0EF3 inc hl ROM:0EF4 ld a, (hl) ROM:0EF5 ld (FruitPointer), a ROM:0EF8 rst 30h ; store IRQ task ROM:0EF8 ; --------------------------------------------------------------------------- ROM:0EF9 db 8Ah ROM:0EFA db 4 ROM:0EFB db 0 ROM:0EFC ; --------------------------------------------------------------------------- ROM:0EFC ret ROM:0EFC ; End of function sub_EAD ROM:0EFC ROM:0EFC ; --------------------------------------------------------------------------- ROM:0EFD ; ============================== ROM:0EFD ; efd-f3b : table for fruit shapes, colors, point value ROM:0EFD ; bytes in that order ROM:0EFD ; ============================== ROM:0EFD ROM:0EFD LevelDataTbl: db 0, 14h, 6 ; shape, ref from EDB ROM:0EFD db 1, 0Fh, 7 ROM:0EFD db 2, 15h, 8 ROM:0EFD db 2, 15h, 8 ROM:0EFD db 4, 14h, 9 ROM:0EFD db 4, 14h, 9 ROM:0EFD db 5, 17h, 0Ah ROM:0EFD db 5, 17h, 0Ah ROM:0EFD db 6, 9, 0Bh ROM:0EFD db 6, 9, 0Bh ROM:0EFD db 3, 16h, 0Ch ROM:0EFD db 3, 16h, 0Ch ROM:0EFD db 7, 16h, 0Dh ROM:0EFD db 7, 16h, 0Dh ROM:0EFD db 7, 16h, 0Dh ROM:0EFD db 7, 16h, 0Dh ROM:0EFD db 7, 16h, 0Dh ROM:0EFD db 7, 16h, 0Dh ROM:0EFD db 7, 16h, 0Dh ROM:0EFD db 7, 16h, 0Dh ROM:0EFD db 7, 16h, 0Dh ROM:0F3C BlankSpace1: db [ 0C2h ], 0 ; unused bytes in ROM, useful for hacks ROM:0FFE Checksum1: db 48h ; bytes to make odd and even checksums work ROM:0FFF db 36h ROM:1000 ;================== ROM:1000 ;Clear fruit pointer and position ROM:1000 ;================== ROM:1000 ROM:1000 ; =============== S U B R O U T I N E ======================================= ROM:1000 ROM:1000 ROM:1000 ClearFruitPtrPos: ROM:1000 xor a ; zero 0 ROM:1001 ld (FruitPointer), a ; clear fruit ROM:1004 ROM:1004 loc_1004: ROM:1004 ld hl, 0 ROM:1007 ld (FruitPosition), hl ROM:100A ret ROM:100A ; End of function ClearFruitPtrPos ROM:100A ROM:100B ; --------------------------------------------------------------------------- ROM:100B rst 28h ROM:100B ; --------------------------------------------------------------------------- ROM:100C db 1Ch ROM:100D db 9Bh ROM:100E ; --------------------------------------------------------------------------- ROM:100E ld a, (MainMode) ROM:1011 dec a ROM:1012 ret z ROM:1013 rst 28h ROM:1013 ; --------------------------------------------------------------------------- ROM:1014 db 1Ch ROM:1015 db 0A2h ROM:1016 ; --------------------------------------------------------------------------- ROM:1016 ret ROM:1017 ROM:1017 ; =============== S U B R O U T I N E ======================================= ROM:1017 ROM:1017 ROM:1017 sub_1017: ROM:1017 call sub_1291 ROM:101A ld a, (PacManDeathAnim) ROM:101D and a ROM:101E ret nz ROM:101F call sub_1066 ROM:1022 call sub_1094 ROM:1025 call loc_109E ROM:1028 call sub_10A8 ROM:102B call loc_10B3+1 ROM:102E ld a, (DeadGhostIndex) ROM:1031 and a ROM:1032 jp z, loc_1039 ROM:1035 call sub_1235 ROM:1038 ret ROM:1039 ; --------------------------------------------------------------------------- ROM:1039 ROM:1039 loc_1039: ROM:1039 call GhostCollision ROM:103C call CollideWithBlue ; check for collision with blue ghost ROM:103F ld a, (DeadGhostIndex) ROM:1042 and a ROM:1043 ret nz ROM:1044 call sub_1806 ROM:1047 call sub_1B36 ROM:104A call sub_1C4B ROM:104D call sub_1D22 ROM:1050 call sub_1DF9 ROM:1053 ld a, (LevelComplete) ROM:1056 cp 3 ROM:1058 ret nz ROM:1059 call ControlBlueTime ; control blue time ROM:105C call CheckPinkLeave ROM:105F call CheckBlueLeave ROM:1062 call CheckOrangeLeave ROM:1065 ret ROM:1065 ; End of function sub_1017 ROM:1065 ROM:1066 ROM:1066 ; =============== S U B R O U T I N E ======================================= ROM:1066 ROM:1066 ROM:1066 sub_1066: ROM:1066 ld a, (KillingGhostState) ROM:1069 and a ROM:106A ret z ROM:106B dec a ROM:106C jr nz, loc_1076 ROM:106E ROM:106E loc_106E: ROM:106E ld (KillingGhostState), a ROM:1071 inc a ROM:1072 ld (RedState), a ROM:1075 ret ROM:1076 ; --------------------------------------------------------------------------- ROM:1076 ROM:1076 loc_1076: ROM:1076 dec a ROM:1077 jr nz, loc_1081 ROM:1079 ld (KillingGhostState), a ROM:107C inc a ROM:107D ld (PinkState), a ROM:1080 ret ROM:1081 ; --------------------------------------------------------------------------- ROM:1081 ROM:1081 loc_1081: ROM:1081 dec a ROM:1082 jr nz, loc_108C ROM:1084 ld (KillingGhostState), a ROM:1087 inc a ROM:1088 ld (BlueState), a ROM:108B ret ROM:108C ; --------------------------------------------------------------------------- ROM:108C ROM:108C loc_108C: ROM:108C ld (OrangeState), a ROM:108F dec a ROM:1090 ld (KillingGhostState), a ROM:1093 ret ROM:1093 ; End of function sub_1066 ROM:1093 ROM:1094 ROM:1094 ; =============== S U B R O U T I N E ======================================= ROM:1094 ROM:1094 ROM:1094 sub_1094: ROM:1094 ld a, (RedState) ROM:1097 rst 20h ROM:1097 ; End of function sub_1094 ROM:1097 ROM:1097 ; --------------------------------------------------------------------------- ROM:1098 dw 0Ch ; return ROM:109A dw 10C0h ROM:109C dw 10D2h ROM:109E ; --------------------------------------------------------------------------- ROM:109E ROM:109E loc_109E: ROM:109E ld a, (PinkState) ROM:10A1 rst 20h ROM:10A1 ; --------------------------------------------------------------------------- ROM:10A2 dw 0Ch ; return ROM:10A4 dw 1118h ROM:10A6 dw 112Ah ROM:10A8 ROM:10A8 ; =============== S U B R O U T I N E ======================================= ROM:10A8 ROM:10A8 ROM:10A8 sub_10A8: ROM:10A8 ld a, (BlueState) ROM:10AB rst 20h ROM:10AB ; End of function sub_10A8 ROM:10AB ROM:10AB ; --------------------------------------------------------------------------- ROM:10AC dw 0Ch ; return ROM:10AE dw 115Ch ROM:10B0 dw 116Eh ROM:10B2 ; --------------------------------------------------------------------------- ROM:10B2 adc a, a ROM:10B3 ROM:10B3 loc_10B3: ROM:10B3 ld de, 0AF3Ah ROM:10B6 ld c, l ROM:10B7 rst 20h ROM:10B7 ; --------------------------------------------------------------------------- ROM:10B8 dw 0Ch ; return ROM:10BA dw 11C9h ROM:10BC dw 11DBh ROM:10BE dw 11FCh ROM:10C0 ROM:10C0 ; =============== S U B R O U T I N E ======================================= ROM:10C0 ROM:10C0 ROM:10C0 sub_10C0: ROM:10C0 call loc_1BD8 ROM:10C3 ld hl, (RedYPos) ; Red ghost Y position (decreases bottom to top) ROM:10C6 ld de, 8064h ROM:10C9 and a ROM:10CA sbc hl, de ROM:10CC ret nz ROM:10CD ld hl, 4DACh ROM:10D0 inc (hl) ROM:10D1 ret ROM:10D1 ; End of function sub_10C0 ROM:10D1 ROM:10D2 ROM:10D2 ; =============== S U B R O U T I N E ======================================= ROM:10D2 ROM:10D2 ROM:10D2 sub_10D2: ROM:10D2 ld ix, 3301h ROM:10D6 ROM:10D6 loc_10D6: ROM:10D6 ld iy, 4D00h ROM:10DA call DoubleAdd ROM:10DD ld (RedYPos), hl ; Red ghost Y position (decreases bottom to top) ROM:10E0 ld a, 1 ROM:10E2 ld (word_4D28), a ROM:10E5 ld (word_4D2C), a ROM:10E8 ld a, (RedYPos) ; Red ghost Y position (decreases bottom to top) ROM:10EB cp 80h ; 'Ç' ROM:10ED ret nz ROM:10EE ld hl, 2E2Fh ROM:10F1 ld (RedTileY), hl ROM:10F4 ld (word_4D31), hl ROM:10F7 xor a ROM:10F8 ld (RedSubstate), a ROM:10FB ld (RedState), a ROM:10FE ld (RedGhostFlag), a ROM:1101 ROM:1101 loc_1101: ROM:1101 ld ix, 4DACh ROM:1105 or (ix+0) ROM:1108 or (ix+1) ROM:110B or (ix+2) ROM:110E or (ix+3) ROM:1111 ret nz ROM:1112 ld hl, 4EACh ROM:1115 res 6, (hl) ROM:1117 ret ROM:1117 ; End of function sub_10D2 ROM:1117 ROM:1118 ROM:1118 ; =============== S U B R O U T I N E ======================================= ROM:1118 ROM:1118 ROM:1118 sub_1118: ROM:1118 call loc_1CAF ROM:111B ld hl, (PinkYPos) ROM:111E ld de, 8064h ROM:1121 and a ROM:1122 sbc hl, de ROM:1124 ret nz ROM:1125 ld hl, 4DADh ROM:1128 inc (hl) ROM:1129 ret ROM:1129 ; End of function sub_1118 ROM:1129 ROM:112A ROM:112A ; =============== S U B R O U T I N E ======================================= ROM:112A ROM:112A ROM:112A sub_112A: ROM:112A ld ix, 3301h ROM:112E ld iy, 4D02h ROM:1132 call DoubleAdd ROM:1135 ld (PinkYPos), hl ROM:1138 ld a, 1 ROM:113A ld (word_4D28+1), a ROM:113D ld (word_4D2C+1), a ROM:1140 ld a, (PinkYPos) ROM:1143 cp 80h ; 'Ç' ROM:1145 ret nz ROM:1146 ld hl, 2E2Fh ROM:1149 ld (PinkTileY), hl ROM:114C ld (word_4D33), hl ROM:114F xor a ROM:1150 ld (PinkSubstate), a ROM:1153 ld (PinkState), a ROM:1156 ld (PinkGhostFlag), a ROM:1159 jp loc_1101 ROM:1159 ; End of function sub_112A ROM:1159 ROM:115C ROM:115C ; =============== S U B R O U T I N E ======================================= ROM:115C ROM:115C ROM:115C sub_115C: ROM:115C call loc_1D86 ROM:115F ld hl, (BlueYPos) ROM:1162 ld de, 8064h ROM:1165 and a ROM:1166 sbc hl, de ROM:1168 ret nz ROM:1169 ld hl, 4DAEh ROM:116C inc (hl) ROM:116D ret ROM:116D ; End of function sub_115C ROM:116D ROM:116E ROM:116E ; =============== S U B R O U T I N E ======================================= ROM:116E ROM:116E ROM:116E sub_116E: ROM:116E ld ix, 3301h ROM:1172 ld iy, 4D04h ROM:1176 call DoubleAdd ROM:1179 ld (BlueYPos), hl ROM:117C ld a, 1 ROM:117E ld (word_4D2A), a ROM:1181 ld (BlueDirection), a ROM:1184 ld a, (BlueYPos) ROM:1187 cp 80h ; 'Ç' ROM:1189 ret nz ROM:118A ld hl, 4DAEh ROM:118D inc (hl) ROM:118E ret ROM:118E ; End of function sub_116E ROM:118E ROM:118F ; --------------------------------------------------------------------------- ROM:118F ld ix, 3303h ROM:1193 ld iy, 4D04h ROM:1197 call DoubleAdd ROM:119A ld (BlueYPos), hl ROM:119D ld a, 2 ROM:119F ld (word_4D2A), a ROM:11A2 ld (BlueDirection), a ROM:11A5 ld a, (BlueXPos) ROM:11A8 cp 90h ; 'É' ROM:11AA ret nz ROM:11AB ld hl, 302Fh ROM:11AE ld (BlueTileY), hl ROM:11B1 ld (word_4D35), hl ROM:11B4 ld a, 1 ROM:11B6 ld (word_4D2A), a ROM:11B9 ld (BlueDirection), a ROM:11BC xor a ROM:11BD ld (BlueSubstate), a ROM:11C0 ld (BlueState), a ROM:11C3 ld (BlueGhostFlag), a ROM:11C6 jp loc_1101 ROM:11C9 ; --------------------------------------------------------------------------- ROM:11C9 call loc_1E5D ROM:11CC ld hl, (OrangeYPos) ROM:11CF ld de, 8064h ROM:11D2 and a ROM:11D3 sbc hl, de ROM:11D5 ret nz ROM:11D6 ld hl, 4DAFh ROM:11D9 inc (hl) ROM:11DA ret ROM:11DB ; --------------------------------------------------------------------------- ROM:11DB ld ix, 3301h ROM:11DF ld iy, 4D06h ROM:11E3 call DoubleAdd ROM:11E6 ld (OrangeYPos), hl ROM:11E9 ld a, 1 ROM:11EB ld (word_4D2A+1), a ROM:11EE ld (BlueDirection+1), a ROM:11F1 ld a, (OrangeYPos) ROM:11F4 cp 80h ; 'Ç' ROM:11F6 ret nz ROM:11F7 ld hl, 4DAFh ROM:11FA inc (hl) ROM:11FB ret ROM:11FC ; --------------------------------------------------------------------------- ROM:11FC ld ix, 32FFh ROM:1200 ld iy, 4D06h ROM:1204 call DoubleAdd ROM:1207 ld (OrangeYPos), hl ROM:120A xor a ROM:120B ld (word_4D2A+1), a ROM:120E ld (BlueDirection+1), a ROM:1211 ld a, (OrangeXPos) ROM:1214 cp 70h ; 'p' ROM:1216 ret nz ROM:1217 ld hl, 2C2Fh ROM:121A ld (OrangeTileY), hl ROM:121D ld (word_4D37), hl ROM:1220 ld a, 1 ROM:1222 ld (word_4D2A+1), a ROM:1225 ld (BlueDirection+1), a ROM:1228 xor a ROM:1229 ld (OrangeSubstate), a ROM:122C ld (OrangeState), a ROM:122F ld (OrangeGhostFlag), a ROM:1232 jp loc_1101 ROM:1235 ROM:1235 ; =============== S U B R O U T I N E ======================================= ROM:1235 ROM:1235 ROM:1235 sub_1235: ROM:1235 ld a, (byte_4DD1) ROM:1238 rst 20h ROM:1239 ccf ROM:123A ld (de), a ROM:123B inc c ROM:123C nop ROM:123D ccf ROM:123E ld (de), a ROM:123F ld hl, 4C00h ROM:1242 ld a, (DeadGhostIndex) ROM:1245 add a, a ROM:1246 ld e, a ROM:1247 ld d, 0 ROM:1249 add hl, de ROM:124A ld a, (byte_4DD1) ROM:124D and a ROM:124E jr nz, loc_1277 ROM:1250 ld a, (byte_4DD0) ROM:1253 ld b, 27h ; ''' ROM:1255 add a, b ROM:1256 ld b, a ROM:1257 ld a, (CocktailMode) ROM:125A ld c, a ROM:125B ld a, (PlayerNumber) ROM:125E and c ROM:125F jr z, loc_1265 ROM:1261 set 6, b ROM:1263 set 7, b ROM:1265 ROM:1265 loc_1265: ROM:1265 ld (hl), b ROM:1266 inc hl ROM:1267 ld (hl), 18h ROM:1269 ld a, 0 ROM:126B ld (PacmanSpriteColor), a ROM:126E rst 30h ; store IRQ task ROM:126E ; --------------------------------------------------------------------------- ROM:126F db 4Ah ROM:1270 db 3 ROM:1271 db 0 ROM:1272 ; --------------------------------------------------------------------------- ROM:1272 ld hl, 4DD1h ROM:1275 inc (hl) ROM:1276 ret ROM:1277 ; --------------------------------------------------------------------------- ROM:1277 ROM:1277 loc_1277: ROM:1277 ld (hl), 20h ; ' ' ROM:1279 ld a, 9 ROM:127B ld (PacmanSpriteColor), a ROM:127E ld a, (DeadGhostIndex) ROM:1281 ld (KillingGhostState), a ROM:1284 xor a ROM:1285 ld (DeadGhostIndex), a ROM:1288 ld (byte_4DD1), a ROM:128B ld hl, 4EACh ROM:128E set 6, (hl) ROM:1290 ret ROM:1290 ; End of function sub_1235 ROM:1290 ROM:1291 ROM:1291 ; =============== S U B R O U T I N E ======================================= ROM:1291 ROM:1291 ROM:1291 sub_1291: ROM:1291 ld a, (PacManDeathAnim) ROM:1294 rst 20h ROM:1294 ; End of function sub_1291 ROM:1294 ROM:1294 ; --------------------------------------------------------------------------- ROM:1295 Table: dw 0Ch ROM:1297 dw 12B7h ROM:1299 dw 12B7h ROM:129B dw 12B7h ROM:129D dw 12B7h ROM:129F dw 12CBh ROM:12A1 dw 12F9h ROM:12A3 dw 1306h ROM:12A5 dw 130Eh ROM:12A7 dw 1316h ROM:12A9 dw 131Eh ROM:12AB dw 1326h ROM:12AD dw 132Eh ROM:12AF dw 1336h ROM:12B1 dw 133Eh ROM:12B3 dw 1346h ROM:12B5 dw 1353h ROM:12B7 ; --------------------------------------------------------------------------- ROM:12B7 ld hl, (word_4DC5) ROM:12BA inc hl ROM:12BB ld (word_4DC5), hl ROM:12BE ld de, 78h ; 'x' ROM:12C1 and a ROM:12C2 sbc hl, de ROM:12C4 ret nz ROM:12C5 ld a, 5 ROM:12C7 ld (PacManDeathAnim), a ROM:12CA ret ROM:12CB ROM:12CB ; =============== S U B R O U T I N E ======================================= ROM:12CB ROM:12CB ROM:12CB sub_12CB: ROM:12CB ld hl, 0 ROM:12CE call sub_267E ROM:12D1 ld a, 34h ; '4' ROM:12D3 ld de, 0B4h ; '¦' ROM:12D6 ROM:12D6 loc_12D6: ROM:12D6 ld c, a ROM:12D7 ld a, (CocktailMode) ROM:12DA ld b, a ROM:12DB ld a, (PlayerNumber) ROM:12DE and b ROM:12DF jr z, loc_12E5 ROM:12E1 ld a, 0C0h ; '+' ROM:12E3 or c ROM:12E4 ld c, a ROM:12E5 ROM:12E5 loc_12E5: ROM:12E5 ld a, c ROM:12E6 ld (PacmanSpriteNum), a ROM:12E9 ld hl, (word_4DC5) ROM:12EC inc hl ROM:12ED ld (word_4DC5), hl ROM:12F0 and a ROM:12F1 sbc hl, de ROM:12F3 ret nz ROM:12F4 ld hl, 4DA5h ROM:12F7 inc (hl) ROM:12F8 ret ROM:12F8 ; End of function sub_12CB ROM:12F8 ROM:12F9 ROM:12F9 ; =============== S U B R O U T I N E ======================================= ROM:12F9 ROM:12F9 ROM:12F9 sub_12F9: ROM:12F9 ld hl, 4EBCh ROM:12FC set 4, (hl) ROM:12FE ld a, 35h ; '5' ROM:1300 ld de, 0C3h ; '+' ROM:1303 jp loc_12D6 ROM:1303 ; End of function sub_12F9 ROM:1303 ROM:1306 ROM:1306 ; =============== S U B R O U T I N E ======================================= ROM:1306 ROM:1306 ROM:1306 sub_1306: ROM:1306 ld a, 36h ; '6' ROM:1308 ld de, 0D2h ; '-' ROM:130B jp loc_12D6 ROM:130B ; End of function sub_1306 ROM:130B ROM:130E ROM:130E ; =============== S U B R O U T I N E ======================================= ROM:130E ROM:130E ROM:130E sub_130E: ROM:130E ld a, 37h ; '7' ROM:1310 ld de, 0E1h ; 'ß' ROM:1313 jp loc_12D6 ROM:1313 ; End of function sub_130E ROM:1313 ROM:1316 ROM:1316 ; =============== S U B R O U T I N E ======================================= ROM:1316 ROM:1316 ROM:1316 sub_1316: ROM:1316 ld a, 38h ; '8' ROM:1318 ld de, 0F0h ; '=' ROM:131B jp loc_12D6 ROM:131B ; End of function sub_1316 ROM:131B ROM:131E ROM:131E ; =============== S U B R O U T I N E ======================================= ROM:131E ROM:131E ROM:131E sub_131E: ROM:131E ld a, 39h ; '9' ROM:1320 ld de, 0FFh ROM:1323 jp loc_12D6 ROM:1323 ; End of function sub_131E ROM:1323 ROM:1326 ROM:1326 ; =============== S U B R O U T I N E ======================================= ROM:1326 ROM:1326 ROM:1326 sub_1326: ROM:1326 ld a, 3Ah ; ':' ROM:1328 ld de, 10Eh ROM:132B jp loc_12D6 ROM:132B ; End of function sub_1326 ROM:132B ROM:132E ROM:132E ; =============== S U B R O U T I N E ======================================= ROM:132E ROM:132E ROM:132E sub_132E: ROM:132E ld a, 3Bh ; ';' ROM:1330 ld de, 11Dh ROM:1333 jp loc_12D6 ROM:1333 ; End of function sub_132E ROM:1333 ROM:1336 ROM:1336 ; =============== S U B R O U T I N E ======================================= ROM:1336 ROM:1336 ROM:1336 sub_1336: ROM:1336 ld a, 3Ch ; '<' ROM:1338 ld de, 12Ch ROM:133B jp loc_12D6 ROM:133B ; End of function sub_1336 ROM:133B ROM:133E ROM:133E ; =============== S U B R O U T I N E ======================================= ROM:133E ROM:133E ROM:133E sub_133E: ROM:133E ld a, 3Dh ; '=' ROM:1340 ld de, 13Bh ROM:1343 jp loc_12D6 ROM:1343 ; End of function sub_133E ROM:1343 ROM:1346 ROM:1346 ; =============== S U B R O U T I N E ======================================= ROM:1346 ROM:1346 ROM:1346 sub_1346: ROM:1346 ld hl, 4EBCh ROM:1349 ld (hl), 20h ; ' ' ROM:134B ld a, 3Eh ; '>' ROM:134D ld de, 159h ROM:1350 jp loc_12D6 ROM:1350 ; End of function sub_1346 ROM:1350 ROM:1353 ;Game end testing ROM:1353 ROM:1353 ; =============== S U B R O U T I N E ======================================= ROM:1353 ROM:1353 ROM:1353 sub_1353: ROM:1353 ld a, 3Fh ; '?' ROM:1355 ld (PacmanSpriteNum), a ROM:1358 ld hl, (word_4DC5) ROM:135B inc hl ROM:135C ld (word_4DC5), hl ROM:135F ld de, 1B8h ROM:1362 and a ROM:1363 sbc hl, de ROM:1365 ret nz ROM:1366 ;decrement lives ROM:1366 ; called after death animation, ROM:1366 ; but before screen redrawn ROM:1366 ; good hook for "Insert Coin To Continue" ROM:1366 ld hl, 4E14h ; hl - lives left ROM:1369 dec (hl) ; one less ROM:136A ld hl, 4E15h ; lives on screen ROM:136D dec (hl) ; one less ROM:136E call ClearPositions ; todo? ROM:1371 ld hl, 4E04h ; 3=ghost move, 2 = ghost wait ROM:1374 inc (hl) ROM:1375 ret ROM:1375 ; End of function sub_1353 ROM:1375 ROM:1376 ROM:1376 ; =============== S U B R O U T I N E ======================================= ROM:1376 ROM:1376 ROM:1376 ControlBlueTime: ROM:1376 ld a, (PillEffect) ROM:1379 and a ROM:137A ret z ROM:137B ld ix, 4DA7h ROM:137F ld a, (ix+0) ROM:1382 or (ix+1) ROM:1385 or (ix+2) ROM:1388 or (ix+3) ROM:138B jp z, loc_1398 ROM:138E ld hl, (word_4DCB) ROM:1391 dec hl ROM:1392 ld (word_4DCB), hl ROM:1395 ld a, h ROM:1396 or l ROM:1397 ret nz ROM:1398 ROM:1398 loc_1398: ROM:1398 ld hl, 4C0Bh ROM:139B ld (hl), 9 ROM:139D ld a, (RedState) ROM:13A0 and a ROM:13A1 jp nz, loc_13A7 ROM:13A4 ld (RedGhostFlag), a ROM:13A7 ROM:13A7 loc_13A7: ROM:13A7 ld a, (PinkState) ROM:13AA and a ROM:13AB jp nz, loc_13B1 ROM:13AE ld (PinkGhostFlag), a ROM:13B1 ROM:13B1 loc_13B1: ROM:13B1 ld a, (BlueState) ROM:13B4 and a ROM:13B5 jp nz, loc_13BB ROM:13B8 ld (BlueGhostFlag), a ROM:13BB ROM:13BB loc_13BB: ROM:13BB ld a, (OrangeState) ROM:13BE and a ROM:13BF jp nz, loc_13C5 ROM:13C2 ld (OrangeGhostFlag), a ROM:13C5 ROM:13C5 loc_13C5: ROM:13C5 xor a ROM:13C6 ld (word_4DCB), a ROM:13C9 ld (word_4DCB+1), a ROM:13CC ld (PillEffect), a ROM:13CF ld (byte_4DC8), a ROM:13D2 ld (byte_4DD0), a ROM:13D5 ld hl, 4EACh ROM:13D8 res 5, (hl) ROM:13DA res 7, (hl) ROM:13DC ret ROM:13DC ; End of function ControlBlueTime ROM:13DC ROM:13DD ROM:13DD ; =============== S U B R O U T I N E ======================================= ROM:13DD ROM:13DD ROM:13DD sub_13DD: ROM:13DD ld hl, 4D9Eh ROM:13E0 ld a, (PelletsEaten) ROM:13E3 cp (hl) ROM:13E4 jp z, loc_13EE ROM:13E7 ld hl, 0 ROM:13EA ld (word_4D97), hl ROM:13ED ret ROM:13EE ; --------------------------------------------------------------------------- ROM:13EE ROM:13EE loc_13EE: ROM:13EE ld hl, (word_4D97) ROM:13F1 inc hl ROM:13F2 ld (word_4D97), hl ROM:13F5 ld de, (word_4D95) ROM:13F9 and a ROM:13FA sbc hl, de ROM:13FC ret nz ROM:13FD ld hl, 0 ROM:1400 ld (word_4D97), hl ROM:1403 ld a, (PinkSubstate) ROM:1406 and a ROM:1407 push af ROM:1408 call z, loc_2086 ROM:140B pop af ROM:140C ret z ROM:140D ld a, (BlueSubstate) ROM:1410 and a ROM:1411 push af ROM:1412 call z, loc_20A9 ROM:1415 pop af ROM:1416 ret z ROM:1417 ld a, (OrangeSubstate) ROM:141A and a ROM:141B call z, loc_20D1 ROM:141E ret ROM:141E ; End of function sub_13DD ROM:141E ROM:141F ROM:141F ; =============== S U B R O U T I N E ======================================= ROM:141F ROM:141F ROM:141F sub_141F: ROM:141F ld a, (CocktailMode) ROM:1422 ld b, a ROM:1423 ld a, (PlayerNumber) ROM:1426 and b ROM:1427 ret z ROM:1428 ld b, a ROM:1429 ld ix, 4C00h ROM:142D ld e, 8 ROM:142F ld c, 8 ROM:1431 ld d, 7 ROM:1433 ld a, (RedYPos) ; Red ghost Y position (decreases bottom to top) ROM:1436 add a, e ROM:1437 ld (ix+13h), a ROM:143A ld a, (RedXPos) ; Red ghost X position, decreases left to right ROM:143D cpl ROM:143E add a, d ROM:143F ld (ix+12h), a ROM:1442 ld a, (PinkYPos) ROM:1445 add a, e ROM:1446 ld (ix+15h), a ROM:1449 ld a, (PinkXPos) ROM:144C cpl ROM:144D add a, d ROM:144E ld (ix+14h), a ROM:1451 ld a, (BlueYPos) ROM:1454 add a, e ROM:1455 ld (ix+17h), a ROM:1458 ld a, (BlueXPos) ROM:145B cpl ROM:145C add a, c ROM:145D ld (ix+16h), a ROM:1460 ld a, (OrangeYPos) ROM:1463 add a, e ROM:1464 ld (ix+19h), a ROM:1467 ld a, (OrangeXPos) ROM:146A cpl ROM:146B add a, c ROM:146C ld (ix+18h), a ROM:146F ld a, (PacManYPos) ROM:1472 add a, e ROM:1473 ld (ix+1Bh), a ROM:1476 ld a, (PacManXPos) ROM:1479 cpl ROM:147A add a, c ROM:147B ld (ix+1Ah), a ROM:147E ld a, (FruitPosition) ROM:1481 add a, e ROM:1482 ld (ix+1Dh), a ROM:1485 ld a, (FruitPosition+1) ROM:1488 cpl ROM:1489 add a, c ROM:148A ld (ix+1Ch), a ROM:148D jp loc_14FE ROM:148D ; End of function sub_141F ROM:148D ROM:1490 ROM:1490 ; =============== S U B R O U T I N E ======================================= ROM:1490 ROM:1490 ROM:1490 DrawSprites: ROM:1490 ld a, (CocktailMode) ROM:1493 ld b, a ROM:1494 ld a, (PlayerNumber) ROM:1497 and b ROM:1498 ret nz ROM:1499 ld b, a ROM:149A ld e, 9 ROM:149C ld c, 7 ROM:149E ld d, 6 ROM:14A0 ld ix, 4C00h ROM:14A4 ld a, (RedYPos) ; Red ghost Y position (decreases bottom to top) ROM:14A7 cpl ROM:14A8 add a, e ROM:14A9 ld (ix+13h), a ROM:14AC ld a, (RedXPos) ; Red ghost X position, decreases left to right ROM:14AF add a, d ROM:14B0 ld (ix+12h), a ROM:14B3 ld a, (PinkYPos) ROM:14B6 cpl ROM:14B7 add a, e ROM:14B8 ld (ix+15h), a ROM:14BB ld a, (PinkXPos) ROM:14BE add a, d ROM:14BF ld (ix+14h), a ROM:14C2 ld a, (BlueYPos) ROM:14C5 cpl ROM:14C6 add a, e ROM:14C7 ld (ix+17h), a ROM:14CA ld a, (BlueXPos) ROM:14CD add a, c ROM:14CE ld (ix+16h), a ROM:14D1 ld a, (OrangeYPos) ROM:14D4 cpl ROM:14D5 add a, e ROM:14D6 ld (ix+19h), a ROM:14D9 ld a, (OrangeXPos) ROM:14DC add a, c ROM:14DD ld (ix+18h), a ROM:14E0 ld a, (PacManYPos) ROM:14E3 cpl ROM:14E4 add a, e ROM:14E5 ld (ix+1Bh), a ROM:14E8 ld a, (PacManXPos) ROM:14EB add a, c ROM:14EC ld (ix+1Ah), a ROM:14EF ld a, (FruitPosition) ROM:14F2 cpl ROM:14F3 add a, e ROM:14F4 ld (ix+1Dh), a ROM:14F7 ld a, (FruitPosition+1) ROM:14FA add a, c ROM:14FB ld (ix+1Ch), a ROM:14FE ROM:14FE loc_14FE: ROM:14FE ld a, (PacManDeathAnim) ROM:1501 and a ROM:1502 jp nz, loc_154B ROM:1505 ld a, (DeadGhostIndex) ROM:1508 and a ROM:1509 jp nz, loc_15B4 ROM:150C ld hl, 151Ch ROM:150F push hl ROM:1510 ld a, (byte_4D30) ROM:1513 rst 20h ROM:1514 adc a, h ROM:1515 ld d, 0B1h ; '¦' ROM:1517 ld d, 0D6h ; '+' ROM:1519 ld d, 0F7h ; '˜' ROM:151B ld d, 78h ; 'x' ROM:151D and a ROM:151E jr z, loc_154B ROM:1520 ld c, 0C0h ; '+' ROM:1522 ld a, (PacmanSpriteNum) ROM:1525 ld d, a ROM:1526 and c ROM:1527 jr nz, loc_152E ROM:1529 ld a, d ROM:152A or c ROM:152B jp loc_1548 ROM:152E ; --------------------------------------------------------------------------- ROM:152E ROM:152E loc_152E: ROM:152E ld a, (byte_4D30) ROM:1531 cp 2 ROM:1533 jr nz, loc_153E ROM:1535 bit 7, d ROM:1537 jr z, loc_154B ROM:1539 ld a, d ROM:153A xor c ROM:153B jp loc_1548 ROM:153E ; --------------------------------------------------------------------------- ROM:153E ROM:153E loc_153E: ROM:153E cp 3 ROM:1540 jr nz, loc_154B ROM:1542 bit 6, d ROM:1544 jr z, loc_154B ROM:1546 ld a, d ROM:1547 xor c ROM:1548 ROM:1548 loc_1548: ROM:1548 ld (PacmanSpriteNum), a ROM:154B ROM:154B loc_154B: ROM:154B ld hl, 4DC0h ROM:154E ld d, (hl) ROM:154F ld a, 1Ch ROM:1551 add a, d ROM:1552 ld (ix+2), a ROM:1555 ld (ix+4), a ROM:1558 ld (ix+6), a ROM:155B ld (ix+8), a ROM:155E ld c, 20h ; ' ' ROM:1560 ld a, (RedState) ROM:1563 and a ROM:1564 jr nz, loc_156C ROM:1566 ld a, (RedGhostFlag) ROM:1569 and a ROM:156A jr nz, loc_1575 ROM:156C ROM:156C loc_156C: ROM:156C ld a, (word_4D2C) ROM:156F add a, a ROM:1570 add a, d ROM:1571 add a, c ROM:1572 ld (ix+2), a ROM:1575 ROM:1575 loc_1575: ROM:1575 ld a, (PinkState) ROM:1578 and a ROM:1579 jr nz, loc_1581 ROM:157B ld a, (PinkGhostFlag) ROM:157E and a ROM:157F jr nz, loc_158A ROM:1581 ROM:1581 loc_1581: ROM:1581 ld a, (word_4D2C+1) ROM:1584 add a, a ROM:1585 add a, d ROM:1586 add a, c ROM:1587 ld (ix+4), a ROM:158A ROM:158A loc_158A: ROM:158A ld a, (BlueState) ROM:158D and a ROM:158E jr nz, loc_1596 ROM:1590 ld a, (BlueGhostFlag) ROM:1593 and a ROM:1594 jr nz, loc_159F ROM:1596 ROM:1596 loc_1596: ROM:1596 ld a, (BlueDirection) ROM:1599 add a, a ROM:159A add a, d ROM:159B add a, c ROM:159C ld (ix+6), a ROM:159F ROM:159F loc_159F: ROM:159F ld a, (OrangeState) ROM:15A2 and a ROM:15A3 jr nz, loc_15AB ROM:15A5 ld a, (OrangeGhostFlag) ROM:15A8 and a ROM:15A9 jr nz, loc_15B4 ROM:15AB ROM:15AB loc_15AB: ROM:15AB ld a, (BlueDirection+1) ROM:15AE add a, a ROM:15AF add a, d ROM:15B0 add a, c ROM:15B1 ld (ix+8), a ROM:15B4 ROM:15B4 loc_15B4: ROM:15B4 call sub_15E6 ROM:15B7 call sub_162D ROM:15BA call sub_1652 ROM:15BD ld a, b ROM:15BE and a ROM:15BF ret z