mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
577 lines
10 KiB
577 lines
10 KiB
;
|
|
; PROGRAM: DEVICE3
|
|
; AUTHOR: RICHARD CONN
|
|
; VERSION: 1.0
|
|
; DATE: 4 Apr 84
|
|
; PREVIOUS VERSION: None
|
|
; DERIVATION: DEVICE2 from ZCPR2
|
|
;
|
|
VERS EQU 10
|
|
z3env SET 0f400h
|
|
|
|
;
|
|
; DEVICE 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 DEVICE command is:
|
|
;
|
|
; DEVICE <-- Enter Interactive Mode
|
|
; DEVICE // <-- Ask for Help
|
|
;
|
|
; In Interactive Mode, DEVICE commands are:
|
|
;
|
|
; 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
|
|
;
|
|
fcb equ 5ch
|
|
cr equ 0dh
|
|
lf equ 0ah
|
|
|
|
;
|
|
; SYSLIB Routines
|
|
;
|
|
ext z3init,getiop
|
|
ext cin,cout,epstr,eprint,cline,bline,codend,caps
|
|
|
|
;
|
|
; 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,'DEVICE 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:
|
|
lda fcb+1 ;get first char of argument
|
|
cpi '/' ;help?
|
|
jnz command ;run command subroutine
|
|
|
|
;
|
|
; Print Help Message
|
|
;
|
|
help:
|
|
call banner
|
|
call eprint
|
|
db cr,lf,'DEVICE - Interactive Redirectable I/O Driver Selection'
|
|
db cr,lf,'Syntax:'
|
|
db cr,lf,' DEVICE <-- Enter Interactive Mode'
|
|
db cr,lf,' DEVICE // <-- Print Help Message'
|
|
db 0
|
|
ret
|
|
;
|
|
; Print General Help Message
|
|
;
|
|
genhelp:
|
|
call eprint
|
|
db 'Enter Command Character:'
|
|
db cr,lf,' D - Display all or selected devices'
|
|
db cr,lf,' C - Select Console Device'
|
|
db cr,lf,' L - Select List Device'
|
|
db cr,lf,' P - Select Punch Device'
|
|
db cr,lf,' R - Select Reader Device'
|
|
db cr,lf,' X - Exit Program'
|
|
db 0
|
|
ret
|
|
;
|
|
; Print Display Help Message
|
|
;
|
|
disphelp:
|
|
call eprint
|
|
db cr,lf,'Enter Devices to Display:'
|
|
db cr,lf,' A - All'
|
|
db cr,lf,' C - Consoles'
|
|
db cr,lf,' L - Lists'
|
|
db cr,lf,' P - Punches'
|
|
db cr,lf,' R - Readers'
|
|
db 0
|
|
ret
|
|
;
|
|
; Print Banner
|
|
;
|
|
banner:
|
|
call eprint
|
|
db 'DEVICE3, 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
|
|
|
|
;
|
|
; COMMAND -- This is an interactive mainline which allows user input,
|
|
; runs command lines via DOCMD, and permits Help and Comments
|
|
;
|
|
command:
|
|
call banner
|
|
call eprint
|
|
db ' - Interactive I/O Device Selection Utility'
|
|
db cr,lf,'Strike ? for Help'
|
|
db 0
|
|
cloop:
|
|
call eprint
|
|
db cr,lf,'DEVICE3 Command? ',0
|
|
lxi h,majcmd ;process major command
|
|
call ccheck ;look for and run command
|
|
mov a,b ;get char
|
|
call cout ;echo it
|
|
call eprint
|
|
db ' - Invalid Command',0
|
|
jmp cloop
|
|
;
|
|
; Command Table for Major Commands
|
|
;
|
|
majcmd:
|
|
db '?' ;help
|
|
dw genhelp
|
|
db ' ' ;skip command
|
|
dw exit1
|
|
db cr ;skip command
|
|
dw exit1
|
|
db 'D' ;display devices
|
|
dw display
|
|
db 'C' ;Select Console
|
|
dw console
|
|
db 'L' ;Select List
|
|
dw list
|
|
db 'P' ;Select Punch
|
|
dw punch
|
|
db 'R' ;Select Reader
|
|
dw reader
|
|
db 'X' ;Exit
|
|
dw exit
|
|
db 0 ;end of table
|
|
;
|
|
; Display major command
|
|
;
|
|
display:
|
|
pop psw ;clear return address
|
|
call eprint
|
|
db 'Display Devices for ',0
|
|
lxi h,discmd ;table of display commands
|
|
call ccheck
|
|
mov a,b
|
|
call cout ;print error command
|
|
call eprint
|
|
db ' - Invalid Command',cr,lf,0
|
|
jmp display
|
|
;
|
|
; Display Command Table
|
|
;
|
|
discmd:
|
|
db '?' ;help
|
|
dw disphelp
|
|
db cr ;exit
|
|
dw exit1
|
|
db ' ' ;exit
|
|
dw exit1
|
|
db 'A' ;all
|
|
dw dispall
|
|
db 'C' ;console
|
|
dw dispcon
|
|
db 'L' ;list
|
|
dw displst
|
|
db 'P' ;punch
|
|
dw disppun
|
|
db 'R' ;reader
|
|
dw disprdr
|
|
db 0 ;end of table
|
|
|
|
;
|
|
; Console major command
|
|
;
|
|
console:
|
|
call eprint
|
|
db 'Select Console ',0
|
|
call getname
|
|
mvi a,0 ;select CON:
|
|
jmp assign
|
|
;
|
|
; List major command
|
|
;
|
|
list:
|
|
call eprint
|
|
db 'Select List ',0
|
|
call getname
|
|
mvi a,3 ;select LST:
|
|
jmp assign
|
|
;
|
|
; Punch major command
|
|
;
|
|
punch:
|
|
call eprint
|
|
db 'Select Punch ',0
|
|
call getname
|
|
mvi a,2 ;select PUN:
|
|
jmp assign
|
|
;
|
|
; Reader major command
|
|
;
|
|
reader:
|
|
call eprint
|
|
db 'Select Reader ',0
|
|
call getname
|
|
mvi a,1 ;select RDR:
|
|
jmp assign
|
|
;
|
|
; Exit major command
|
|
;
|
|
exit:
|
|
call eprint
|
|
db 'Exit',0
|
|
pop psw ;clear stack
|
|
exit1:
|
|
ret ;exit to OS or DEVICE (if entry at EXIT1)
|
|
;
|
|
; Check for Command in A in Table Pted to by HL
|
|
;
|
|
ccheck:
|
|
call cin ;get user input
|
|
call caps ;capitalize it
|
|
mov b,a ;save command in B
|
|
cc1:
|
|
mov a,m ;get command letter
|
|
ora a ;end of table?
|
|
rz
|
|
cmp b ;match?
|
|
jz cc2
|
|
inx h ;skip to next
|
|
inx h
|
|
inx h
|
|
jmp cc1
|
|
cc2:
|
|
inx h ;pt to address
|
|
mov e,m ;get low
|
|
inx h
|
|
mov d,m ;get high
|
|
lxi h,cloop ;set return address
|
|
xthl ;return address on stack
|
|
xchg ;address of routine in HL
|
|
pchl ;"call" routine
|
|
;
|
|
; Get Device Name from User
|
|
; Return with NZ if name input, else reissue command
|
|
;
|
|
getname:
|
|
call eprint
|
|
db ' [Enter a Device Name] ',0
|
|
call codend ;pt to end of available code
|
|
mvi m,20 ;set length of line
|
|
mvi a,0ffh ;capitalize
|
|
call bline
|
|
call sblank ;skip to non-blank
|
|
mov a,m ;empty line?
|
|
ora a ;0=yes
|
|
jz gnabort ;abort input if so
|
|
shld name ;set ptr to name
|
|
ret ;NZ means name present
|
|
gnabort:
|
|
pop psw ;clear stack
|
|
ret ;return to main command processor
|
|
|
|
;
|
|
; Do Assignment in General
|
|
;
|
|
assign:
|
|
mov b,a ;save A in B
|
|
sta logical ;save logical device number
|
|
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
|
|
call eprint
|
|
db cr,lf,' Invalid Device Name: ',0
|
|
lhld name ;pt to error name
|
|
call epstr ;print name
|
|
ret
|
|
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 curr ;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
|
|
;
|
|
dispall:
|
|
call eprint
|
|
db 'All Devices',cr,lf
|
|
db ' CON: Devices --',0
|
|
call dc1 ;successive displays
|
|
call eprint
|
|
db cr,lf,' RDR: Devices --',0
|
|
call dr1
|
|
call eprint
|
|
db cr,lf,'Strike Any Key -- ',0
|
|
call cin
|
|
call eprint
|
|
db cr,lf,' PUN: Devices --',0
|
|
call dp1
|
|
call eprint
|
|
db cr,lf,' LST: Devices --',0
|
|
jmp dl1
|
|
dispcon:
|
|
call eprint
|
|
db 'CON: Devices',0
|
|
dc1:
|
|
mvi a,0 ;select CON:
|
|
call disp
|
|
jmp curr
|
|
displst:
|
|
call eprint
|
|
db 'LST: Devices',0
|
|
dl1:
|
|
mvi a,3 ;select LST:
|
|
call disp
|
|
jmp curr
|
|
disprdr:
|
|
call eprint
|
|
db 'RDR: Devices',0
|
|
dr1:
|
|
mvi a,1 ;select RDR:
|
|
call disp
|
|
jmp curr
|
|
disppun:
|
|
call eprint
|
|
db 'PUN: Devices',0
|
|
dp1:
|
|
mvi a,2 ;select PUN:
|
|
call disp
|
|
;
|
|
; Print Name of Current Device
|
|
;
|
|
curr:
|
|
push h ;save ptr
|
|
mov b,a ;save number in B
|
|
push b ;save B
|
|
call eprint
|
|
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
|
|
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
|
|
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
|
|
|