; ; PROGRAM: DEVICE2 ; AUTHOR: RICHARD CONN ; VERSION: 1.3 ; DATE: 6 Jan 83 ; PREVIOUS VERSION: 1.0 (29 Dec 82), 1.1 (2 Jan 83), 1.2 (5 Jan 83) ; VERS EQU 13 ; ; This program is Copyright (c) 1982, 1983 by Richard Conn ; All Rights Reserved ; ; ZCPR2 and its utilities, including this one, are released ; to the public domain. Anyone who wishes to USE them may do so with ; no strings attached. The author assumes no responsibility or ; liability for the use of ZCPR2 and its utilities. ; ; The author, Richard Conn, has sole rights to this program. ; ZCPR2 and its utilities may not be sold without the express, ; written permission of the author. ; ; ; DEVICE is a program which enables the user to manipulate the ; extended ZCPR2 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 DEVICE command is: ; ; DEVICE or DEVICE // <-- Ask for Help ; DEVICE 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 cin,cout,pstr,print,cline,bbline ; ; Branch to Start of Program ; jmp start ; ;****************************************************************** ; ; SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format ; ; This data block precisely defines the data format for ; initial features of a ZCPR2 system which are required for proper ; initialization of the ZCPR2-Specific Routines in SYSLIB. ; ; ; EXTERNAL PATH DATA ; EPAVAIL: DB 0FFH ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES) EPADR: DW 40H ; ADDRESS OF EXTERNAL PATH IF AVAILABLE ; ; INTERNAL PATH DATA ; INTPATH: DB 0,0 ; DISK, USER FOR FIRST PATH ELEMENT ; DISK = 1 FOR A, '$' FOR CURRENT ; USER = NUMBER, '$' FOR CURRENT DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 ; DISK, USER FOR 8TH PATH ELEMENT DB 0 ; END OF PATH ; ; MULTIPLE COMMAND LINE BUFFER DATA ; MCAVAIL: DB 0FFH ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE? MCADR: DW 0FF00H ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE ; ; DISK/USER LIMITS ; MDISK: DB 4 ; MAXIMUM NUMBER OF DISKS MUSER: DB 31 ; MAXIMUM USER NUMBER ; ; FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK ; DOK: DB 0FFH ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES) UOK: DB 0FFH ; ALLOW USER CHANGE? (0=NO, 0FFH=YES) ; ; PRIVILEGED USER DATA ; PUSER: DB 10 ; BEGINNING OF PRIVILEGED USER AREAS PPASS: DB 'chdir',0 ; PASSWORD FOR MOVING INTO PRIV USER AREAS DS 41-($-PPASS) ; 40 CHARS MAX IN BUFFER + 1 for ending NULL ; ; CURRENT USER/DISK INDICATOR ; CINDIC: DB '$' ; USUAL VALUE (FOR PATH EXPRESSIONS) ; ; DMA ADDRESS FOR DISK TRANSFERS ; DMADR: DW 80H ; TBUFF AREA ; ; NAMED DIRECTORY INFORMATION ; NDRADR: DW 00000H ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY NDNAMES: DB 64 ; MAX NUMBER OF DIRECTORY NAMES DNFILE: DB 'NAMES ' ; NAME OF DISK NAME FILE DB 'DIR' ; TYPE OF DISK NAME FILE ; ; REQUIREMENTS FLAGS ; EPREQD: DB 000H ; EXTERNAL PATH? MCREQD: DB 000H ; MULTIPLE COMMAND LINE? MXREQD: DB 000H ; MAX USER/DISK? UDREQD: DB 000H ; ALLOW USER/DISK CHANGE? PUREQD: DB 000H ; PRIVILEGED USER? CDREQD: DB 000H ; CURRENT INDIC AND DMA? NDREQD: DB 000H ; NAMED DIRECTORIES? Z2CLASS: DB 1 ; CLASS 1 DB 'ZCPR2' DS 10 ; RESERVED ; ; END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA ; ;****************************************************************** ; ; ; Other Parameter Data ; drvadr: dw 0 ; Address of I/O Drivers ; ; Start of Program ; start: call print db 'DEVICE2, Version ' db (vers/10)+'0','.',(vers mod 10)+'0',0 lhld drvadr ;check for initialization mov a,h ora l ;must NOT be zero jnz start0 call print db cr,lf,'DEVICE NOT Initialized with I/O Base -- Aborting',0 ret start0: call status ;check for drivers jnz start1 call print db cr,lf,'Redirection Not Supported -- Aborting',0 ret 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 command ;command mode cpi '/' ;help? jnz docmd ;run command subroutine ; ; Print Help Message ; help: call print db cr,lf,' DEVICE is a program which enables the user to' db cr,lf,'manipulate the extended ZCPR2 redirectable device' db cr,lf,'drivers. It allows the user to perform the following' db cr,lf,'functions:' db cr,lf,' Display the Names of the Current Devices' db cr,lf,' Set One or More of the Current Devices' db cr,lf,' The format of the DEVICE command is:' db cr,lf,' DEVICE ' db '<-- Enter Interactive Mode' db cr,lf,' DEVICE // ' db '<-- Ask for Help' db cr,lf,' DEVICE ' help1: db 'Command,Command, ... ' db '<-- Issue Commands' db cr,lf,'where "command" may take the following forms:' db cr,lf,' DISPLAY=ALL ' db '<-- Display Names of All Devices' db cr,lf,' DISPLAY=CON ' db '<-- Display Names of Consoles' db cr,lf,' DISPLAY=LST ' db '<-- Display Names of Printers' db cr,lf,' DISPLAY=RDR ' db '<-- Display Names of Readers' db cr,lf,' DISPLAY=PUN ' db '<-- Display Names of 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 cr,lf,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 cpi ';' rz jmp sdelm ; ; COMMAND -- This is an interactive mainline which allows user input, ; runs command lines via DOCMD, and permits Help and Comments ; command: call print db cr,lf,'DEVICE2 Interactive Command System' db cr,lf,'Type ? and Strike RETURN for Help' db 0 cloop: call print db cr,lf,'DEVICE2 Command? ',0 mvi a,0ffh ;capitalize call bbline call sblank ;skip to non-blank mov a,m ;empty line? ora a ;0=yes jz cloop cpi '?' ;help? jz chelp cpi ';' ;comment? jz cloop cpi 'X' ;done? rz call docmd ;run command line jmp cloop chelp: call print db cr,lf,'DEVICE2 Commands are of the form:',cr,lf,0 lxi h,help1 call pstr call print db cr,lf,'A command line beginning with a semicolon (;) is a' db ' comment.' db cr,lf,'The X Command Exits DEVICE2.' db cr,lf,0 jmp cloop ; ; 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 cpi ';' ;another also? 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 print db cr,lf,'Command Error at -- ',0 call pstr ;print rest ret ; ; Do LST: Assignment ; dolst: mvi a,3 ;select LST: jmp assign ; ; Do PUN: Assignment ; dopun: mvi a,2 ;select PUN: jmp assign ; ; Do RDR: Assignment ; dordr: mvi a,1 ;select RDR: jmp assign ; ; Do CON: Assignment ; docon: 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 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 print db cr,lf,'Invalid Name Assignment at -- ',0 call pstr 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 print db cr,lf,'Strike Any Key to Continue -- ',0 call cin call disppun jmp displst dispcon: call print db cr,lf,cr,lf,'CON: Devices --',0 mvi a,0 ;select CON: call disp jmp current displst: call print db cr,lf,cr,lf,'LST: Devices --',0 mvi a,3 ;select LST: call disp jmp current disprdr: call print db cr,lf,cr,lf,'RDR: Devices --',0 mvi a,1 ;select RDR: call disp jmp current disppun: call print db cr,lf,cr,lf,'PUN: Devices --',0 mvi a,2 ;select PUN: call disp ; ; Print Name of Current Device ; current: push h ;save ptr mov b,a ;save number in B push b ;save B call print db cr,lf,' Current Assignment: ',0 push b ;save B call status ;get status pop b ;get B inr b ;add 1 for offset dcx h ;back up curr: inx h ;pt to next inx h dcr b ;count down jnz curr 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 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 disp2: push b ;save values dcr c ;pt to next name call print db cr,lf,' ',0 call pnamer ;print name (B=logical, C=physical) pop b ;get count dcr c ;count down jnz disp2 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 print ;print separator db ' - ',0 call pstr ;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: lhld drvadr ;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