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
/
TCSELECT.MQC
/
TCSELECT.MAC
Wrap
Text File
|
2000-06-30
|
12KB
|
607 lines
; ZCPR3 TCAP Facility (Z3TCAP)
; Program Name: TCSELECT
; Author: Richard Conn
; Version: 1.1
; Date: 1 Mar 85
; Previous Versions: 1.0 (10 Mar 84)
version equ 11
; Version 1.1 by Richard Conn: Added FILENABLE equate to allow writing
; files to disk. If FILENABLE is FALSE, TCSELECT may only store in memory.
;
; TCSELECT allows the user to select an entry from a Z3TCAP.TCP
; file and store it into memory or a Z3T file. TCSELECT is menu-driven.
; TCSELECT may be assembled to disable the ability to create a disk file
; (specifically for Z-NODE operation).
;
;
; Basic Equates
;
false equ 0
true equ not false
filenable equ true
entcnt equ 20 ;number of entries per screen
z3env SET 0f400h ;ZCPR3 Environment Descriptor
fcb equ 5ch
tbuff equ 80h
ctrlc equ 'C'-'@'
cr equ 0dh
lf equ 0ah
;
; ZCPR3 and SYSLIB References
;
ext z3init,qprint,z3log,getenv
ext codend,moveb
ext print,pfn1,pstr,capine,crlf,cout,pafdc,comphd
ext initfcb,pfind,f$open,f$read,r$read,f$close
ext f$exist,gfa
ext putud,getud,logud
;
if filenable
ext f$make,f$write,f$delete
endif
;
; 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 'TCSELECT, 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 slash
jnz start1
;
; Print Help Info
;
help:
call print
db 'TCSELECT - Select Entry from Z3TCAP.TCP'
;
if filenable
;
db cr,lf,'Syntax:'
db cr,lf,' TCSELECT outfile -or- TCSELECT outfile.typ'
db cr,lf
db cr,lf,'where "outfile" is the file to be generated by'
db cr,lf,'the execution of TCSELECT. If no file type is'
db cr,lf,'given, a file type of Z3T is the default.'
db cr,lf
;
endif
;
db cr,lf,'Syntax:'
db cr,lf,' TCSELECT'
db cr,lf
db cr,lf,'where this alternate form may be used to store'
db cr,lf,'the Z3TCAP entry for the selected terminal directly'
db cr,lf,'into the Z3 Environment Descriptor.'
db 0
ret
;
; Resume Processing
;
start1:
;
if filenable
;
; 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
;
endif
;
; Begin Reading Z3TCAP.TCP
;
call putud ;save current location
lxi d,z3tfcb ;try to open Z3TCAP.TCP
call initfcb ;init FCB
mvi a,0ffh ;search current also
call pfind ;look for file
jnz start2 ;file found
;
; File Z3TCAP.TCP Not Found
;
fnferr:
call print
db 'File ',0
lxi d,z3tfcb+1 ;print file name
call pfn1
call print
db ' Not Found - Aborting',0
ret
;
; Extract Z3TCAP Index
;
start2:
call logud ;log into DU in BC
lxi d,z3tfcb ;pt to FCB
call f$open ;open file
jnz fnferr
call codend ;read file into buffer
mvi c,0 ;set block counter
;
; Load Z3TCAP Index
;
loadi:
inr c ;increment block counter
push b
lxi d,z3tfcb ;pt to FCB
call f$read ;read next block
jnz rerr ;read error
lxi d,tbuff ;copy from TBUFF
push h ;save ptr to this block
xchg
mvi b,128 ;128 bytes
call moveb
pop h ;pt to this block
lxi d,16 ;every 16
mvi b,8 ;8 entries possible
;
; Check for End of Index
;
loadi1:
mov a,m ;end of index if space
cpi ' '
jz loadi2
dad d ;pt to next
dcr b ;count down
jnz loadi1
pop b ;get count and load next
jmp loadi ;HL pts to next block to load
;
; Error in Reading File
;
rerr:
pop psw ;clear stack
call print
db cr,lf,'File Read Error',0
ret
;
; Reached End of Index
;
loadi2:
shld z3tcver ;save ptr to version number
loadi3:
dad d ;compute address of next block after last
dcr b
jnz loadi3
shld scratch ;scratch area
pop b ;get record number of next block
mov a,c
sta rec1 ;save count
lxi d,z3tfcb ;close file
call f$close
;
; Print menu of terminals
;
menu:
mvi a,1 ;set menu number
sta menunum
call codend ;pt to first terminal
shld curtable ;save ptr
menu1:
call prmenu ;print menu pted to by HL
call print
db cr,lf,'Enter Selection',0
call chk1st ;first menu?
lxi h,lstmsg ;pt to last message
cz pstr
call chknth ;last menu?
lxi h,nxtmsg ;pt to next message
cz pstr
call print
db ', or ^C to Exit - ',0
call capine ;get response
call crlf ;new line
cpi ctrlc ;abort?
rz
cpi '+' ;next?
jz nxtmenu
cpi '-' ;last?
jz lstmenu
sui 'A' ;convert to digit
jc menuerr ;print error message
mov c,a ;result in C
mvi a,entcnt-1 ;selection limit?
cmp c ;range error?
jc menuerr
;
; Set ptr to menu entry
; On input, C = offset in 20-terminal menu and MENUNUM is menu (1..)
;
lda menunum ;get menu number
dcr a ;adjust to 0 offset
mvi d,0 ;HL = number
mov e,a
lxi h,0 ;init sum
mvi b,entcnt ;multiply by number of entries
mult:
dad d ;+menunumber
dcr b ;count down
jnz mult ;B=0 on exit
dad b ;compute offset from record 1 for entry
jmp lterm ;load terminal now with offset in HL
;
; HL Now Contains Terminal Number (Zero Relative)
;
lterm:
lda rec1 ;get location of terminal data record 1
mov c,a
dad b ;HL contains random record number of terminal
;
; HL Now Contains Random Record Number for Terminal in File (Zero Relative)
; Reopen Z3TCAP.TCP
;
lxi d,z3tfcb ;pt to FCB of file
call initfcb ;reinit it
call f$open
;
; Position to Correct Record and Read it in
;
call r$read ;read random record in HL
call f$close ;close file
;
; Copy Into Scratch Area
;
lhld scratch ;pt to scratch area
lxi d,tbuff ;pt to TBUFF
xchg
mvi b,128 ;128 bytes
call moveb
xchg ;HL pts to scratch
;
; Confirm Selection
;
call print
db cr,lf,' Selected Terminal is: ',0
call prent ;print name
call print
db ' -- Confirm (Y/N)? ',0
call capine ;get input
call crlf
cpi 'Y'
jnz menu1 ;continue
;
; Check for FCB and do a memory fill if no file given
;
if filenable
;
lda fcb+1 ;anything in FCB?
cpi ' '
jz memory ;place SCRATCH into Z3 Env Descriptor
;
; Create Target File
;
call getud ;return home
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',0
ret
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
;
endif ;filenable -- MEMORY follows
;
; Place Z3TCAP Entry into Z3 Environment Descriptor
;
memory:
call getenv ;pt to env desc
lxi d,80h ;pt to TCAP entry
dad d
xchg ;DE pts to entry
lhld scratch ;pt to scratch area
mvi b,128 ;copy 128 bytes
call moveb
call print
db cr,lf,' ZCPR3 Environment Descriptor Loaded',0
ret
;
; Invalid Selection
;
menuerr:
call print
db ' -- Error: Invalid Selection',0
jmp menu1
;
; Advance to next menu
;
nxtmenu:
call chknth ;at end?
jz nmenu
call print
db ' -- Error: Already at Last Menu',0
jmp menu1
nmenu:
lhld curtable ;pt to current table
lxi d,16*entcnt ;advance to next
dad d
shld curtable
lda menunum ;increment menu number
inr a
sta menunum
jmp menu1
;
; Backup to last menu
;
lstmenu:
call chk1st ;at beginning?
jz lmenu
call print
db ' -- Error: Already at First Menu',0
jmp menu1
lmenu:
lhld curtable ;pt to current table
lxi d,-16*entcnt ;backup
dad d
shld curtable
lda menunum ;decrement menu number
dcr a
sta menunum
jmp menu1
;
; PRMENU
; PRMENU performs the following functions:
; 1. Sets flag if at 1st menu
; 2. Sets flag if at last menu
; 3. Prints menu in 2 columns
;
prmenu:
call print
db cr,lf,'** Terminal Menu ',0
lda menunum ;print menu number
call pafdc ;print as floating
call print
db ' for Z3TCAP Version ',0
lhld z3tcver ;get ptr to version
inx h ;pt to version number
prmenu0:
mov a,m ;get char
inx h ;pt to next
call cout ;print char
cpi ' ' ;done if space
jnz prmenu0
call print
db ' **',cr,lf,cr,lf,0
xra a
sta m1flag ;set not at 1st menu
sta mnflag ;set not at nth menu
;
; Determine if at 1st menu
;
call codend ;pt to terminal table
xchg ;... in DE
lhld curtable ;set 1st menu flag
call comphd ;compare
jnz prm1
mvi a,0ffh ;set flag
sta m1flag
;
; Determine if at nth menu
;
prm1:
push h ;save ptr to current table
lxi d,16 ;size of table entry
mvi b,entcnt ;entcnt entries per screen
prm2:
mov a,m ;end?
cpi ' ' ;no entry?
jz prm3
dad d ;advance
dcr b ;count down
jnz prm2
jmp prm4
prm3:
mvi a,0ffh ;at nth menu
sta mnflag ;set flag
;
; Determine menu bounds
;
prm4:
lxi h,0 ;clear ptr to col2
shld col2
pop h ;get ptr to current table
mvi b,entcnt/2 ;try to advance entcnt/2 entries
prm5:
mov a,m ;no next entry?
cpi ' '
jz prm6
dad d ;advance to next
dcr b ;count down
jnz prm5
shld col2 ;save ptr to column 2
;
; Print menu
;
prm6:
lhld col2 ;get ptr to column 2
xchg ;... in DE
lhld curtable ;get ptr to column 1
mvi b,entcnt/2 ;entcnt/2 lines max
mvi c,'A' ;current letter
prm7:
mov a,m ;get first char?
cpi ' ' ;done?
rz
mov a,c ;output letter
call prentry ;print entry
xchg ;HL pts to col 2
mov a,h ;done?
ora l
jz prm8
mov a,m ;empty?
cpi ' '
jz prm8
mov a,c ;get char
adi 10 ;add offset
call prentry
prm8:
inr c ;increment menu letter
xchg ;restore HL/DE
call crlf
dcr b ;count down
jnz prm7
ret
;
; Print entry whose letter is in A and whose text is pted to by HL
; Advance HL
;
prentry:
call cout ;output char
call print
db '. ',0
prent:
push b ;save regs
mvi b,16 ;16 chars
prent1:
mov a,m ;get char
inx h ;pt to next
call cout ;print char
dcr b
jnz prent1
call print
db ' ',0 ;separator
pop b
ret
;
; Check to see if this is the first menu
;
chk1st:
lda m1flag ;get flag
ora a
ret
;
; Check to see if this is the last menu
;
chknth:
lda mnflag ;get flag
ora a
ret
;
; Buffers
;
z3tfcb:
db 0
db 'Z3TCAP TCP'
ds 24 ;36 bytes total
;
if filenable
;
deftyp:
db 'Z3T' ;default file type
;
endif
;
nxtmsg:
db ', + for Next',0
lstmsg:
db ', - for Last',0
m1flag:
ds 1 ;1st menu flag
mnflag:
ds 1 ;nth menu flag
col2:
ds 2 ;pointer to column 2 entries
rec1:
ds 1 ;number of 1st data record
menunum:
ds 1 ;number of current menu
z3tcver:
ds 2 ;ptr to ZCPR3 TCAP Version Number
scratch:
ds 2 ;ptr to scratch area
curtable:
ds 2 ;current table ptr
end