home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Program: GOTO
- ; Author: Richard Conn
- ; Version: 1.0
- ; Date: 8 Mar 84
- ; Previous Versions: None
- ;
- version equ 10
-
- ;
- ; GOTO is a program designed to be run under ZEX which permits
- ; branching within a ZEX file. It accepts only one argument, a label,
- ; which is defined within the ZEX file as a special comment of the
- ; form:
- ; ;=label anytext
- ; The syntax of GOTO is:
- ; GOTO label
- ;
-
- ;
- ; Basic Equates
- ;
- z3env SET 0f400h ;Environment Descriptor
- fcb equ 5ch
- cr equ 0dh
- lf equ 0ah
- lflag equ '=' ;label flag in comment
-
- ;
- ; Externals
- ;
- ext z3init,getzrun,getzfc,putznc,putzrun
- ext print,cout,caps
-
- ;
- ; Environment Definition
- ;
- if z3env ne 0
- ;
- ; External ZCPR3 Environment Descriptor
- ;
- jmp start
- db 'Z3ENV' ;This is a ZCPR3 Utility
- db 1 ;External Environment Descriptor
- z3eadr:
- dw z3env
- start:
- lhld z3eadr ;pt to ZCPR3 environment
- ;
- else
- ;
- ; Internal ZCPR3 Environment Descriptor
- ;
- MACLIB Z3BASE.LIB
- MACLIB SYSENV.LIB
- z3eadr:
- jmp start
- SYSENV
- start:
- lxi h,z3eadr ;pt to ZCPR3 environment
- endif
-
- ;
- ; Start of Program -- Initialize ZCPR3 Environment
- ;
- call z3init ;initialize the ZCPR3 Env and the VLIB Env
- ;
- ; Check for Valid Label
- ;
- lda fcb+1 ;get first char of FCB
- cpi ' ' ;no label?
- jz help
- cpi '/'
- jnz start1
- ;
- ; Print GOTO Help
- ;
- help:
- call print
- db 'GOTO, Version '
- db (version/10)+'0','.',(version mod 10)+'0'
- db cr,lf,'GOTO -- Branch Within a ZEX File'
- db cr,lf,'Syntax:'
- db cr,lf,' GOTO label'
- db cr,lf,'where "label" is defined by a special comment of'
- db cr,lf,'the form ";',lflag,'label".',0
- ret
- ;
- ; Check for Running ZEX
- ;
- start1:
- call getzrun ;get ZEX run flag
- jnz start2
- call print
- db ' ZEX Not Running',0
- ret
- ;
- ; Begin Scan of ZEX Message Buffer
- ;
- start2:
- call getzfc ;get ptr to first ZEX char
- lxi d,fcb+1 ;pt to GOTO label
- ;
- ; Scan for Label Comment
- ;
- scanc:
- mov a,m ;get char
- cpi ';' ;comment?
- jnz flush ;advance to next line
- dcx h ;pt to next
- mov a,m
- cpi lflag ;label?
- jnz flush ;advance to next line if not label
- ;
- ; We have a label - check it
- ;
- push h ;save ptrs
- push d
- dcx h ;pt to first char
- mvi b,8 ;at most 8 chars
- label:
- ldax d ;get GOTO char
- cpi ' ' ;done?
- jz label1
- mov c,a
- mov a,m
- call caps ;capitalize label in ZEX file
- cmp c ;compare
- jnz label2
- dcx h ;advance
- inx d
- dcr b
- jnz label
- ;
- ; Label Matches
- ;
- label1:
- mov a,m ;must be space or less for match
- cpi ' '+1
- jnc label2
- pop d ;restore ptrs
- pop h
- ;
- ; Advance to Beginning of Next Line
- ;
- nxtline:
- mov a,m ;get char
- dcx h ;pt to next
- cpi cr ;end of line?
- jz nxtl1
- cpi 0ffh ;end of processing?
- jnz nxtline
- nxtl1:
- call putznc ;store ptr to next char
- call print
- db ' GOTO Label ',0
- jmp prlabel
- ;
- ; No Match on Label
- ;
- label2:
- pop d ;restore regs
- pop h
- ;
- ; Flush to Next Line or EOB
- ;
- flush:
- mov a,m ;get next char
- cpi 0ffh ;end of buffer?
- jz notfnd
- dcx h ;pt to next
- cpi cr ;end of line?
- jnz flush
- jmp scanc ;resume search
- ;
- ; Label Not Found
- ;
- notfnd:
- call print
- db ' Label ',0
- call prlabel ;print label
- call print
- db ' Not Found -- Aborting ZEX',0
- xra a ;turn off ZEX
- jmp putzrun
-
- ;
- ; Print Label Name
- ;
- prlabel:
- mvi b,8
- lxi h,fcb+1
- prl1:
- mov a,m ;get next char
- cpi ' ' ;done?
- rz
- call cout ;print char
- inx h
- dcr b ;count down
- jnz prl1
- ret
-
- end