Routines |
Prev: 50272 | Up: Map | Next: 50545 |
|
||||
There are 16 foreground scenery objects, whose graphics addresses are held from 39063.
This routine calculates the number, types, and X/Y co-ordinates of scenery objects in the room, and stashes the data for each one into a 7-byte data set in a table at 32513.
The following instructions identifies the level type. If it's a cavern-style level, sets the offset for the graphic address pointer to 8.
|
||||
50433 | LD A,(60087) | Get room number | ||
50436 | LD L,A | Store in L register | ||
50437 | CP 82 | If room number is 1-81 it's a 'brick style level'. For other scenery types it's actually rooms 1-82 (49528). This means the first room in the High Temple of Chaos (room 82) is a hybrid room, with brickwork walls but cavern foreground scenery. |
||
50439 | LD A,0 | ...So set graphics offset 60279 to 0... | ||
50441 | JR C,50445 | |||
50443 | LD A,8 | ...Otherwise it's a 'cavern' style level, so set the offset to 8. | ||
50445 | LD (60279),A | Store the offset | ||
Bytes in the ROM, picked using the room number, are used to generate a varied but repeatable selection of foreground object types.
|
||||
50448 | LD H,0 | Multiply room number by 8 | ||
50450 | ADD HL,HL | |||
50451 | ADD HL,HL | |||
50452 | ADD HL,HL | |||
50453 | EX DE,HL | ...Store result in DE register to be used for the ROM address | ||
50454 | LD HL,(60272) | Get address pointer to the foreground object data table at 32513 | ||
CALCULATE NUMBER OF FOREGROUND SCENERY OBJECTS
The first of the room data bytes at 25001 reflects the size of the room.
The number of foreground objects in a room is this room size byte divided by two (rounded down).
|
||||
50457 | LD A,(60284) | Get (first) room data byte from banks at 25001, which indicates the size of the room | ||
50460 | LD C,A | Temp store in C register | ||
50461 | RRA | Divide by 2 | ||
50462 | AND 127 | Filter out any carry bits caused by the RRA | ||
50464 | LD B,A | ...and store in B register as a counter for number-of-objects | ||
SET LEFTMOST OBJECT POSITION
The next bit calculates the first (leftmost) item's horizontal position (in 4-pixel/half-character steps) within the room, based on room size.
|
||||
50465 | LD A,C | Retrieve (first) room data byte from C register | ||
50466 | RLA | x 2 | ||
50467 | NEG | Make the value negative as the first object will be to the left of (or near) the leftmost screen wall | ||
50469 | ADD A,8 | Add 8 to the value as a small offset, to move it over to the right slightly | ||
50471 | LD (60232),A | |||
IDENTIFY SCENERY OBJECT TYPE AND GRAPHIC ADDRESS POINTER
DE is currently pointing at a ROM address based on room number (x 8, so room 1 = memory address location 00008).
A combination of the room number and bytes from addresses in ROM are used to create a repeatable, but varied pattern of foreground scenery objects for each room.
|
||||
50474 | LD A,(DE) | Get byte from ROM | ||
50475 | INC DE | ...and move pointer along to next ROM address | ||
50476 | ADD A,B | Add byte from B register (which contains the first room data byte divided by 2) to added variation | ||
50477 | AND 7 | There are only 8 types of foreground object for each level type, so we only need bits 0-2 (values 0-7) | ||
50479 | ADD A,106 | Add to the graphic address pointer table at 38851. An offset of 106 puts the address pointer at the scenery objects at 39063. | ||
50481 | LD C,A | |||
50482 | LD A,(60279) | Add the offset calculated earlier (either 0 or 8 depending on the level type). Offset should now be between 106 and 121 | ||
50485 | ADD A,C | |||
50486 | LD (60094),HL | Store address pointer to the foreground object data set at 32513 | ||
50489 | LD (60282),DE | Store ROM address pointer | ||
50493 | LD D,0 | Double the offset value to create an address pointer offset in DE | ||
50495 | RLA | |||
50496 | RL D | Filter out bit 0 to ensure it's an even number | ||
50498 | AND 254 | |||
50500 | LD E,A | |||
50501 | LD HL,(60266) | Get the base graphics address pointer | ||
50504 | ADD HL,DE | Add the offset | ||
50505 | LD E,(HL) | Get the scenery graphics address in the DE register, e.g. 43611 for the skeleton | ||
50506 | INC HL | |||
50507 | LD D,(HL) | |||
COPY FOREGROUND SCENERY DATA VARIABLES INTO DATA SETS
Foreground scenery object data is stored in the data tables at 32513.
|
||||
50508 | LD HL,(60094) | Retrieve address pointer to foreground object data sets at 32513 | ||
50511 | LD (HL),0 | First byte default value = 0 (item not on screen) | ||
50513 | INC HL | |||
50514 | LD (HL),0 | Horizontal position precision/fraction byte = 0 (item starting position will be a multiple of 8 pixels) | ||
50516 | INC HL | |||
50517 | LD A,(60232) | Horizontal position in room. This is in 1-character/8-pixel steps (foreground scenery moves in larger distance increments than other scenery) | ||
50520 | LD (HL),A | |||
50521 | INC HL | |||
50522 | ADD A,16 | Add 16 to the horizontal position and re-store. The value of 16 puts a gap of 16 character squares between foreground objects. | ||
50524 | LD (60232),A | |||
50527 | LD (HL),0 | Vertical position precision/fraction byte (not needed here) | ||
50529 | INC HL | |||
50530 | LD (HL),104 | Vertical position from top of playing area, in pixels - default position = 104 | ||
50532 | INC HL | |||
50533 | LD (HL),E | Address pointer to the scenery graphic to draw, e.g. 43611 | ||
50534 | INC HL | |||
50535 | LD (HL),D | |||
50536 | INC HL | |||
50537 | LD DE,(60282) | Retrieve ROM address pointer | ||
50541 | DJNZ 50474 | Continue to store object details in the 7 byte scenery data banks at 32513. B register = count of objects that need storing. | ||
50543 | LD (HL),255 | Set end-of-data byte to indicate the end of room foreground scenery object sets |
Prev: 50272 | Up: Map | Next: 50545 |