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
/
CPM
/
ZCPR2
/
DEVICE.MQC
/
DEVICE.MAC
Wrap
Text File
|
2000-06-30
|
13KB
|
624 lines
;
; 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 ;<SP> 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