home *** CD-ROM | disk | FTP | other *** search
- title 'if'
-
- .z80
-
- bdos equ 5
- wboot equ 0
-
- ifx: ld sp,stack ; local stack
- ld a,(80h) ; number of characters
- ld hl,81h ; address of first character
- and a
- jp z,err1 ; error if no input string
- ld b,a ; for djnz counter
- lp0: ld a,(hl)
- cp ' ' ; scan spaces
- jr nz,ex0 ; jump on non-space
- inc hl
- djnz lp0
- jp err1
- ex0: ld d,h ; keep start location
- ld e,l
- ld c,0 ; to count characters
- lp1: ld a,(hl) ; get char from input string
- cp '0'
- jr c,ex1 ; exit if below '0'
- cp '9'+1
- jr c,cn1 ; accept if below '9'+1
- cp 'A'
- jr c,ex1 ; exit if below 'A'
- cp 'Z'+1
- jr nc,ex1 ; exit if below 'Z'
- cn1: inc hl ; location in string
- inc c ; character count
- djnz lp1
- jp err1
- ex1:
- lp2: ld a,(hl) ; get char from input string
- cp ' '
- jr nz,ex2 ; non-space
- inc hl
- djnz lp2 ; scan thru spaces
- jp err1
- ex2: cp '='
- jr z,cn2
- cp '#'
- jp nz,err1
- cn2: ld (op),a ; keep operator
- inc hl
- dec b
- jp z,ex4 ; second string blank
- lp3: ld a,(hl)
- cp ' '
- jr nz,ex3 ; jump on non-space
- inc hl
- djnz lp3
- jr ex4 ; second string blank
- ex3: ex de,hl
- lp4: ld a,(de) ; char from second string
- cp ' ' ; allow space
- jr z,ex4
- cp (hl) ; compare with first string
- jp nz,diff
- inc hl
- inc de
- dec c
- djnz lp4
- ex4: ld a,c
- and a
- jp nz,diff ; strings different length
-
- ; strings equal
- ld a,(op) ; recover operator
- cp '='
- jr z,succ
- jr unsu
- diff: ld a,(op) ; strings different
- cp '='
- jr z,unsu
- jr succ
- succ: ld de,0
- jr ex5
- unsu: ld de,0ff00h
- jr ex5
- ex5: ld c,108
- call bdos
- jp wboot
-
- err1: ld de,errm
- ld c,9
- call bdos
- jr unsu
- errm: db 13,10,'error in IF statement - treat as false',13,10,'$'
- op: ds 1
- ds 32 ; stack
- stack:
-
- end ifx
-