;-----------------------------------------------------------;
;                                                           ;
; Maths Pack                                                ;
; Version 1.0                                               ;
; Calculate Angle Between 2 Vectors                         ;
; By James Vernon <james@calc.org>                          ;
;                                                           ;
;-----------------------------------------------------------;

vecAngleName:                                   ; Function description
.db     "Angle Between 2 Vectors",0

vecAngle:                                       ; Start of actual function
        set     trigdeg,(iy+trigflags)          ; Put calc in DEGREES mode
        ld      hl,strVecAngle
        call    putsNewLine
        ld      de,vaI1
        call    getNumber
        bcall(_newline)
        ld      hl,strVecAngleJ
        call    putsNewLine
        ld      de,vaJ1
        call    getNumber
        bcall(_newline)
        ld      hl,strVecAngleK
        call    putsNewLine
        ld      de,vaK1
        call    getNumber
        bcall(_newline)
        ld      hl,strVector2
        call    putsNewLine
        ld      hl,strVecAngleI
        call    putsNewLine
        ld      de,vaI2
        call    getNumber
        bcall(_newline)
        ld      hl,strVecAngleJ
        call    putsNewLine
        ld      de,vaJ2
        call    getNumber
        bcall(_newline)
        ld      hl,strVecAngleK
        call    putsNewLine
        ld      de,vaK2
        call    getNumber

        call    cls
        ld      hl,strVectorAngleAnswer
        call    putsNewLine

        ld      hl,op1
        ld      de,vaI1
        call    popOp
        ld      hl,op2
        ld      de,vaI2
        call    popOp
        bcall(_fpmult)
        call    pushOp1        
        ld      hl,op1
        ld      de,vaJ1
        call    popOp
        ld      hl,op2
        ld      de,vaJ2
        call    popOp
        bcall(_fpmult)
        bcall(_op1toop2)
        call    popOp1
        bcall(_fpadd)
        call    pushOp1
        ld      hl,op1
        ld      de,vaK1
        call    popOp
        ld      hl,op2
        ld      de,vaK2
        call    popOp
        bcall(_fpmult)
        bcall(_op1toop2)
        call    popOp1
        bcall(_fpadd)
        ld      hl,op1
        ld      de,vaAB
        call    pushOp

        ld      hl,op1
        ld      de,vaI1
        call    popOp
        bcall(_fpsquare)
        ld      hl,op1
        ld      de,vaI1
        call    pushOp
        ld      hl,op1
        ld      de,vaJ1
        call    popOp
        bcall(_fpsquare)
        ld      hl,op1
        ld      de,vaJ1
        call    pushOp
        ld      hl,op1
        ld      de,vaK1
        call    popOp
        bcall(_fpsquare)
        ld      hl,op2
        ld      de,vaI1
        call    popOp
        bcall(_fpadd)
        ld      hl,op2
        ld      de,vaJ1
        call    popOp
        bcall(_fpadd)
        bcall(_sqroot)
        ld      hl,op1
        ld      de,vaM1
        call    pushOp

        ld      hl,op1
        ld      de,vaI2
        call    popOp
        bcall(_fpsquare)
        ld      hl,op1
        ld      de,vaI2
        call    pushOp
        ld      hl,op1
        ld      de,vaJ2
        call    popOp
        bcall(_fpsquare)
        ld      hl,op1
        ld      de,vaJ2
        call    pushOp
        ld      hl,op1
        ld      de,vaK2
        call    popOp
        bcall(_fpsquare)
        ld      hl,op2
        ld      de,vaI2
        call    popOp
        bcall(_fpadd)
        ld      hl,op2
        ld      de,vaJ2
        call    popOp
        bcall(_fpadd)
        bcall(_sqroot)
        ld      hl,op1
        ld      de,vaM2
        call    pushOp

        ld      hl,op1
        ld      de,vaM1
        call    popOp
        ld      hl,op2
        ld      de,vaM2
        call    popOp
        bcall(_fpmult)
        bcall(_op1toop2)
        ld      hl,op1
        ld      de,vaAB
        call    popOp
        bcall(_fpdiv)
        bcall(_acos)
        bcall(_formreal)
        ld      hl,op3
        bcall(_puts)
        jp      waitKey

vaI1            = float1
vaJ1            = float2
vaK1            = float3
vaI2            = float4
vaJ2            = float5
vaK2            = float6
vaAB            = float7
vaM1            = float8
vaM2            = float9

strVecAngle:
.db     "Enter Vector in "
.db     "I, J, K format. "
.db     "Vector a:       "

strVecAngleI:
.db     "I=",0

strVecAngleJ:
.db     "J=",0

strVecAngleK:
.db     "K=",0

strVector2:
.db     "Vector b:",0

strVectorAngleAnswer:
.db     "Angle:",0

.end
