home *** CD-ROM | disk | FTP | other *** search
- ;
- ; PROGRAM: CRC
- ; VERSION: 2.0
- ; DATE: 16 Jan 83
- ; AUTHOR: RICHARD CONN
- ; PREVIOUS VERSIONS: 1.2 (6 Jan 83), 1.1 (1 Jan 83), 1.0 (12 Dec 82)
- ;
- VERS equ 20
-
- ;
- ; 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.
- ;
-
-
- ;
- ; CRC Command --
- ; CRC is used to compute the CRC of one or more files. CRC
- ; permits ambiguous file names and supports an Inspect mode that
- ; allows the user to confirm each file before the computation is done.
- ; Additionally, there is a Disk Output Mode which allows the user to send
- ; the output from the operation to disk as well as to his screen with optional
- ; comments.
- ;
- ; The CRC command may be of the following forms:
- ; CRC dir:afn,dir:afn1,... o
- ; CRCs are computed for the indicated sets of files in the indicated
- ; directories.
- ;
- ; The option characters (o) are none or more of the following:
- ; C -- Comment Output; add comments if output is to disk
- ; D -- Disk Output; send output to disk file CRCKLIST.CRC
- ; I -- Inspect and approve each rename
- ; P -- Printer Output
- ;
- ; Examples:
- ; CRC A1:MYFILE.*,B2:HELLO.TXT <-- Compute CRCs of files
- ; CRC *.* DC <-- CRCs of all files in
- ; current user/disk with
- ; disk output and comments
- ; CRC *.* DCI <-- As above, but inspect and
- ; approve files first
- ;
-
- FALSE EQU 0
- TRUE EQU NOT FALSE
-
- ESIZE EQU 16 ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
-
- EXT DIRFS ; DIRECTORY PROCESSOR
- EXT DIRPACK ; PACK DIRECTORY
- EXT FSIZE ; COMPUTE FILE SIZE
-
- EXT ZGPINS ; INIT BUFFERS
- EXT ZFNAME ; FILE NAME PROCESSOR
-
- EXT FO0$OPEN ; OPEN FILE FOR BYTE-ORIENTED OUTPUT
- EXT FO0$CLOSE ; CLOSE FILE
- EXT F0$PUT ; WRITE BYTE TO FILE
-
- EXT F$MAKE ; CREATE FILE
- EXT F$OPEN ; OPEN FILE
- EXT F$READ ; READ BLOCK FROM FILE
- EXT F$CLOSE ; CLOSE FILE
- EXT F$DELETE ; DELETE FILE
-
- EXT CONDIN ; CONDITIONAL INPUT
-
- EXT MA2HC ; MEMORY STORE OF A AS 2 HEX CHARS
- EXT MHLDC ; MEMORY STORE OF HL AS UP TO 5 DEC CHARS W/LEADING SP
-
- EXT BBLINE ; INPUT LINE EDITOR
- EXT INITFCB ; INIT FCB
- EXT BDOS ; BDOS ENTRY
- EXT RETUD ; RETURN CURRENT USER/DISK
- EXT PUTUD ; SAVE CURRENT USER/DISK
- EXT GETUD ; RESTORE CURRENT USER/DISK
- EXT LOGUD ; LOG INTO USER/DISK
- EXT MOVEB ; COPY ROUTINE
- EXT PRINT ; PRINT STRING PTED TO BY RET ADR
- EXT LOUT ; LST: OUTPUT ROUTINE
- EXT COUT ; CONSOLE OUTPUT ROUTINE
- EXT CIN ; CONSOLE INPUT ROUTINE
- EXT CAPS ; CAPITALIZE ROUTINE
- EXT CRLF ; NEW LINE ROUTINE
- EXT CODEND ; CODE END COMPUTATION ROUTINE
-
- ;
- ; CP/M EQUATES
- ;
- CPM EQU 0 ; WARM BOOT
- FCB EQU 5CH ; FCB
- TBUFF EQU 80H ; INPUT LINE BUFFER
- CR EQU 13 ; <CR>
- LF EQU 10 ; <LF>
- CTRLC EQU 3 ; ^C
-
- ;
- ; 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 0FFH ; MAX USER/DISK?
- UDREQD:
- DB 000H ; ALLOW USER/DISK CHANGE?
- PUREQD:
- DB 000H ; PRIVILEGED USER?
- CDREQD:
- DB 0FFH ; CURRENT INDIC AND DMA?
- NDREQD:
- DB 0FFH ; NAMED DIRECTORIES?
- Z2CLASS:
- DB 0 ; CLASS 0
- DB 'ZCPR2'
- DS 10 ; RESERVED
-
- ;
- ; END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
- ;
- ;******************************************************************
- ;
-
- ;
- ; DISK OUTPUT FCB
- ;
- DSKFCB:
- DB 0
- DB 'CRC ' ; FILE NAME
- DB 'CRC' ; FILE TYPE
- DS 4
- DS 16
- DS 4 ; 36 BYTES
-
- ;
- ; Start of Program
- ;
- START:
- LXI H,0 ; GET STACK PTR
- DAD SP
- SHLD STACK ; SAVE IT
- LXI SP,STACK ; SET SP
- CALL PUTUD ; SAVE CURRENT USER/DISK AWAY
- CALL RETUD ; GET CURRENT USER/DISK
- MOV A,B ; SAVE DISK
- STA DISK
- MOV A,C ; SAVE USER
- STA USER
-
- CALL ZGPINS ; INIT BUFFERS
- CALL PRINT
- DB 'CRC Version '
- DB VERS/10+'0','.',(VERS MOD 10)+'0',0
- LDA FCB+1 ; GET FIRST CHAR OF FILE NAME
- CPI ' ' ; NO FILE SPEC?
- JZ HELP
- CPI '/' ; OPTION CAUGHT?
- JNZ ECONT
-
- ; PRINT HELP INFORMATION
- HELP:
- CALL PRINT
- DB CR,LF,'CRC Command --'
- DB CR,LF,' CRC dir:afn1,dir:afn2,... o...'
- DB CR,LF,LF,'d is disk, u is user, and o is one or more option '
- DB 'letters.'
- DB CR,LF,'If one or more options are specified, the o MUST be '
- DB 'preceded by a space.'
- DB CR,LF,'Nothing is required, and wild cards (?,*) are '
- DB CR,LF,'permitted. o is optional, and valid options are -'
- DB CR,LF,' C -- Comment Mode (Allow user to comment each entry '
- DB 'on disk)'
- DB CR,LF,' D -- Disk Output (Send Output to Disk in file CRC.CRC'
- DB CR,LF,' I -- Inspect Mode (Give user approval option)'
- DB CR,LF,' P -- Printer Output'
- DB CR,LF,'dir: is a named directory or the form du:.'
- DB CR,LF,'If u is omitted, current user is assumed, as with d.'
- DB CR,LF,0
-
- ; RETURN TO OS
- RETURN:
- LHLD STACK ; GET OLD STACK
- SPHL ; SET IT
- RET
-
- ;
- ; SKIP UNTIL NON-BLANK
- ;
- SBLANK:
- MOV A,M ; LOOK FOR BLANK
- INX H ; PT TO NEXT
- CPI ' ' ; BLANK?
- JZ SBLANK
- DCX H ; BACK UP
- RET
-
- ;
- ; SKIP UNTIL BLANK OR EOL
- ;
- SNBLANK:
- MOV A,M ; GET CHAR
- INX H ; PT TO NEXT
- CPI ' ' ; BLANK?
- JZ SNB1
- ORA A ; EOL?
- JNZ SNBLANK
- SNB1:
- DCX H ; BACK UP
- RET
-
- ;
- ; PLACE ZERO AT END OF BUFFER
- ;
- ECONT:
- LXI H,TBUFF ; PT TO BUFFER
- MOV A,M ; GET COUNT
- INX H ; PT TO FIRST CHAR
- ADD L ; PT TO END OF BUFFER
- MOV L,A
- MOV A,H
- ACI 0
- MOV H,A
- MVI M,0
-
- ; COPY BUFFER INTO TEMP BUFFER
- LXI H,TBUFF ; PT TO BUFFER
- MOV B,M ; GET CHAR COUNT
- INX H ; PT TO FIRST CHAR
- INR B ; ADD ENDING 0
- LXI D,CMDLNE ; PT TO CMDLNE BUFFER
- CALL MOVEB ; COPY INTO COMMAND LINE BUFFER
-
- ; EXTRACT FLAGS IF PRESENT
- XRA A ; A=0
- STA INSPECT ; SET NO INSPECT
- STA COMMENT ; SET NO COMMENT MODE
- STA PRTOUT ; SET NO PRINTER OUTPUT
- STA DSKOUT ; SET NO DISK OUTPUT
- LXI H,0 ; SET FILE COUNT
- SHLD FILECNT
- LXI H,CMDLNE ; PT TO BUFFER
- ;
- ; SKIP TO FILE NAME STRING
- ;
- CALL SBLANK ; SKIP OVER BLANKS
- ;
- ; SKIP TO END OF FILE NAME STRING
- ;
- CALL SNBLANK ; SKIP OVER NON-BLANKS
- ;
- ; CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
- ;
- OPT:
- CPI '/' ; OPTION CHAR?
- JNZ OPTION
- INX H ; SKIP SLASH
- ; PROCESS LIST OF OPTIONS
- OPTION:
- MOV A,M ; GET BYTE
- ORA A ; DONE?
- JZ DSPEC
- INX H ; PT TO NEXT CHAR
- CPI ' ' ; SKIP OVER SPACES
- JZ OPTION
- CPI '/' ; IF OPTION LETTER, OBVIOUS ERROR, SO HELP
- JZ HELP
- CPI 'P' ; PRINTER OUTPUT?
- JZ OPTPRT
- CPI 'C' ; COMMENT?
- JZ OPTCMT
- CPI 'I' ; INSPECT?
- JZ OPTINS
- CPI 'D' ; DISK OUTPUT?
- JNZ HELP
- MVI A,0FFH ; DISK OUTPUT
- STA DSKOUT
- JMP OPTION
- OPTPRT:
- MVI A,0FFH ; PRINTER OUTPUT
- STA PRTOUT
- JMP OPTION
- OPTCMT:
- MVI A,0FFH ; COMMENT MODE
- STA COMMENT
- JMP OPTION
- OPTINS:
- MVI A,0FFH ; INSPECT
- STA INSPECT
- JMP OPTION
-
- ;
- ; EXTRACT DISK, USER, AND FILE NAME INFORMATION
- ;
- DSPEC:
- LDA DSKOUT ; DISK OUTPUT?
- ORA A ; Z=NO
- JZ DSPEC0
- LXI D,DSKFCB ; OUTPUT FCB
- CALL INITFCB ; CLEAR FCB
- CALL F$DELETE ; DELETE FILE
- CALL INITFCB ; CLEAR FCB
- CALL F$MAKE ; CREATE FILE
- CALL FO0$OPEN ; OPEN FILE
- DSPEC0:
- LXI H,CMDLNE ; PT TO FIRST BYTE
- CALL SBLANK ; SKIP TO NON-BLANK
- ;
- ; MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
- ; HL PTS TO FIRST BYTE OF NEXT FILE SPEC
- ;
- DSPEC1:
- CALL GETUD ; RESET USER IF NECESSARY
- LXI D,NTFCB ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
-
- CALL ZFNAME ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
- JZ DERR ; ERROR HANDLER
-
- SHLD NEXTCH ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
- MOV A,B ; SAVE POSSIBLE DRIVE SPEC
- CPI 0FFH ; CURRENT DISK?
- JZ DSPEC2
- LDA MDISK ; GET MAX DISK NUMBER
- DCR B ; ADJUST TO WITHIN BOUNDS 0-15
- CMP B ; WITHIN BOUNDS?
- MOV A,B ; GET DISK NUMBER IN A
- JNC USPEC
- DERR:
- CALL PRINT
- DB CR,LF,'Invalid Drive or User Specification',0
- JMP DRETURN
-
- ;
- ; SET CURRENT DISK
- ;
- DSPEC2:
- LDA DISK ;GET CURRENT DISK
- MOV B,A ;... IN B
-
- ; CHECK FOR USER NUMBER
- USPEC:
- MOV A,C ; GET NEW USER NUMBER
- CPI 0FFH ; DEFAULT USER?
- JZ USPEC1
- CPI '?' ; ALL USERS NOT ALLOWED?
- JZ UERR
- LDA MUSER ; GET MAX USER NUMBER
- CMP C
- MOV A,C ; USER NUMBER IN A
- JNC FCT
- UERR:
- CALL PRINT
- DB CR,LF,'Invalid User Number',0
- JMP DRETURN
- USPEC1:
- LDA USER ;GET CURRENT USER
- MOV C,A ;... IN C
-
- ;
- ; LOAD DIRECTORY AND PERFORM FUNCTION
- ;
- FCT:
- MOV A,B ; SAVE NEW DISK/USER AWAY
- STA CDISK ; CURRENT DISK
- MOV A,C
- STA CUSER ; CURRENT USER
- CALL LOGUD ; LOG INTO ACCOUNT
- CALL CODEND ; PT TO END OF CODE
- CALL RETUD ; GET USER NUMBER FOR DIRFS
- MVI A,11000000B ; SELECT SYS AND NON-SYS FILES
- ORA C ; OR IN USER NUMBER
- LXI D,NTFCB ; PT TO FCB
- CALL INITFCB ; INIT THE FCB
- CALL DIRFS ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
- CALL ICHECK ; CHECK FOR INSPECT OPTION AND INSPECT IF SET
- CALL GETUD ; RETURN TO BASE USER/DISK
-
- ;
- ; PERFORM FUNCTION; HL PTS TO FILE AND BC CONTAINS NUMBER OF FILES
- ;
- FCTL:
- MOV A,B ; CHECK FOR COMPLETION (COUNT = 0)
- ORA C
- JZ FCTL1
- DCX B ; COUNT DOWN
- PUSH H ; SAVE PTR AND COUNT
- PUSH B
- CALL FUNCTION ; PERFORM FUNCTION
- POP B ; GET COUNT AND PTR
- POP H
- LXI D,ESIZE ; PT TO NEXT ENTRY
- DAD D
- JMP FCTL
-
- ;
- ; CHECK FOR NEXT FILE SPEC
- ;
- FCTL1:
- LHLD NEXTCH ; GET PTR
- MOV A,M ; GET DELIM
- CPI ',' ; ANOTHER FILE?
- JNZ DRETURN
- INX H ; PT TO CHAR AFTER COMMA
- JMP DSPEC1 ; CONTINUE PROCESSING
-
- ;
- ; FUNCTION COMPLETE -- EXIT
- ;
- DRETURN:
- CALL DCRLF ; NEW LINE
- LDA DSKOUT ; DISK OUTPUT USED?
- ORA A ; NZ=YES
- CNZ FO0$CLOSE ; CLOSE FILE
- JMP RETURN
-
- ;
- ; EMERGENCY ABORT
- ;
- ABORT:
- CALL PRINT
- DB CR,LF,'** CRC Abort **',CR,LF,0
- CALL GETUD ; RETURN HOME
- JMP DRETURN
-
- ;
- ; FUNCTION -- COMPUTE CRCS OF SELECTED FILES
- ;
- FUNCTION:
-
- ;
- ; PRINT FILE NAME
- ;
- CRCLP:
- CALL DCRLF ;NEW LINE
- PUSH H ;SAVE PTR
- LHLD FILECNT ; INCREMENT FILE COUNT
- INX H
- SHLD FILECNT
- CALL DVAL ;OUTPUT DECIMAL VALUE
- POP H ;GET PTR
- CALL DPRINT
- DB ' File: ',0
- CALL PRFN ; PRINT FILE NAME
- CALL DPRINT
- DB ' -- Size: ',0
- CALL FSIZE ; COMPUTE SIZE IN DE
- XCHG ; HL=SIZE
- CALL DVAL ; OUTPUT VALUE
- MVI A,'K' ; OUTPUT K
- CALL DOUT
- XCHG ; HL = PTR TO FIRST BYTE OF FILE FCB PART
- LXI D,CRCFCB ; COPY INTO FCB
- MVI B,12 ; 12 BYTES
- CALL MOVEB
- XRA A ; ZERO FIRST BYTE
- STAX D ; SELECT CURRENT DISK OF CRCFCB
-
- ;
- ; TEST FOR COMMENT AND DISK OUTPUT, AND ACCEPT COMMENT IF SET
- ;
- CTEST:
- LDA COMMENT ; GET FLAG
- MOV B,A ; ... IN B
- LDA DSKOUT ; GET FLAG
- ANA B ; AND
- JZ DOIT ; NO COMMENT IF ONE OR THE OTHER IS ZERO
- CALL PRINT
- DB CR,LF,' Comment? ',0
- XRA A ; DON'T CAPITALIZE
- CALL BBLINE ; GET LINE FROM USER
- CALL CRLF ; NEW LINE
- LXI D,CMTLNE ; COPY INTO COMMENT LINE BUFFER FOR NOW
- CTEST1:
- MOV A,M ; GET CHAR
- STAX D ; PUT CHAR
- ORA A ; END?
- JZ DOIT
- INX H ; PT TO NEXT
- INX D
- JMP CTEST1
-
- ;
- ; PRINT FILE NAME PTED TO BY HL
- ; OUTPUT TO CON: AND OPTIONALLY DISK
- ;
- PRFN:
- PUSH H ; SAVE PTR
- INX H ; PT TO FILE NAME
- MVI B,8 ; PRINT NAME
- CALL PRNT
- MVI A,'.' ; DECIMAL
- CALL DOUT
- MVI B,3 ; PRINT TYPE
- CALL PRNT
- POP H ; GET PTR
- RET
-
- ;
- ; PRINT CHARS PTED TO BY HL FOR B BYTES
- ; OUTPUT TO CON: AND OPTIONALLY DISK
- ;
- PRNT:
- MOV A,M ; GET CHAR
- CALL DOUT
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ PRNT
- RET
-
- ;
- ; PRINT FILE NAME PTED TO BY HL
- ; OUTPUT TO CON:
- ;
- PRFNC:
- PUSH H ; SAVE PTR
- INX H ; PT TO FILE NAME
- MVI B,8 ; PRINT NAME
- CALL PRNTC
- MVI A,'.' ; DECIMAL
- CALL COUT
- MVI B,3 ; PRINT TYPE
- CALL PRNTC
- POP H ; GET PTR
- RET
-
- ;
- ; PRINT CHARS PTED TO BY HL FOR B BYTES
- ; OUTPUT TO CON:
- ;
- PRNTC:
- MOV A,M ; GET CHAR
- CALL COUT
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ PRNTC
- RET
-
- ;
- ; CHECK FOR INSPECT OPTION AND INSPECT FILES IF SET
- ; FIRST FILE PTED TO BY HL, COUNT IN BC
- ;
- ICHECK:
- LDA INSPECT ; INSPECT?
- ORA A ; 0=NO
- RZ
- CALL PRINT
- DB CR,LF,CR,LF,'** File Inspection **',0
- PUSH H ; SAVE POINTER TO FIRST FILE
- PUSH B ; SAVE FILE COUNT
- ICKL:
- PUSH B ; SAVE COUNT
- CALL CRLF ; NEW LINE
- CALL PRFNC ; PRINT FILE NAME TO CONSOLE ONLY
- CALL CRCQ ; CRC QUESTION
- POP B ; GET COUNT
- CPI 'S' ; SKIP REST?
- JZ ISKIP
- CPI 'Q' ; QUIT?
- JZ QUIT
- CPI 'N' ; NO?
- JZ NODO
- CALL PRINT
- DB ' Selected',0
- MOV A,M ; GET BYTE
- ORI 80H ; SET MSB
- MOV M,A ; PUT BYTE
- JMP ICKNXT
-
- ; DON'T CRC FILE
- NODO:
- CALL PRINT
- DB ' NOT Selected',0
-
- ; CONTINUE SCAN OF FILES
- ICKNXT:
- LXI D,16 ; SIZE OF FILE ENTRY
- DAD D ; PT TO NEXT ENTRY
- DCX B ; COUNT DOWN
- MOV A,B ; DONE?
- ORA C
- JNZ ICKL
- ISKIP:
- POP B ; RESTORE ORIGINAL COUNT
- POP H ; RESTORE PTR TO FIRST FILE
- CALL DIRPACK ; PACK DIRECTORY BASED ON SELECTION
- CALL PRINT
- DB CR,LF,'** Inspection Complete **',CR,LF,0
- RET
-
- ;
- ; PROMPT USER FOR INSPECT
- ;
- CRCQ:
- CALL PRINT ; PRINT PROMPT
- DB ' -- Select (Y/N/S=Skip Rest/Q=Quit/other=Y)? ',0
- CALL CIN ; GET RESPONSE
- CALL CAPS ; CAPITALIZE
- CALL COUT ; ECHO
- RET
-
- ;
- ; QUIT CRC PROGRAM
- ;
- QUIT:
- CALL PRINT
- DB ' Quit to ZCPR2',0
- JMP DRETURN
-
- ;
- ; COMPUTE CRC; NAME IN CRCFCB
- ;
- DOIT:
- LDA CDISK ; LOG INTO PROPER DISK AND USER
- MOV B,A
- LDA CUSER
- MOV C,A
- CALL LOGUD
- CALL CRCCLR ; CLEAR CRC ACCUMULATOR
- LXI D,CRCFCB ; PT TO FCB
- CALL INITFCB ; INIT IT
- CALL F$OPEN ; OPEN IT FOR INPUT
- DOITL:
- CALL F$READ ; READ BLOCK INTO TBUFF
- ORA A ; ERROR?
- JNZ DOITD ; DONE IF SO
- CALL CONDIN ; CHECK FOR ABORT
- JZ DOITL0
- CPI CTRLC ; ABORT?
- JZ ABORT ; QUICK ABORT
- DOITL0:
- LXI H,TBUFF ; PT TO FIRST BYTE
- MVI B,128 ; 128 BYTES
- DOITL1:
- MOV A,M ; GET BYTE
- CALL CRCUPD ; UPDATE CRC
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ DOITL1
- JMP DOITL ; CONTINUE THRU FILE
- DOITD:
- CALL GETUD ; RETURN TO HOME DIRECTORY
- CALL DPRINT
- DB ' -- CRC: ',0
- CALL CRCDONE ; RETURN CRC IN HL
- CALL HVAL ; PRINT VALUE AS HEX
- LDA COMMENT ; CHECK FOR DISK AND COMMENT AND OUTPUT IF SO
- MOV B,A ; FLAG IN B
- LDA DSKOUT
- ANA B ; ZERO IF ONE NOT SELECTED
- RZ ; DONE IF ONE NOT SELECTED
- CALL DPRINT
- DB CR,LF,' Comment: ',0
- LXI H,CMTLNE ; OUTPUT COMMENT LINE
- CMTLP:
- MOV A,M ; GET CHAR
- ORA A ; EOL?
- RZ ; EXIT WHEN DONE
- CALL DOUT ; OUTPUT CHAR
- INX H ; PT TO NEXT
- JMP CMTLP
-
- ;
- ; OUTPUT CHAR TO CONSOLE AND OPTIONALLY PRINTER OR DISK
- ;
- DOUT:
- PUSH PSW ; SAVE CHAR
- PUSH B ; SAVE BC
- MOV B,A ; CHAR IN B
- CALL COUT ; OUTPUT TO CONSOLE
- LDA PRTOUT ; PRINTER OUTPUT?
- ORA A ; Z=NO
- JZ DOUT1
- MOV A,B ; GET CHAR
- CALL LOUT ; OUTPUT TO PRINTER
- DOUT1:
- LDA DSKOUT ; DISK OUTPUT?
- ORA A ; Z=NO
- JZ DOUT2
- MOV A,B ; GET CHAR
- CALL F0$PUT ; OUTPUT TO DISK
- DOUT2:
- POP B ; RESTORE REGS
- POP PSW
- RET
-
- ;
- ; OUTPUT CHARS PTED TO BY RET ADR TO CONSOLE AND DISK OR PRINTER
- ;
- DPRINT:
- XTHL ; GET PTR AND SAVE HL AT SAME TIME
- DPRL:
- MOV A,M ; GET CHAR
- INX H ; PT TO NEXT
- ORA A ; END?
- JZ DPRL1
- CALL DOUT ; OUTPUT IT
- JMP DPRL
- DPRL1:
- XTHL ; SET RET ADR AND RESTORE HL
- RET
-
- ;
- ; NEW LINE TO ALL
- ;
- DCRLF:
- PUSH PSW ; SAVE PSW
- MVI A,CR ; NEW LINE
- CALL DOUT
- MVI A,LF
- CALL DOUT
- POP PSW ; RESTORE PSW
- RET
-
- ;
- ; OUTPUT VALUE IN HL TO ALL IN HEX
- ;
- HVAL:
- PUSH H ; SAVE HL
- PUSH D ; SAVE DE
- LXI D,NUMBUF ; PT TO NUMBER BUFFER
- MOV A,H
- CALL MA2HC ; OUTPUT IN HEX
- MVI A,' ' ; STORE SPACE
- STAX D
- INX D ; PT TO NEXT
- MOV A,L
- CALL MA2HC
- JMP DVAL0
-
- ;
- ; OUTPUT HL AS UP TO 5 DECIMAL DIGITS TO ALL
- ;
- DVAL:
- PUSH H ; SAVE REGS
- PUSH D
- LXI D,NUMBUF ; PT TO BUFFER
- CALL MHLDC ; OUTPUT IN DECIMAL
- DVAL0:
- LXI H,NUMBUF ; PT TO BUFFER
- MVI D,5 ; 5 CHARS
- DVAL1:
- MOV A,M ; GET CHAR
- INX H ; PT TO NEXT
- CALL DOUT ; OUTPUT IT
- DCR D ; COUNT DOWN
- JNZ DVAL1
- POP D ; RESTORE REGS
- POP H
- RET
-
- ;
- ; **** START OF CRC ROUTINES ****
- ;
-
- ;
- ; CRCCLR -- Clear CRC Accumulator
- ;
- ; No Registers are Affected
- ;
- CRCCLR:
- PUSH H ;SAVE HL
- LXI H,0 ;INIT TO ZERO
- SHLD CRCACC
- POP H
- RET
-
- ;
- ; CRCDONE -- Return the CRC Value in HL
- ;
- CRCDONE:
- LHLD CRCACC ;GET VALUE
- RET
-
- ;
- ; CRCUPD -- Update CRC Accumulator
- ;
- ;An 8080 routine for generating a CYCLIC-REDUNDANCY-CHECK.
- ;Adapted from Keith Petersen's CRCK 4.2 program.
- ;By Fred Gutman.
- ;From 'EDN' magazine, June 5, 1979 issue, page 84.
- ;
- ; Byte to be updated is passed in A
- ; No Registers are Affected
- ;
- CRCUPD:
- PUSH H ;SAVE HL
- PUSH B ;SAVE BC
- PUSH PSW ;SAVE BYTE TO UPDATE
- MOV B,A ;BYTE IN B
- LHLD CRCACC ;GET REMAINDER
- MOV A,H
- ANI 128 ;Q-BIT MASK
- PUSH PSW ;SAVE STATUS
- DAD H ;2 X R(X)
- MOV A,B ;GET BYTE
- ADD L
- MOV L,A
- POP PSW
- JZ CRCU1 ;IF Q-BIT IS ZERO
- ;
- MOV A,H
- XRI 0A0H ;MS HALF OF GEN. POLY
- MOV H,A
- MOV A,L
- XRI 97H ;LS HALF OF GEN. POLY
- MOV L,A
- ;
- CRCU1:
- SHLD CRCACC ;SAVE RESULT
- POP PSW ;RESTORE REGS
- POP B
- POP H
- RET
-
- ;
- ; CRC Accumulator
- ;
- CRCACC:
- DS 2 ;2 BYTES
-
- ;
- ; **** END OF CRC ROUTINES ****
- ;
-
- ;
- ; BUFFERS
- ;
- INSPECT:
- DS 1 ; INSPECT FLAG (0=NO, 0FFH=YES)
- COMMENT:
- DS 1 ; CONTROL FLAG (0=NO, 0FFH=YES)
- DSKOUT:
- DS 1 ; DISK OUTPUT (0=NO, 0FFH=YES)
- PRTOUT:
- DS 1 ; PRINTER OUTPUT (0=NO, 0FFH=YES)
- DISK:
- DS 1 ; HOME DISK NUMBER
- USER:
- DS 1 ; HOME USER NUMBER
- CDISK:
- DS 1 ; CURRENT DISK NUMBER
- CUSER:
- DS 1 ; CURRENT USER NUMBER
- NEXTCH:
- DS 2 ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
- FILECNT:
- DS 2 ; COUNT OF NUMBER OF FILES RENAMED
- NUMBUF:
- DS 5 ; NUMBER STORAGE BUFFER
- CRCFCB:
- DS 36 ; FCB FOR CRC
- NTFCB:
- DS 36 ; FCB FOR NEW FILE
- CMTLNE:
- DS 256 ; COMMENT LINE BUFFER
- CMDLNE:
- DS 256 ; ALLOW MAX SIZE OF COMMAND LINE
- DS 100 ; STACK AREA
- STACK:
- DS 2 ; OLD STACK PTR
-
- END
-