![]() |
Routines |
| Prev: E3CC | Up: Map | Next: E46C |
Calculate attribute screen addresses and set screen colours for any items/creatures that have colours different from the standard room colours.
First identify attribute row using the item's vertical pixel position:
|
||||
| E3FD | LD A,($EAD2) | Item's vertical position, from top of playing area, in pixels | ||
| E400 | ADD A,$12 | Add an offset to avoid top border | ||
| E402 | AND $F8 | Filter out bits 0-2 (values 0-7) as attributes are in character (8-pixel) increments | ||
| E404 | ADD A,A | Double the value | ||
| E405 | LD L,A | Store calculated value in low byte of display attribute address | ||
| E406 | SBC A,A | If the earlier ADD has caused a carry, we're into the second third of the screen attribute display | ||
| E407 | LD H,A | ...Adjust the high byte accordingly | ||
| E408 | ADD HL,HL | |||
|
Vertical character row (left of screen) is now identified. Next consider horizontal position.
|
||||
| E409 | LD A,($EAD3) | Item's horizontal screen position, in pixels | ||
| E40C | ADD A,$09 | Adjust/increment base position. This value isn't quite right - see Bugs - Attribute bleed on left of screen | ||
| E40E | RRA | Divide by 8 to get character square from pixel | ||
| E40F | RRA | |||
| E410 | RRA | |||
| E411 | AND $1F | Attribute lines are 0-31 so only need to keep these bits | ||
| E413 | ADD A,L | And add it into the attribute address low byte | ||
| E414 | LD L,A | |||
| E415 | LD A,$58 | High byte of attribute display address is %01010000, so add this into the high byte of the address | ||
| E417 | ADD A,H | |||
| E418 | LD H,A | |||
|
HL register is now pointing at screen attribute address for the item.
The next set of instructions determines the size of the item to colour. There are two sizes - large (for creatures) and small (for objects - i.e. everything else).
|
||||
| E419 | LD A,($EB43) | Get item graphic type | ||
| E41C | CP $00 | 0 = item no longer present, i.e. destroyed creature | ||
| E41E | JR Z,$E424 | |||
| E420 | CP $03 | 3 = creature | ||
| E422 | JR NZ,$E429 | |||
| E424 | LD DE,$EBD6 | Colour pattern address = EBD6 for creature/destroyed creature | ||
| E427 | JR $E42C | |||
| E429 | LD DE,$EBE6 | Colour pattern address = EBE6 for any other item | ||
| E42C | LD A,(DE) | First byte of set is number of total data bytes in set - either 15 or 9 | ||
| E42D | LD ($EAC7),A | Store as counter | ||
| E430 | INC DE | Move to the first byte in the data set | ||
|
Colouring loop:
|
||||
| E431 | LD A,(DE) | Get the byte | ||
| E432 | INC DE | |||
| E433 | LD C,A | Store in C register | ||
| E434 | RLA | Shift bit 7 into carry | ||
| E435 | SBC A,A | And subtract | ||
| E436 | LD B,A | This will result in 0 (value will be added) or 255 (-1 = value subtracted) in the B register | ||
| E437 | ADD HL,BC | BC - containing the offset, either positive or negative - added to the screen attribute address (in HL) | ||
|
Check that attribute display address isn't out of bounds (side border or bottom third of screen).
|
||||
| E438 | LD A,L | Get attribute column on screen (0-31) | ||
| E439 | AND $1F | Only need values 0-31 | ||
| E43B | SUB $02 | Can't draw on left/right border, so check screen column number is between 2 and 29 (inclusive) | ||
| E43D | CP $1C | ...A subtraction of 2 and then comparing against a value of 28 | ||
| E43F | JR NC,$E462 | ...will cause attribute addresses either in the left border 0, 1 or the right border (30, 31) to jump out here with a No Carry | ||
| E441 | LD A,L | Border check OK. Get low byte of screen attribute address | ||
| E442 | CP $40 | If attribute low byte address is 64 or less... | ||
| E444 | LD A,H | (High byte of screen attribute address) | ||
| E445 | JR NC,$E44B | |||
| E447 | CP $58 | ...and high byte = 88, attribute display address is in the top third and the top two lines (border) of the screen | ||
| E449 | JR Z,$E462 | If so, skip and don't print any colour here | ||
| E44B | SUB $58 | High byte > 88 so we're past the top third | ||
| E44D | CP $02 | Check if we're into the bottom third of the screen | ||
| E44F | JR NC,$E462 | If so, this part of the item is off screen - don't set attribute colour here | ||
|
Check if we're drawing or erasing and set colour accordingly:
|
||||
| E451 | LD A,($EACF) | Check DRAW/ERASE flag | ||
| E454 | CP $00 | |||
| E456 | JR Z,$E45E | |||
| E458 | LD A,($EAA8) | It's DRAW (1) - so get graphic's attribute colour byte | ||
| E45B | LD (HL),A | ...and put on screen | ||
| E45C | JR $E462 | |||
| E45E | LD A,($EAA9) | It's ERASE (0) so get room's attribute colour byte | ||
| E461 | LD (HL),A | ...and put on screen | ||
|
Repeat loop counter:
|
||||
| E462 | LD A,($EAC7) | Get the counter | ||
| E465 | DEC A | Decrement | ||
| E466 | LD ($EAC7),A | ...and re-store | ||
| E469 | JR NZ,$E431 | Continue printing attributes for the rest of the graphic | ||
| E46B | RET | |||
| Prev: E3CC | Up: Map | Next: E46C |