Prev: B136 Up: Map Next: B21D
B1C6: Convert polar to screen coordinates
Input
IX Pointer to sprite data
D Polar y
E Polar x
Output
D Screen y
E Screen x
Carry flag set if out of screen
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