Prev: 8AE6 Up: Map Next: 8BD9
8B12: Draw background patterns for sprite
Input
IY Data structure
display_background_patterns 8B12 LD L,(IY+$02) Get name table address of 3 x 3 area to clear
8B15 LD H,(IY+$03) ...
8B18 LD A,H If zero
8B19 OR L ...
8B1A JR Z,display_background_patterns_2 Then skip ahead
Clear name table area
8B1C LD C,$03 3 rows
display_background_patterns_0 8B1E EX DE,HL DE now VDP address
8B1F LD B,$03 3 columns
8B21 XOR A Zero to clear
display_background_patterns_1 8B22 RST $10 Write VDP byte
8B23 INC DE Next VDP address
8B24 DJNZ display_background_patterns_1 Inner loop
8B26 LD HL,$001D One row down and 3 columns back
8B29 ADD HL,DE ...
8B2A DEC C Row counter
8B2B JR NZ,display_background_patterns_0 Outer loop
display_background_patterns_2 8B2D LD (IY+$02),$00 Reset name table address
8B31 LD (IY+$03),$00 ...
8B35 LD L,(IY+$04) Background patterns LSB
8B38 LD H,(IY+$05) Background patterns MSB
8B3B LD A,H If both zero
8B3C OR L ...
8B3D RET Z Then return
Shift/scroll patterns to the right pixel offset
8B3E PUSH IY Save structure pointer
8B40 PUSH HL Save background patterns address
8B41 LD HL,buffer Clear 72 bytes starting from buffer
8B44 LD DE,$71A4 ...
8B47 LD BC,$0047 ...
8B4A LD (HL),$00 ...
8B4C LDIR ...
8B4E LD A,(IY+$01) Get screen y
8B51 AND $07 Pixel offset y
8B53 LD IX,buffer Cleared buffer
8B57 LD E,A DE = pixel offset y
8B58 LD D,$00 ...
8B5A ADD IX,DE Buffer address
8B5C LD A,(IY+$00) Get screen x
8B5F AND $07 Pixel offset x
8B61 LD B,A B = pixel offset (counter for inner loop)
8B62 LD C,$10 C = 16 (counter for outer loop)
8B64 POP IY Restore background patterns address
display_background_patterns_3 8B66 PUSH BC Save counters
8B67 LD C,$00 C = 0
8B69 LD D,(IY+$00) D = byte from left column of pattern
8B6C LD E,(IY+$10) E = byte from right column of pattern
8B6F INC B If pixel offset = 0
8B70 DEC B ...
8B71 JR Z,display_background_patterns_5 Then skip shifting
display_background_patterns_4 8B73 OR A Clear carry?
8B74 RR D Shift first byte
8B76 RR E Shift second byte
8B78 RR C Shift third byte
8B7A DJNZ display_background_patterns_4 Repeat 'pixel offset' times (inner loop)
display_background_patterns_5 8B7C LD (IX+$00),D Save shifted bytes in buffer
8B7F LD (IX+$18),E 3 patterns offset
8B82 LD (IX+$30),C ...
8B85 INC IX Next destination address
8B87 INC IY Next source address
8B89 POP BC Restore counters
8B8A DEC C Repeat 16 times
8B8B JR NZ,display_background_patterns_3 Outer loop
Update pattern table
8B8D POP IY
8B8F LD L,(IY+$06) VDP pattern index (name)
8B92 LD H,$00
8B94 ADD HL,HL * 8
8B95 ADD HL,HL ...
8B96 ADD HL,HL ...
8B97 EX DE,HL DE now VDP address in pattern table
8B98 LD HL,buffer Source address
8B9B LD BC,$0048 72 bytes (9 patterns)
8B9E RST $38 WRITE_VRAM
Update name table (3 x 3)
8B9F LD A,(IY+$01) Get screen y
8BA2 AND $F8 Round to characters
8BA4 LD L,A HL = A
8BA5 LD H,$00 ...
8BA7 ADD HL,HL * 4 = row offset in name table
8BA8 ADD HL,HL ...
8BA9 LD A,(IY+$00) Get screen x
8BAC SRL A / 8 = column offset in name table
8BAE SRL A ...
8BB0 SRL A ...
8BB2 DEC A -1 (start one column before)
8BB3 LD E,A DE = A
8BB4 LD D,$00 ...
8BB6 ADD HL,DE Add to address
8BB7 LD DE,$1800 Name table base address
8BBA ADD HL,DE Add to address in HL
8BBB LD (IY+$02),L Store address
8BBE LD (IY+$03),H ...
8BC1 LD C,$03 3 rows
8BC3 LD A,(IY+$06) Get name
display_background_patterns_6 8BC6 EX DE,HL DE is now VDP address
8BC7 LD B,$03 3 columns
display_background_patterns_7 8BC9 RST $10 Write VDP byte
8BCA ADD A,$03 Name += 3 (columns 3 apart)
8BCC INC DE Next VDP address
8BCD DJNZ display_background_patterns_7 Inner loop for 3 bytes
8BCF SUB $08 Name -= 8 (rows 1 apart)
8BD1 LD HL,$001D One row down and 3 columns back
8BD4 ADD HL,DE ...
8BD5 DEC C Row counter
8BD6 JR NZ,display_background_patterns_6 Outer loop for 3 bytes
8BD8 RET
Prev: 8AE6 Up: Map Next: 8BD9