mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
577 lines
10 KiB
Plaintext
577 lines
10 KiB
Plaintext
;
|
||
; 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
|
||
|