Cameltst

; Listing 1.
; ===============================================
; CamelForth for the Zilog Z80
; Primitive testing code
;
; This is the "minimal" test of the CamelForth
; kernel.  It verifies the threading and nesting
; mechanisms, the stacks, and the primitives
;   DUP EMIT EXIT lit branch ONEPLUS.
; It is particularly useful because it does not
; use the DO..LOOP, multiply, or divide words,
; and because it can be used on embedded CPUs.
; The numeric display word .A is also useful
; for testing the rest of the Core wordset.
;
; The required macros and CPU initialization
; are in file CAMEL80.AZM.
; ===============================================

;Z ><   u1 -- u2    swap the bytes of TOS
    head SWAB,2,><,docode
        ld a,b
        ld b,c
        ld c,a
        next

;Z LO   c1 -- c2    return low nybble of TOS
    head LO,2,LO,docode
        ld a,c
        and 0fh
        ld c,a
        ld b,0
        next

;Z HI   c1 -- c2    return high nybble of TOS
    head HI,2,HI,docode
        ld a,c
        and 0f0h
        rrca
        rrca
        rrca
        rrca
        ld c,a
        ld b,0
        next

;Z >HEX  c1 -- c2    convert nybble to hex char
    head TOHEX,4,>HEX,docode
        ld a,c
        sub 0ah
        jr c,numeric
        add a,7
numeric: add a,3ah
        ld c,a
        next

;Z .HH   c --       print byte as 2 hex digits
;   DUP HI >HEX EMIT LO >HEX EMIT ;
    head DOTHH,3,.HH,docolon
        DW DUP,HI,TOHEX,EMIT,LO,TOHEX,EMIT,EXIT

;Z .B    a -- a+1   fetch & print byte, advancing
;   DUP C@ .HH 20 EMIT 1+ ;
    head DOTB,2,.B,docolon
    DW DUP,CFETCH,DOTHH,lit,20h,EMIT,ONEPLUS,EXIT

;Z .A   u --       print unsigned as 4 hex digits
;   DUP >< .HH .HH 20 EMIT ;
    head DOTA,2,.A,docolon
        DW DUP,SWAB,DOTHH,DOTHH,lit,20h,EMIT,EXIT

;X DUMP   addr u --      dump u locations at addr
;   0 DO
;      I 15 AND 0= IF CR DUP .A THEN
;      .B
;   LOOP DROP ;
    head DUMP,4,DUMP,docolon
        DW LIT,0,XDO
DUMP2:  DW II,LIT,15,AND,ZEROEQUAL,qbranch,DUMP1
        DW CR,DUP,DOTA
DUMP1:  DW DOTB,XLOOP,DUMP2,DROP,EXIT

;Z ZQUIT   --    endless dump for testing
;   0 BEGIN  0D EMIT 0A EMIT  DUP .A
;       .B .B .B .B .B .B .B .B
;       .B .B .B .B .B .B .B .B
;   AGAIN ;
    head ZQUIT,5,ZQUIT,docolon
       DW lit,0
zquit1:  DW lit,0dh,EMIT,lit,0ah,EMIT,DUP,DOTA
       DW DOTB,DOTB,DOTB,DOTB,DOTB,DOTB,DOTB,DOTB
       DW DOTB,DOTB,DOTB,DOTB,DOTB,DOTB,DOTB,DOTB
       DW branch,zquit1