123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- 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
|