![]() |
Routines |
| Prev: DB9E | Up: Map | Next: DC41 |
|
This finds the next item to draw that is furthest behind (x,y).
Used by the routine at get_next_drawable.
|
||||||||||||||||||
| get_next_drawable_itemstruct | DBEB | LD BC,$1007 | Set B for 16 iterations (item__LIMIT) and set C for a seven byte stride simultaneously | |||||||||||||||
| DBEE | LD HL,$76C9 | Point HL at the first item_struct's room member | ||||||||||||||||
|
Start loop
|
||||||||||||||||||
| ggi_loop | DBF1 | BIT 7,(HL) | Is the itemstruct_ROOM_FLAG_ITEM_NEARBY_7 flag set? ($80) | |||||||||||||||
| DBF3 | JR Z,ggi_next | If not, jump to the next iteration | ||||||||||||||||
| DBF5 | BIT 6,(HL) | Is the itemstruct_ROOM_FLAG_ITEM_NEARBY_6 flag set? ($40) | ||||||||||||||||
| DBF7 | JR Z,ggi_next | If not, jump to the next iteration | ||||||||||||||||
| DBF9 | PUSH HL | Preserve the item_struct pointer | ||||||||||||||||
| DBFA | PUSH BC | Preserve the item counter and stride | ||||||||||||||||
|
Select an item if it's behind the point (x,y).
|
||||||||||||||||||
| DBFB | INC HL | Advance HL to item_struct.pos.x | ||||||||||||||||
| DBFC | LD A,(HL) | Fetch item_struct.pos.x | ||||||||||||||||
| DBFD | CALL multiply_by_8 | Multiply it by 8 returning the result in BC | ||||||||||||||||
| DC00 | PUSH BC | Preserve the result | ||||||||||||||||
| DC01 | EXX | Flip to banked regs - so we can subtract X position | ||||||||||||||||
| DC02 | POP HL | Restore the result into HL | ||||||||||||||||
| DC03 | AND A | Clear the carry flag prior to SBC | ||||||||||||||||
| DC04 | SBC HL,BC | Calculate (item_struct.pos.x * 8 - x_position) | ||||||||||||||||
| DC06 | EXX | Flip to unbanked regs - now we have the result | ||||||||||||||||
| DC07 | JR Z,ggi_next_pop | Was (item_struct.pos.x * 8 <= x_position)? | ||||||||||||||||
| DC09 | JR C,ggi_next_pop | Jump if so | ||||||||||||||||
| DC0B | INC HL | Advance HL to item_struct.pos.y | ||||||||||||||||
| DC0C | LD A,(HL) | Fetch item_struct.pos.y | ||||||||||||||||
| DC0D | CALL multiply_by_8 | Multiply it by 8 returning the result in BC | ||||||||||||||||
| DC10 | PUSH BC | Preserve the result | ||||||||||||||||
| DC11 | EXX | Flip to banked regs - so we can subtract Y position | ||||||||||||||||
| DC12 | POP HL | Restore the result into HL | ||||||||||||||||
|
Q. Why are we not clearing the carry flag like at DC03?
|
||||||||||||||||||
| DC13 | SBC HL,DE | Calculate (item_struct.pos.y * 8 - y_position) | ||||||||||||||||
| DC15 | EXX | Flip to unbanked regs - now we have the result | ||||||||||||||||
| DC16 | JR Z,ggi_next_pop | Was (item_struct.pos.y * 8 <= y_position)? | ||||||||||||||||
| DC18 | JR C,ggi_next_pop | Jump if so | ||||||||||||||||
| DC1A | PUSH HL | Preserve the item_struct pointer | ||||||||||||||||
| DC1B | EXX | Flip to banked regs - so we can store new X,Y positions | ||||||||||||||||
| DC1C | POP HL | Restore the item_struct pointer | ||||||||||||||||
|
Calculate (x,y) for the next iteration.
|
||||||||||||||||||
| DC1D | LD A,(HL) | Fetch item_struct.pos.y | ||||||||||||||||
| DC1E | CALL multiply_by_8 | Multiply it by 8 returning the result in BC | ||||||||||||||||
| DC21 | LD E,C | DE = BC | ||||||||||||||||
| DC22 | LD D,B | |||||||||||||||||
| DC23 | DEC HL | Rewind HL to point at item_struct.pos.x | ||||||||||||||||
| DC24 | LD A,(HL) | Fetch item_struct.pos.x | ||||||||||||||||
| DC25 | CALL multiply_by_8 | Multiply it by 8 returning the result in BC | ||||||||||||||||
| DC28 | DEC HL | Rewind HL to point at item_struct (jump back over item & room bytes) | ||||||||||||||||
| DC29 | DEC HL | |||||||||||||||||
|
IY is used to return an item_struct here which is unusual compared to the rest of the code which maintains IY as a current vischar pointer.
|
||||||||||||||||||
| DC2A | PUSH HL | Copy the item_struct pointer to IY | ||||||||||||||||
| DC2B | POP IY | |||||||||||||||||
| DC2D | EXX | Flip to unbanked regs | ||||||||||||||||
| DC2E | POP BC | Restore the item counter and stride | ||||||||||||||||
| DC2F | PUSH BC | Preserve the item counter and stride | ||||||||||||||||
| DC30 | LD A,$10 | Calculate the item index (item__LIMIT - item counter) | ||||||||||||||||
| DC32 | SUB B | |||||||||||||||||
| DC33 | OR $40 | Set the item found flag | ||||||||||||||||
| DC35 | EX AF,AF' | Return the value in A' | ||||||||||||||||
| ggi_next_pop | DC36 | POP BC | Restore item counter and stride | |||||||||||||||
| DC37 | POP HL | Restore item_struct pointer | ||||||||||||||||
| ggi_next | DC38 | LD A,C | Advance by stride to next item | |||||||||||||||
| DC39 | ADD A,L | |||||||||||||||||
| DC3A | LD L,A | |||||||||||||||||
| DC3B | JR NC,ggi_loop_end | |||||||||||||||||
| DC3D | INC H | |||||||||||||||||
| ggi_loop_end | DC3E | DJNZ ggi_loop | ...loop | |||||||||||||||
| DC40 | RET | Return | ||||||||||||||||
| Prev: DB9E | Up: Map | Next: DC41 |