; ; 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. ; ; ; Operating System Buffers ; fcb equ 5ch tbuff equ 80h cr equ 0dh lf equ 0ah tab equ 'I'-'@' ; ; 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 ; ; SYSLIB and Z3LIB References ; ext z3init,envptr ext epstr,eprint,cout ext padc ; ; 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 end