Prev: B5E6 Up: Map Next: B6F5
B5FA: Read static UDG information and store it in a screen buffer
Used by the routine at AE77.
Input
IX Pointer to UDG information
B5FA LD DE,$A000 Attributes 1
This entry point is used by the routine at AE77.
B5FD LD A,(IX+$00) Get next command
B600 INC IX Move forward ready for the next one
B602 CP $10 Set carry flag if this command sets bits 0-3
B604 RRA Put direction in carry flag
B605 LD C,A Store the remainder of the bits in C
B606 LD A,$01 Offset $01 for left / right
B608 JR NC,$B60C Move forward if left / right
B60A LD A,$20 Offset $20 for up / down
B60C LD H,$00 Store for offset in HL later
B60E SRL C Get positive / negative movement flag
B610 JR NC,$B615 Move forward if positive
B612 NEG Moving negative distance (left or up), convert to negative value
B614 DEC H Start from previous line
B615 LD L,A Put offset in L
B616 LD ($A445),HL Store this
B619 LD A,C Get bits 2-7 in A
B61A SRL A Get MOVE or DRAW command
B61C JR NC,$B670 Jump forward if MOVE
Draw the current UDG here
B61E SRL A
B620 LD C,A
B621 EX AF,AF'
B622 LD A,($A444)
B625 INC A
B626 JR NZ,$B633
B628 LD HL,($A455)
B62B LD A,(HL)
B62C ADD A,C
B62D LD (HL),A
B62E INC HL
B62F LD A,($A443)
B632 LD (HL),A
B633 EX AF,AF'
B634 EX AF,AF'
B635 LD C,D
B636 LD A,D
B637 RLCA
B638 RLCA
B639 RLCA
B63A AND $08
B63C LD HL,$A45C
B63F ADD A,(HL)
B640 LD D,A
B641 LD A,($A444)
B644 INC A
B645 JR NZ,$B655
B647 LD A,($A445)
B64A RLA
B64B JR NC,$B655
B64D LD HL,($A455)
B650 INC HL
B651 INC HL
B652 LD (HL),E
B653 INC HL
B654 LD (HL),D
Copy the UDG data onto screen
B655 LD HL,($A441) Get current UDG
B658 LD B,$08 8 lines
B65A LD A,(HL) Get next line
B65B LD (DE),A Set it
B65C INC HL Next line in data
B65D INC D Next line on screen
B65E DJNZ $B65A Loop back if more to do
Put the attribute on screen
B660 LD D,C Point DE to the attributes buffer
B661 LD A,($A443) Get current attribute
B664 LD (DE),A Set it on screen
B665 LD HL,($A445) Get current size and direction
B668 ADD HL,DE Set it to here and put it in HL
B669 EX DE,HL
B66A EX AF,AF' Restore A
B66B DEC A Loop back to next iteration
B66C JR NZ,$B634
B66E JR $B6A0
Move in the direction specified
B670 SRL A Put bit 3 in the carry flag. A now contains direction to move in
B672 LD B,A Put the remainder in B
B673 EX AF,AF' Remember flags
B674 LD HL,($A445) Get offset
B677 EX DE,HL Convert to an offset inside the attribute buffer
B678 ADD HL,DE
B679 DJNZ $B678 Keep moving while there is more to do
B67B EX DE,HL Remember current location in DE
B67C LD A,($A444)
B67F INC A
B680 JR NZ,$B69F
B682 LD HL,($A455)
B685 LD A,(HL)
B686 AND A
B687 JR Z,$B692
B689 INC HL
B68A INC HL
B68B INC HL
B68C INC HL
B68D LD (HL),$00
B68F LD ($A455),HL
B692 INC HL
B693 INC HL
B694 LD A,D
B695 RLCA
B696 RLCA
B697 RLCA
B698 AND $08
B69A ADD A,$80
B69C LD (HL),E
B69D INC HL
B69E LD (HL),A
B69F EX AF,AF' Restore carry flag
B6A0 JP NC,$B5FD Jump back if not changing sprite
Change the current UDG, or end logic
B6A3 LD L,(IX+$00) Put UDG ID in L
B6A6 INC IX Move to next entry in the room data
B6A8 BIT 0,L Is there an attribute change?
B6AA JR Z,$B6B6 Move forward if not
B6AC LD A,(IX+$00) Get the attribute
B6AF INC IX Move to next entry in the room data
B6B1 LD ($A443),A Set this as the current attribute
B6B4 RES 0,L Turn off the attribute flag
B6B6 LD A,L Restore in A
B6B7 CP $FE Is this an "end of data" command?
B6B9 JR NZ,$B6D2 No, so move forward and select the UDG
B6BB LD A,($A444)
B6BE INC A
B6BF RET NZ
B6C0 LD HL,($A455)
B6C3 LD A,(HL)
B6C4 AND A
B6C5 JR Z,$B6CD
B6C7 INC HL
B6C8 INC HL
B6C9 INC HL
B6CA INC HL
B6CB LD (HL),$00
B6CD INC HL
B6CE LD ($A455),HL
B6D1 RET
Set a new current UDG
B6D2 LD H,$00 Convert UDG number (in L) to an offset
B6D4 ADD HL,HL
B6D5 ADD HL,HL
B6D6 LD BC,($A423) Add this to the base pointer for static UDGs
B6DA ADD HL,BC
B6DB LD ($A441),HL Set this as the current value
B6DE LD HL,$A462 Get the flags for this room
B6E1 SRL (HL) Extract out the next bit
B6E3 JP NC,$B5FD If the bit is not set, this UDG should be printed
B6E6 LD HL,$5000 Select main screen. This will be overwritten by the main } room drawing process, and hence the UDG will not be displayed
B6E9 LD ($A441),HL
B6EC LD A,($A402) Select new current attribute
B6EF LD ($A443),A
B6F2 JP $B5FD Back to parsing
Prev: B5E6 Up: Map Next: B6F5