;   _____                                  _                   
;  / ____|                                (_)                
; | |      ___  _ __ ___  _ __   __ _ _ __ _ ___  ___  _ __  
; | |     / _ \| '_ ` _ \| '_ \ / _` | '__| / __|/ _ \| '_ \ 
; | |____| (_) | | | | | | |_) | (_| | |  | \__ \ (_) | | | |
;  \_____|\___/|_| |_| |_| .__/ \__,_|_|  |_|___/\___/|_| |_|
;                        | |                                 
;                        |_|                                 
; __          __            _     
; \ \        / /           | |    
;  \ \  /\  / /___  _ __ __| |___ 
;   \ \/  \/ // _ \| '__/ _` / __|
;    \  /\  /| (_) | | | (_| \__ \
;     \/  \/  \___/|_|  \__,_|___/

; =            n1 n2 -- flag                 83           "equals" 
; flag is true if n1 is equal to n2.
eqh     data maxh,1
        text '= '
eq      data $+2
        c *stack+,*stack            ; compare and pop n2
        jeq sTrue                   ; set true if n1=n2
        jmp sFalse                  ; else set result to false

        
; >            n1 n2 -- flag                 83     "greater-than" 
; flag is true if n1 is greater than n2.                     
;    -32768 32767 > must return false.                  
;    -32768 0 > must return false.
gth     data eqh,1
        text '> '
gt      data $+2
        c *stack+,*stack            ; compare n2 to n1. pop n2
        jlt sTrue                   ; set true if n2
        jmp sFalse                  ; else set result to false


; <            n1 n2 -- flag                 83        "less-than" 
; flag is true if n1 is less than n2.   
;    -32678 32767 < must return true.                   
;    -32768 0 < must return true.
lth     data gth,1
        text '< '
lt      data $+2
        c *stack+,*stack            ; compare n2 to n1. pop n2
        jgt sTrue                   ; set true if n2>n1
        jmp sFalse                  ; else set result to false


; >=           n1 n2 -- flag
; returns true if n1>=n2
gteh    data lth,2
        text '>='
gte     data $+2
        c *stack+,*stack            ; compare n2 to n2. pop n2
        jlt sTrue                   ; set true if n2
        jeq sTrue                   ; or if n2=n1
        jmp sFalse                  ; else set result to false


; <= (SIGNED)  ( n1 n2 -- flag )
; returns true if n1<=n2
lteh    data gteh,2
        text '<='
lte     data $+2
        c *stack+,*stack            ; compare n2 to n1. pop n2
        jgt sTrue                   ; set true if n2>n1
        jeq sTrue                   ; or if n2=n1
        jmp sFalse                  ; else set result to false


; <>  ( n1 n2 -- flag )
; returns true if n1!=n2
neqhh   data lteh,2
        text '<>'
neq     data $+2
        c *stack+,*stack            ; compare n2 to n1. pop n2
        jne sTrue                   ; set true if n2<>n1
        jmp sFalse                  ; else set result to false


; 0=           w -- flag                     83      "zero-equals" 
; flag is true if w is zero.
eqzh    data neqhh,2
        text '0='
eqz     data $+2
        mov *stack,*stack           ; compare to tos to 0
        jeq sTrue                   ; set true if tos=0
        jmp sFalse                  ; else set result to false


; 0<>  ( x -- flag )
; returns true if x!=0
neqzh   data eqzh,3
        text '0<> '
neqz    data $+2
        mov *stack,*stack           ; compare tos to 0
        jne sTrue                   ; set true if tos<>0
        jmp sFalse                  ; else set result to false

    
; 0<           n -- flag                     83        "zero-less" 
; flag is true if n is less than zero (negative).
ltzh    data neqzh,2
        text '0<'
ltz     data $+2
        mov *stack,*stack           ; compare tos to 0
        jlt sTrue                   ; set true if tos<0
        jmp sFalse                  ; else set result to false


; 0>           n -- flag                     83     "zero-greater" 
; flag is true if n is greater than zero.
gtzh    data ltzh,2
        text '0>'
gtz     data $+2
        mov *stack,*stack           ; compare tos to 0
        jgt sTrue                   ; set true if tos>0
        jmp sFalse                  ; else set result to false


; U<           u1 u2 -- flag                 83      "u-less-than" 
; flag is true if u1 is less than u2.
ulessh  data gtzh,2
        text 'U<'
uless   data $+2
        c *stack+,*stack            ; compare u2 to u1. pop u2
        jh sTrue                    ; set true if u2>u1
        jmp sFalse                  ; else set false


; WITHIN ( n low high -- true|false )
; returns true if n is within low and high+1
withh   data ulessh,6
        text 'WITHIN'
within  data docol,over,sub,rspush,sub,rspop,uless,exit


; 0<=  ( x -- flag )
; returns true if x<=0
ltezh   data withh,3
        text '0<= '
ltez    data $+2
        mov *stack,*stack           ; compare tos to 0
        jlt sTrue                   ; set true if tos<0
        jeq sTrue                   ; or if tos=0
        jmp sFalse                  ; else set result to false


; 0>=  ( x -- flag )
; returns true if x>=0
gtezh   data ltezh,3
        text '0>= '
gtez    data $+2
        mov *stack,*stack           ; compare tos to 0
        jgt sTrue                   ; set true if tos>0
        jeq sTrue                   ; or if tos=0
        jmp sFalse                  ; else set result to false


; The following routines are common to all the routines above.
; The first routine returns a true result, the second routine a false result.
; Each routine has two entry points, depending on whether 1 or 2 parameters
; should be removed from the stack.

    ; called when the result of the comparison is true
sTrue   seto *stack                 ; set value to -1 (true)
        b *next
        
    ; called when the result of the comparison is false
sFalse  clr *stack                  ; set result to 0 (false)
        b *next