;
; PROGRAM: CPSEL
; VERSION: 1.0
; DATE: 18 May 84
; AUTHOR: Richard Conn
; PREVIOUS VERSIONS: None
;
version equ 10
z3env SET 0f400h
;
; CPSEL (CRT/Printer Select) is a utility which permits the user
; to dynamically select the CRT (of CRT 0 and CRT 1) and Printer (of
; Printers 0, 1, 2, and 3) from the current ZCPR3 Environment Descriptor.
; This dynamically changes the characteristics of the printer which is
; used by PRINT and the other utilities which read these buffers for their
; configuration data.
;
;
; Special Equates
;
csel equ 2FH ;offset to CRT select byte
psel equ csel+1 ;offset to Printer select byte
cdata equ psel+1 ;offset to first CRT data record
cdsize equ 3 ;size of CRT data record
pdata equ cdata+2*cdsize ;offset to Printer data record
pdsize equ 4 ;size of Printer data record
;
; 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
call eprint
db 'CPSEL Version '
db (version/10)+'0','.',(version mod 10)+'0'
db 0
lxi h,tbuff+1 ;pt to buffer
lda fcb+1 ;check for help
cpi ' '
jz help
cpi '/'
jnz start1
;
; Print help message
;
help:
call eprint
db cr,lf,' CPSEL cmd1 cmd2 cmd3,...'
db cr,lf,'Commands:'
db cr,lf,' Cc, c=0 or 1 -- Select CRT 0 or 1'
db cr,lf,' Pp, p=0,1,2,3 -- Select Printer 0, 1, 2, or 3'
db cr,lf,' Dd, d=A (All), C (CRT), P (Printer)'
db cr,lf,' -- Display Selection Values'
db 0
ret
;
; Process Options
;
start1:
mov a,m ;get next char
ora a ;done?
rz
inx h ;pt to option
cpi ',' ;delimiter?
jz start1
cpi ' ' ;delimiter?
jz start1
cpi tab ;delimiter?
jz start1
cpi '/' ;delimiter?
jz start1
call cmdchk ;check for commands and run them
jmp start1
;
; Test and Run Commands
;
cmdchk:
mov b,a ;save command in B
lxi d,ctab ;pt to command table
cmd1:
ldax d ;get char
ora a ;end of table?
jz cmde ;print error message
cmp b ;match?
jz cmd2 ;process
inx d ;skip to next
inx d
inx d
jmp cmd1
cmd2:
xchg ;get address
inx h
mov c,m ;get low
inx h
mov b,m ;get high
xchg ;restore hl
push b ;place address on stack
ret ;"run" command
;
; Command Not Found
;
cmde:
call eprint
db cr,lf,' Command Not Found: ',0
mov a,b ;get char
jmp cout
;
; Command Table
;
ctab:
db 'C' ;select CRT
dw cselc
db 'D' ;display
dw disp
db 'P' ;select Printer
dw pselc
db 0 ;end of table
;
; Select CRT
;
cselc:
lxi d,csmsg ;CRT selection
mov a,m ;get digit
ora a ;error if null
jz error
inx h ;pt to next
sui '0' ;convert to binary
jc error
cpi 2 ;range check
jnc error
lxi d,csel ;offset for CRT select
;
; Select Device whose value is in A and Offset in DE
;
select:
push h ;save HL
lhld envptr ;pt to environment
dad d ;pt to buffer
mov m,a ;store value
pop h ;restore HL
ret
;
; Print Error Message
;
error:
call eprint
db cr,lf,' Range Error on ',0
xchg ;HL pts to message
call epstr ;print message
xchg
ret
;
; Select Printer
;
pselc:
lxi d,psmsg ;Printer selection
mov a,m ;get digit
ora a ;error if null
jz error
inx h ;pt to next
sui '0' ;convert to binary
jc error
cpi 4 ;range check
jnc error
lxi d,psel ;offset for Printer select
jmp select ;select device
;
; Display
;
disp:
mov a,m ;get option
ora a ;end of command?
jz dispall ;display all
inx h ;pt to next
cpi 'A' ;all?
jz dispall
cpi 'C' ;CRT?
jz dispcrt
cpi 'P' ;Printer?
jz dispprt
lxi d,dsmsg ;display select message
jmp error
;
; Display All
;
dispall:
call dispcrt ;display CRT and fall thru to display Printer
;
; Display Printer
;
dispprt:
call eprint
db cr,lf,' Current Printer Selection: ',0
push h ;save HL
lhld envptr
lxi d,psel ;offset
dad d
mov a,m ;get selection
mov c,a ;selection in C
adi '0' ;convert to ASCII
call cout
mvi b,0 ;set up loop
lxi d,pdata ;offset to printer data
lhld envptr ;pt to environment
dad d ;pt to printer data
dploop:
call eprint
db cr,lf,' ',0
mvi e,' ' ;leading space for not current printer
mov a,c ;see if at current printer
cmp b
jnz dpl1
mvi e,'*' ;mark current printer
dpl1:
mov a,e
call cout
call eprint
db ' Prt ',0
call comprt ;print common data elements
call eprint
db ' Form Feed? ',0
mov a,m ;print form feed message
ora a
jz prno
call eprint
db 'Yes',0
jmp pryes
prno:
call eprint
db 'No',0
pryes:
inx h ;pt to next
inr b ;increment
mov a,b ;done?
cpi 4 ;limit
jnz dploop
pop h ;restore ptr
ret
;
; Common Data Elements to Both Printer and CRT
;
comprt:
mov a,b ;get printer number
adi '0' ;to ASCII
call cout
call eprint
db ': Width = ',0
mov a,m ;print line width
call padc
inx h
call eprint
db ' Actual/Text Lines = ',0
mov a,m ;print number of actual lines
call padc
inx h
mvi a,'/'
call cout
mov a,m ;print number of text lines
inx h ;pt to next
jmp padc
;
; Display CRT
;
dispcrt:
call eprint
db cr,lf,' Current CRT Selection: ',0
push h ;save HL
lhld envptr
lxi d,csel ;offset
dad d
mov a,m ;get selection
mov c,a ;save in C
adi '0' ;convert to ASCII
call cout
mvi b,0 ;set up loop
lxi d,cdata ;offset to CRT data
lhld envptr ;pt to environment
dad d ;pt to printer data
dcloop:
call eprint
db cr,lf,' ',0
mvi e,' ' ;leading space for not current printer
mov a,c ;see if at current printer
cmp b
jnz dpc1
mvi e,'*' ;mark current printer
dpc1:
mov a,e
call cout
call eprint
db ' CRT ',0
call comprt ;print common data elements
inr b ;increment
mov a,b ;done?
cpi 2 ;limit
jnz dcloop
pop h ;restore ptr to next command line element
ret
;
; Error Messages
;
csmsg:
db 'CRT Selection',0
dsmsg:
db 'Display Option',0
psmsg:
db 'Prt Selection',0