;-----------------------------------------------------------;
;                                                           ;
; Maths Pack                                                ;
; Version 1.0                                               ;
; Surd Simplifier                                           ;
; By James Vernon <james@calc.org>                          ;
;                                                           ;
;-----------------------------------------------------------;

surdName:                                       ; Function description
.db     "Surd Simplifier",0

surd:                                           ; Start of actual function
        ld      hl,strSurdGetNumber
        call    putsNewLine
        bcall(_newline)
        ld      de,op1
        call    getNumber
        bcall(_newline)
        bcall(_ckop1pos)
        jr      z,surdChkInt
        ld      hl,strSurdNoNeg
surdError:
        bcall(_puts)
        jp      waitKey
surdChkInt:
        call    pushOp1
        ld      hl,op1+1
        bcall(_ckint)
        jr      z,doSurd
        ld      hl,strSurdNoFP
        jr      surdError
doSurd:
        call    popOp1
        ld      hl,op1
        ld      de,surdBuffer
        call    pushOp
        ld      hl,surdTable
        ld      b,NUM_SURD_FACTORS
findSurdFactor:
        push    bc
        push    hl
        push    hl
        pop     hl
        ld      l,(hl)
        ld      h,0
        bcall(_setxxxxop2)
        bcall(_cpop1op2)
        jr      c,endFindSurdFactor
        bcall(_op1toop6)
        bcall(_fpdiv)
        call    pushOp1
        call    pushOp2
        ld      hl,op1+1
        bcall(_ckint)
        jr      z,surdFactorFound
        bcall(_op6toop1)
endFindSurdFactor:
        pop     hl
        pop     bc
        dec     hl
        djnz    findSurdFactor
surdFactorFound:
        pop     hl
        pop     bc
        call    popOp1
        call    popOp2
        call    pushOp1
        bcall(_op2toop1)
        bcall(_sqroot)
        bcall(_op1toop2)
        call    popOp1
showSurdAnswer:
        call    pushOp1
        call    cls
        ld      hl,strSurdAnswer
        bcall(_puts)
        ld      hl,op1
        ld      de,surdBuffer
        call    popOp
        call    pushOp2
        ld      a,3
        bcall(_formreal)
        ld      hl,op3
        bcall(_puts)
        ld      hl,strSurdAnswer2
        bcall(_puts)
        call    popOp2
        bcall(_op2toop1)
        ld      a,3
        bcall(_formreal)
        ld      hl,op3
        bcall(_puts)
        call    popOp1
showSurdAnswer2:
        call    pushOp1
        ld      a,$10
        bcall(_putc)
        call    popOp1
        ld      a,3
        bcall(_formreal)
        ld      hl,op3
        bcall(_puts)
        call    waitKey
        ret

strSurdGetNumber:
.db     "Enter a number: "
.db     $10,"(x), x=",0

strSurdAnswer:
.db     "Answer:         "
.db     $10,"(",0
strSurdAnswer2:
.db     ") = ",0

strSurdNoNeg:
.db     "No negative     "
.db     "numbers!",0

strSurdNoFP:
.db     "Must be integer!",0

NUM_SURD_FACTORS        = 15
.db     1,4,9,16,25,36,49,64,81,100
.db     121,144,169,196,225
surdTable               = $-1

surdBuffer      = float1

.end
