home *** CD-ROM | disk | FTP | other *** search
- ;
- ; 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