atanbin: ;compute atan(DE/BC) ;make DE and BC positive, adjust angle later ld a,b rlc d rra rrc d push af jr nc,+_ xor a sub e ld e,a sbc a,a sub d ld d,a _: bit 7,b jr z,+_ xor a sub c ld c,a sbc a,a sub b ld b,a _: call atanbin_sub pop af ;bit 7 set means y was negative ;bit 6 set means x was negative add a,a jr nc,+_ push af xor a sub c ld c,a pop af _: ret p ld a,128 sub c ld c,a ret atanbin_sub: ;compute DE/BC as a fixed-point number ;if DE>=BC, swap and make the final result 256-atan(BC/DE) ld h,b ld l,c or a sbc hl,de jr nz,+_ atan_return_32: ld bc,32 ret _: add hl,de push af jr nc,+_ ld b,d ld c,e .db $FE _: ex de,hl ;now do HL/BC, given that BC>HL ;We also made sure all were positive at this point xor a sub c ld c,a sbc a,a sub b ld b,a add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla ;round step add hl,hl \ add hl,bc \ adc a,0 jr c,atan_return_32 ;if overflowed, this means we are essentially doing atan(1) ;If A<128 ; return ((32+19A)>>7) ;Else ; return ((32+13A)>>7)+6 ld l,a ld h,0 ld c,l ld b,h add hl,hl add hl,bc add hl,hl ld d,h ld e,l add hl,hl add hl,bc ;HL is 13A ;DE is 6A add a,a jr nc,+_ inc h inc h inc h .db $FE _: add hl,de ld c,32 add hl,bc add hl,hl sla l ld a,h adc a,b ld c,a ;Now do pi/2-x if needed (pi/2 = 64, here) pop af ret nc ld a,64 sub c ld c,a ret