Prev: B866 Up: Map Next: B916
B89C: Get next drawable
This finds the next vischar or item that should be drawn.
Used by the routine at plot_sprites.
Output
F Z set if a valid vischar or item was returned.
A Returns (vischars_LENGTH - iters) if vischar, or ((item__LIMIT - iters) | (1 << 6)) if itemstruct.
IY The vischar or itemstruct to plot.
HL The vischar or itemstruct to plot.
get_next_drawable B89C LD BC,$0000 BC and DE are previous_x and previous_y. Zero them both
B89F LD D,C
B8A0 LD E,C
B8A1 LD A,$FF Load A with a 'nothing found' marker ($FF)
B8A3 EX AF,AF' Bank it
B8A4 EXX Bank the previous_x/y registers
Note that we maintain a previous_height but it's never usefully used.
B8A5 LD DE,$0000 Initialise the previous_height to zero
B8A8 LD BC,$0820 Set B for eight iterations and set C for a 32 byte stride simultaneously
B8AB LD HL,$8007 Point HL at vischar 0's counter_and_flags
Find the rearmost vischar that is flagged for drawing.
Start loop
lvoi_loop B8AE BIT 7,(HL) Is counter_and_flags' vischar_DRAWABLE flag set?
B8B0 JR Z,lvoi_next Jump to next iteration if not
B8B2 PUSH HL Preserve the vischar pointer
B8B3 PUSH BC Preserve the loop counter and stride
Check the X axis
B8B4 LD A,$08 Point HL at vischar.mi.pos.x
B8B6 ADD A,L
B8B7 LD L,A
B8B8 LD C,(HL) Load vischar.mi.pos.x into BC
B8B9 INC L
B8BA LD B,(HL)
B8BB INC BC Add 4
B8BC INC BC
B8BD INC BC
B8BE INC BC
B8BF PUSH BC Stack it
B8C0 EXX Switch banks to get spare HL
B8C1 POP HL HL = vischar.mi.pos.x + 4
B8C2 SBC HL,BC Subtract previous_x
B8C4 EXX Bank
B8C5 JR C,lvoi_pop_next Jump if (vischar.mi.pos.x + 4) < previous_x?
Check the Y axis
B8C7 INC L Load vischar.mi.pos.y into BC
B8C8 LD C,(HL)
B8C9 INC L
B8CA LD B,(HL)
B8CB INC BC Add 4
B8CC INC BC
B8CD INC BC
B8CE INC BC
B8CF PUSH BC Stack it
B8D0 EXX Switch banks to get spare HL
B8D1 POP HL HL = vischar.mi.pos.y + 4
B8D2 SBC HL,DE Subtract previous_y
B8D4 EXX Bank
B8D5 JR C,lvoi_pop_next Jump if (vischar.mi.pos.y + 4) < previous_y?
B8D7 INC L Point HL at vischar.mi.pos.height
We compute a vischar index here but the outer code never usefully uses it.
B8D8 POP BC Fetch the loop counter from the stack
B8D9 PUSH BC
B8DA LD A,$08 Compute the vischar index (8 - B)
B8DC SUB B
B8DD EX AF,AF' Bank it for return value
B8DE LD E,(HL) previous_height = vischar.mi.pos.height
B8DF INC L
B8E0 LD D,(HL)
B8E1 PUSH HL Preserve the vischar pointer
B8E2 EXX Bank
B8E3 POP HL Restore vischar pointer to the other bank
B8E4 DEC L Point HL at vischar.mi.pos.y
B8E5 DEC L
B8E6 LD D,(HL) previous_y = vischar.mi.pos.y
B8E7 DEC L
B8E8 LD E,(HL)
B8E9 DEC L
B8EA LD B,(HL) previous_x = vischar.mi.pos.x
B8EB DEC L
B8EC LD C,(HL)
B8ED LD A,L Point HL at vischar
B8EE SUB $0F
B8F0 LD L,A
B8F1 PUSH HL Set IY to HL
B8F2 POP IY
B8F4 EXX
lvoi_pop_next B8F5 POP BC Restore loop counter and stride
B8F6 POP HL Restore vischar pointer
lvoi_next B8F7 LD A,L Advance to the next vischar
B8F8 ADD A,C
B8F9 LD L,A
B8FA DJNZ lvoi_loop ...loop
B8FC CALL get_next_drawable_itemstruct Iterate over all item_structs looking for nearby items
B8FF EX AF,AF' Get the old A back
If the topmost bit of A' remains set from its initialisation at B8A1, then no vischar was found. It's preserved by the call to get_next_drawable_itemstruct.
B900 BIT 7,A Does bit 7 remain set from initialisation?
B902 RET NZ Return with Z clear if so: nothing was found
Otherwise we've found a vischar
B903 PUSH IY Get vischar in HL
B905 POP HL
B906 BIT 6,A Is item_FOUND set? ($40)
B908 JR NZ,lvoi_item_found Jump if so
B90A RES 7,(IY+$07) Clear the vischar.counter_and_flags vischar_DRAWABLE flag
B90E RET Return with Z set
lvoi_item_found B90F INC HL Point HL at itemstruct.room_and_flags
B910 RES 6,(HL) Clear itemstruct_ROOM_FLAG_NEARBY_6
B912 BIT 6,(HL) Test the bit we've just cleared (odd!) - sets Z
B914 DEC HL Point HL back at the base of the itemstruct. (Note that DEC HL doesn't alter the Z flag)
B915 RET Return with Z set
Prev: B866 Up: Map Next: B916