home *** CD-ROM | disk | FTP | other *** search
- ; PROGRAM: IOLOADER
- ; AUTHOR: RICHARD CONN
- ; VERSION: 1.3
- ; DATE: 6 Jan 83
- ; PREVIOUS VERSIONS: 1.0 (10 Oct 82), 1.1 (29 Dec 82), 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.
- ;
-
-
- ;
- ; IOLOADER is a program which loads a file of Redirectable I/O
- ; Drivers into the proper place in the CHBIOSZ for later use. This
- ; place is defined by the IOBADR buffer in the front of this program.
- ;
- ; IOLOADER is invoked in one of two ways:
- ; IOLOADER -- Loads the File SYSIO.IO
- ; IOLOADER filename -- Loads the File filename.IO
- ; IOLOADER filename.typ -- Loads the File filename.typ
- ;
- EXT PRINT,ZGPINS,CLINE,MOVEB,LOGUD,BDOS
- EXT ZFNAME,ZPFIND,F$OPEN,F$CLOSE,F$READ,INITFCB
-
- TBUFF EQU 80H ;TBUFF OF ZCPR2
- CR EQU 0DH
- LF EQU 0AH
-
- ;
- ; 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 0FFH ; 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 0FFH ; 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
- ;
- ;******************************************************************
- ;
- IOBADR:
- DW 0 ;Base Address of I/O System
-
- ;
- ; Start of Program
- ;
- START:
- CALL ZGPINS ;INIT BUFFERS
- CALL PRINT ;PRINT BANNER
- DB 'IOLOADER, Version ',VERS/10+'0','.',(VERS MOD 10)+'0',0
- LHLD IOBADR ;BASE OF IO SYSTEM INITIALIZED?
- MOV A,H
- ORA L
- JNZ IOL1
- CALL PRINT
- DB CR,LF,'I/O Base Address Not Initialized -- Aborting',0
- RET
-
- ; DETERMINE FILE NAME
- IOL1:
- LXI H,TBUFF ;PT TO TBUFF
- CALL CLINE ;EXTRACT LINE AS STRING
- CALL SBLANK ;SKIP TO NON-BLANK
- CPI '/' ;HELP?
- JNZ IOL2 ;CONTINUE IF NOT
- CALL PRINT ;PRINT HELP MESSAGE
- DB CR,LF,' IOLOADER is used to load the Redirectable I/O'
- DB CR,LF,'Drivers for CHBIOSZ. It is invoked by one of the'
- DB CR,LF,'following forms --'
- DB CR,LF,' IOLOADER <-- Loads SYSIO.IO'
- DB CR,LF,' IOLOADER // <-- Print HELP Msg'
- DB CR,LF,' IOLOADER file <-- Loads file.IO'
- DB CR,LF,' IOLOADER file.typ <-- Loads file.typ'
- DB CR,LF,0
- RET
-
- ; DETERMINE FILE NAME AND FIND FILE
- IOL2:
- LXI D,DEFCB ;PT TO DEFAULT FCB
- ORA A ;USE DEFAULT NAME?
- JZ IOL2A
- LXI D,FCB ;PT TO FCB
- PUSH D ;SAVE PTR
- CALL ZFNAME ;EXTRACT NAME DATA
- LXI D,FCBTYP ;ANY TYPE SPECIFIED?
- LXI H,IOTYP ;PREP TO SET UP I/O TYPE
- MVI B,3 ;3 BYTES
- LDAX D ;GET TYPE SPECIFIED
- CPI ' ' ;ANY?
- CZ MOVEB ;COPY IF NOT
- POP D ;DE PTS TO FCB OF FILE TO LOOK FOR
- IOL2A:
- MVI B,0FFH ;SEARCH CURRENT USER/DISK FIRST
- CALL ZPFIND ;SEARCH FOR FILE
- JNZ IOL3 ;LOAD FILE
- CALL PRINT
- DB CR,LF,'I/O Driver NOT Found',0
- RET
-
- ; LOAD FILE
- IOL3:
- CALL LOGUD ;LOG INTO DIRECTORY
- CALL INITFCB ;INIT FCB
- CALL F$OPEN ;OPEN FILE FOR INPUT
- PUSH D ;SAVE FCB PTR
- LHLD IOBADR ;GET ADDRESS OF I/O BASE
- LXI D,-128 ;BACK UP 1 BLOCK
- DAD D
- POP D ;GET FCB PTR
- SHLD DMAADR ;SAVE IN BUFFER FOR NOW
-
- ; FILE LOADING LOOP
- IOL4:
- PUSH D ;SAVE FCB PTR
- LHLD DMAADR ;GET ADDRESS OF LAST BLOCK LOADED
- LXI D,128 ;PT TO NEXT BLOCK TO LOAD
- DAD D
- SHLD DMAADR ;SAVE ADDRESS OF CURRENT BLOCK LOADING
- XCHG ;DE PTS TO ADDRESS
- MVI C,26 ;SET DMA ADDRESS
- CALL BDOS
- POP D ;GET FCB PTR
- CALL F$READ ;READ NEXT BLOCK
- ORA A ;0=CONTINUE
- JZ IOL4
-
- ; CLOSE FILE
- CALL F$CLOSE
-
- ; RUN THE TERMINAL INIT ROUTINE
- CALL TINIT ;RUN THE INIT ROUTINE
-
- ; PRINT FINAL MESSAGE AND EXIT
- CALL PRINT
- DB CR,LF,'Load Complete',0
- RET
-
- ;
- ; TERMINAL INIT ROUTINE FROM I/O DRIVERS
- ;
- TINIT:
- LHLD IOBADR ;GET ADDRESS OF I/O BASE
- LXI D,9 ;ADD 9 FOR TINIT OFFSET
- DAD D
- PCHL
-
- ; SKIP TO NON-BLANK
- SBLANK:
- MOV A,M ;GET CHAR
- INX H ;PT TO NEXT
- CPI ' ' ;BLANK?
- JZ SBLANK
- DCX H ;PT TO NON-BLANK
- RET
-
- ; BUFFERS
- DS 60 ;30-ELT STACK
- STACK: DS 2 ;OLD STACK PTR
-
- FCBPTR: DS 2 ;POINTER TO FCB FOR FILE SEARCH
-
- DMAADR: DS 2 ;ADDRESS OF NEXT BLOCK TO LOAD
-
- TMPUSR: DS 1 ;CURRENT USER NUMBER
-
- FCB:
- DS 9
- FCBTYP:
- DS 3
- DS 24
-
- DEFCB:
- DB 0 ;CURRENT DISK
- DB 'SYSIO '
- IOTYP:
- DB 'IO '
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- END
-