#include "ti83p.inc"

#define temp uservar
#define b32 uservar+2
#define root uservar+6
#define lowvalue uservar+8
#define highvalue uservar+10

.org progstart

 bcall(_ZeroOp1)
 ld a,'N'
 ld (Op1+1),a
 bcall(_RclVarSym) ;// N => Op1
 bcall(_Op1ToOp5)  ;// N => Op5
 bcall(_PushRealO1)
 ld hl,$FFFF
 bcall(_SetXXXXOp2);// 65535 => Op2
 bcall(_Op2ToOp1)
 bcall(_Plus1)
 bcall(_PushRealO1)
 bcall(_FPRecip)
 bcall(_Op5ToOp2)
 bcall(_FPMult)   ;// N : 65536
 bcall(_PushRealO1)
 bcall(_Trunc)

 call Op1ToHl
 ld (b32+2),hl
 bcall(_PopRealO1)
 bcall(_Frac)
 bcall(_PopRealO2)
 bcall(_FPMult)
 ld d,0
 bcall(_Round)

 call Op1ToHl

 ld (b32),hl

 bcall(_PopRealO1)   ;Get Op1!

 ld hl,(b32)

 ld de,(b32+2)
 ld a,h
 or d
 or e
 ld a,l
 jr nz,big
 cp 1
 jr z,setstore
 cp 2
 jr z,exitloop
 cp 3
 jr z,exitloop

big:

 bit 0,a
 jr nz,nomul2
 ld a,2
 jr setstore

nomul2:

 bcall(_SqRoot)

 call Op1ToHl
 ld (root),hl

 ld de,3
 jr mainloop

carryflag:
 ccf
 sbc hl,de
 jr nocarry

mainloop:

 push de
 ld hl, b32
 ld de, lowvalue
 ld bc,4
 ldir

 pop de

 ld b,32
 ld hl,0

division:

 push hl
 ld hl,(lowvalue)
 add hl,hl
 ld (lowvalue),hl
 ld hl,(highvalue)
 adc hl,hl
 ld (highvalue),hl

 pop hl
 adc hl,hl
 jr c,carryflag
 sbc hl,de
 jr nc,nocarry

 add hl,de

nocarry:

 djnz division

 ld a,h
 or l
 jr nz,continue

 ld h,d
 ld l,e
 bcall(_SetXXXXOp2)
 bcall(_Op2ToOp1)
 jr store

continue:

 inc de
 ld a,d
 or e
 jr z,exitloop
 inc de

 ld a,(root+1)
 cp d
 jr c,exitloop
 jr nz,mainloop
 ld a,(root)
 cp e
 jr nc,mainloop

exitloop:

 ld a,0
setstore:
 bcall(_SetXXOp1)
store:
 bcall(_StoX)

 ret

Op1ToHl:
 ld a,8
 bcall(_SetXXOp2)
 bcall(_PushRealO2)
 bcall(_FPDiv)
 bcall(_PushRealO1)
 bcall(_ConvOp1)
 ld (temp),de

 bcall(_PopRealO1)
 bcall(_PopRealO2)
 bcall(_Frac)
 bcall(_FPMult)
 bcall(_ConvOp1)

 ld hl,(temp)
 add hl,hl
 add hl,hl
 add hl,hl
 add hl,de

 ret

.end
end

