;-----------------------------------------------------------;
;                                                           ;
; Maths Pack                                                ;
; Version 1.0                                               ;
; Quadratic Equation Solver                                 ;
; By James Vernon <james@calc.org>                          ;
;                                                           ;
;-----------------------------------------------------------;

quadSolverName:                                 ; Function description
.db     "Quadratic Solver",0

quadSolver:                                     ; Start of actual function
        ld      hl,strQuadSolverA
        call    putsNewLine
        ld      de,qsA
        call    getNumber
        bcall(_newline)
        ld      hl,strQuadSolverB
        call    putsNewLine
        ld      de,qsB
        call    getNumber
        bcall(_newline)
        ld      hl,strQuadSolverC
        call    putsNewLine
        ld      de,qsC
        call    getNumber

        call    cls
        ld      hl,strQuadSolverAns
        bcall(_puts)
        ld      hl,op1
        ld      de,qsB
        call    popOp                           ; Op1 = B
        bcall(_fpsquare)                        ; Op1 = B^2
        call    pushOp1
        ld      hl,op1
        ld      de,qsA
        call    popOp                           ; Op1 = A
        ld      hl,op2
        ld      de,qsC
        call    popOp                           ; Op2 = C
        bcall(_fpmult)                          ; Op1 = AC
        bcall(_op2set4)
        bcall(_fpmult)                          ; Op1 = 4AC
        bcall(_op1toop2)                        ; Op2 = 4AC
        call    popOp1                          ; Op1 = B^2
        bcall(_fpsub)                           ; Op1 = B^2-4AC
        bcall(_sqroot)                          ; Op1 = sqrt(B^2-4AC)
        bcall(_op1toop2)                        ; Op2 = sqrt(B^2-4AC)
        call    pushOp2
        ld      hl,op1
        ld      de,qsB
        call    popOp                           ; Op1 = B
        bcall(_invop1s)                         ; Op1 = -B
        bcall(_op1toop6)                        ; Op6 = -B
        bcall(_fpadd)                           ; Op1 = -B+sqrt(B^2-4AC)
        call    pushOp1
        ld      hl,op1
        ld      de,qsA
        call    popOp                           ; Op1 = A
        bcall(_times2)                          ; Op1 = 2A
        bcall(_op1toop2)                        ; Op2 = 2A
        call    popOp1                          ; Op1 = -B+sqrt(B^2-4AC)
        bcall(_fpdiv)                           ; Op1 = (-B+sqrt(B^2-4AC))/(2A)
        call    pushOp6
        ld      a,15
        bcall(_formreal)
        ld      hl,op3
        bcall(_puts)
        ld      hl,strQuadSolverOr
        bcall(_puts)
        call    popOp6                          ; Op6 = -B
        call    popOp2                          ; Op2 = sqrt(B^2-4AC)
        bcall(_op6toop1)                        ; Op1 = -B
        bcall(_fpsub)                           ; Op1 = -B-sqrt(B^2-4AC)
        call    pushOp1
        ld      hl,op1
        ld      de,qsA
        call    popOp                           ; Op1 = A
        bcall(_times2)                          ; Op1 = 2A
        bcall(_op1toop2)                        ; Op2 = 2A
        call    popOp1                          ; Op1 = -B-sqrt(B^2-4AC)
        bcall(_fpdiv)                           ; Op1 = (-B-sqrt(B^2-4AC))/(2A)
        ld      a,15
        bcall(_formreal)
        ld      hl,op3
        bcall(_puts)
        jp      waitKey
        ret

;(-B+sqrt(B^2-4AC))/(2A)
;(-B-sqrt(B^2-4AC))/(2A)

qsA             = float1
qsB             = float2
qsC             = float3

strQuadSolverA:
.db     "Quadratic Solver"
.db     "AX",$12,"+BX+C        "
.db     "A=",0

strQuadSolverB:
.db     "B=",0

strQuadSolverC:
.db     "C=",0

strQuadSolverAns:
.db     "Answer:         "
.db     "X=",0

strQuadSolverOr:
.db     " or ",0

.end
