home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ZSYS / SIMTEL20 / ZCPR3 / CRC.MAC < prev    next >
Text File  |  2000-06-30  |  18KB  |  915 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. z3env    SET    0f400h
  10.  
  11. ;
  12. ;  CRC Command --
  13. ;    CRC is used to compute the CRC of one or more files.  CRC
  14. ; permits ambiguous file names and supports an Inspect mode that
  15. ; allows the user to confirm each file before the computation is done.
  16. ; Additionally, there is a Disk Output Mode which allows the user to send
  17. ; the output from the operation to disk as well as to his screen with optional
  18. ; comments.
  19. ;
  20. ;    The CRC command may be of the following forms:
  21. ;        CRC dir:afn,dir:afn1,... o
  22. ;    CRCs are computed for the indicated sets of files in the indicated
  23. ; directories.
  24. ;
  25. ;    The option characters (o) are none or more of the following:
  26. ;        C -- Comment Output; add comments if output is to disk
  27. ;        D -- Disk Output; send output to disk file CRC.CRC
  28. ;        I -- Inspect and approve each rename
  29. ;        P -- Printer Output
  30. ;
  31. ;    Examples:
  32. ;        CRC A1:MYFILE.*,B2:HELLO.TXT    <-- Compute CRCs of files
  33. ;        CRC *.* DC            <-- CRCs of all files in
  34. ;                            current user/disk with
  35. ;                            disk output and comments
  36. ;        CRC *.* DCI            <-- As above, but inspect and
  37. ;                            approve files first
  38. ;
  39.  
  40. FALSE    EQU    0
  41. TRUE    EQU    NOT FALSE
  42.  
  43. ESIZE    EQU    16    ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
  44.  
  45.     EXT    DIRQS    ; DIRECTORY PROCESSOR
  46.     EXT    DPARAMS    ; DISK PARAMETERS
  47.     EXT    DIRPACK    ; DIR PACK ROUTINE
  48.     EXT    FSIZE    ; COMPUTE FILE SIZE
  49.  
  50.     EXT    Z3INIT    ; INIT BUFFERS
  51.     EXT    ZFNAME    ; FILE NAME PROCESSOR
  52.     EXT    Z3LOG    ; LOG INTO Z3 DU
  53.  
  54.     EXT    FO0$OPEN    ; OPEN FILE FOR BYTE-ORIENTED OUTPUT
  55.     EXT    FO0$CLOSE    ; CLOSE FILE
  56.     EXT    F0$PUT        ; WRITE BYTE TO FILE
  57.  
  58.     EXT    F$MAKE    ; CREATE FILE
  59.     EXT    F$OPEN    ; OPEN FILE
  60.     EXT    F$READ    ; READ BLOCK FROM FILE
  61.     EXT    F$CLOSE    ; CLOSE FILE
  62.     EXT    F$DELETE    ; DELETE FILE
  63.  
  64.     EXT    CONDIN    ; CONDITIONAL INPUT
  65.  
  66.     EXT    MA2HC    ; MEMORY STORE OF A AS 2 HEX CHARS
  67.     EXT    MHLDC    ; MEMORY STORE OF HL AS UP TO 5 DEC CHARS W/LEADING SP
  68.  
  69.     EXT    BBLINE    ; INPUT LINE EDITOR
  70.     EXT    INITFCB    ; INIT FCB
  71.     EXT    BDOS    ; BDOS ENTRY
  72.     EXT    RETUD    ; RETURN CURRENT USER/DISK
  73.     EXT    PUTUD    ; SAVE CURRENT USER/DISK
  74.     EXT    GETUD    ; RESTORE CURRENT USER/DISK
  75.     EXT    LOGUD    ; LOG INTO USER/DISK
  76.     EXT    MOVEB    ; COPY ROUTINE
  77.     EXT    EPRINT    ; PRINT STRING PTED TO BY RET ADR
  78.     EXT    LOUT    ; LST: OUTPUT ROUTINE
  79.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  80.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  81.     EXT    CAPS    ; CAPITALIZE ROUTINE
  82.     EXT    CRLF    ; NEW LINE ROUTINE
  83.     EXT    CODEND    ; CODE END COMPUTATION ROUTINE
  84.  
  85. ;
  86. ;  CP/M EQUATES
  87. ;
  88. CPM    EQU    0    ; WARM BOOT
  89. FCB    EQU    5CH    ; FCB
  90. FCB2    EQU    6CH    ; FCB 2
  91. TBUFF    EQU    80H    ; INPUT LINE BUFFER
  92. CR    EQU    13    ; <CR>
  93. LF    EQU    10    ; <LF>
  94. CTRLC    EQU    3    ; ^C
  95.  
  96. ;
  97. ; Environment Definition
  98. ;
  99.     if    z3env ne 0
  100. ;
  101. ; External ZCPR3 Environment Descriptor
  102. ;
  103.     jmp    start
  104.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  105.     db    1    ;External Environment Descriptor
  106. z3eadr:
  107.     dw    z3env
  108. ;
  109. ;  DISK OUTPUT FCB
  110. ;
  111. DSKFCB:
  112.     DB    0
  113.     DB    'CRC     '    ; FILE NAME
  114.     DB    'CRC'        ; FILE TYPE
  115.     DS    4
  116.     DS    16
  117.     DS    4    ; 36 BYTES
  118.  
  119. start:
  120.     lhld    z3eadr    ;pt to ZCPR3 environment
  121. ;
  122.     else
  123. ;
  124. ; Internal ZCPR3 Environment Descriptor
  125. ;
  126.     MACLIB    Z3BASE.LIB
  127.     MACLIB    SYSENV.LIB
  128. z3eadr:
  129.     jmp    start
  130.     SYSENV
  131. ;
  132. ;  DISK OUTPUT FCB
  133. ;
  134. DSKFCB:
  135.     DB    0
  136.     DB    'CRC     '    ; FILE NAME
  137.     DB    'CRC'        ; FILE TYPE
  138.     DS    4
  139.     DS    16
  140.     DS    4    ; 36 BYTES
  141.  
  142. start:
  143.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  144.     endif
  145.  
  146. ;
  147. ; Start of Program -- Initialize ZCPR3 Environment
  148. ;
  149.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  150. ;
  151.     LXI    H,0    ; GET STACK PTR
  152.     DAD    SP
  153.     SHLD    STACK    ; SAVE IT
  154. ;
  155. ; Compute Buffer Locations
  156. ;
  157.     CALL    CODEND    ; DETERMINE FREE SPACE
  158.     SHLD    CMDLNE    ; SET PTR TO COMMAND LINE
  159.     LXI    D,100H    ; BUFFER SIZE
  160.     DAD    D    ; COMMAND LINE
  161.     SHLD    CRCFCB    ; FCB FOR CRCS
  162.     DAD    D
  163.     SHLD    CMTLNE    ; BUFFER FOR COMMENT LINE
  164.     DAD    D
  165.     SHLD    DIRBUF    ; SET PTR TO DIRECTORY BUFFER
  166.     SPHL        ; SET STACK PTR
  167. ;
  168. ; Save Location
  169. ;
  170.     CALL    PUTUD    ; SAVE CURRENT USER/DISK AWAY
  171. ;
  172. ; Print Banner
  173. ;
  174.     CALL    EPRINT
  175.     DB    'CRC  Version '
  176.     DB    VERS/10+'0','.',(VERS MOD 10)+'0',0
  177.     LDA    FCB+1    ; GET FIRST CHAR OF FILE NAME
  178.     CPI    ' '    ; NO FILE SPEC?
  179.     JZ    HELP
  180.     CPI    '/'    ; OPTION CAUGHT?
  181.     JNZ    ECONT
  182.  
  183. ;  PRINT HELP INFORMATION
  184. HELP:
  185.     CALL    EPRINT
  186.     DB    CR,LF,' CRC dir:afn1,dir:afn2,... o...'
  187.     DB    CR,LF,'Options:'
  188.     DB    CR,LF,' C -- Comment Mode (Allow user to comment each entry '
  189.     DB    'on disk)'
  190.     DB    CR,LF,' D -- Disk Output (Send Output to Disk in file CRC.CRC)'
  191.     DB    CR,LF,' I -- Inspect Mode (Give user approval option)'
  192.     DB    CR,LF,' L -- Count Lines of Code'
  193.     DB    CR,LF,' P -- Printer Output'
  194.     DB    0
  195.  
  196. ;  RETURN TO OS
  197. RETURN:
  198.     CALL    GETUD    ; RESET DIR
  199.     LHLD    STACK    ; GET OLD STACK
  200.     SPHL        ; SET IT
  201.     RET
  202.  
  203. ;
  204. ;  SKIP UNTIL NON-BLANK
  205. ;
  206. SBLANK:
  207.     MOV    A,M    ; LOOK FOR BLANK
  208.     INX    H    ; PT TO NEXT
  209.     CPI    ' '    ; BLANK?
  210.     JZ    SBLANK
  211.     DCX    H    ; BACK UP
  212.     RET
  213.  
  214. ;
  215. ;  SKIP UNTIL BLANK OR EOL
  216. ;
  217. SNBLANK:
  218.     MOV    A,M    ; GET CHAR
  219.     INX    H    ; PT TO NEXT
  220.     CPI    ' '    ; BLANK?
  221.     JZ    SNB1
  222.     ORA    A    ; EOL?
  223.     JNZ    SNBLANK
  224. SNB1:
  225.     DCX    H    ; BACK UP
  226.     RET
  227.  
  228. ;
  229. ;  COPY BUFFER INTO TEMP BUFFER
  230. ;
  231. ECONT:
  232.     LHLD    CMDLNE    ; PT TO COMMAND LINE
  233.     XCHG        ; ... IN DE
  234.     LXI    H,TBUFF+1    ; PT TO BUFFER
  235.     MVI    B,80H    ; BUFFER SIZE (MAX)
  236.     CALL    MOVEB    ; COPY INTO COMMAND LINE BUFFER
  237.  
  238. ;  EXTRACT FLAGS IF PRESENT
  239.     XRA    A    ; A=0
  240.     STA    LOC    ; SET NO LINES OF CODE COUNT
  241.     STA    INSPECT    ; SET NO INSPECT
  242.     STA    COMMENT    ; SET NO COMMENT MODE
  243.     STA    PRTOUT    ; SET NO PRINTER OUTPUT
  244.     STA    DSKOUT    ; SET NO DISK OUTPUT
  245.     LXI    H,0    ; SET FILE COUNT
  246.     SHLD    FILECNT
  247.     LHLD    CMDLNE    ; PT TO BUFFER
  248. ;
  249. ;  SKIP TO FILE NAME STRING
  250. ;
  251.     CALL    SBLANK    ; SKIP OVER BLANKS
  252. ;
  253. ;  SKIP TO END OF FILE NAME STRING
  254. ;
  255.     CALL    SNBLANK    ; SKIP OVER NON-BLANKS
  256. ;
  257. ;  SKIP TO FIRST OPTION CHAR
  258. ;
  259.     CALL    SBLANK    ; SKIP OVER BLANKS
  260.  
  261. ;
  262. ;  CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
  263. ;
  264. OPT:
  265.     CPI    '/'    ; OPTION CHAR?
  266.     JNZ    OPTION
  267.     INX    H    ; SKIP SLASH
  268. ;  PROCESS LIST OF OPTIONS
  269. OPTION:
  270.     MOV    A,M    ; GET BYTE
  271.     ORA    A    ; DONE?
  272.     JZ    DSPEC
  273.     INX    H    ; PT TO NEXT CHAR
  274.     CPI    ' '    ; SKIP OVER SPACES
  275.     JZ    OPTION
  276.     CPI    '/'    ; IF OPTION LETTER, OBVIOUS ERROR, SO HELP
  277.     JZ    HELP
  278.     CPI    'P'    ; PRINTER OUTPUT?
  279.     JZ    OPTPRT
  280.     CPI    'L'    ; LINES OF CODE?
  281.     JZ    OPTLOC
  282.     CPI    'C'    ; COMMENT?
  283.     JZ    OPTCMT
  284.     CPI    'I'    ; INSPECT?
  285.     JZ    OPTINS
  286.     CPI    'D'    ; DISK OUTPUT?
  287.     JNZ    HELP
  288.  
  289. ; SET DISK OUTPUT OPTION
  290.     MVI    A,0FFH    ; DISK OUTPUT
  291.     STA    DSKOUT
  292.     JMP    OPTION
  293.  
  294. ; SET PRINTER OUTPUT OPTION
  295. OPTPRT:
  296.     MVI    A,0FFH    ; PRINTER OUTPUT
  297.     STA    PRTOUT
  298.     JMP    OPTION
  299.  
  300. ; SET LINES OF CODE OPTION
  301. OPTLOC:
  302.     MVI    A,0FFH    ; LINES OF CODE COUNTER
  303.     STA    LOC
  304.     JMP    OPTION
  305.  
  306. ; SET COMMENT OPTION
  307. OPTCMT:
  308.     MVI    A,0FFH    ; COMMENT MODE
  309.     STA    COMMENT
  310.     JMP    OPTION
  311.  
  312. ; SET INSPECT OPTION
  313. OPTINS:
  314.     MVI    A,0FFH    ; INSPECT
  315.     STA    INSPECT
  316.     JMP    OPTION
  317.  
  318. ;
  319. ;  EXTRACT DISK, USER, AND FILE NAME INFORMATION
  320. ;
  321. DSPEC:
  322.     LDA    DSKOUT    ; DISK OUTPUT?
  323.     ORA    A    ; Z=NO
  324.     JZ    DSPEC0
  325.     LXI    D,DSKFCB    ; OUTPUT FCB
  326.     CALL    INITFCB        ; CLEAR FCB
  327.     CALL    F$DELETE    ; DELETE FILE
  328.     CALL    INITFCB        ; CLEAR FCB
  329.     CALL    F$MAKE        ; CREATE FILE
  330.     CALL    FO0$OPEN    ; OPEN FILE
  331. DSPEC0:
  332.     LHLD    CMDLNE    ; PT TO FIRST BYTE
  333.     CALL    SBLANK    ; SKIP TO NON-BLANK
  334. ;
  335. ;  MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
  336. ;    HL PTS TO FIRST BYTE OF NEXT FILE SPEC
  337. ;
  338. DSPEC1:
  339.     CALL    GETUD    ; RETURN TO HOME DIRECTORY
  340.     LXI    D,FCB    ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
  341.     MVI    A,0    ; SCAN FOR DIR FORM BEFORE DU
  342.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  343.     SHLD    NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  344.  
  345. ;
  346. ;  LOAD DIRECTORY AND PERFORM FUNCTION
  347. ;
  348. FCT:
  349.     LXI    D,FCB    ; PT TO FCB
  350.     CALL    Z3LOG    ; LOG INTO DIR
  351.     CALL    RETUD    ; SAVE DIRECTORY WE ARE IN
  352.     MOV    A,B    ; SAVE DISK
  353.     STA    CDISK
  354.     MOV    A,C    ; SAVE USER
  355.     STA    CUSER
  356.     LHLD    DIRBUF    ; PT TO DIRECTORY BUFFER
  357.     MVI    A,11000000B    ; SELECT SYS AND NON-SYS FILES
  358.     LXI    D,FCB    ; PT TO FCB
  359.     CALL    INITFCB    ; INIT THE FCB
  360.     CALL    DIRQS    ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
  361.     CALL    DPARAMS    ; GET DISK PARAMETERS FOR FILE SIZE COMPUTATION
  362.     CALL    ICHECK    ; CHECK FOR INSPECT OPTION AND INSPECT IF SET
  363.     CALL    HEADER    ; PRINT COLUMN HEADER
  364.     CALL    GETUD    ; RETURN TO BASE USER/DISK
  365.  
  366. ;
  367. ;  PERFORM FUNCTION; HL PTS TO FILE AND BC CONTAINS NUMBER OF FILES
  368. ;
  369. FCTL:
  370.     MOV    A,B        ; CHECK FOR COMPLETION (COUNT = 0)
  371.     ORA    C
  372.     JZ    FCTL1
  373.     DCX    B        ; COUNT DOWN
  374.     PUSH    H        ; SAVE PTR AND COUNT
  375.     PUSH    B
  376.     CALL    FUNCTION    ; PERFORM FUNCTION
  377.     POP    B        ; GET COUNT AND PTR
  378.     POP    H
  379.     LXI    D,ESIZE        ; PT TO NEXT ENTRY
  380.     DAD    D
  381.     JMP    FCTL
  382.  
  383. ;
  384. ;  CHECK FOR NEXT FILE SPEC
  385. ;
  386. FCTL1:
  387.     LHLD    NEXTCH    ; GET PTR
  388.     MOV    A,M    ; GET DELIM
  389.     CPI    ','    ; ANOTHER FILE?
  390.     JNZ    DRETURN
  391.     INX    H    ; PT TO CHAR AFTER COMMA
  392.     JMP    DSPEC1    ; CONTINUE PROCESSING
  393.  
  394. ;
  395. ;  FUNCTION COMPLETE -- EXIT
  396. ;
  397. DRETURN:
  398.     CALL    DCRLF    ; NEW LINE
  399.     LDA    DSKOUT    ; DISK OUTPUT USED?
  400.     ORA    A    ; NZ=YES
  401.     CNZ    FO0$CLOSE    ; CLOSE FILE
  402.     JMP    RETURN
  403.  
  404. ;
  405. ;  EMERGENCY ABORT
  406. ;
  407. ABORT:
  408.     CALL    EPRINT
  409.     DB    CR,LF,'** CRC Abort **',CR,LF,0
  410.     CALL    GETUD    ; RETURN HOME
  411.     JMP    DRETURN
  412.  
  413. ;
  414. ;  PRINT COLUMN HEADER
  415. ;
  416. HEADER:
  417.     CALL    DPRINT
  418.     DB    CR,LF,'      Filename.Typ   Size  Recs   CRC',0
  419.     LDA    LOC    ; LINES OF CODE?
  420.     ORA    A
  421.     JZ    HDR1
  422.     CALL    DPRINT
  423.     DB    '  Lines',0
  424. HDR1:
  425.     LDA    COMMENT    ; COMMENT FIELD ALSO?
  426.     ORA    A    ; 0=NO
  427.     RZ
  428.     CALL    DPRINT
  429.     DB    '  Comment',0
  430.     RET
  431. ;
  432. ;  FUNCTION -- COMPUTE CRCS OF SELECTED FILES
  433. ;
  434. FUNCTION:
  435.  
  436. ;
  437. ;  PRINT FILE NAME
  438. ;
  439. CRCLP:
  440.     CALL    DCRLF    ;NEW LINE
  441.     PUSH    H    ;SAVE PTR
  442.     LHLD    FILECNT        ; INCREMENT FILE COUNT
  443.     INX    H
  444.     SHLD    FILECNT
  445.     CALL    DVAL    ;OUTPUT DECIMAL VALUE
  446.     POP    H    ;GET PTR
  447.     MVI    A,' '    ;LEADING SPACE
  448.     CALL    DOUT
  449.     CALL    PRFN    ; PRINT FILE NAME
  450.     MVI    A,' '    ; SPACE SEPARATOR
  451.     CALL    DOUT
  452.     CALL    FSIZE    ; COMPUTE SIZE IN DE
  453.     XCHG        ; HL=SIZE
  454.     CALL    DVAL    ; OUTPUT VALUE
  455.     MVI    A,'K'    ; OUTPUT K
  456.     CALL    DOUT
  457.     LHLD    CRCFCB    ; PT TO FCB
  458.     XCHG        ; HL = PTR TO FIRST BYTE OF FILE FCB PART
  459.     MVI    B,12    ; 12 BYTES
  460.     CALL    MOVEB
  461.     XRA    A    ; ZERO FIRST BYTE
  462.     STAX    D    ; SELECT CURRENT DISK OF CRCFCB
  463.     JMP    DOIT    ; PERFORM FUNCTION
  464.  
  465. ;
  466. ;  TEST FOR COMMENT AND DISK OUTPUT, AND ACCEPT COMMENT IF SET
  467. ;
  468. CTEST:
  469.     LDA    COMMENT    ; GET FLAG
  470.     ORA    A    ; ZERO IF NONE
  471.     RZ
  472.     CALL    EPRINT
  473.     DB    ' ?',0
  474.     XRA    A    ; DON'T CAPITALIZE
  475.     CALL    BBLINE    ; GET LINE FROM USER
  476.     XCHG        ; SAVE HL
  477.     LHLD    CMTLNE    ; COPY INTO COMMENT LINE BUFFER FOR NOW
  478.     XCHG        ; RESTORE HL AND NEW DE
  479. CTEST1:
  480.     MOV    A,M    ; GET CHAR
  481.     STAX    D    ; PUT CHAR
  482.     ORA    A    ; END?
  483.     RZ
  484.     INX    H    ; PT TO NEXT
  485.     INX    D
  486.     JMP    CTEST1
  487.  
  488. ;
  489. ;  PRINT FILE NAME PTED TO BY HL
  490. ;    OUTPUT TO CON: AND OPTIONALLY DISK
  491. ;
  492. PRFN:
  493.     PUSH    H    ; SAVE PTR
  494.     INX    H    ; PT TO FILE NAME
  495.     MVI    B,8    ; PRINT NAME
  496.     CALL    PRNT
  497.     MVI    A,'.'    ; DECIMAL
  498.     CALL    DOUT
  499.     MVI    B,3    ; PRINT TYPE
  500.     CALL    PRNT
  501.     POP    H    ; GET PTR
  502.     RET
  503.  
  504. ;
  505. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  506. ;    OUTPUT TO CON: AND OPTIONALLY DISK
  507. ;
  508. PRNT:
  509.     MOV    A,M    ; GET CHAR
  510.     CALL    DOUT
  511.     INX    H    ; PT TO NEXT
  512.     DCR    B    ; COUNT DOWN
  513.     JNZ    PRNT
  514.     RET
  515.  
  516. ;
  517. ;  PRINT FILE NAME PTED TO BY HL
  518. ;    OUTPUT TO CON:
  519. ;
  520. PRFNC:
  521.     PUSH    H    ; SAVE PTR
  522.     INX    H    ; PT TO FILE NAME
  523.     MVI    B,8    ; PRINT NAME
  524.     CALL    PRNTC
  525.     MVI    A,'.'    ; DECIMAL
  526.     CALL    COUT
  527.     MVI    B,3    ; PRINT TYPE
  528.     CALL    PRNTC
  529.     POP    H    ; GET PTR
  530.     RET
  531.  
  532. ;
  533. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  534. ;    OUTPUT TO CON:
  535. ;
  536. PRNTC:
  537.     MOV    A,M    ; GET CHAR
  538.     CALL    COUT
  539.     INX    H    ; PT TO NEXT
  540.     DCR    B    ; COUNT DOWN
  541.     JNZ    PRNTC
  542.     RET
  543.  
  544. ;
  545. ;  CHECK FOR INSPECT OPTION AND INSPECT FILES IF SET
  546. ;    FIRST FILE PTED TO BY HL, COUNT IN BC
  547. ;
  548. ICHECK:
  549.     LDA    INSPECT    ; INSPECT?
  550.     ORA    A    ; 0=NO
  551.     RZ
  552.     CALL    EPRINT
  553.     DB    CR,LF,CR,LF,'** File Inspection **'
  554.     DB    CR,LF,'Y(def)=Select  N=Don''t Select'
  555.     DB    CR,LF,'S=Skip Rest    Q=Quit (Abort)'
  556.     DB    CR,LF,0
  557.     PUSH    H    ; SAVE POINTER TO FIRST FILE
  558.     PUSH    B    ; SAVE FILE COUNT
  559. ICKL:
  560.     PUSH    B    ; SAVE COUNT
  561.     CALL    CRLF    ; NEW LINE
  562.     CALL    PRFNC    ; PRINT FILE NAME TO CONSOLE ONLY
  563.     CALL    CRCQ    ; CRC QUESTION
  564.     POP    B    ; GET COUNT
  565.     CPI    'S'    ; SKIP REST?
  566.     JZ    ISKIP
  567.     CPI    'Q'    ; QUIT?
  568.     JZ    QUIT
  569.     CPI    'N'    ; NO?
  570.     JZ    NODO
  571.     CALL    EPRINT
  572.     DB    '     Selected',0
  573.     MOV    A,M    ; GET BYTE
  574.     ORI    80H    ; SET MSB
  575.     MOV    M,A    ; PUT BYTE
  576.     JMP    ICKNXT
  577.  
  578. ;  DON'T CRC FILE
  579. NODO:
  580.     CALL    EPRINT
  581.     DB    ' NOT Selected',0
  582.  
  583. ;  CONTINUE SCAN OF FILES
  584. ICKNXT:
  585.     LXI    D,ESIZE    ; SIZE OF FILE ENTRY
  586.     DAD    D    ; PT TO NEXT ENTRY
  587.     DCX    B    ; COUNT DOWN
  588.     MOV    A,B    ; DONE?
  589.     ORA    C
  590.     JNZ    ICKL
  591. ISKIP:
  592.     POP    B    ; RESTORE ORIGINAL COUNT
  593.     POP    H    ; RESTORE PTR TO FIRST FILE
  594.     CALL    DIRPACK    ; PACK DIRECTORY BASED ON SELECTION
  595.     CALL    EPRINT
  596.     DB    CR,LF,'** Inspection Complete **',CR,LF,0
  597.     RET
  598.  
  599. ;
  600. ;  PROMPT USER FOR INSPECT
  601. ;
  602. CRCQ:
  603.     CALL    EPRINT    ; PRINT PROMPT
  604.     DB    ' -- Select (Y/N/S/Q)? ',0
  605.     CALL    CIN    ; GET RESPONSE
  606.     CALL    CAPS    ; CAPITALIZE
  607.     CALL    COUT    ; ECHO
  608.     RET
  609.  
  610. ;
  611. ;  QUIT CRC PROGRAM
  612. ;
  613. QUIT:
  614.     CALL    EPRINT
  615.     DB    ' Quit to Z3',0
  616.     JMP    DRETURN
  617.  
  618. ;
  619. ;  COMPUTE CRC; NAME IN CRCFCB
  620. ;
  621. DOIT:
  622.     LDA    CDISK        ; GOTO DIRECTORY OF FILE
  623.     MOV    B,A
  624.     LDA    CUSER
  625.     MOV    C,A
  626.     CALL    LOGUD        ; LOG INTO FILE'S DIRECTORY
  627.     CALL    CRCCLR        ; CLEAR CRC ACCUMULATOR
  628.     LXI    H,0        ; HL=0
  629.     SHLD    RECNT        ; RESET RECORD COUNT
  630.     SHLD    LOCNT        ; RESET LINES OF CODE COUNT
  631.     LHLD    CRCFCB        ; PT TO FCB
  632.     XCHG            ; ... IN DE
  633.     CALL    INITFCB        ; INIT IT
  634.     CALL    F$OPEN        ; OPEN IT FOR INPUT
  635. DOITL:
  636.     CALL    F$READ        ; READ BLOCK INTO TBUFF
  637.     ORA    A        ; ERROR?
  638.     JNZ    DOITD        ; DONE IF SO
  639.     PUSH    H        ; SAVE HL
  640.     LHLD    RECNT        ; INCREMENT RECORD COUNT
  641.     INX    H
  642.     SHLD    RECNT
  643.     POP    H
  644.     CALL    CONDIN        ; CHECK FOR ABORT
  645.     JZ    DOITL0
  646.     CPI    CTRLC        ; ABORT?
  647.     JZ    ABORT        ; QUICK ABORT
  648. DOITL0:
  649.     LXI    H,TBUFF        ; PT TO FIRST BYTE
  650.     MVI    B,128        ; 128 BYTES
  651. DOITL1:
  652.     MOV    A,M        ; GET BYTE
  653.     CALL    CRCUPD        ; UPDATE CRC
  654.     LDA    LOC        ; COUNT LINES OF CODE?
  655.     ORA    A        ; 0=NO
  656.     JZ    DOITL2
  657.     MOV    A,M        ; GET BYTE
  658.     ANI    7FH        ; MASK
  659.     CPI    LF        ; LINE FEED IS KEY
  660.     JNZ    DOITL2
  661.     PUSH    H        ; INCREMENT LOC COUNTER
  662.     LHLD    LOCNT
  663.     INX    H
  664.     SHLD    LOCNT
  665.     POP    H
  666. DOITL2:
  667.     INX    H        ; PT TO NEXT
  668.     DCR    B        ; COUNT DOWN
  669.     JNZ    DOITL1
  670.     JMP    DOITL        ; CONTINUE THRU FILE
  671. DOITD:
  672.     CALL    GETUD        ; RETURN TO HOME DIRECTORY
  673.     CALL    DPRINT        ; SEPARATOR
  674.     DB    ' ',0
  675.     LHLD    RECNT        ; PRINT RECORD COUNT
  676.     CALL    DVAL        ; PRINT IN DECIMAL
  677.     CALL    DPRINT
  678.     DB    '  ',0
  679.     CALL    CRCDONE        ; RETURN CRC IN HL
  680.     CALL    HVAL        ; PRINT VALUE AS HEX
  681.     LDA    LOC        ; LINES OF CODE?
  682.     ORA    A
  683.     JZ    DOITD1
  684.     CALL    DPRINT        ; LEADING SPACES
  685.     DB    ' ',0
  686.     LHLD    LOCNT        ; GET COUNT
  687.     CALL    DVAL        ; PRINT AS DECIMAL
  688. DOITD1:
  689.     CALL    CTEST        ; GET FOR AND INPUT COMMENT
  690.     LDA    COMMENT        ; CHECK FOR COMMENT AND OUTPUT IF SO
  691.     ORA    A        ; ZERO IF ONE NOT SELECTED
  692.     RZ
  693.     CALL    DPRINT        ; SEPARATOR
  694.     DB    '  ',0
  695.     LHLD    CMTLNE    ; OUTPUT COMMENT LINE
  696. CMTLP:
  697.     MOV    A,M        ; GET CHAR
  698.     ORA    A        ; EOL?
  699.     RZ            ; EXIT WHEN DONE
  700.     CALL    DPOUT        ; OUTPUT CHAR
  701.     INX    H        ; PT TO NEXT
  702.     JMP    CMTLP
  703.  
  704. ;
  705. ;  OUTPUT CHAR TO CONSOLE AND OPTIONALLY PRINTER OR DISK
  706. ;
  707. DOUT:
  708.     PUSH    PSW    ; SAVE CHAR
  709.     PUSH    B    ; SAVE BC
  710.     MOV    B,A    ; CHAR IN B
  711.     CALL    COUT    ; OUTPUT TO CONSOLE
  712. DOUT0:
  713.     LDA    PRTOUT    ; PRINTER OUTPUT?
  714.     ORA    A    ; Z=NO
  715.     JZ    DOUT1
  716.     MOV    A,B    ; GET CHAR
  717.     CALL    LOUT    ; OUTPUT TO PRINTER
  718. DOUT1:
  719.     LDA    DSKOUT    ; DISK OUTPUT?
  720.     ORA    A    ; Z=NO
  721.     JZ    DOUT2
  722.     MOV    A,B    ; GET CHAR
  723.     CALL    F0$PUT    ; OUTPUT TO DISK
  724. DOUT2:
  725.     POP    B    ; RESTORE REGS
  726.     POP    PSW
  727.     RET
  728.  
  729. ;
  730. ;  OUTPUT CHAR TO OPTIONALLY PRINTER OR DISK
  731. ;
  732. DPOUT:
  733.     PUSH    PSW    ; SAVE CHAR
  734.     PUSH    B    ; SAVE BC
  735.     MOV    B,A    ; CHAR IN B
  736.     JMP    DOUT0    ; USE DOUT ROUTINES
  737.  
  738. ;
  739. ;  OUTPUT CHARS PTED TO BY RET ADR TO CONSOLE AND DISK OR PRINTER
  740. ;
  741. DPRINT:
  742.     XTHL        ; GET PTR AND SAVE HL AT SAME TIME
  743. DPRL:
  744.     MOV    A,M    ; GET CHAR
  745.     INX    H    ; PT TO NEXT
  746.     ORA    A    ; END?
  747.     JZ    DPRL1
  748.     CALL    DOUT    ; OUTPUT IT
  749.     JMP    DPRL
  750. DPRL1:
  751.     XTHL        ; SET RET ADR AND RESTORE HL
  752.     RET
  753.  
  754. ;
  755. ;  NEW LINE TO ALL
  756. ;
  757. DCRLF:
  758.     PUSH    PSW    ; SAVE PSW
  759.     MVI    A,CR    ; NEW LINE
  760.     CALL    DOUT
  761.     MVI    A,LF
  762.     CALL    DOUT
  763.     POP    PSW    ; RESTORE PSW
  764.     RET
  765.  
  766. ;
  767. ;  OUTPUT VALUE IN HL TO ALL IN HEX
  768. ;
  769. HVAL:
  770.     PUSH    H    ; SAVE HL
  771.     PUSH    D    ; SAVE DE
  772.     LXI    D,NUMBUF    ; PT TO NUMBER BUFFER
  773.     MOV    A,H
  774.     CALL    MA2HC    ; OUTPUT IN HEX
  775.     MOV    A,L
  776.     CALL    MA2HC
  777.     MVI    A,' '    ; TRAILING SPACE
  778.     STAX    D
  779.     JMP    DVAL0
  780.  
  781. ;
  782. ;  OUTPUT HL AS UP TO 5 DECIMAL DIGITS TO ALL
  783. ;
  784. DVAL:
  785.     PUSH    H    ; SAVE REGS
  786.     PUSH    D
  787.     LXI    D,NUMBUF    ; PT TO BUFFER
  788.     CALL    MHLDC    ; OUTPUT IN DECIMAL
  789. DVAL0:
  790.     LXI    H,NUMBUF    ; PT TO BUFFER
  791.     MVI    D,5    ; 5 CHARS
  792. DVAL1:
  793.     MOV    A,M    ; GET CHAR
  794.     INX    H    ; PT TO NEXT
  795.     CALL    DOUT    ; OUTPUT IT
  796.     DCR    D    ; COUNT DOWN
  797.     JNZ    DVAL1
  798.     POP    D    ; RESTORE REGS
  799.     POP    H
  800.     RET
  801.  
  802. ;
  803. ;  **** START OF CRC ROUTINES ****
  804. ;
  805.  
  806. ;
  807. ;  CRCCLR -- Clear CRC Accumulator
  808. ;
  809. ;  No Registers are Affected
  810. ;
  811. CRCCLR:
  812.     PUSH    H    ;SAVE HL
  813.     LXI    H,0    ;INIT TO ZERO
  814.     SHLD    CRCACC
  815.     POP    H
  816.     RET
  817.  
  818. ;
  819. ;  CRCDONE -- Return the CRC Value in HL
  820. ;
  821. CRCDONE:
  822.     LHLD    CRCACC    ;GET VALUE
  823.     RET
  824.  
  825. ;
  826. ;  CRCUPD -- Update CRC Accumulator
  827. ;
  828. ;An 8080 routine for generating a CYCLIC-REDUNDANCY-CHECK.
  829. ;Adapted from Keith Petersen's CRCK 4.2 program.
  830. ;By Fred Gutman.
  831. ;From 'EDN' magazine, June 5, 1979 issue, page 84.
  832. ;
  833. ;  Byte to be updated is passed in A
  834. ;  No Registers are Affected
  835. ;
  836. CRCUPD:
  837.     PUSH    H    ;SAVE HL
  838.     PUSH    B    ;SAVE BC
  839.     PUSH    PSW    ;SAVE BYTE TO UPDATE
  840.     MOV    B,A    ;BYTE IN B
  841.     LHLD    CRCACC    ;GET REMAINDER
  842.     MOV    A,H
  843.     ANI    128    ;Q-BIT MASK
  844.     PUSH    PSW    ;SAVE STATUS
  845.     DAD    H    ;2 X R(X)
  846.     MOV    A,B    ;GET BYTE
  847.     ADD    L
  848.     MOV    L,A
  849.     POP    PSW
  850.     JZ    CRCU1    ;IF Q-BIT IS ZERO
  851. ;
  852.     MOV    A,H
  853.     XRI    0A0H    ;MS HALF OF GEN. POLY
  854.     MOV    H,A
  855.     MOV    A,L
  856.     XRI    97H    ;LS HALF OF GEN. POLY
  857.     MOV    L,A
  858. ;
  859. CRCU1:
  860.     SHLD    CRCACC    ;SAVE RESULT
  861.     POP    PSW    ;RESTORE REGS
  862.     POP    B
  863.     POP    H
  864.     RET
  865.  
  866. ;
  867. ;  CRC Accumulator
  868. ;
  869. CRCACC:
  870.     DS    2    ;2 BYTES
  871.  
  872. ;
  873. ;  **** END OF CRC ROUTINES ****
  874. ;
  875.  
  876. ;
  877. ;  BUFFERS
  878. ;
  879. CDISK:
  880.     DS    1    ; DISK WHERE FILES ARE
  881. CUSER:
  882.     DS    1    ; USER WHERE FILES ARE
  883. LOC:
  884.     DS    1    ; LINES OF CODE FLAG (0=NO, 0FFH=YES)
  885. INSPECT:
  886.     DS    1    ; INSPECT FLAG (0=NO, 0FFH=YES)
  887. COMMENT:
  888.     DS    1    ; CONTROL FLAG (0=NO, 0FFH=YES)
  889. DSKOUT:
  890.     DS    1    ; DISK OUTPUT (0=NO, 0FFH=YES)
  891. PRTOUT:
  892.     DS    1    ; PRINTER OUTPUT (0=NO, 0FFH=YES)
  893. LOCNT:
  894.     DS    2    ; LINES OF CODE COUNT
  895. RECNT:
  896.     DS    2    ; RECORD COUNT
  897. NEXTCH:
  898.     DS    2    ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
  899. FILECNT:
  900.     DS    2    ; COUNT OF NUMBER OF FILES RENAMED
  901. NUMBUF:
  902.     DS    5    ; NUMBER STORAGE BUFFER
  903. DIRBUF:
  904.     DS    2    ; PTR TO DIRECTORY BUFFER
  905. CRCFCB:
  906.     DS    2    ; PTR TO FCB FOR CRC
  907. CMTLNE:
  908.     DS    2    ; PTR TO COMMENT LINE BUFFER
  909. CMDLNE:
  910.     DS    2    ; PTR TO COMMAND LINE
  911. STACK:
  912.     DS    2    ; OLD STACK PTR
  913.  
  914.     END
  915.