Routines |
Prev: 77D3 | Up: Map | Next: 78F9 |
Used by the routine at 7AB6. On entry, A holds the LSB of the address of the screen refresh buffer byte that corresponds to the top row of the portion of the play area to be displayed during the cutscene.
|
||||||||||||
7866 | PUSH DE | Save the play area coordinates briefly | ||||||||||
7867 | PUSH AF | Save the screen refresh buffer address LSB briefly | ||||||||||
7868 | CALL $FC57 | Hide the play area | ||||||||||
786B | POP AF | Restore the screen refresh buffer address LSB to A | ||||||||||
786C | LD L,A | Point HL at the first screen refresh buffer (SRB) byte that will need updating later | ||||||||||
786D | POP DE | Restore the play area coordinates to DE | ||||||||||
786E | PUSH HL | Save the SRB address for now | ||||||||||
786F | AND $03 | Compute Sam's new x-coordinate (x+5, where x is the x-coordinate of the leftmost column of the portion of the play area to be displayed) | ||||||||||
7871 | ADD A,A | |||||||||||
7872 | ADD A,A | |||||||||||
7873 | ADD A,A | |||||||||||
7874 | ADD A,$05 | |||||||||||
7876 | ADD A,E | |||||||||||
7877 | LD C,A | C=Sam's new x-coordinate | ||||||||||
7878 | LD A,D | Set the new y-coordinate of the topmost row of the play area on screen | ||||||||||
7879 | LD ($7FFF),A | |||||||||||
787C | LD A,L | A=screen refresh buffer address LSB | ||||||||||
787D | SUB $0C | Compute Sam's new y-coordinate | ||||||||||
787F | AND $FC | |||||||||||
7881 | RRCA | |||||||||||
7882 | RRCA | |||||||||||
7883 | ADD A,D | |||||||||||
7884 | LD HL,$E600 | Point HL at byte 0x00 of Sam's character buffer | ||||||||||
7887 | LD (HL),$00 | Set Sam's animatory state to 0x00 (standing/walking phase 1) | ||||||||||
7889 | INC L | L=0x01 | ||||||||||
788A | LD (HL),C | Set Sam's x-coordinate | ||||||||||
788B | INC L | L=0x02 | ||||||||||
788C | LD (HL),A | Set Sam's y-coordinate | ||||||||||
788D | INC L | L=0x04 | ||||||||||
788E | INC L | |||||||||||
788F | LD (HL),$01 | Set Sam's z-coordinate | ||||||||||
Next we cycle character buffer groups forwards or backwards as appropriate to correspond with the portion of the play area that will be on screen.
|
||||||||||||
7891 | LD HL,$F1B7 | Place a RET instruction at F1B7 so that the screen will not scroll right | ||||||||||
7894 | LD (HL),$C9 | |||||||||||
7896 | LD L,$E0 | Place a RET instruction at F1E0 so that the screen will not scroll left | ||||||||||
7898 | LD (HL),$C9 | |||||||||||
789A | PUSH HL | |||||||||||
789B | LD HL,$7FFE | Collect X (the x-coordinate of the leftmost column of the play area on screen) from 7FFE | ||||||||||
789E | LD A,(HL) | |||||||||||
789F | CP E | Does X match the target x-coordinate (in E)? | ||||||||||
78A0 | JR Z,$78B9 | Jump if so | ||||||||||
78A2 | PUSH DE | Save the target x-coordinate briefly | ||||||||||
78A3 | JR C,$78AC | Jump if X<E | ||||||||||
78A5 | CALL $F18E | Cycle a character buffer group forwards (but without scrolling the screen) | ||||||||||
78A8 | LD A,$F8 | A=-8 | ||||||||||
78AA | JR $78B1 | |||||||||||
78AC | CALL $F1BA | Cycle a character buffer group backwards (but without scrolling the screen) | ||||||||||
78AF | LD A,$08 | |||||||||||
78B1 | POP DE | Restore the target x-coordinate to E | ||||||||||
78B2 | LD HL,$7FFE | Add 8 to or subtract 8 from X (the x-coordinate of the leftmost column of the play area on screen, stored at 7FFE) | ||||||||||
78B5 | ADD A,(HL) | |||||||||||
78B6 | LD (HL),A | |||||||||||
78B7 | JR $789F | Jump back to check whether we need to cycle any more character buffers backwards or forwards | ||||||||||
78B9 | POP HL | |||||||||||
78BA | LD (HL),$C3 | Restore the JP instruction at F1E0 | ||||||||||
78BC | LD L,$B7 | Restore the JP instruction at F1B7 | ||||||||||
78BE | LD (HL),$C3 | |||||||||||
Next we determine whether any lights near Sam need to be switched on and any window blinds need to be raised.
|
||||||||||||
78C0 | LD H,$E6 | 0xE6=Sam | ||||||||||
78C2 | CALL $F6A2 | Collect in C the x-coordinate of the front column of Sam's sprite | ||||||||||
78C5 | LD B,$C0 | Is there a light switch next to Sam? | ||||||||||
78C7 | CALL $F454 | |||||||||||
78CA | JR Z,$78EB | Jump if not (we can reveal the play area now) | ||||||||||
78CC | BIT 5,A | Set the zero flag if the light switch affects the light in only one window or window-pair | ||||||||||
78CE | LD A,(BC) | A=window flags for Sam's location | ||||||||||
78CF | JR Z,$78D8 | Jump if the light switch affects the light in only one window or window-pair | ||||||||||
78D1 | BIT 5,A | Is the light switch in the 'on' position? | ||||||||||
78D3 | CALL NZ,$F4A6 | If not, switch the light on | ||||||||||
78D6 | JR $78EB | Jump forward to reveal the play area | ||||||||||
78D8 | BIT 1,A | Is there a right-hand window here with a blind? | ||||||||||
78DA | JR Z,$78DE | Jump if not | ||||||||||
78DC | RES 0,A | Reset bit 0: blind raised in the right-hand window | ||||||||||
78DE | BIT 7,A | Is there a left-land or single window here with a blind? | ||||||||||
78E0 | JR Z,$78E4 | Jump if not | ||||||||||
78E2 | RES 6,A | Reset bit 6: blind raised in the left-hand or only window | ||||||||||
78E4 | RES 5,A | Reset bit 5: light switch on | ||||||||||
78E6 | LD (BC),A | Save the new window flags (blinds raised, light switch on) | ||||||||||
78E7 | XOR A | Clear A to prevent the following call from changing the window flags (we've already updated them) | ||||||||||
78E8 | CALL $F499 | Update the SRB for the window | ||||||||||
Finally we can reveal the portion of the play area in which Sam will walk up and down until the cutscene message has been displayed and the game resumes.
|
||||||||||||
78EB | POP HL | Restore the SRB address to HL | ||||||||||
78EC | LD B,$06 | The portion is 6 rows high | ||||||||||
78EE | LD A,L | Initialise A for the loop that follows | ||||||||||
78EF | LD L,A | Set all bits in the relevant SRB bytes | ||||||||||
78F0 | LD (HL),$FF | |||||||||||
78F2 | ADD A,$04 | |||||||||||
78F4 | DJNZ $78EF | |||||||||||
78F6 | JP $EA80 | Update the display |
Prev: 77D3 | Up: Map | Next: 78F9 |