;
;  PROGRAM:  SYSTEST3
;  AUTHOR:  Richard Conn
;  PURPOSE:  This program demonstrates the EVAL routines and the Math routines
;               within SYSLIB
;

;
;  Externals
;
       EXT     ADDHD   ; HL = HL + DE
       EXT     SUBHD   ; HL = HL - DE
       EXT     NEGH    ; HL = NEGATE OF HL
       EXT     MULHD   ; HL = HL * DE
       EXT     DIVHD   ; HL = HL / DE
       EXT     ANDHD   ; HL = HL AND DE
       EXT     ORHD    ; HL = HL OR DE
       EXT     XORHD   ; HL = HL XOR DE
       EXT     SHFTRH  ; HL = HL shifted right one bit position
       EXT     SHFTLH  ; HL = HL shifted left one bit position
       EXT     ROTRH   ; HL = HL rotated right one bit position
       EXT     ROTLH   ; HL = HL rotated left one bit position

       EXT     PRINT   ; Print String
       EXT     BBLINE  ; Input Line Editor
       EXT     EVAL    ; Number Evaluator
       EXT     PHLDC   ; Print HL as up to 5 decimal chars
       EXT     PHL4HC  ; Print HL as 4 Hex chars

;
;  ASCII Char defns
;
cr      equ     0dh
lf      equ     0ah

;
;  Print Banner
;
       call    print
       db      'SYSTEST3 -- Math Routines and Evaluation Demo',0

;
;  This is the main loop and a prompt to the user.
;
loop:
       call    print
       db      cr,lf,'Input Two Numbers, Separated by a Comma (<CR> to Stop)'
       db      ' -- ',0
       call    bbline  ; get user input
       ora     a       ; no input if A=0
       rz              ; return to Operating System
       call    eval    ; evaluate the first number (which is pted to by HL)
       xchg            ; place number in HL
       shld    num1    ; save it away as 1st number
       xchg            ; restore pointer to comma after number in HL
       inx     h       ; skip comma
       call    eval    ; evaluate the 2nd number (returned in DE)

;
;  Through the rest of this loop, DE contains the 2nd number.  Note that none
;  of the routines affect it.
;
       call    print
       db      cr,lf,'First Number is ',0
       lhld    num1    ; get and print first number
       call    phldc   ; print in decimal
       call    print
       db      ' in Decimal or ',0
       call    phl4hc  ; print in hex
       call    print
       db      ' in Hex',cr,lf,0
       call    print
       db      'The Second Number is ',0
       xchg            ; get 2nd number into HL
       call    phldc   ; print in decimal
       call    print
       db      ' in Decimal or ',0
       call    phl4hc  ; print in hex
       call    print
       db      ' in Hex',cr,lf,0
       xchg            ; save 2nd number in DE for rest of loop
       call    print
       db      cr,lf,'Sum = ',0
       lhld    num1    ; get first number again
       call    addhd   ; HL = HL + DE
       call    phldc   ; print sum
       call    print
       db      '  Difference = ',0
       lhld    num1    ; get first number (since destroyed by ADDHD)
       call    subhd   ; ... and so on ...
       call    phldc   ; print difference
       call    print
       db      '  Product = ',0
       lhld    num1
       call    mulhd
       call    phldc   ; print product
       call    print
       db      '  Quotient = ',0
       lhld    num1
       call    divhd
       call    phldc   ; print quotient
       call    print
       db      cr,lf,'  Negative of First Argument = ',0
       lhld    num1
       call    negh
       call    phldc   ; print negative
       call    print
       db      cr,lf,'AND = ',0
       lhld    num1    ; get first number
       call    andhd
       call    phl4hc
       call    print
       db      '  OR = ',0
       lhld    num1
       call    orhd
       call    phl4hc
       call    print
       db      '  XOR = ',0
       lhld    num1
       call    xorhd
       call    phl4hc
       call    print
       db      cr,lf,'First Argument:  SHIFT L = ',0
       lhld    num1
       call    shftlh
       call    phl4hc
       call    print
       db      '  SHIFT R = ',0
       lhld    num1
       call    shftrh
       call    phl4hc
       call    print
       db      '  ROT L = ',0
       lhld    num1
       call    rotlh
       call    phl4hc
       call    print
       db      '  ROT R = ',0
       lhld    num1
       call    rotrh
       call    phl4hc
       jmp     loop

num1:   ds      2       ; first number

       db      0

       end