; ; PROGRAM: DEV3 ; AUTHOR: RICHARD CONN ; VERSION: 1.0 ; DATE: 4 Apr 84 ; PREVIOUS VERSION: None ; DERIVATION: DEVICE2 of ZCPR2 ; VERS EQU 10 z3env SET 0f400h ; ; DEV is a program which enables the user to manipulate the ; extended ZCPR3 redirectable device drivers. It allows the user to ; perform the following functions: ; ; o Display the Names of the Current Devices ; o Set One or More of the Current Devices ; o Ask for Help ; ; The format of the DEV command is: ; ; DEV or DEV // <-- Ask for Help ; DEV command,command,command ... <-- Issue Commands ; ; where "command" may take the following forms: ; ; DISPLAY ALL <-- Display Names of All Devices ; DISPLAY CON <-- Display Names of Consoles ; DISPLAY LST <-- Display Names of Printers ; DISPLAY RDR <-- Display Names of Readers ; DISPLAY PUN <-- Display Names of Punches ; ; CON:=name <-- Select Console ; LST:=name <-- Select Printer ; RDR:=name <-- Select Reader ; PUN:=name <-- Select Punch ; ; ; Constants ; tbuff equ 80h cr equ 0dh lf equ 0ah ; ; SYSLIB Routines ; ext z3init,getiop ext cin,cout,epstr,eprint,cline,crlf ; ; 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 ; ; Start of Program ; call getiop ;check for initialization mov a,h ora l ;must NOT be zero jnz start0 call banner call eprint db cr,lf,'DEV NOT Initialized with I/O Base',0 abort: call eprint db ' -- Aborting',0 ret start0: call status ;check for drivers jnz start1 call banner call eprint db cr,lf,'Redirection Not Supported',0 jmp abort start1: lxi h,tbuff ;pt to input buffer call cline ;extract and save command line call sblank ;skip to non-blank ora a ;EOL? jz help ;select help cpi '/' ;help? jnz docmd ;run command subroutine ; ; Print Help Message ; help: call banner call eprint db cr,lf,'DEV - Quick Redirectable I/O Device Selector' db cr,lf,'Syntax:' db cr,lf,' DEV or DEV // ' db '<-- Ask for Help' db cr,lf,' DEV Command,Command, ... ' db '<-- Issue Commands' db cr,lf,'where "command" may take the following forms:' db cr,lf,' DISPLAY=ALL ' db '<-- Display All Devices' db cr,lf,' DISPLAY=CON ' db '<-- Display Consoles' db cr,lf,' DISPLAY=LST ' db '<-- Display Printers' db cr,lf,' DISPLAY=RDR ' db '<-- Display Readers' db cr,lf,' DISPLAY=PUN ' db '<-- Display Punches' db cr,lf db cr,lf,' CON:=name <-- Select Console' db cr,lf,' LST:=name <-- Select Printer' db cr,lf,' RDR:=name <-- Select Reader' db cr,lf,' PUN:=name <-- Select Punch' db 0 ret ; ; Print Banner ; banner: call eprint db 'DEV, Version ' db (vers/10)+'0','.',(vers mod 10)+'0',0 ret ; ; Skip to Non-Blank Routine ; sblank: mov a,m ;get char inx h ;pt to next cpi ' ' ;blank? jz sblank ;continue if so dcx h ;pt to non-blank ret ; ; Skip until a delimiter encountered ; sdelm: mov a,m ;get char inx h ;pt to next cpi ' '+1 ; or less? rc cpi '=' rz cpi ',' rz jmp sdelm ; ; DOCMD -- This subroutine processes the command line pted to by HL. ; It is the Main Line if a DEVICE command line is given, it is just ; a subroutine if the user is in interactive mode. ; docmd: call docmd1 ;do first command call sdelm ;skip to delim cpi ',' ;another command? jz docmd ret docmd1: mov a,m ;get command letter cpi 'C' ;console assignment? jz docon cpi 'D' ;display? jz dodisp cpi 'L' ;LST:? jz dolst cpi 'P' ;PUN:? jz dopun cpi 'R' ;RDR:? jz dordr cerr: call eprint db cr,lf,'Error at -- ',0 call epstr ;print rest ret ; ; Do LST: Assignment ; dolst: call eprint db ' LST:',0 mvi a,3 ;select LST: jmp assign ; ; Do PUN: Assignment ; dopun: call eprint db ' PUN:',0 mvi a,2 ;select PUN: jmp assign ; ; Do RDR: Assignment ; dordr: call eprint db ' RDR:',0 mvi a,1 ;select RDR: jmp assign ; ; Do CON: Assignment ; docon: call eprint db ' CON:',0 mvi a,0 ;select console ; ; Do Assignment in General ; assign: mov b,a ;save A in B push b ;save BC call sdelm ;skip to delimiter pop b ;get BC cpi ' ' jz asgn0 cpi '=' jnz cerr asgn0: mov a,b ;get A back sta logical ;save logical device number shld name ;save ptr to mnemonic mov b,a ;number in B inr b ;add 1 for offset call status ;get device status dcx h ;pt to previous dcx h asgn1: inx h ;pt to next inx h dcr b ;count down jnz asgn1 mov c,m ;get number of devices in C mov a,c ;check for value of zero ora a jnz asgn2 lhld name ;pt to error name jmp cerr asgn2: lda logical ;get logical device number mov b,a ;... in B push b ;save device count dcr c ;pt to previous call namer ;get name xchg ;name pted to by DE lhld name ;user's name pted to by HL asgn3: ldax d ;get name of device cpi ' '+1 ;done? jc asgn3a cmp m ;compare to user jnz asgn4 inx h ;pt to next inx d jmp asgn3 asgn3a: mov a,m ;get user cpi ' '+1 ;done? jc asgn3b cpi ',' ;done? jnz asgn4 asgn3b: pop b ;match -- C-1 is selected device dcr c ;decrement call select ;select device lda logical ;get logical device in A call current ;print name of device selected lhld name ;pt to name for scan continuation ret asgn4: pop b ;count down dcr c ;count down jnz asgn2 ;continue lhld name ;pt to invalid name call eprint db cr,lf,' Invalid Name at -- ',0 call epstr lhld name ;pt to name for scan continuation ret ; ; Display Devices and Assignments ; dodisp: call sdelm ;skip to delimiter ora a ;none=all jz dispall mov a,m ;get char after delimiter cpi 'A' ;all? jz dispall cpi 'C' ;CON: jz dispcon cpi 'L' ;LST: jz displst cpi 'P' ;PUN: jz disppun cpi 'R' ;RDR: jz disprdr jmp cerr dispall: call dispcon ;successive displays call disprdr call eprint db cr,lf,'Strike Any Key -- ',0 call cin call disppun jmp displst dispcon: call eprint db cr,lf,'CON:',0 mvi a,0 ;select CON: call disp jmp curr displst: call eprint db cr,lf,'LST:',0 mvi a,3 ;select LST: call disp jmp curr disprdr: call eprint db cr,lf,'RDR:',0 mvi a,1 ;select RDR: call disp jmp curr disppun: call eprint db cr,lf,'PUN:',0 mvi a,2 ;select PUN: call disp ; ; Print Name of Current Device ; curr: call crlf ;new line current: push h ;save ptr mov b,a ;save number in B push b ;save B call eprint db ' Assignment is ',0 push b ;save B call status ;get status pop b ;get B inr b ;add 1 for offset dcx h ;back up curr1: inx h ;pt to next inx h dcr b ;count down jnz curr1 pop b ;get logical number in B mov c,m ;get physical number in C call pname0 ;print first part of name only pop h ;get ptr ret ; ; Print Names of All Physical Devices for a Logical Device ; disp: push h ;save char ptr push psw ;save device number call eprint db ' Devices --',0 mov b,a ;logical device in B push b ;save for later push b ;save it call status ;get status report pop b ;get logical device number inr b ;add 1 for offset dcx h ;back up dcx h disp1: inx h ;pt to next inx h dcr b ;count down jnz disp1 pop b ;get B back mov c,m ;get count of devices mov a,c ;check for none ora a jz disp3 disp2: push b ;save values dcr c ;pt to next name call eprint db cr,lf,' ',0 call pnamer ;print name (B=logical, C=physical) pop b ;get count dcr c ;count down jnz disp2 disp3: pop psw pop h ret ; ; Routine to Print Name of Selected Device ; B=logical number, C=physical number ; pnamer: push b ;save BC call pname0 ;print first part of name call eprint ;print separator db ' - ',0 call epstr ;print rest as string pop b ;restore BC ret ; ; Print first part of selected device name ; pname0: call namer ;get ptr to string mvi b,8 ;at most 8 chars pname1: mov a,m ;get char inx h ;pt to next char cpi ' ' ;end of name? jz pname2 call cout ;print char dcr b ;count down jnz pname1 ret pname2: mvi a,' ' ;print spaces call cout dcr b ;count down jnz pname2 ret ; ; Basic Interface Routines ; status: lxi d,0 ;Offset 0 runit: call getiop ;device driver base dad d pchl select: lxi d,3 ;Offset 3 jmp runit namer: lxi d,6 ;Offset 6 jmp runit ; ; Buffers ; logical: ds 1 ;Logical Device Number name: ds 2 ;Pointer to User-Supplied Name end