home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ZSYS
/
SIMTEL20
/
ZCPR3
/
TCMAKE.MAC
< prev
next >
Wrap
Text File
|
2000-06-30
|
19KB
|
1,085 lines
; ZCPR3 TCAP Facility (Z3TCAP)
; Program Name: TCMAKE
; Author: Richard Conn
; Version: 1.0
; Date: 10 Mar 84
version equ 10
;
; TCMAKE allows the user to create a Z3T file for his particular
; terminal.
;
;
; Basic Equates
;
z3env SET 0f400h ;ZCPR3 Environment Descriptor
qch equ '\' ;quote char
fcb equ 5ch
tbuff equ 80h
ctrlc equ 'C'-'@'
cr equ 0dh
lf equ 0ah
;
; ZCPR3 and SYSLIB References
;
ext z3init,qprint,z3log
ext bbline,sksp,eval
ext codend,moveb,fillb,hmovb
ext print,pfn1,pstr,capine,cin,caps,crlf,cout,pafdc,pa2hc
ext initfcb,f$make,f$write,f$close
ext f$exist,gfa,f$delete
;
; 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
;
; Print Banner
;
call qprint
db 'TCMAKE, Version '
db (version/10)+'0','.',(version mod 10)+'0'
db cr,lf,0
;
; Check for Entry in FCB
;
lda fcb+1 ;get first char
cpi ' ' ;none if space
jz help
cpi '/' ;none if slash
jnz start1
;
; Print Help Info
;
help:
call print
db 'TCMAKE - Create a Z3T File'
db cr,lf,'Syntax:'
db cr,lf,' TCMAKE outfile -or- TCMAKE outfile.typ'
db cr,lf
db cr,lf,'where "outfile" is the file to be generated by'
db cr,lf,'the execution of TCMAKE. If no file type is'
db cr,lf,'given, a file type of Z3T is the default.'
db 0
ret
;
; Resume Processing
;
start1:
;
; Set Default File Type if None
;
lxi d,fcb+9 ;pt to file type
lxi h,deftyp ;pt to default file type
mvi b,3 ;3 bytes
ldax d ;get first char
cpi ' ' ;none if space
cz moveb ;set default file type
;
; Init the Buffers and Pointers
;
call codend ;pt to scratch area
shld scratch ;set ptr
lxi d,100h ;give space (overkill)
xra a ;init strings to empty
sta rcfirst ;clear flag
dad d
shld cladr ;CL
mov m,a ;clear
dad d
shld cmadr ;CM
mov m,a ;clear
dad d
shld ceadr ;CE
mov m,a ;clear
dad d
shld soadr ;SO
mov m,a ;clear
dad d
shld seadr ;SE
mov m,a ;clear
dad d
shld tiadr ;TI
mov m,a ;clear
dad d
shld teadr ;TE
mov m,a ;clear
dad d
shld cmbadr ;CM Beginning
mov m,a ;clear
dad d
shld cmmadr ;CM Middle
mov m,a ;clear
dad d
shld cmeadr ;CM Ending
mov m,a ;clear
dad d
shld reqn ;Row Equation
mov m,a
dad d
shld ceqn ;Column Equation
mov m,a
lxi h,ku ;clear 1-byte buffers
mvi b,7 ;7 of them
xra a ;0 fill
call fillb
;
; Create the Data Base
;
menu1:
call create ;create entry
call assemble ;assemble the entry
jz menu1 ;continue if buffer overflow
;
; Confirm Selection
;
call print
db cr,lf,' Selected Terminal is: ',0
lhld scratch ;pt to buffer
call prent ;print name
call print
db ' -- Confirm (Y/N)? ',0
call capine ;get input
call crlf
cpi 'Y'
jnz menu1 ;continue
call wrfile ;write file
ret
;
; Assemble Data into Z3T Format
; Return with Z if Buffer Overflow (more than 128 bytes)
; Return with NZ if OK
;
assemble:
mvi c,128-23 ;128 bytes max with 23 bytes for header
mvi b,23 ;copy 23 byte header
lhld scratch ;into scratch area
lxi d,tname ;from TNAME
xchg
call hmovb
lhld cladr ;copy CL string
call asmcopy
lxi h,crcmd ;reverse row/col to col/row?
lda rcfirst ;get flag
cpi 'C' ;reverse if C
jnz asmc0
call asmcopy
dcx d ;don't let zero in
asmc0:
lhld cmbadr ;CM Beginning
call asmcopy
dcx d
lhld ceqn ;prepare for col first
lda rcfirst ;get row/col flag
cpi 'C' ;col/row?
jz asmc1
lhld reqn ;row first, so store row
asmc1:
call asmcopy
dcx d ;skip 0
lhld cmmadr ;CM Middle
call asmcopy
dcx d ;skip 0
lhld reqn ;prepare for row first
lda rcfirst ;get row/col flag
cpi 'C' ;col/row?
jz asmc2
lhld ceqn ;col first, so store col
asmc2:
call asmcopy
dcx d ;skip 0
lhld cmeadr ;CM Ending
call asmcopy
lhld ceadr ;CE
call asmcopy
lhld soadr ;SO
call asmcopy
lhld seadr ;SE
call asmcopy
lhld tiadr ;TI
call asmcopy
lhld teadr ;TE
call asmcopy
xra a ;zero rest
asmzero:
stax d ;store 0
inx d
dcr c ;count down
jnz asmzero
dcr c ;return NZ for OK
ret
;
; Copy TCAP String from HL to DE
; Check for SCRATCH Area Overflow by Counting C Down
; Allow For Quotes
;
asmcopy:
mov a,m ;get char
stax d ;store it
inx h ;pt to next
inx d
ora a ;done?
rz
dcr c ;check for overflow
jz asmovfl
cpi qch ;quote?
jnz asmcopy
mov a,m ;get quoted byte
stax d ;store it
inx h ;pt to next
inx d
dcr c ;check for overflow
jnz asmcopy
asmovfl:
pop psw ;clear stack
call print
db cr,lf,'** Buffer Overflow **',0
xra a ;error code
ret
;
; Create Entries
;
create:
call print
db cr,lf
db cr,lf,' ** Z3TCAP Main Menu',0
call prfdata ;print file data
call print
db cr,lf
db cr,lf,'Define: 1. Clear Screen Sequence'
db cr,lf,' 2. Cursor Motion Sequence'
db cr,lf,' 3. Clear to End of Line Sequence'
db cr,lf,' 4. Standout Mode Sequences'
db cr,lf,' 5. Terminal Init/Deinit Sequences'
db cr,lf,' 6. Arrow Keys'
db cr,lf,' 7. Terminal Name'
db cr,lf
db cr,lf,'Status: S. Print Status (Definitions so far)'
db cr,lf
db cr,lf,'Exit: X. Exit and Write File'
db cr,lf,' Q. Quit and Abort Program without Writing File'
db cr,lf
db cr,lf,'Command? ',0
call capine ;get response
call crlf
lxi h,ctable ;pt to command table
call tscan ;scan table
call print
db ' Invalid Command: ',0
call cout ;print char
jmp create ;resume
;
; Print File Data
;
prfdata:
call print
db ' for File ',0
lxi d,fcb+1
call pfn1
call print
db ' **',0
ret
;
; Define Name of Terminal
;
namedef:
lxi h,tname ;space fill terminal name buffer
mvi a,' '
mvi b,16
call fillb
call print
db cr,lf,' Input Name of Terminal: ',0
xra a ;no caps
call bbline ;get line from user
call sksp ;skip over leading spaces
lxi d,tname ;save name in buffer
mvi b,16 ;16 bytes max
putname:
mov a,m ;get next char
ora a ;done?
jz pn1
stax d ;put next char
inx h ;pt to next
inx d
dcr b ;count down
jnz putname
pn1:
jmp create
;
; Define Arrow Keys
;
arrowdef:
call print
db 'Arrow Key Definition'
db cr,lf,' Your Terminal''s Arrow Keys may be defined ONLY'
db cr,lf,' if they generate only one character each. If they'
db cr,lf,' do, type Y to continue. If not, type anything else.'
db cr,lf,' Define Arrow Keys (Y/N)? ',0
call capine
cpi 'Y'
jnz create
call print
db cr,lf,' Strike the Appropriate Arrow Key'
db cr,lf,' 1. Arrow UP? ',0
lxi h,ku ;pt to first entry
call cin
mov m,a ;store it
inx h ;pt to next
call ccout
call print
db cr,lf,' 2. Arrow DOWN? ',0
call cin
mov m,a
inx h
call ccout
call print
db cr,lf,' 3. Arrow RIGHT? ',0
call cin
mov m,a
inx h
call ccout
call print
db cr,lf,' 4. Arrow LEFT? ',0
call cin
mov m,a
call ccout
jmp create
;
; Review Arrow Keys
;
arrowrev:
call print
db cr,lf,'Review of Arrow Key Definitions'
db cr,lf,' 1. Arrow UP = ',0
lxi h,ku ;pt to first
mov a,m
call ccout
inx h
call print
db cr,lf,' 2. Arrow DOWN = ',0
mov a,m
call ccout
inx h
call print
db cr,lf,' 3. Arrow RIGHT = ',0
mov a,m
call ccout
inx h
call print
db cr,lf,' 4. Arrow LEFT = ',0
mov a,m
call ccout
ret
;
; Quit Create Mode and Program
;
crquit:
call print
db 'Do you really want to quit (Y/N)? ',0
call capine ;get input from user
cpi 'Y' ;see if he typed a Y
jnz create ;resume if not
pop psw ;clear stack
;
; Exit Create Mode
;
crexit:
ret
;
; CL Definition
;
cldef:
call print
db 'Clear Screen Definition',cr,lf
db ' 1. Timing Delay',0
call getdelay ;get delay constant
sta cld ;save delay constant
call print
db cr,lf,' 2. Clear Screen Byte Sequence',0
lhld cladr ;pt to buffer
call getstr
jmp create
;
; CL Review
;
clreview:
call print
db cr,lf,'Review of Clear Screen Definition'
db cr,lf,' 1. Timing Delay = ',0
lda cld
call pafdc
call print
db ' Milliseconds'
db cr,lf,' 2. Clear Screen Sequence:',0
lhld cladr
call prtstr
ret
;
; CE Definition
;
cedef:
call print
db 'Clear to End of Line Definition',cr,lf
db ' 1. Timing Delay',0
call getdelay ;get delay constant
sta ced ;save delay constant
call print
db cr,lf,' 2. Clear to End of Line Byte Sequence',0
lhld ceadr ;pt to buffer
call getstr
jmp create
;
; CE Review
;
cereview:
call print
db cr,lf,'Review of Clear to End of Line Definition'
db cr,lf,' 1. Timing Delay = ',0
lda ced
call pafdc
call print
db ' Milliseconds'
db cr,lf,' 2. Clear to End of Line Sequence:',0
lhld ceadr
call prtstr
ret
;
; SO Definition
;
sodef:
call print
db 'Standout Mode Definition',cr,lf
db ' 1. Begin Standout Mode Byte Sequence',0
lhld soadr ;pt to buffer
call getstr
call print
db cr,lf,' 2. End Standout Mode Byte Sequence',0
lhld seadr ;pt to buffer
call getstr
jmp create
;
; SO Review
;
soreview:
call print
db cr,lf,'Review of Standout Mode Definition'
db cr,lf,' 1. Begin Standout Mode Sequence:',0
lhld soadr
call prtstr
call print
db cr,lf,' 2. End Standout Mode Sequence:',0
lhld seadr
call prtstr
ret
;
; TI Definition
;
tidef:
call print
db 'Terminal Init/Deinit Definition',cr,lf
db ' 1. Terminal Initialization Byte Sequence',0
lhld tiadr ;pt to buffer
call getstr
call print
db cr,lf,' 2. Terminal Deinitialization Byte Sequence',0
lhld teadr ;pt to buffer
call getstr
jmp create
;
; TI Review
;
tireview:
call print
db cr,lf,'Review of Terminal Init/Deinit Definition'
db cr,lf,' 1. Terminal Initialization Sequence: ',0
lhld tiadr
call prtstr
call print
db cr,lf,' 2. Terminal Deinitialization Sequence: ',0
lhld teadr
call prtstr
ret
;
; CM Definition
;
cmdef:
call print
db 'Cursor Motion Definition',cr,lf
db ' 1. Timing Delay',0
call getdelay ;get delay
sta cmd
cmcrdef:
call print
db cr,lf,' 2. Enter R if Row/Column or C for Column/Row: ',0
call capine
cpi 'C' ;col/row
jz cmdef1
cpi 'R'
jz cmdef1
call print
db ' - Invalid',0
jmp cmcrdef
cmdef1:
sta rcfirst ;set flag
call print
db cr,lf,' 3. Enter Equation for Row: ',0
xra a ;no caps
call bbline ;get input
call sksp ;skip spaces
xchg
lhld reqn
xchg
call copy0
call print
db cr,lf,' 4. Enter Equation for Column: ',0
xra a ;no caps
call bbline ;get input
call sksp ;skip spaces
xchg
lhld ceqn
xchg
call copy0
call print
db cr,lf,' 5. Enter Prefix Byte Sequence',0
lhld cmbadr ;beginning
call getstr
call print
db cr,lf,' 6. Enter Middle Byte Sequence',0
lhld cmmadr ;middle
call getstr
call print
db cr,lf,' 7. Enter Suffix Byte Sequence',0
lhld cmeadr ;ending
call getstr
jmp create
;
; Copy HL to DE until 0
;
copy0:
mov a,m ;copy
stax d
cpi qch ;quote?
jz copyq
ora a ;done if 0
rz
inx h ;pt to next
inx d
jmp copy0
copyq:
inx h ;copy quoted char
inx d
mov a,m ;copy
stax d
inx h ;advance
inx d
jmp copy0
;
; Review CM Data
;
cmreview:
call print
db cr,lf,'Review of Cursor Motion Data'
db cr,lf,' 1. Timing Delay = ',0
lda cmd
call pafdc
call print
db ' Milliseconds'
db cr,lf,' 2. Row or Column First: ',0
lda rcfirst
call cout
call print
db cr,lf,' 3. Row Equation: -->',0
lhld reqn
call pstr
call print
db '<--'
db cr,lf,' 4. Column Equation: -->',0
lhld ceqn
call pstr
call print
db '<--'
db cr,lf,' 5. Prefix Byte Sequence: ',0
lhld cmbadr
call prtstr
call print
db cr,lf,' 6. Middle Byte Sequence: ',0
lhld cmmadr
call prtstr
call print
db cr,lf,' 7. Suffix Byte Sequence: ',0
lhld cmeadr
call prtstr
ret
;
; Status Display
;
rstatus:
call print
db cr,lf,' Strike Any Key to Continue - ',0
call cin
status:
call print
db cr,lf,' ** Z3TCAP Status',0
call prfdata ;file data
call print
db cr,lf
db cr,lf,'Review: 1. Clear Screen Definition'
db cr,lf,' 2. Cursor Motion Definition'
db cr,lf,' 3. Clear to End of Line Definition'
db cr,lf,' 4. Standout Mode Definition'
db cr,lf,' 5. Terminal Init/Deinit Definition'
db cr,lf,' 6. Arrow Key Definition'
db cr,lf,' 7. Terminal Name Definition'
db cr,lf
db cr,lf,'Exit: X. Exit to Main Menu'
db cr,lf
db cr,lf,'Command? ',0
call capine
lxi h,rtable
call tscan
call print
db cr,lf,' Invalid Command: ',0
call cout
jmp status
;
; Review Name
;
rname:
call print
db cr,lf,'Terminal Name: ',0
lxi h,tname
mvi b,16
rname1:
mov a,m ;get char
call cout
inx h ;pt to next
dcr b ;count down
jnz rname1
jmp rstatus
;
; Review CL
;
rcl:
call clreview
jmp rstatus
;
; Review CE
;
rce:
call cereview
jmp rstatus
;
; Review CM
;
rcm:
call cmreview
jmp rstatus
;
; Review SO
;
rso:
call soreview
jmp rstatus
;
; Review TI
;
rti:
call tireview
jmp rstatus
;
; Review Arrow Keys
;
rarrow:
call arrowrev
jmp rstatus
;
; Status Review Commands
;
rtable:
db '1'
dw rcl
db '2'
dw rcm
db '3'
dw rce
db '4'
dw rso
db '5'
dw rti
db '6'
dw rarrow
db '7'
dw rname
db 'X'
dw create
db 0
;
; Scan Command Table
;
tscan:
mov b,a ;save char in B
tscan1:
mov a,m ;get char
ora a ;end of table?
jz tscanx ;exit
cmp b ;compare
jz tscanf ;found
inx h ;skip to next
inx h
inx h
jmp tscan1
tscanx:
mov a,b ;restore char and exit - not found
ret
tscanf:
inx h ;get address
mov a,m
inx h
mov h,m
mov l,a
pop psw ;clear stack
pchl ;branch to routine
;
; Command Table
;
ctable:
db '1' ;CL
dw cldef
db '2' ;CM
dw cmdef
db '3' ;CE
dw cedef
db '4' ;SO
dw sodef
db '5' ;TI
dw tidef
db '6' ;arrows
dw arrowdef
db '7' ;name
dw namedef
db 'S' ;status
dw status
db 'Q' ;quit
dw crquit
db 'X' ;exit
dw crexit
db 0
;
; Routine to Input Delay Constant
;
getdelay:
call print
db cr,lf,' Enter Delay Time in Milliseconds: ',0
mvi a,0ffh ;caps
call bbline
call sksp
call eval ;convert to binary
ret
;
; Routine to Define Text String
;
getstr:
shld firstch ;set ptr to first char
getfirst:
mvi b,1 ;set count
lhld firstch ;set next char to first
shld nxtchar
getnext:
call print
db cr,lf,' Char #',0
mov a,b ;get char number
call pafdc ;print it
inr b ;increment count
push b ;save it
;
; Prompt for Type of Input
;
call print
db ' - Type Char, .=Number, or <CR>=Done: ',0
call cin ;get response
cpi cr ;exit
jz getx
cpi '.' ;number?
jz getnum
;
; Input Character
;
call print
db 'Char ',0
call ccout ;echo character
jmp putch
;
; Input Number
;
getnum:
call print
db 'Enter Number: ',0
mvi a,0ffh ;caps
call bbline ;get input
call sksp ;skip spaces
call eval ;convert
;
; Save Character with Quoting
;
putch:
lhld nxtchar ;pt to next char
ora a ;quote if null
jz quote
cpi qch ;quote if quote
jz quote
putch1:
mov m,a ;store it
inx h ;pt to next
shld nxtchar ;set ptr
pop b ;get count
jmp getnext ;get next char
;
; Quote the Character
;
quote:
mvi m,qch ;save quote char
inx h
jmp putch1
;
; Exit
;
getx:
pop psw ;clear stack
lhld nxtchar ;store ending 0
mvi m,0
ret
;
; Print String Pted to by HL
;
prtstr:
mvi b,0 ;set count
call crlf ;new line
mov a,m ;empty?
ora a
jnz prts0
call print
db ' -- Empty --',0
ret
prts0:
mov a,m ;get next char
ora a ;done?
rz
call print
db ' (',0
mov a,b ;print count
inr a
call pafdc
call print
db ') ',0
mov a,m ;get next char
inx h ;pt to next
cpi qch ;check for quote
jnz prts1
mov a,m ;get char that is quoted
inx h ;pt to next
prts1:
call ccout
call print
db ' ',0
call pa2hc ;print as 2 hex chars
call print
db 'H ',0
inr b ;increment count
mov a,b ;get count
ani 3
cz crlf ;new line
jmp prts0
;
; Create Target File
;
wrfile:
lxi d,fcb ;pt to FCB
call z3log ;log into proper directory
call f$exist ;test of presence of file
jz make2 ;create file
call gfa ;get file attributes
ani 1 ;R/O?
jz make1
call print
db cr,lf,'File ',0
lxi d,fcb+1
call pfn1
call print
db ' is Read/Only - Saving as $$$.Z3T',0
lxi h,tempfcb ;set $$$.Z3T
lxi d,fcb+1
mvi b,11 ;11 chars
call moveb
lxi d,fcb ;reinit
call initfcb ;resume
make1:
call f$delete ;delete file
make2:
call f$make ;create file
cpi 0ffh ;error
jnz writef
call print
db cr,lf,'File Create Error',0
ret
;
; Write Block to File
;
writef:
lhld scratch ;pt to entry
lxi d,tbuff ;copy into buffer
mvi b,128 ;128 bytes
call moveb
lxi d,fcb ;pt to FCB
call f$write ;write block
jnz werr
call f$close ;close file
call print
db cr,lf,'File ',0
lxi d,fcb+1
call pfn1
call print
db ' Created',0
ret
;
; Can't Write File
;
werr:
call print
db cr,lf,'File Write Error',0
ret
;
; Print Entry Name Pted to by HL
;
prent:
mvi b,16 ;16 chars
prtname:
mov a,m ;get char
call cout
inx h ;advance
dcr b ;count down
jnz prtname
ret
;
; Print Char in A with Control Char Processing
;
ccout:
push psw ;save char
ani 7fh ;mask MSB
cpi 7fh ;DEL?
jz ccout2
cpi ' '
jnc ccout1
push psw ;save char
mvi a,'^'
call cout
pop psw
adi '@' ;convert to char
ccout1:
call cout
pop psw
ret
ccout2:
call print
db '<DEL>',0
pop psw
ret
;
; Buffers
;
crcmd:
db '%r',0
tempfcb:
db '$$$ '
db 'Z3T'
tname:
db '** Empty Name **' ;16 chars
ku:
ds 1 ;cursor up
kd:
ds 1 ;cursor down
kr:
ds 1 ;cursor right
kl:
ds 1 ;cursor left
cld:
ds 1 ;CL delay
cmd:
ds 1 ;CM delay
ced:
ds 1 ;CE delay
cladr:
ds 2 ;CL address
cmadr:
ds 2 ;CM address
ceadr:
ds 2 ;CE address
soadr:
ds 2 ;SO address
seadr:
ds 2 ;SE address
tiadr:
ds 2 ;TI address
teadr:
ds 2 ;TE address
cmbadr:
ds 2 ;CM Beginning
cmmadr:
ds 2 ;CM Middle
cmeadr:
ds 2 ;CM Ending
reqn:
ds 2 ;Row Equation
ceqn:
ds 2 ;Column Equation
rcfirst:
ds 1 ;R if Row First, C if Col First
deftyp:
db 'Z3T' ;default file type
firstch:
ds 2 ;ptr to first char in string
nxtchar:
ds 2 ;ptr to next char in string
scratch:
ds 2 ;ptr to scratch area
end