| Gyruss | Routines |
| Prev: 8AE6 | Up: Map | Next: 8BD9 |
|
Used by the routines at create_mine, display_mines, shot_hit_mine_0, ship_hit_mine and display_ship_background_patterns.
|
||||||||
| 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 |