home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Program: Z3INS
- ; Author: Richard Conn
- ; Version: 1.2
- ; Date: 9 January 1985
- ; Previous Versions: 1.0 11 June 84, 1.1 1 Dec 84
- ;
- VERS EQU 12 ; Four times faster.. jww
- Z3ENV SET 0F400H
-
- ;
- ; The purpose of Z3INS is to install a group of ZCPR3 System Utilities.
- ; Z3INS reads in an Environment Descriptor and then reads in a file containing
- ; the names of the utilities to be installed. It then reads in each file named
- ; and installs the proper values into it.
- ;
- ; Syntax:
- ; Z3INS Envfile.typ Install.typ
- ; Default File Types:
- ; Envfile - ENV
- ; Install - INS
- ;
- ; Added the ability to install one program if the "Install" type
- ; is "COM".
- ;
- ; Customization
- ; Number of Blocks to Read/Write Per File Access
- ;
- NBLKS EQU 16 ; Must be even (8=1K, 16=2K, etc)
-
- ;
- ; Library Utilities
- ;
- EXT Z3INIT
- EXT FNAME
- EXT F$OPEN,F$CLOSE,F$READ,F$WRITE,INITFCB
- EXT EPRINT,PFN1,CRLF,COUT
- EXT MOVEB,SKSP
- EXT CODEND
-
- ;
- ; System Equates
- ;
- BASE EQU 0 ; Base address of system
- BDOS EQU BASE+05H
- FCB EQU BASE+5CH
- FCB2 EQU BASE+6CH
- TBUFF EQU BASE+80H
- TAB EQU 09H
- CR EQU 0DH
- LF EQU 0AH
- CTRLZ EQU 'Z'-'@' ; EOF mark
-
- ;
- ; 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
- ;
- ; Print Name
- ;
- CALL EPRINT
- DB 'Z3INS Version '
- DB (VERS/10)+'0','.',(VERS MOD 10)+'0',0
- ;
- ; Check for file names
- ;
- LDA FCB+1 ; Get first char
- CPI '/' ; Print help
- JZ HELP
- CPI ' '
- JNZ FN2
- ;
- ; Print Help Message
- ;
- HELP:
- CALL EPRINT
- DB CR,LF,'Syntax:'
- DB CR,LF,' Z3INS envfile.ENV insfile.INS or'
- DB CR,LF,' Z3INS envfile.ENV program.com'
- DB 0
- RET
- ;
- ; Continue file name check
- ;
- FN2:
- LDA FCB2+1
- CPI ' ' ; Print help if none
- JZ HELP
- ;
- ; Set Default File Types
- ;
- LXI D,FCB+9 ; Pt to file type
- LXI H,DEFENV ; Pt to default
- CALL SETTYP
- LXI D,FCB2+9 ; Pt to file type
- LXI H,DEFINS ; Pt to default
- CALL SETTYP
- LXI H,FCB2 ; Save 2nd FCB
- LXI D,INFILE
- MVI B,16 ; 16 bytes
- CALL MOVEB
- ;
- ; Load Environment Descriptor
- ;
- LXI D,FCB ; Pt to FCB
- CALL INITFCB
- CALL F$OPEN ; Open file
- JZ LOADENV
- ;
- ; Print File Not Found Message
- ; DE pts to FCB
- ;
- PRFNF:
- CALL EPRINT
- DB CR,LF,'** File ',0
- LXI D,FCB+1 ; Pt to file name
- CALL PFN1
- CALL EPRINT
- DB ' NOT Found',0
- RET
- ;
- ; Load Environment Descriptor
- ;
- LOADENV:
- CALL CODEND ; Pt to free space
- CALL LOAD ; Load in file
- SHLD FLIST ; Save ptr to file list
- XCHG ; In DE also
- CALL CODEND ; Check for proper amount
- MOV A,D
- SUB H
- CPI 1 ; Must be 1 page
- JZ LOADE1
- ENVERR:
- CALL EPRINT
- DB CR,LF,'** Invalid Environment Descriptor',0
- RET
- LOADE1:
- MOV A,L ; Low must be same
- SUB E
- JNZ ENVERR
- LXI D,FCB ; Close environment descriptor
- CALL F$CLOSE
- ;
- ; Load File List
- ;
- LXI H,INFILE ; Copy into FCB
- LXI D,FCB
- MVI B,16
- CALL MOVEB
-
- ; start changes here (Vers 1.1)
-
- LXI H,FCB+9 ; Point to install file type
- LXI D,COMNAME ; File type for single Install
- MVI B,3 ; Character loop count
- COMLP:
- LDAX D ; Next character for file type
- CMP M ; Next install file type char
- JNZ MULT ; Match failed - install multiple
- INX H
- INX D
- DCR B
- JNZ COMLP ; Loop for all chars
-
- LXI H,ZZ ; Point to EOF character
- SHLD NXTCHR ; To stop install procedure
- LHLD FLIST ; Get next avail free storage loc
- SHLD FREE ; Place to load installed program
- JMP SINGLE ; Process just a single program
-
- ; stop changes here (Vers 1.1)
-
- MULT: LXI D,FCB ; Init FCB
- CALL INITFCB
- CALL F$OPEN ; Open file
- JNZ PRFNF ; File not found
- LHLD FLIST ; Pt to buffer
- CALL LOAD ; Load file
- MVI M,CTRLZ ; Ensure EOF mark
- ZZ EQU $-1 ; Point to a convenient CTRL-Z (Vers 1.1)
- SHLD FREE ; Set ptr to free space
- XCHG ; Ptr in DE
- LHLD BDOS+1 ; Get address of top of TPA
- MOV A,H ; Adjust for CPR
- SUI 10
- SUB D ; See how many pages left
- CPI NBLKS/2 ; Must be at least N/2 pages
- JNC FUNCTION ; Perform function if OK
- CALL EPRINT
- DB CR,LF,'** Not Enough Free Memory for Installation'
- DB CR,LF,' Make Installation File Shorter',0
- RET
- ;
- ; Perform Installation Function
- ;
- FUNCTION:
- LHLD FLIST ; Pt to file list
- PUSH H ; Save ptr
- ;
- ; Set all MSBs to Zero
- ;
- CLEAN:
- MOV A,M ; Clear MSB
- ANI 7FH
- MOV M,A
- INX H ; Pt to next
- CPI CTRLZ ; Done?
- JNZ CLEAN
- POP H ; Pt to first line
- ;
- ; Process Next Line
- ;
- FCTNXT:
- CALL SKSP ; Skip over leading spaces
- SHLD NXTCHR ; Set ptr to next char
- MOV A,M ; Get char
- CPI ';' ; Comment?
- JZ FCTCMT ; Process comment line
- CPI CTRLZ ; Done?
- JZ DONE
- LXI D,FCB ; Pt to FCB
- CALL FNAME ; Process file name
- ;
- ; Check for Non-Ambiguous File Name
- ;
- SINGLE: ; Entry point to install a single program
- LXI H,FCB+1 ; Pt to file name
- MVI B,11 ; 11 chars
- FCTAMB:
- MOV A,M ; Check it
- CPI '?'
- JZ AMBERR
- INX H ; Pt to next
- DCR B ; Count down
- JNZ FCTAMB
- LXI D,FCB ; Init FCB and open file
- CALL INITFCB
- CALL F$OPEN
- JZ FCTPRE ; If ok, process preamble
- CALL PRFNF ; Print file not found
- ;
- ; Continue with Next Line
- ;
- FCTCONT:
- LHLD NXTCHR ; Pt to next char
- FCTC1:
- MOV A,M ; Skip to after LF or EOF
- INX H
- CPI LF
- JZ FCTNXT ; Continue
- CPI CTRLZ ; Done?
- JNZ FCTC1
- RET
- ;
- ; Print Ambiguous File Name Error
- ;
- AMBERR:
- CALL EPRINT
- DB CR,LF,'** Ambiguous File Name Not Allowed: ',0
- LXI D,FCB+1 ; Pt to file name
- CALL PFN1
- JMP FCTCONT ; Continue
- ;
- ; Process Comment Line
- ;
- FCTCMT:
- CALL CRLF ; New line
- MVI C,1 ; Set tab count
- FCTCMT1:
- MOV A,M ; Get char
- INX H ; Pt to next
- CPI TAB ; Tabulate?
- JZ FCTCMT2
- CPI CR ; Done?
- JZ FCTCONT
- CPI LF ; Done?
- JZ FCTCONT
- CPI CTRLZ ; Done?
- JZ FCTCONT
- CPI ' ' ; Don't advance if less than space
- JC FCTCMT1
- INR C ; Add 1 to col pos
- CALL COUT ; Print
- JMP FCTCMT1 ; Resume
- FCTCMT2:
- MVI A,' ' ; Space over
- CALL COUT
- INR C ; Increment location
- MOV A,C
- ANI 7 ; Check for every 8
- JNZ FCTCMT2
- JMP FCTCMT1 ; Resume
- ;
- ; Process Preamble
- ;
- FCTPRE:
- CALL EPRINT
- DB CR,LF,'** Installing File ',0
- LXI D,FCB+1 ; Pt to file name
- CALL PFN1
- LHLD FREE ; Pt to free area
- MVI B,2 ; Number of blocks to load
- CALL LOADN ; Load them
- MOV A,C ; How many blocks loaded?
- CPI 2 ; Must be 2
- JZ FCTPRE1
- ;
- ; Not a ZCPR3 Utility
- ;
- NOTZ3:
- CALL EPRINT
- DB ' -- NOT a ZCPR3 Utility',0
- JMP FCTCONT
- ;
- ; Ensure we have a Z3 utility
- ;
- FCTPRE1:
- LHLD FREE ; Pt to first byte
- MOV A,M ; Get it
- CPI 0C3H ; Must be a JMP
- JNZ NOTZ3
- INX H ; Pt to next key area
- INX H
- INX H
- LXI D,ENVNAM ; Pt to environment name
- MVI B,5 ; 5 chars
- FCTPRE2:
- LDAX D ; Get name char
- CMP M ; Check
- JNZ NOTZ3
- INX H ; Pt to next
- INX D
- DCR B ; Count down
- JNZ FCTPRE2
- MOV A,M ; Get class
- PUSH PSW
- INX H ; Pt to first byte
- XCHG ; DE pts to next byte
- CALL CODEND ; Pt to environment descriptor
- POP PSW
- CPI 1 ; Class 1 (external) or 2 (internal)?
- JZ CLASS1
- ;
- ; Environment Descriptor is Internal
- ; HL pts to Environment Descriptor and DE pts to next byte
- ;
- LXI B,3+5+1 ; Skip to first valid byte
- DAD B
- MVI A,0 ; Compute number of bytes to copy
- SUB C
- MOV B,A ; Result in B
- CALL MOVEB ; Copy into buffer
- JMP FCTPRE3 ; Complete preamble processing
- ;
- ; Environment Descriptor is External
- ; HL pts to Environment Descriptor and DE pts to next byte
- ;
- CLASS1:
- LXI B,1BH ; Offset to environment descriptor address
- DAD B
- MOV A,M ; Get address
- STAX D ; Store it
- INX H ; Pt to next
- INX D
- MOV A,M ; Get high
- STAX D ; Store it
- ;
- ; Complete Preamble Processing
- ; Write the new preamble directly to the target file (Vers 1.2)
- ;
- FCTPRE3:
- XRA A
- STA FCB+32 ; Set current record to zero
- LXI B,2 ; Record count
- LHLD FREE ; Start at the beginning
- CALL WRITEN ; Write 2 records
- MOV A,C
- ORA A ; Check that 2 records were written
- JNZ PRFWE ; Report error and exit, if not.
- LXI D,FCB ; Point to current FCB
- CALL F$CLOSE ; Close the file
- JMP FCTCONT ; Get the next one
- ;
- ; File Write Error
- ;
- PRFWE:
- CALL EPRINT
- DB CR,LF,'** File Write Error',0
- RET
- ;
- ; Set File Type Pted to by HL into DE if (DE)=' '
- ;
- SETTYP:
- LDAX D ; Get dest byte
- CPI ' '
- RNZ ; Already has type
- MVI B,3 ; Copy
- JMP MOVEB
- ;
- ; Load File Specified in FCB into Memory Starting at HL
- ; Check for Overflow
- ;
- LOAD:
- PUSH H ; Save address of next block
- LHLD BDOS+1 ; Check for overflow
- XCHG
- POP H ; Get address of next block
- MOV A,D
- SUI 10 ; Adjust for CPR
- SUB H
- JNZ LOAD1
- CALL EPRINT
- DB CR,LF,'** Memory Overflow',0
- POP PSW ; Clear stack
- RET
- ;
- ; Load next block - HL pts to location
- ;
- LOAD1:
- LXI D,FCB ; Pt to FCB
- CALL F$READ ; Read next block
- RNZ ; Done if EOF
- LXI D,TBUFF ; Pt to buffer area
- XCHG ; Flip source and dest
- MVI B,128 ; 128 bytes
- CALL MOVEB
- LXI H,128 ; Pt to next
- DAD D
- JMP LOAD ; Continue
- ;
- ; Load B blocks into Memory Pted to by HL
- ; Return count in C
- ;
- LOADN:
- MVI C,0 ; Set count
- LOADN1:
- LXI D,FCB ; Pt to fcb
- CALL F$READ ; Read next block
- RNZ ; Done if EOF
- INR C ; Increment count
- PUSH B ; Save BC
- LXI D,TBUFF ; Pt to buffer area
- XCHG ; Flip source and dest
- MVI B,128 ; 128 bytes
- CALL MOVEB
- LXI H,128 ; Pt to next
- DAD D
- POP B ; Restore BC
- DCR B ; Count down
- JNZ LOADN1
- RET
- ;
- ; Store C blocks from Memory Pted to by HL
- ;
- WRITEN:
- PUSH B ; Save count
- LXI D,TBUFF ; Copy into TBUFF
- MVI B,128 ; 128 bytes
- CALL MOVEB
- LXI B,128 ; Pt to next
- DAD B
- POP B ; Get count
- LXI D,FCB ; Pt to fcb
- CALL F$WRITE ; Write next block
- RNZ ; Done if EOF
- DCR C ; Decrement count
- JNZ WRITEN
- RET
-
- ;
- ; Write Completion Message
- ;
- DONE:
- CALL EPRINT
- DB CR,LF,'** Installation Complete **',0
- RET
-
- ;
- ; Buffers
- ;
- COMNAME:
- DB 'COM' ; File type for COM file
- DEFENV:
- DB 'ENV' ; Default file type for Environment Descriptor
- DEFINS:
- DB 'INS' ; Default file type for Installation File
- INFILE:
- DS 16 ; FCB save area
- FLIST:
- DS 2 ; Address of file list
- FREE:
- DS 2 ; Address of scratch area to read into
- NXTCHR:
- DS 2 ; Ptr to next char to process
- ENVNAM:
- DB 'Z3ENV' ; Environment Descriptor ID
-
- END