![]() |
Routines |
| Prev: 37056 | Up: Map | Next: 37819 |
| 37310 | LD IX,33024 | Point IX at the first byte of the first entity buffer at 33024 | ||
|
The drawing loop begins here.
|
||||
| 37314 | LD A,(IX+0) | Pick up the first byte of the current entity's buffer | ||
| 37317 | CP 255 | Have we already dealt with every entity? | ||
| 37319 | RET Z | Return if so | ||
| 37320 | AND 7 | Keep only bits 0-2 (which determine the type of entity) | ||
| 37322 | JP Z,37811 | Jump to consider the next entity buffer if this one is not being used | ||
| 37325 | CP 3 | Is this a rope? | ||
| 37327 | JP Z,37540 | Jump if so | ||
| 37330 | CP 4 | Is this an arrow? | ||
| 37332 | JR Z,37431 | Jump if so | ||
|
We are dealing with a horizontal or vertical guardian.
|
||||
| 37334 | LD E,(IX+3) | Point DE at the entry in the screen buffer address lookup table at 33280 that corresponds to the guardian's y-coordinate | ||
| 37337 | LD D,130 | |||
| 37339 | LD A,(DE) | Copy the LSB of the screen buffer address to L | ||
| 37340 | LD L,A | |||
| 37341 | LD A,(IX+2) | Pick up the guardian's x-coordinate from bits 0-4 of the third byte of its buffer | ||
| 37344 | AND 31 | |||
| 37346 | ADD A,L | Adjust the LSB of the screen buffer address in L for the guardian's x-coordinate | ||
| 37347 | LD L,A | |||
| 37348 | LD A,E | Copy the fourth byte of the guardian's buffer to A | ||
| 37349 | RLCA | H=92 or 93; now HL holds the address of the guardian's current location in the attribute buffer at 23552 | ||
| 37350 | AND 1 | |||
| 37352 | OR 92 | |||
| 37354 | LD H,A | |||
| 37355 | LD DE,31 | Prepare DE for later addition | ||
| 37358 | LD A,(IX+1) | Pick up the second byte of the guardian's buffer | ||
| 37361 | AND 15 | Keep only bits 0-2 (INK colour) and 3 (BRIGHT value) | ||
| 37363 | ADD A,56 | Push bit 3 up to bit 6 | ||
| 37365 | AND 71 | Keep only bits 0-2 (INK colour) and 6 (BRIGHT value) | ||
| 37367 | LD C,A | Save this value in C temporarily | ||
| 37368 | LD A,(HL) | Pick up the room attribute byte at the guardian's location from the buffer at 23552 | ||
| 37369 | AND 56 | Keep only bits 3-5 (PAPER colour) | ||
| 37371 | XOR C | Merge the INK colour and BRIGHT value from C | ||
| 37372 | LD C,A | Copy this attribute value to C | ||
| 37373 | LD (HL),C | Set the attribute bytes in the buffer at 23552 for the top two rows of cells occupied by the guardian's sprite | ||
| 37374 | INC HL | |||
| 37375 | LD (HL),C | |||
| 37376 | ADD HL,DE | |||
| 37377 | LD (HL),C | |||
| 37378 | INC HL | |||
| 37379 | LD (HL),C | |||
| 37380 | LD A,(IX+3) | Pick up the fourth byte of the guardian's buffer | ||
| 37383 | AND 14 | Does the guardian's sprite occupy only two rows of cells at the moment? | ||
| 37385 | JR Z,37391 | Jump if so | ||
| 37387 | ADD HL,DE | Set the attribute bytes in the buffer at 23552 for the third row of cells occupied by the guardian's sprite | ||
| 37388 | LD (HL),C | |||
| 37389 | INC HL | |||
| 37390 | LD (HL),C | |||
| 37391 | LD C,1 | Prepare C for the call to 37974 later on | ||
| 37393 | LD A,(IX+1) | Now bits 5-7 of A hold the animation frame mask | ||
| 37396 | AND (IX+0) | 'AND' on the current animation frame (bits 5-7) | ||
| 37399 | OR (IX+2) | 'OR' on the base sprite index (bits 5-7) | ||
| 37402 | AND 224 | Keep only bits 5-7 | ||
| 37404 | LD E,A | Point DE at the graphic data for the guardian's current animation frame (see 43776) | ||
| 37405 | LD D,(IX+5) | |||
| 37408 | LD H,130 | Point HL at the guardian's current location in the screen buffer at 24576 | ||
| 37410 | LD L,(IX+3) | |||
| 37413 | LD A,(IX+2) | |||
| 37416 | AND 31 | |||
| 37418 | OR (HL) | |||
| 37419 | INC HL | |||
| 37420 | LD H,(HL) | |||
| 37421 | LD L,A | |||
| 37422 | CALL 37974 | Draw the guardian | ||
| 37425 | JP NZ,37047 | Kill Willy if the guardian collided with him | ||
| 37428 | JP 37811 | Jump to consider the next entity | ||
|
We are dealing with an arrow.
|
||||
| 37431 | BIT 7,(IX+0) | Is the arrow travelling left to right? | ||
| 37435 | JR NZ,37444 | Jump if so | ||
| 37437 | DEC (IX+4) | Decrement the arrow's x-coordinate | ||
| 37440 | LD C,44 | The sound effect for an arrow travelling right to left is made when the x-coordinate is 44 | ||
| 37442 | JR 37449 | |||
| 37444 | INC (IX+4) | Increment the arrow's x-coordinate | ||
| 37447 | LD C,244 | The sound effect for an arrow travelling left to right is made when the x-coordinate is 244 | ||
| 37449 | LD A,(IX+4) | Pick up the arrow's x-coordinate (0-255) | ||
| 37452 | CP C | Is it time to make the arrow sound effect? | ||
| 37453 | JR NZ,37474 | Jump if not | ||
| 37455 | LD BC,640 | Prepare the delay counters (B=2, C=128) for the arrow sound effect | ||
| 37458 | LD A,(32990) | Pick up the border colour for the current room from 32990 | ||
| 37461 | OUT (254),A | Produce the arrow sound effect | ||
| 37463 | XOR 24 | |||
| 37465 | DJNZ 37465 | |||
| 37467 | LD B,C | |||
| 37468 | DEC C | |||
| 37469 | JR NZ,37461 | |||
| 37471 | JP 37811 | Jump to consider the next entity | ||
| 37474 | AND 224 | Is the arrow's x-coordinate in the range 0-31 (i.e. on-screen)? | ||
| 37476 | JP NZ,37811 | If not, jump to consider the next entity | ||
| 37479 | LD E,(IX+2) | Point DE at the entry in the screen buffer address lookup table at 33280 that corresponds to the arrow's y-coordinate | ||
| 37482 | LD D,130 | |||
| 37484 | LD A,(DE) | Pick up the LSB of the screen buffer address | ||
| 37485 | ADD A,(IX+4) | Adjust it for the arrow's x-coordinate | ||
| 37488 | LD L,A | Point HL at the arrow's current location in the attribute buffer at 23552 | ||
| 37489 | LD A,E | |||
| 37490 | AND 128 | |||
| 37492 | RLCA | |||
| 37493 | OR 92 | |||
| 37495 | LD H,A | |||
| 37496 | LD (IX+5),0 | Initialise the collision detection byte (0=off, 255=on) | ||
| 37500 | LD A,(HL) | Pick up the room attribute byte at the arrow's location | ||
| 37501 | AND 7 | Keep only bits 0-2 (INK colour) | ||
| 37503 | CP 7 | Is the INK white? | ||
| 37505 | JR NZ,37510 | Jump if not | ||
| 37507 | DEC (IX+5) | Activate collision detection | ||
| 37510 | LD A,(HL) | Set the INK colour to white at the arrow's location | ||
| 37511 | OR 7 | |||
| 37513 | LD (HL),A | |||
| 37514 | INC DE | Pick up the MSB of the screen buffer address for the arrow's location | ||
| 37515 | LD A,(DE) | |||
| 37516 | LD H,A | Point HL at the top pixel row of the arrow's location in the screen buffer at 24576 | ||
| 37517 | DEC H | |||
| 37518 | LD A,(IX+6) | Draw the top pixel row of the arrow | ||
| 37521 | LD (HL),A | |||
| 37522 | INC H | Point HL at the middle pixel row of the arrow's location in the screen buffer at 24576 | ||
| 37523 | LD A,(HL) | Pick up the graphic byte that's already here | ||
| 37524 | AND (IX+5) | Has the arrow hit anything that has white INK (e.g. Willy)? | ||
| 37527 | JP NZ,37047 | If so, kill Willy | ||
| 37530 | LD (HL),255 | Draw the shaft of the arrow | ||
| 37532 | INC H | Point HL at the bottom pixel row of the arrow's location in the screen buffer at 24576 | ||
| 37533 | LD A,(IX+6) | Draw the bottom pixel row of the arrow | ||
| 37536 | LD (HL),A | |||
| 37537 | JP 37811 | Jump to consider the next entity | ||
|
We are dealing with a rope.
|
||||
| 37540 | LD IY,33280 | Point IY at the first byte of the screen buffer address lookup table at 33280 | ||
| 37544 | LD (IX+9),0 | Initialise the second byte in the following entity buffer to zero; this will count the segments of rope to draw | ||
| 37548 | LD A,(IX+2) | Initialise the fourth byte of the rope's buffer; this holds the x-coordinate of the cell in which the segment of rope under consideration will be drawn | ||
| 37551 | LD (IX+3),A | |||
| 37554 | LD (IX+5),128 | Initialise the sixth byte of the rope's buffer to 128 (bit 7 set); the value held here is used to draw the segment of rope under consideration | ||
|
The following loop draws each segment of the rope from top to bottom.
|
||||
| 37558 | LD A,(IY+0) | Point HL at the location of the segment of rope under consideration in the screen buffer at 24576 | ||
| 37561 | ADD A,(IX+3) | |||
| 37564 | LD L,A | |||
| 37565 | LD H,(IY+1) | |||
| 37568 | LD A,(34262) | Pick up the rope status indicator at 34262 | ||
| 37571 | OR A | Is Willy on the rope, or has he recently jumped or dropped off it? | ||
| 37572 | JR NZ,37590 | Jump if so | ||
| 37574 | LD A,(IX+5) | Pick up the drawing byte | ||
| 37577 | AND (HL) | Is this segment of rope touching anything else that's been drawn so far (e.g. Willy)? | ||
| 37578 | JR Z,37646 | Jump if not | ||
| 37580 | LD A,(IX+9) | Copy the segment counter into the rope status indicator at 34262 | ||
| 37583 | LD (34262),A | |||
| 37586 | SET 0,(IX+11) | Signal: Willy is on the rope | ||
| 37590 | CP (IX+9) | Does the rope status indicator at 34262 match the segment counter? | ||
| 37593 | JR NZ,37646 | Jump if not | ||
| 37595 | BIT 0,(IX+11) | Is Willy on the rope (and clinging to this particular segment)? | ||
| 37599 | JR Z,37646 | Jump if not | ||
| 37601 | LD B,(IX+3) | Copy the x-coordinate of the cell containing the segment of rope under consideration to B | ||
| 37604 | LD A,(IX+5) | Pick up the drawing byte in A | ||
| 37607 | LD C,1 | The value in C will specify Willy's next animation frame; initialise it to 1 | ||
| 37609 | CP 4 | Is the set bit of the drawing byte in bit 0 or 1? | ||
| 37611 | JR C,37628 | Jump if so | ||
| 37613 | LD C,0 | Assume that Willy's next animation frame will be 0 | ||
| 37615 | CP 16 | Is the set bit of the drawing byte in bit 2 or 3? | ||
| 37617 | JR C,37628 | Jump if so | ||
| 37619 | DEC B | Decrement the x-coordinate | ||
| 37620 | LD C,3 | Assume that Willy's next animation frame will be 3 | ||
| 37622 | CP 64 | Is the set bit of the drawing byte in bit 4 or 5? | ||
| 37624 | JR C,37628 | Jump if so | ||
| 37626 | LD C,2 | Willy's next animation frame will be 2 (the set bit of the drawing byte is in bit 6 or 7) | ||
| 37628 | LD (34258),BC | Set Willy's animation frame at 34258, and temporarily store his x-coordinate at 34259 | ||
| 37632 | LD A,IYl | Update Willy's y-coordinate at 34255 to account for his change of location as the rope moves | ||
| 37634 | SUB 16 | |||
| 37636 | LD (34255),A | |||
| 37639 | PUSH HL | Save HL briefly | ||
| 37640 | CALL 36508 | Update Willy's attribute buffer address at 34259 to account for his change of location as the rope moves | ||
| 37643 | POP HL | Restore the screen buffer address of the segment of rope under consideration to HL | ||
| 37644 | JR 37646 | Make a redundant jump to the next instruction | ||
| 37646 | LD A,(IX+5) | Draw a pixel of the rope to the screen buffer at 24576 | ||
| 37649 | OR (HL) | |||
| 37650 | LD (HL),A | |||
| 37651 | LD A,(IX+9) | Point HL at the relevant entry in the second half of the rope animation table at 33536 | ||
| 37654 | ADD A,(IX+1) | |||
| 37657 | LD L,A | |||
| 37658 | SET 7,L | |||
| 37660 | LD H,131 | |||
| 37662 | LD E,(HL) | Add its value to IY; now IY points at the entry in the screen buffer address lookup table at 33280 that corresponds to the next segment of rope to consider | ||
| 37663 | LD D,0 | |||
| 37665 | ADD IY,DE | |||
| 37667 | RES 7,L | Point HL at the relevant entry in the first half of the rope animation table at 33536 | ||
| 37669 | LD A,(HL) | Pick up its value | ||
| 37670 | OR A | Is it zero? | ||
| 37671 | JR Z,37712 | Jump if so | ||
| 37673 | LD B,A | Copy the rope animation table entry value to B; this will count the rotations of the drawing byte | ||
| 37674 | BIT 7,(IX+1) | Is the rope currently right of centre? | ||
| 37678 | JR Z,37697 | Jump if so | ||
| 37680 | RLC (IX+5) | Rotate the drawing byte left once | ||
| 37684 | BIT 0,(IX+5) | Did that push the set bit from bit 7 into bit 0? | ||
| 37688 | JR Z,37693 | Jump if not | ||
| 37690 | DEC (IX+3) | Decrement the x-coordinate for the cell containing this segment of rope | ||
| 37693 | DJNZ 37680 | Jump back until the drawing byte has been rotated as required | ||
| 37695 | JR 37712 | Jump to consider the next segment of rope | ||
| 37697 | RRC (IX+5) | Rotate the drawing byte right once | ||
| 37701 | BIT 7,(IX+5) | Did that push the set bit from bit 0 into bit 7? | ||
| 37705 | JR Z,37710 | Jump if not | ||
| 37707 | INC (IX+3) | Increment the x-coordinate for the cell containing this segment of rope | ||
| 37710 | DJNZ 37697 | Jump back until the drawing byte has been rotated as required | ||
| 37712 | LD A,(IX+9) | Pick up the segment counter | ||
| 37715 | CP (IX+4) | Have we drawn every segment of the rope yet? | ||
| 37718 | JR Z,37726 | Jump if so | ||
| 37720 | INC (IX+9) | Increment the segment counter | ||
| 37723 | JP 37558 | Jump back to draw the next segment of rope | ||
|
Now that the entire rope has been drawn, deal with Willy's movement along it.
|
||||
| 37726 | LD A,(34262) | Pick up the rope status indicator at 34262 | ||
| 37729 | BIT 7,A | Has Willy recently jumped off the rope or dropped off the bottom of it (A>=240)? | ||
| 37731 | JR Z,37743 | Jump if not | ||
| 37733 | INC A | Update the rope status indicator at 34262 | ||
| 37734 | LD (34262),A | |||
| 37737 | RES 0,(IX+11) | Signal: Willy is not on the rope | ||
| 37741 | JR 37811 | Jump to consider the next entity | ||
| 37743 | BIT 0,(IX+11) | Is Willy on the rope? | ||
| 37747 | JR Z,37811 | If not, jump to consider the next entity | ||
| 37749 | LD A,(34256) | Pick up Willy's direction and movement flags from 34256 | ||
| 37752 | BIT 1,A | Is Willy moving up or down the rope? | ||
| 37754 | JR Z,37811 | If not, jump to consider the next entity | ||
| 37756 | RRCA | XOR Willy's direction bit (0=facing right, 1=facing left) with the rope's direction bit (0=swinging right to left, 1=swinging left to right) | ||
| 37757 | XOR (IX+0) | |||
| 37760 | RLCA | |||
| 37761 | RLCA | Now A=1 if Willy is facing the same direction as the rope is swinging (he will move down the rope), or -1 otherwise (he will move up the rope) | ||
| 37762 | AND 2 | |||
| 37764 | DEC A | |||
| 37765 | LD HL,34262 | Increment or decrement the rope status indicator at 34262 | ||
| 37768 | ADD A,(HL) | |||
| 37769 | LD (HL),A | |||
| 37770 | LD A,(33003) | Pick up the number of the room above from 33003 and copy it to C | ||
| 37773 | LD C,A | |||
| 37774 | LD A,(33824) | Pick up the number of the current room from 33824 | ||
| 37777 | CP C | Is there a room above this one? | ||
| 37778 | JR NZ,37787 | Jump if so | ||
| 37780 | LD A,(HL) | Pick up the rope status indicator at 34262 | ||
| 37781 | CP 12 | Is it 12 or greater? | ||
| 37783 | JR NC,37787 | Jump if so | ||
| 37785 | LD (HL),12 | Set the rope status indicator at 34262 to 12 (there is nowhere to go above this rope) | ||
| 37787 | LD A,(HL) | Pick up the rope status indicator at 34262 | ||
| 37788 | CP (IX+4) | Compare it with the length of the rope | ||
| 37791 | JR C,37811 | If Willy is at or above the bottom of the rope, jump to consider the next entity | ||
| 37793 | JR Z,37811 | |||
| 37795 | LD (HL),240 | Set the rope status indicator at 34262 to 240 (Willy has just dropped off the bottom of the rope) | ||
| 37797 | LD A,(34255) | Round down Willy's y-coordinate at 34255 to the nearest multiple of 8; this might move him upwards a little, but ensures that his actual pixel y-coordinate is a multiple of 4 before he starts falling | ||
| 37800 | AND 248 | |||
| 37802 | LD (34255),A | |||
| 37805 | XOR A | Initialise the airborne status indicator at 34257 | ||
| 37806 | LD (34257),A | |||
| 37809 | JR 37811 | Make a redundant jump to the next instruction | ||
|
The current entity has been dealt with. Time for the next one.
|
||||
| 37811 | LD DE,8 | Point IX at the first byte of the next entity's buffer | ||
| 37814 | ADD IX,DE | |||
| 37816 | JP 37314 | Jump back to deal with it | ||
| Prev: 37056 | Up: Map | Next: 37819 |