Files
RomWBW/Source/Images/hd0/s0/u15/GOTO.MAC
2016-09-30 18:07:16 -07:00

204 lines
3.4 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;
; 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