| Gyruss | Routines |
| Prev: B136 | Up: Map | Next: B21D |
|
Used by the routines at create_mine, display_mines, move_dots, display_center_enemies and load_sprite_pattern_2.
|
||||||||||||||||||||
| polar_to_screen | B1C6 | PUSH IX | ||||||||||||||||||
| B1C8 | PUSH HL | |||||||||||||||||||
| B1C9 | PUSH BC | |||||||||||||||||||
| B1CA | LD A,$0B | 11 | ||||||||||||||||||
| B1CC | ADD A,D | Polar y + 11 | ||||||||||||||||||
| B1CD | JP M,polar_to_screen_5 | If this is 128 or more (polar y > 116 or polar y < -11), then set position outside screen and return | ||||||||||||||||||
| B1D0 | LD L,A | Calculate table address, with polar y = -11 corresponding to row 0 | ||||||||||||||||||
| B1D1 | LD H,$00 | and polar y = 0 corresponding to row 11 | ||||||||||||||||||
| B1D3 | ADD HL,HL | (y + 11) * 32 | ||||||||||||||||||
| B1D4 | ADD HL,HL | ... | ||||||||||||||||||
| B1D5 | ADD HL,HL | ... | ||||||||||||||||||
| B1D6 | ADD HL,HL | ... | ||||||||||||||||||
| B1D7 | ADD HL,HL | ... | ||||||||||||||||||
| B1D8 | LD A,E | x | ||||||||||||||||||
| B1D9 | BIT 4,E | Is bit 4 set (top left or lower right quadrants)? | ||||||||||||||||||
| B1DB | JR Z,polar_to_screen_0 | Jump if not | ||||||||||||||||||
| B1DD | CPL | Else invert (0 -> 15, 1 -> 14, etc.) | ||||||||||||||||||
| polar_to_screen_0 | B1DE | AND $0F | Use the first 4 inverted bits | |||||||||||||||||
| B1E0 | ADD A,A | x2 (2 bytes per x) | ||||||||||||||||||
| B1E1 | ADD A,L | Add to address | ||||||||||||||||||
| B1E2 | LD L,A | ... | ||||||||||||||||||
| B1E3 | JR NC,polar_to_screen_1 | ... | ||||||||||||||||||
| B1E5 | INC H | ... | ||||||||||||||||||
| polar_to_screen_1 | B1E6 | LD BC,polar_to_screen_table | Lookup table base address | |||||||||||||||||
| B1E9 | ADD HL,BC | Add to address | ||||||||||||||||||
| B1EA | LD A,(HL) | Get table value | ||||||||||||||||||
| B1EB | CP $FF | If $FF | ||||||||||||||||||
| B1ED | JR Z,polar_to_screen_5 | Then set position outside screen and return | ||||||||||||||||||
| B1EF | LD IX,center_of_projection | Center of projection | ||||||||||||||||||
| B1F3 | LD A,E | x | ||||||||||||||||||
| B1F4 | RRCA | Shift right | ||||||||||||||||||
| B1F5 | XOR E | Bit 4 is now set if bit 5 (left/right) and bit 4 (top left/lower right) were different, i.e. top of screen | ||||||||||||||||||
| B1F6 | BIT 4,A | Test bit 4 (top of screen) | ||||||||||||||||||
| B1F8 | LD A,(HL) | Get table value | ||||||||||||||||||
| B1F9 | JR Z,polar_to_screen_2 | Skip negating if not top of screen | ||||||||||||||||||
| B1FB | NEG | -table value | ||||||||||||||||||
| polar_to_screen_2 | B1FD | ADD A,(IX+$00) | +center y ($60) | |||||||||||||||||
| B200 | SUB $04 | -4 (adjust for sprite size) | ||||||||||||||||||
| B202 | LD D,A | Store as sprite y | ||||||||||||||||||
| B203 | INC HL | Next table address | ||||||||||||||||||
| B204 | LD A,(HL) | Get table value | ||||||||||||||||||
| B205 | BIT 5,E | Test bit 5 of x (left/right) | ||||||||||||||||||
| B207 | JR NZ,polar_to_screen_3 | Skip negating if right | ||||||||||||||||||
| B209 | NEG | -table value | ||||||||||||||||||
| polar_to_screen_3 | B20B | ADD A,(IX+$01) | +center x ($80 or $B5 or ?) | |||||||||||||||||
| B20E | SUB $04 | -4 (adjust for sprite size) | ||||||||||||||||||
| B210 | LD E,A | Store as sprite x | ||||||||||||||||||
| B211 | OR A | Clear carry flag | ||||||||||||||||||
| polar_to_screen_4 | B212 | POP BC | Return | |||||||||||||||||
| B213 | POP HL | ... | ||||||||||||||||||
| B214 | POP IX | ... | ||||||||||||||||||
| B216 | RET | ... | ||||||||||||||||||
| polar_to_screen_5 | B217 | LD DE,$F500 | Set return position outside screen | |||||||||||||||||
| B21A | SCF | Set carry flag | ||||||||||||||||||
| B21B | JR polar_to_screen_4 | To return | ||||||||||||||||||
| Prev: B136 | Up: Map | Next: B21D |