home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / zcpr2 / crc.mqc / CRC.MAC
Text File  |  1985-02-09  |  20KB  |  968 lines

  1. ;
  2. ;  PROGRAM:  CRC
  3. ;  VERSION:  2.0
  4. ;  DATE:  16 Jan 83
  5. ;  AUTHOR:  RICHARD CONN
  6. ;  PREVIOUS VERSIONS:  1.2 (6 Jan 83), 1.1 (1 Jan 83), 1.0 (12 Dec 82)
  7. ;
  8. VERS    equ    20
  9.  
  10. ;
  11. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  12. ;    All Rights Reserved
  13. ;
  14. ;    ZCPR2 and its utilities, including this one, are released
  15. ; to the public domain.  Anyone who wishes to USE them may do so with
  16. ; no strings attached.  The author assumes no responsibility or
  17. ; liability for the use of ZCPR2 and its utilities.
  18. ;
  19. ;    The author, Richard Conn, has sole rights to this program.
  20. ; ZCPR2 and its utilities may not be sold without the express,
  21. ; written permission of the author.
  22. ;
  23.  
  24.  
  25. ;
  26. ;  CRC Command --
  27. ;    CRC is used to compute the CRC of one or more files.  CRC
  28. ; permits ambiguous file names and supports an Inspect mode that
  29. ; allows the user to confirm each file before the computation is done.
  30. ; Additionally, there is a Disk Output Mode which allows the user to send
  31. ; the output from the operation to disk as well as to his screen with optional
  32. ; comments.
  33. ;
  34. ;    The CRC command may be of the following forms:
  35. ;        CRC dir:afn,dir:afn1,... o
  36. ;    CRCs are computed for the indicated sets of files in the indicated
  37. ; directories.
  38. ;
  39. ;    The option characters (o) are none or more of the following:
  40. ;        C -- Comment Output; add comments if output is to disk
  41. ;        D -- Disk Output; send output to disk file CRCKLIST.CRC
  42. ;        I -- Inspect and approve each rename
  43. ;        P -- Printer Output
  44. ;
  45. ;    Examples:
  46. ;        CRC A1:MYFILE.*,B2:HELLO.TXT    <-- Compute CRCs of files
  47. ;        CRC *.* DC            <-- CRCs of all files in
  48. ;                            current user/disk with
  49. ;                            disk output and comments
  50. ;        CRC *.* DCI            <-- As above, but inspect and
  51. ;                            approve files first
  52. ;
  53.  
  54. FALSE    EQU    0
  55. TRUE    EQU    NOT FALSE
  56.  
  57. ESIZE    EQU    16    ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
  58.  
  59.     EXT    DIRFS    ; DIRECTORY PROCESSOR
  60.     EXT    DIRPACK    ; PACK DIRECTORY
  61.     EXT    FSIZE    ; COMPUTE FILE SIZE
  62.  
  63.     EXT    ZGPINS    ; INIT BUFFERS
  64.     EXT    ZFNAME    ; FILE NAME PROCESSOR
  65.  
  66.     EXT    FO0$OPEN    ; OPEN FILE FOR BYTE-ORIENTED OUTPUT
  67.     EXT    FO0$CLOSE    ; CLOSE FILE
  68.     EXT    F0$PUT        ; WRITE BYTE TO FILE
  69.  
  70.     EXT    F$MAKE    ; CREATE FILE
  71.     EXT    F$OPEN    ; OPEN FILE
  72.     EXT    F$READ    ; READ BLOCK FROM FILE
  73.     EXT    F$CLOSE    ; CLOSE FILE
  74.     EXT    F$DELETE    ; DELETE FILE
  75.  
  76.     EXT    CONDIN    ; CONDITIONAL INPUT
  77.  
  78.     EXT    MA2HC    ; MEMORY STORE OF A AS 2 HEX CHARS
  79.     EXT    MHLDC    ; MEMORY STORE OF HL AS UP TO 5 DEC CHARS W/LEADING SP
  80.  
  81.     EXT    BBLINE    ; INPUT LINE EDITOR
  82.     EXT    INITFCB    ; INIT FCB
  83.     EXT    BDOS    ; BDOS ENTRY
  84.     EXT    RETUD    ; RETURN CURRENT USER/DISK
  85.     EXT    PUTUD    ; SAVE CURRENT USER/DISK
  86.     EXT    GETUD    ; RESTORE CURRENT USER/DISK
  87.     EXT    LOGUD    ; LOG INTO USER/DISK
  88.     EXT    MOVEB    ; COPY ROUTINE
  89.     EXT    PRINT    ; PRINT STRING PTED TO BY RET ADR
  90.     EXT    LOUT    ; LST: OUTPUT ROUTINE
  91.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  92.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  93.     EXT    CAPS    ; CAPITALIZE ROUTINE
  94.     EXT    CRLF    ; NEW LINE ROUTINE
  95.     EXT    CODEND    ; CODE END COMPUTATION ROUTINE
  96.  
  97. ;
  98. ;  CP/M EQUATES
  99. ;
  100. CPM    EQU    0    ; WARM BOOT
  101. FCB    EQU    5CH    ; FCB
  102. TBUFF    EQU    80H    ; INPUT LINE BUFFER
  103. CR    EQU    13    ; <CR>
  104. LF    EQU    10    ; <LF>
  105. CTRLC    EQU    3    ; ^C
  106.  
  107. ;
  108. ;  Branch to Start of Program
  109. ;
  110.     JMP    START
  111.  
  112. ;
  113. ;******************************************************************
  114. ;
  115. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  116. ;
  117. ;    This data block precisely defines the data format for
  118. ; initial features of a ZCPR2 system which are required for proper
  119. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  120. ;
  121.  
  122. ;
  123. ;  EXTERNAL PATH DATA
  124. ;
  125. EPAVAIL:
  126.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  127. EPADR:
  128.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  129.  
  130. ;
  131. ;  INTERNAL PATH DATA
  132. ;
  133. INTPATH:
  134.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  135.             ; DISK = 1 FOR A, '$' FOR CURRENT
  136.             ; USER = NUMBER, '$' FOR CURRENT
  137.     DB    0,0
  138.     DB    0,0
  139.     DB    0,0
  140.     DB    0,0
  141.     DB    0,0
  142.     DB    0,0
  143.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  144.     DB    0    ; END OF PATH
  145.  
  146. ;
  147. ;  MULTIPLE COMMAND LINE BUFFER DATA
  148. ;
  149. MCAVAIL:
  150.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  151. MCADR:
  152.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  153.  
  154. ;
  155. ;  DISK/USER LIMITS
  156. ;
  157. MDISK:
  158.     DB    4    ; MAXIMUM NUMBER OF DISKS
  159. MUSER:
  160.     DB    31    ; MAXIMUM USER NUMBER
  161.  
  162. ;
  163. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  164. ;
  165. DOK:
  166.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  167. UOK:
  168.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  169.  
  170. ;
  171. ;  PRIVILEGED USER DATA
  172. ;
  173. PUSER:
  174.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  175. PPASS:
  176.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  177.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  178.  
  179. ;
  180. ;  CURRENT USER/DISK INDICATOR
  181. ;
  182. CINDIC:
  183.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  184.  
  185. ;
  186. ;  DMA ADDRESS FOR DISK TRANSFERS
  187. ;
  188. DMADR:
  189.     DW    80H    ; TBUFF AREA
  190.  
  191. ;
  192. ;  NAMED DIRECTORY INFORMATION
  193. ;
  194. NDRADR:
  195.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  196. NDNAMES:
  197.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  198. DNFILE:
  199.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  200.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  201.  
  202. ;
  203. ;  REQUIREMENTS FLAGS
  204. ;
  205. EPREQD:
  206.     DB    0FFH    ; EXTERNAL PATH?
  207. MCREQD:
  208.     DB    000H    ; MULTIPLE COMMAND LINE?
  209. MXREQD:
  210.     DB    0FFH    ; MAX USER/DISK?
  211. UDREQD:
  212.     DB    000H    ; ALLOW USER/DISK CHANGE?
  213. PUREQD:
  214.     DB    000H    ; PRIVILEGED USER?
  215. CDREQD:
  216.     DB    0FFH    ; CURRENT INDIC AND DMA?
  217. NDREQD:
  218.     DB    0FFH    ; NAMED DIRECTORIES?
  219. Z2CLASS:
  220.     DB    0    ; CLASS 0
  221.     DB    'ZCPR2'
  222.     DS    10    ; RESERVED
  223.  
  224. ;
  225. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  226. ;
  227. ;******************************************************************
  228. ;
  229.  
  230. ;
  231. ;  DISK OUTPUT FCB
  232. ;
  233. DSKFCB:
  234.     DB    0
  235.     DB    'CRC     '    ; FILE NAME
  236.     DB    'CRC'        ; FILE TYPE
  237.     DS    4
  238.     DS    16
  239.     DS    4    ; 36 BYTES
  240.  
  241. ;
  242. ;  Start of Program
  243. ;
  244. START:
  245.     LXI    H,0    ; GET STACK PTR
  246.     DAD    SP
  247.     SHLD    STACK    ; SAVE IT
  248.     LXI    SP,STACK    ; SET SP
  249.     CALL    PUTUD    ; SAVE CURRENT USER/DISK AWAY
  250.     CALL    RETUD    ; GET CURRENT USER/DISK
  251.     MOV    A,B    ; SAVE DISK
  252.     STA    DISK
  253.     MOV    A,C    ; SAVE USER
  254.     STA    USER
  255.  
  256.     CALL    ZGPINS    ; INIT BUFFERS
  257.     CALL    PRINT
  258.     DB    'CRC  Version '
  259.     DB    VERS/10+'0','.',(VERS MOD 10)+'0',0
  260.     LDA    FCB+1    ; GET FIRST CHAR OF FILE NAME
  261.     CPI    ' '    ; NO FILE SPEC?
  262.     JZ    HELP
  263.     CPI    '/'    ; OPTION CAUGHT?
  264.     JNZ    ECONT
  265.  
  266. ;  PRINT HELP INFORMATION
  267. HELP:
  268.     CALL    PRINT
  269.     DB    CR,LF,'CRC Command --'
  270.     DB    CR,LF,'    CRC dir:afn1,dir:afn2,... o...'
  271.     DB    CR,LF,LF,'d is disk, u is user, and o is one or more option '
  272.     DB    'letters.'
  273.     DB    CR,LF,'If one or more options are specified, the o MUST be '
  274.     DB    'preceded by a space.'
  275.     DB    CR,LF,'Nothing is required, and wild cards (?,*) are '
  276.     DB    CR,LF,'permitted.  o is optional, and valid options are -'
  277.     DB    CR,LF,'    C -- Comment Mode (Allow user to comment each entry '
  278.     DB    'on disk)'
  279.     DB    CR,LF,'    D -- Disk Output (Send Output to Disk in file CRC.CRC'
  280.     DB    CR,LF,'    I -- Inspect Mode (Give user approval option)'
  281.     DB    CR,LF,'    P -- Printer Output'
  282.     DB    CR,LF,'dir: is a named directory or the form du:.'
  283.     DB    CR,LF,'If u is omitted, current user is assumed, as with d.'
  284.     DB    CR,LF,0
  285.  
  286. ;  RETURN TO OS
  287. RETURN:
  288.     LHLD    STACK    ; GET OLD STACK
  289.     SPHL        ; SET IT
  290.     RET
  291.  
  292. ;
  293. ;  SKIP UNTIL NON-BLANK
  294. ;
  295. SBLANK:
  296.     MOV    A,M    ; LOOK FOR BLANK
  297.     INX    H    ; PT TO NEXT
  298.     CPI    ' '    ; BLANK?
  299.     JZ    SBLANK
  300.     DCX    H    ; BACK UP
  301.     RET
  302.  
  303. ;
  304. ;  SKIP UNTIL BLANK OR EOL
  305. ;
  306. SNBLANK:
  307.     MOV    A,M    ; GET CHAR
  308.     INX    H    ; PT TO NEXT
  309.     CPI    ' '    ; BLANK?
  310.     JZ    SNB1
  311.     ORA    A    ; EOL?
  312.     JNZ    SNBLANK
  313. SNB1:
  314.     DCX    H    ; BACK UP
  315.     RET
  316.  
  317. ;
  318. ;  PLACE ZERO AT END OF BUFFER
  319. ;
  320. ECONT:
  321.     LXI    H,TBUFF    ; PT TO BUFFER
  322.     MOV    A,M    ; GET COUNT
  323.     INX    H    ; PT TO FIRST CHAR
  324.     ADD    L    ; PT TO END OF BUFFER
  325.     MOV    L,A
  326.     MOV    A,H
  327.     ACI    0
  328.     MOV    H,A
  329.     MVI    M,0
  330.  
  331. ;  COPY BUFFER INTO TEMP BUFFER
  332.     LXI    H,TBUFF    ; PT TO BUFFER
  333.     MOV    B,M    ; GET CHAR COUNT
  334.     INX    H    ; PT TO FIRST CHAR
  335.     INR    B    ; ADD ENDING 0
  336.     LXI    D,CMDLNE    ; PT TO CMDLNE BUFFER
  337.     CALL    MOVEB    ; COPY INTO COMMAND LINE BUFFER
  338.  
  339. ;  EXTRACT FLAGS IF PRESENT
  340.     XRA    A    ; A=0
  341.     STA    INSPECT    ; SET NO INSPECT
  342.     STA    COMMENT    ; SET NO COMMENT MODE
  343.     STA    PRTOUT    ; SET NO PRINTER OUTPUT
  344.     STA    DSKOUT    ; SET NO DISK OUTPUT
  345.     LXI    H,0    ; SET FILE COUNT
  346.     SHLD    FILECNT
  347.     LXI    H,CMDLNE    ; PT TO BUFFER
  348. ;
  349. ;  SKIP TO FILE NAME STRING
  350. ;
  351.     CALL    SBLANK    ; SKIP OVER BLANKS
  352. ;
  353. ;  SKIP TO END OF FILE NAME STRING
  354. ;
  355.     CALL    SNBLANK    ; SKIP OVER NON-BLANKS
  356. ;
  357. ;  CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
  358. ;
  359. OPT:
  360.     CPI    '/'    ; OPTION CHAR?
  361.     JNZ    OPTION
  362.     INX    H    ; SKIP SLASH
  363. ;  PROCESS LIST OF OPTIONS
  364. OPTION:
  365.     MOV    A,M    ; GET BYTE
  366.     ORA    A    ; DONE?
  367.     JZ    DSPEC
  368.     INX    H    ; PT TO NEXT CHAR
  369.     CPI    ' '    ; SKIP OVER SPACES
  370.     JZ    OPTION
  371.     CPI    '/'    ; IF OPTION LETTER, OBVIOUS ERROR, SO HELP
  372.     JZ    HELP
  373.     CPI    'P'    ; PRINTER OUTPUT?
  374.     JZ    OPTPRT
  375.     CPI    'C'    ; COMMENT?
  376.     JZ    OPTCMT
  377.     CPI    'I'    ; INSPECT?
  378.     JZ    OPTINS
  379.     CPI    'D'    ; DISK OUTPUT?
  380.     JNZ    HELP
  381.     MVI    A,0FFH    ; DISK OUTPUT
  382.     STA    DSKOUT
  383.     JMP    OPTION
  384. OPTPRT:
  385.     MVI    A,0FFH    ; PRINTER OUTPUT
  386.     STA    PRTOUT
  387.     JMP    OPTION
  388. OPTCMT:
  389.     MVI    A,0FFH    ; COMMENT MODE
  390.     STA    COMMENT
  391.     JMP    OPTION
  392. OPTINS:
  393.     MVI    A,0FFH    ; INSPECT
  394.     STA    INSPECT
  395.     JMP    OPTION
  396.  
  397. ;
  398. ;  EXTRACT DISK, USER, AND FILE NAME INFORMATION
  399. ;
  400. DSPEC:
  401.     LDA    DSKOUT    ; DISK OUTPUT?
  402.     ORA    A    ; Z=NO
  403.     JZ    DSPEC0
  404.     LXI    D,DSKFCB    ; OUTPUT FCB
  405.     CALL    INITFCB        ; CLEAR FCB
  406.     CALL    F$DELETE    ; DELETE FILE
  407.     CALL    INITFCB        ; CLEAR FCB
  408.     CALL    F$MAKE        ; CREATE FILE
  409.     CALL    FO0$OPEN    ; OPEN FILE
  410. DSPEC0:
  411.     LXI    H,CMDLNE    ; PT TO FIRST BYTE
  412.     CALL    SBLANK    ; SKIP TO NON-BLANK
  413. ;
  414. ;  MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
  415. ;    HL PTS TO FIRST BYTE OF NEXT FILE SPEC
  416. ;
  417. DSPEC1:
  418.     CALL    GETUD    ; RESET USER IF NECESSARY
  419.     LXI    D,NTFCB    ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
  420.  
  421.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  422.     JZ    DERR    ; ERROR HANDLER
  423.  
  424.     SHLD    NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  425.     MOV    A,B    ; SAVE POSSIBLE DRIVE SPEC
  426.     CPI    0FFH    ; CURRENT DISK?
  427.     JZ    DSPEC2
  428.     LDA    MDISK    ; GET MAX DISK NUMBER
  429.     DCR    B    ; ADJUST TO WITHIN BOUNDS 0-15
  430.     CMP    B    ; WITHIN BOUNDS?
  431.     MOV    A,B    ; GET DISK NUMBER IN A
  432.     JNC    USPEC
  433. DERR:
  434.     CALL    PRINT
  435.     DB    CR,LF,'Invalid Drive or User Specification',0
  436.     JMP    DRETURN
  437.  
  438. ;
  439. ;  SET CURRENT DISK
  440. ;
  441. DSPEC2:
  442.     LDA    DISK    ;GET CURRENT DISK
  443.     MOV    B,A    ;... IN B
  444.  
  445. ;  CHECK FOR USER NUMBER
  446. USPEC:
  447.     MOV    A,C    ; GET NEW USER NUMBER
  448.     CPI    0FFH    ; DEFAULT USER?
  449.     JZ    USPEC1
  450.     CPI    '?'    ; ALL USERS NOT ALLOWED?
  451.     JZ    UERR
  452.     LDA    MUSER    ; GET MAX USER NUMBER
  453.     CMP    C
  454.     MOV    A,C    ; USER NUMBER IN A
  455.     JNC    FCT
  456. UERR:
  457.     CALL    PRINT
  458.     DB    CR,LF,'Invalid User Number',0
  459.     JMP    DRETURN
  460. USPEC1:
  461.     LDA    USER    ;GET CURRENT USER
  462.     MOV    C,A    ;... IN C
  463.  
  464. ;
  465. ;  LOAD DIRECTORY AND PERFORM FUNCTION
  466. ;
  467. FCT:
  468.     MOV    A,B    ; SAVE NEW DISK/USER AWAY
  469.     STA    CDISK    ; CURRENT DISK
  470.     MOV    A,C
  471.     STA    CUSER    ; CURRENT USER
  472.     CALL    LOGUD    ; LOG INTO ACCOUNT
  473.     CALL    CODEND    ; PT TO END OF CODE
  474.     CALL    RETUD    ; GET USER NUMBER FOR DIRFS
  475.     MVI    A,11000000B    ; SELECT SYS AND NON-SYS FILES
  476.     ORA    C    ; OR IN USER NUMBER
  477.     LXI    D,NTFCB    ; PT TO FCB
  478.     CALL    INITFCB    ; INIT THE FCB
  479.     CALL    DIRFS    ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
  480.     CALL    ICHECK    ; CHECK FOR INSPECT OPTION AND INSPECT IF SET
  481.     CALL    GETUD    ; RETURN TO BASE USER/DISK
  482.  
  483. ;
  484. ;  PERFORM FUNCTION; HL PTS TO FILE AND BC CONTAINS NUMBER OF FILES
  485. ;
  486. FCTL:
  487.     MOV    A,B        ; CHECK FOR COMPLETION (COUNT = 0)
  488.     ORA    C
  489.     JZ    FCTL1
  490.     DCX    B        ; COUNT DOWN
  491.     PUSH    H        ; SAVE PTR AND COUNT
  492.     PUSH    B
  493.     CALL    FUNCTION    ; PERFORM FUNCTION
  494.     POP    B        ; GET COUNT AND PTR
  495.     POP    H
  496.     LXI    D,ESIZE        ; PT TO NEXT ENTRY
  497.     DAD    D
  498.     JMP    FCTL
  499.  
  500. ;
  501. ;  CHECK FOR NEXT FILE SPEC
  502. ;
  503. FCTL1:
  504.     LHLD    NEXTCH    ; GET PTR
  505.     MOV    A,M    ; GET DELIM
  506.     CPI    ','    ; ANOTHER FILE?
  507.     JNZ    DRETURN
  508.     INX    H    ; PT TO CHAR AFTER COMMA
  509.     JMP    DSPEC1    ; CONTINUE PROCESSING
  510.  
  511. ;
  512. ;  FUNCTION COMPLETE -- EXIT
  513. ;
  514. DRETURN:
  515.     CALL    DCRLF    ; NEW LINE
  516.     LDA    DSKOUT    ; DISK OUTPUT USED?
  517.     ORA    A    ; NZ=YES
  518.     CNZ    FO0$CLOSE    ; CLOSE FILE
  519.     JMP    RETURN
  520.  
  521. ;
  522. ;  EMERGENCY ABORT
  523. ;
  524. ABORT:
  525.     CALL    PRINT
  526.     DB    CR,LF,'** CRC Abort **',CR,LF,0
  527.     CALL    GETUD    ; RETURN HOME
  528.     JMP    DRETURN
  529.  
  530. ;
  531. ;  FUNCTION -- COMPUTE CRCS OF SELECTED FILES
  532. ;
  533. FUNCTION:
  534.  
  535. ;
  536. ;  PRINT FILE NAME
  537. ;
  538. CRCLP:
  539.     CALL    DCRLF    ;NEW LINE
  540.     PUSH    H    ;SAVE PTR
  541.     LHLD    FILECNT        ; INCREMENT FILE COUNT
  542.     INX    H
  543.     SHLD    FILECNT
  544.     CALL    DVAL    ;OUTPUT DECIMAL VALUE
  545.     POP    H    ;GET PTR
  546.     CALL    DPRINT
  547.     DB    ' File: ',0
  548.     CALL    PRFN    ; PRINT FILE NAME
  549.     CALL    DPRINT
  550.     DB    ' -- Size: ',0
  551.     CALL    FSIZE    ; COMPUTE SIZE IN DE
  552.     XCHG        ; HL=SIZE
  553.     CALL    DVAL    ; OUTPUT VALUE
  554.     MVI    A,'K'    ; OUTPUT K
  555.     CALL    DOUT
  556.     XCHG        ; HL = PTR TO FIRST BYTE OF FILE FCB PART
  557.     LXI    D,CRCFCB    ; COPY INTO FCB
  558.     MVI    B,12    ; 12 BYTES
  559.     CALL    MOVEB
  560.     XRA    A    ; ZERO FIRST BYTE
  561.     STAX    D    ; SELECT CURRENT DISK OF CRCFCB
  562.  
  563. ;
  564. ;  TEST FOR COMMENT AND DISK OUTPUT, AND ACCEPT COMMENT IF SET
  565. ;
  566. CTEST:
  567.     LDA    COMMENT    ; GET FLAG
  568.     MOV    B,A    ; ... IN B
  569.     LDA    DSKOUT    ; GET FLAG
  570.     ANA    B    ; AND
  571.     JZ    DOIT    ; NO COMMENT IF ONE OR THE OTHER IS ZERO
  572.     CALL    PRINT
  573.     DB    CR,LF,'    Comment? ',0
  574.     XRA    A    ; DON'T CAPITALIZE
  575.     CALL    BBLINE    ; GET LINE FROM USER
  576.     CALL    CRLF    ; NEW LINE
  577.     LXI    D,CMTLNE    ; COPY INTO COMMENT LINE BUFFER FOR NOW
  578. CTEST1:
  579.     MOV    A,M    ; GET CHAR
  580.     STAX    D    ; PUT CHAR
  581.     ORA    A    ; END?
  582.     JZ    DOIT
  583.     INX    H    ; PT TO NEXT
  584.     INX    D
  585.     JMP    CTEST1
  586.  
  587. ;
  588. ;  PRINT FILE NAME PTED TO BY HL
  589. ;    OUTPUT TO CON: AND OPTIONALLY DISK
  590. ;
  591. PRFN:
  592.     PUSH    H    ; SAVE PTR
  593.     INX    H    ; PT TO FILE NAME
  594.     MVI    B,8    ; PRINT NAME
  595.     CALL    PRNT
  596.     MVI    A,'.'    ; DECIMAL
  597.     CALL    DOUT
  598.     MVI    B,3    ; PRINT TYPE
  599.     CALL    PRNT
  600.     POP    H    ; GET PTR
  601.     RET
  602.  
  603. ;
  604. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  605. ;    OUTPUT TO CON: AND OPTIONALLY DISK
  606. ;
  607. PRNT:
  608.     MOV    A,M    ; GET CHAR
  609.     CALL    DOUT
  610.     INX    H    ; PT TO NEXT
  611.     DCR    B    ; COUNT DOWN
  612.     JNZ    PRNT
  613.     RET
  614.  
  615. ;
  616. ;  PRINT FILE NAME PTED TO BY HL
  617. ;    OUTPUT TO CON:
  618. ;
  619. PRFNC:
  620.     PUSH    H    ; SAVE PTR
  621.     INX    H    ; PT TO FILE NAME
  622.     MVI    B,8    ; PRINT NAME
  623.     CALL    PRNTC
  624.     MVI    A,'.'    ; DECIMAL
  625.     CALL    COUT
  626.     MVI    B,3    ; PRINT TYPE
  627.     CALL    PRNTC
  628.     POP    H    ; GET PTR
  629.     RET
  630.  
  631. ;
  632. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  633. ;    OUTPUT TO CON:
  634. ;
  635. PRNTC:
  636.     MOV    A,M    ; GET CHAR
  637.     CALL    COUT
  638.     INX    H    ; PT TO NEXT
  639.     DCR    B    ; COUNT DOWN
  640.     JNZ    PRNTC
  641.     RET
  642.  
  643. ;
  644. ;  CHECK FOR INSPECT OPTION AND INSPECT FILES IF SET
  645. ;    FIRST FILE PTED TO BY HL, COUNT IN BC
  646. ;
  647. ICHECK:
  648.     LDA    INSPECT    ; INSPECT?
  649.     ORA    A    ; 0=NO
  650.     RZ
  651.     CALL    PRINT
  652.     DB    CR,LF,CR,LF,'** File Inspection **',0
  653.     PUSH    H    ; SAVE POINTER TO FIRST FILE
  654.     PUSH    B    ; SAVE FILE COUNT
  655. ICKL:
  656.     PUSH    B    ; SAVE COUNT
  657.     CALL    CRLF    ; NEW LINE
  658.     CALL    PRFNC    ; PRINT FILE NAME TO CONSOLE ONLY
  659.     CALL    CRCQ    ; CRC QUESTION
  660.     POP    B    ; GET COUNT
  661.     CPI    'S'    ; SKIP REST?
  662.     JZ    ISKIP
  663.     CPI    'Q'    ; QUIT?
  664.     JZ    QUIT
  665.     CPI    'N'    ; NO?
  666.     JZ    NODO
  667.     CALL    PRINT
  668.     DB    '    Selected',0
  669.     MOV    A,M    ; GET BYTE
  670.     ORI    80H    ; SET MSB
  671.     MOV    M,A    ; PUT BYTE
  672.     JMP    ICKNXT
  673.  
  674. ;  DON'T CRC FILE
  675. NODO:
  676.     CALL    PRINT
  677.     DB    '    NOT Selected',0
  678.  
  679. ;  CONTINUE SCAN OF FILES
  680. ICKNXT:
  681.     LXI    D,16    ; SIZE OF FILE ENTRY
  682.     DAD    D    ; PT TO NEXT ENTRY
  683.     DCX    B    ; COUNT DOWN
  684.     MOV    A,B    ; DONE?
  685.     ORA    C
  686.     JNZ    ICKL
  687. ISKIP:
  688.     POP    B    ; RESTORE ORIGINAL COUNT
  689.     POP    H    ; RESTORE PTR TO FIRST FILE
  690.     CALL    DIRPACK    ; PACK DIRECTORY BASED ON SELECTION
  691.     CALL    PRINT
  692.     DB    CR,LF,'** Inspection Complete **',CR,LF,0
  693.     RET
  694.  
  695. ;
  696. ;  PROMPT USER FOR INSPECT
  697. ;
  698. CRCQ:
  699.     CALL    PRINT    ; PRINT PROMPT
  700.     DB    ' -- Select (Y/N/S=Skip Rest/Q=Quit/other=Y)? ',0
  701.     CALL    CIN    ; GET RESPONSE
  702.     CALL    CAPS    ; CAPITALIZE
  703.     CALL    COUT    ; ECHO
  704.     RET
  705.  
  706. ;
  707. ;  QUIT CRC PROGRAM
  708. ;
  709. QUIT:
  710.     CALL    PRINT
  711.     DB    '    Quit to ZCPR2',0
  712.     JMP    DRETURN
  713.  
  714. ;
  715. ;  COMPUTE CRC; NAME IN CRCFCB
  716. ;
  717. DOIT:
  718.     LDA    CDISK        ; LOG INTO PROPER DISK AND USER
  719.     MOV    B,A
  720.     LDA    CUSER
  721.     MOV    C,A
  722.     CALL    LOGUD
  723.     CALL    CRCCLR        ; CLEAR CRC ACCUMULATOR
  724.     LXI    D,CRCFCB    ; PT TO FCB
  725.     CALL    INITFCB        ; INIT IT
  726.     CALL    F$OPEN        ; OPEN IT FOR INPUT
  727. DOITL:
  728.     CALL    F$READ        ; READ BLOCK INTO TBUFF
  729.     ORA    A        ; ERROR?
  730.     JNZ    DOITD        ; DONE IF SO
  731.     CALL    CONDIN        ; CHECK FOR ABORT
  732.     JZ    DOITL0
  733.     CPI    CTRLC        ; ABORT?
  734.     JZ    ABORT        ; QUICK ABORT
  735. DOITL0:
  736.     LXI    H,TBUFF        ; PT TO FIRST BYTE
  737.     MVI    B,128        ; 128 BYTES
  738. DOITL1:
  739.     MOV    A,M        ; GET BYTE
  740.     CALL    CRCUPD        ; UPDATE CRC
  741.     INX    H        ; PT TO NEXT
  742.     DCR    B        ; COUNT DOWN
  743.     JNZ    DOITL1
  744.     JMP    DOITL        ; CONTINUE THRU FILE
  745. DOITD:
  746.     CALL    GETUD        ; RETURN TO HOME DIRECTORY
  747.     CALL    DPRINT
  748.     DB    ' -- CRC: ',0
  749.     CALL    CRCDONE        ; RETURN CRC IN HL
  750.     CALL    HVAL        ; PRINT VALUE AS HEX
  751.     LDA    COMMENT        ; CHECK FOR DISK AND COMMENT AND OUTPUT IF SO
  752.     MOV    B,A        ; FLAG IN B
  753.     LDA    DSKOUT
  754.     ANA    B        ; ZERO IF ONE NOT SELECTED
  755.     RZ            ; DONE IF ONE NOT SELECTED
  756.     CALL    DPRINT
  757.     DB    CR,LF,'    Comment: ',0
  758.     LXI    H,CMTLNE    ; OUTPUT COMMENT LINE
  759. CMTLP:
  760.     MOV    A,M        ; GET CHAR
  761.     ORA    A        ; EOL?
  762.     RZ            ; EXIT WHEN DONE
  763.     CALL    DOUT        ; OUTPUT CHAR
  764.     INX    H        ; PT TO NEXT
  765.     JMP    CMTLP
  766.  
  767. ;
  768. ;  OUTPUT CHAR TO CONSOLE AND OPTIONALLY PRINTER OR DISK
  769. ;
  770. DOUT:
  771.     PUSH    PSW    ; SAVE CHAR
  772.     PUSH    B    ; SAVE BC
  773.     MOV    B,A    ; CHAR IN B
  774.     CALL    COUT    ; OUTPUT TO CONSOLE
  775.     LDA    PRTOUT    ; PRINTER OUTPUT?
  776.     ORA    A    ; Z=NO
  777.     JZ    DOUT1
  778.     MOV    A,B    ; GET CHAR
  779.     CALL    LOUT    ; OUTPUT TO PRINTER
  780. DOUT1:
  781.     LDA    DSKOUT    ; DISK OUTPUT?
  782.     ORA    A    ; Z=NO
  783.     JZ    DOUT2
  784.     MOV    A,B    ; GET CHAR
  785.     CALL    F0$PUT    ; OUTPUT TO DISK
  786. DOUT2:
  787.     POP    B    ; RESTORE REGS
  788.     POP    PSW
  789.     RET
  790.  
  791. ;
  792. ;  OUTPUT CHARS PTED TO BY RET ADR TO CONSOLE AND DISK OR PRINTER
  793. ;
  794. DPRINT:
  795.     XTHL        ; GET PTR AND SAVE HL AT SAME TIME
  796. DPRL:
  797.     MOV    A,M    ; GET CHAR
  798.     INX    H    ; PT TO NEXT
  799.     ORA    A    ; END?
  800.     JZ    DPRL1
  801.     CALL    DOUT    ; OUTPUT IT
  802.     JMP    DPRL
  803. DPRL1:
  804.     XTHL        ; SET RET ADR AND RESTORE HL
  805.     RET
  806.  
  807. ;
  808. ;  NEW LINE TO ALL
  809. ;
  810. DCRLF:
  811.     PUSH    PSW    ; SAVE PSW
  812.     MVI    A,CR    ; NEW LINE
  813.     CALL    DOUT
  814.     MVI    A,LF
  815.     CALL    DOUT
  816.     POP    PSW    ; RESTORE PSW
  817.     RET
  818.  
  819. ;
  820. ;  OUTPUT VALUE IN HL TO ALL IN HEX
  821. ;
  822. HVAL:
  823.     PUSH    H    ; SAVE HL
  824.     PUSH    D    ; SAVE DE
  825.     LXI    D,NUMBUF    ; PT TO NUMBER BUFFER
  826.     MOV    A,H
  827.     CALL    MA2HC    ; OUTPUT IN HEX
  828.     MVI    A,' '    ; STORE SPACE
  829.     STAX    D
  830.     INX    D    ; PT TO NEXT
  831.     MOV    A,L
  832.     CALL    MA2HC
  833.     JMP    DVAL0
  834.  
  835. ;
  836. ;  OUTPUT HL AS UP TO 5 DECIMAL DIGITS TO ALL
  837. ;
  838. DVAL:
  839.     PUSH    H    ; SAVE REGS
  840.     PUSH    D
  841.     LXI    D,NUMBUF    ; PT TO BUFFER
  842.     CALL    MHLDC    ; OUTPUT IN DECIMAL
  843. DVAL0:
  844.     LXI    H,NUMBUF    ; PT TO BUFFER
  845.     MVI    D,5    ; 5 CHARS
  846. DVAL1:
  847.     MOV    A,M    ; GET CHAR
  848.     INX    H    ; PT TO NEXT
  849.     CALL    DOUT    ; OUTPUT IT
  850.     DCR    D    ; COUNT DOWN
  851.     JNZ    DVAL1
  852.     POP    D    ; RESTORE REGS
  853.     POP    H
  854.     RET
  855.  
  856. ;
  857. ;  **** START OF CRC ROUTINES ****
  858. ;
  859.  
  860. ;
  861. ;  CRCCLR -- Clear CRC Accumulator
  862. ;
  863. ;  No Registers are Affected
  864. ;
  865. CRCCLR:
  866.     PUSH    H    ;SAVE HL
  867.     LXI    H,0    ;INIT TO ZERO
  868.     SHLD    CRCACC
  869.     POP    H
  870.     RET
  871.  
  872. ;
  873. ;  CRCDONE -- Return the CRC Value in HL
  874. ;
  875. CRCDONE:
  876.     LHLD    CRCACC    ;GET VALUE
  877.     RET
  878.  
  879. ;
  880. ;  CRCUPD -- Update CRC Accumulator
  881. ;
  882. ;An 8080 routine for generating a CYCLIC-REDUNDANCY-CHECK.
  883. ;Adapted from Keith Petersen's CRCK 4.2 program.
  884. ;By Fred Gutman.
  885. ;From 'EDN' magazine, June 5, 1979 issue, page 84.
  886. ;
  887. ;  Byte to be updated is passed in A
  888. ;  No Registers are Affected
  889. ;
  890. CRCUPD:
  891.     PUSH    H    ;SAVE HL
  892.     PUSH    B    ;SAVE BC
  893.     PUSH    PSW    ;SAVE BYTE TO UPDATE
  894.     MOV    B,A    ;BYTE IN B
  895.     LHLD    CRCACC    ;GET REMAINDER
  896.     MOV    A,H
  897.     ANI    128    ;Q-BIT MASK
  898.     PUSH    PSW    ;SAVE STATUS
  899.     DAD    H    ;2 X R(X)
  900.     MOV    A,B    ;GET BYTE
  901.     ADD    L
  902.     MOV    L,A
  903.     POP    PSW
  904.     JZ    CRCU1    ;IF Q-BIT IS ZERO
  905. ;
  906.     MOV    A,H
  907.     XRI    0A0H    ;MS HALF OF GEN. POLY
  908.     MOV    H,A
  909.     MOV    A,L
  910.     XRI    97H    ;LS HALF OF GEN. POLY
  911.     MOV    L,A
  912. ;
  913. CRCU1:
  914.     SHLD    CRCACC    ;SAVE RESULT
  915.     POP    PSW    ;RESTORE REGS
  916.     POP    B
  917.     POP    H
  918.     RET
  919.  
  920. ;
  921. ;  CRC Accumulator
  922. ;
  923. CRCACC:
  924.     DS    2    ;2 BYTES
  925.  
  926. ;
  927. ;  **** END OF CRC ROUTINES ****
  928. ;
  929.  
  930. ;
  931. ;  BUFFERS
  932. ;
  933. INSPECT:
  934.     DS    1    ; INSPECT FLAG (0=NO, 0FFH=YES)
  935. COMMENT:
  936.     DS    1    ; CONTROL FLAG (0=NO, 0FFH=YES)
  937. DSKOUT:
  938.     DS    1    ; DISK OUTPUT (0=NO, 0FFH=YES)
  939. PRTOUT:
  940.     DS    1    ; PRINTER OUTPUT (0=NO, 0FFH=YES)
  941. DISK:
  942.     DS    1    ; HOME DISK NUMBER
  943. USER:
  944.     DS    1    ; HOME USER NUMBER
  945. CDISK:
  946.     DS    1    ; CURRENT DISK NUMBER
  947. CUSER:
  948.     DS    1    ; CURRENT USER NUMBER
  949. NEXTCH:
  950.     DS    2    ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
  951. FILECNT:
  952.     DS    2    ; COUNT OF NUMBER OF FILES RENAMED
  953. NUMBUF:
  954.     DS    5    ; NUMBER STORAGE BUFFER
  955. CRCFCB:
  956.     DS    36    ; FCB FOR CRC
  957. NTFCB:
  958.     DS    36    ; FCB FOR NEW FILE
  959. CMTLNE:
  960.     DS    256    ; COMMENT LINE BUFFER
  961. CMDLNE:
  962.     DS    256    ; ALLOW MAX SIZE OF COMMAND LINE
  963.     DS    100    ; STACK AREA
  964. STACK:
  965.     DS    2    ; OLD STACK PTR
  966.  
  967.     END
  968.