home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 142_01 / crcbuild.asm < prev    next >
Assembly Source File  |  1985-03-10  |  14KB  |  695 lines

  1. ;
  2. ;        CRCBUILD.ASM    version 1.0
  3. ;        by John L. Raff WB2MDG/KAPP8107
  4. ;         (built 830408FR)
  5. ;
  6. ;---> NOTE: MUST BE ASSEMBLED BY MAC <----
  7. ;
  8. ;CRCBUILD is a program to build a CP/M file in SIG/M 
  9. ;-CATALOG format and print
  10. ;a CYCLIC-REDUNDANCY-CHECK number based on the
  11. ;CCITT standard polynominal:
  12. ;   X^16 + X^15 + X^13 + X^7 + X^4 + X^2 + X + 1
  13. ;  
  14. ;Define true and false
  15. ;
  16. FALSE    EQU    0
  17. TRUE    EQU    NOT FALSE
  18. ;
  19. ;Conditional assembly switches
  20. ;
  21. STDCPM    EQU    TRUE    ;TRUE IS STANDARD CP/M
  22. ALTCPM    EQU    FALSE    ;TRUE IS H8 OR TRS-80
  23. NOSYS    EQU    FALSE    ;TRUE IF SYS FILES NOT WANTED
  24. ;
  25. ;System equates
  26. ;
  27. BASE    SET    0
  28.     IF    ALTCPM
  29. BASE    SET    4200H
  30.     ENDIF        ;ALTCPM
  31. ;
  32. ;Define write buffer size (presently set for 8k)
  33. ;
  34. BSIZE    EQU    8*1024    ;DISK WRITE BUFFER SIZE
  35. ;
  36. ;BDOS equates
  37. ;
  38. RDCON    EQU    1
  39. WRCON    EQU    2
  40. PRINT    EQU    9
  41. READCONSOLE    EQU    10    ;Read console buffer
  42. CSTAT    EQU    11
  43. OPEN    EQU    15
  44. SRCHF    EQU    17
  45. SRCHN    EQU    18
  46. READ    EQU    20
  47. STDMA    EQU    26
  48. BDOS    EQU    BASE+5
  49. FCB    EQU    BASE+5CH 
  50. FCBEXT    EQU    FCB+12
  51. FCBRNO    EQU    FCB+32
  52. FCB2    EQU    BASE+6CH
  53. STRLMT    EQU    80    ;STRING LENGTH LIMIT
  54. ;
  55. ;Program starts here
  56. ;
  57.     ORG    BASE+100H
  58. ;
  59.     MACLIB    SEQIO    ;DEFINE MACRO LIBRARY USED
  60.  
  61. CRCBUILD:
  62.     JMP    BEGIN    ;Jump around identification & alternate file name
  63.     DB    'CRCBUILD.COM 1.0 830408fr',0
  64. ;
  65. BEGIN:
  66.     XRA    A
  67.     STA    NAMQUAN    ;Zero the quantity of files read
  68.     LXI    H,0    ;GET STACK...
  69.     DAD    SP    ;POINTER SO WE CAN..
  70.     SHLD    STACK    ;SAVE IT
  71.     LXI    SP,STACK ;INITIALIZE LOCAL STACK
  72. BGN2:
  73.     CALL    CRLF    ;TURN UP A NEW LINE
  74.     CALL    ILPRT    ;Print the heading
  75.     DB    'CRCBUILD Ver 1.0 830224TH',CR,LF
  76.     DB    'CTL-S pauses, CTL-C aborts',CR,LF,0
  77.     LDA    FCB+1
  78.     CPI    ' '    ;SEE IF NAME THERE
  79.     JNZ    BEGIN2    ;YES, CONTINUE
  80.     LXI    D,FCB+2    ;Put total directory pattern
  81.     LXI    H,FCB+1    ;in FCB
  82.     MVI    M,'?'    ;All "?"
  83.     LXI    B,10    ;4 characters
  84.     CALL    MOVER    ;MOVE IT
  85.     JMP    BEGIN2    ;Go get um
  86. ;
  87. THRNUM?:    ;Check for three ascii numbers
  88.     CALL    TWONUM?
  89.     RNZ        ;Return if not numbers
  90.     CALL    NUM?
  91.     RZ        ;Return if a number
  92.     CPI    '.'    ;Check for a period
  93.     RNZ        ;Return if not a period
  94.     DCX    H    ;Otherwise back up one character
  95.     DCR    B    ;And one count
  96.     CMP    A    ;Set zero flag
  97.     RET
  98. ;
  99. TWONUM?:
  100.     CALL    NUM?
  101.     RNZ
  102. NUM?:
  103.     MOV    A,M    ;Get the character
  104.     INX    H    ;For next character
  105.     INR    B    ;Increment for next count
  106.     CPI    '0'    ;Is it less than 0
  107.     JC    NUMNOT    ;Branch if it is
  108.     CPI    '9'+1    ;Is it greater than 9?
  109.     JNC    NUMNOT
  110.     CMP    A    ;Set zero flag
  111.     RET
  112. NUMNOT:
  113.     CPI    '0'    ;Should not be equal, reset zero flag
  114.     RET
  115. ;
  116. BEG2NG:
  117.     CALL    ILPRT
  118.     DB    CR,LF,'Incorrect characters',CR,LF,0
  119. ;
  120. BEGIN2:
  121.     CALL    ILPRT
  122.     DB    'Enter -CATALOG.xxx number (three digits) -',0
  123.     LXI    D,STR4    ;Point to string 4
  124.     MVI    A,5    ;Indicate size of buffer 
  125.     STAX    D
  126.     MVI    C,READCONSOLE    ;Read console buffer
  127.     CALL    BDOS    ;Go get the string
  128.     LXI    H,STR4+1    ;Point to quantity characters entered
  129.     MOV    C,M    ;Get the count
  130.     MVI    A,3    ;Check for three characters
  131.     CMP    C    ;In buffer
  132.     JNZ    BEG2NG    ;Branch if not 3 characters
  133.     MVI    B,0    ;Zero counter
  134.     INX    H    ;Point to first character
  135. BEG2A:
  136.     CALL    NUM?    ;Is it a decimal number?
  137.     JNZ    BEG2NG    ;Branch if not a decimal number
  138.     MOV    A,B    ;Check quantity of characters
  139.     CPI    3
  140.     JNZ    BEG2A    ;Branch if not end of characters yet
  141.     MVI    M,0    ;Ensure termination of string
  142.     LXI    H,STR4+2    ;Copy number into file string
  143.     LXI    D,FNAME1
  144.     LXI    B,3        ;Count
  145.     CALL    MOVER
  146.     MVI    A,'F'    ;Indicate write file open
  147.     STA    FFLAG
  148. ;
  149. ;'Declare' FCB for output file
  150. ;(temporarily named -CATALOG.$$$)
  151. ;
  152.     FILE    OUTFILE,CATALOG,,-CATALOG,$$$,BSIZE
  153. ;
  154. AGAIN:    LXI    SP,STACK ;RE-INIT STACK POINTER
  155.     MVI    A,0    ;Indicate in building phase
  156.     STA    WHICH    ;Save flag
  157.     CALL    MFNAME    ;SEARCH FOR NAMES
  158.     JNC    NAMTST    ;ANOTHER FOUND, PRINT NAME
  159. AGN2:    
  160.     LDA    MFFLG2    ;NOTHING FOUND, CHECK...
  161.     ORA    A    ;... NAME FOUND FLAG
  162.     JZ    DONE    ;AT LEAST ONE WAS FOUND
  163.     CALL    ABEXIT    ;PRINT MSG, THEN EXIT
  164.     DB    '++FILE NOT FOUND++$'
  165. ;
  166. DONE:            ;Close -CATALOG.$$$
  167.     LXI    H,FNAME1
  168.     LXI    D,DONEX
  169.     LXI    B,3
  170.     CALL    MOVER
  171.     CALL    ILPRT
  172.     DB    CR,LF,'SIG-M Library -CATALOG Volume Number-'
  173. DONEX:
  174.     DB    'NNN, ',0
  175. DONEY:
  176.     LDA    NAMQUAN
  177.     CALL    SHWDC
  178.     CALL    ILPRT
  179.     DB    ' Files cataloged.',CR,LF,0
  180. ;
  181.     FINIS    CATALOG
  182. ;
  183.     LXI    H,STR4+2    ;Point to beginning of string
  184.     LXI    D,FCBFINAL+9    ;Location of Name TYPE
  185.     LXI    B,3    ;Quantity to move
  186.     CALL    MOVER
  187. ;
  188. ;Build FCB for final name of -CATALOG.nnn
  189. ;
  190.     FILE    SETFILE, FINAL,,-CATALOG,NNN
  191. ;
  192. ;    Erase any existing old file
  193. ;
  194.     ERASE FINAL
  195. ;
  196. ;    Rename -CATALOG.$$$ to -CATALOG.NNN
  197.     RENAME    FINAL,CATALOG
  198. ;
  199. ;Now exit to CP/M
  200. DONE2:    
  201.     CALL    MSGEXIT    ;PRINT DONE, THEN EXIT
  202.     DB    CR,LF,'DONE$'
  203. ;
  204. ;Test for names to ignore
  205. ;
  206. NAMTST:    IF    NOSYS
  207.     LDA    FCB+10    ;GET SYS ATTRIBUTE
  208.     ANI    80H    ;IS IT SYS?
  209.     JNZ    AGAIN    ;YES, IGNORE THIS FILE
  210.     ENDIF        ;NOSYS
  211. ;
  212. ;Ignore files with .$$$ filetype (they are usually
  213. ;zero-length and clutter up our display.  We also
  214. ;want to ignore our own CRCKLIST.$$$ temporary file).
  215. ;
  216.     LXI    H,FCB+9    ;POINT TO FILETYPE IN FCB
  217.     PUSH    H    ;May need pointer for BAD check
  218.     CALL    TSTBAD    ;CHECK FOR .$$$ FILES
  219.     JZ    AGAIN    ;IF ZERO FLAG, IGNORE THEM
  220.     POP    H    ;Restore pointer
  221.     CALL    BADTYP    ;Check for .BAD files
  222.     JZ    AGAIN    ;Branch if it is
  223. ;
  224. NAMTS2:
  225.     CALL    ILPRT    ;PRINT:
  226.     DB    CR,LF
  227. FNAME1:
  228.     DB    'NNN.',0
  229. ;
  230.     LDA    NAMQUAN    ;Get quantity of name
  231.     INR    A    ;Increment count
  232.     STA    NAMQUAN
  233.     CALL    SHWDC    ;Show the count
  234. ;
  235. ;Move 8 characters from FCB+1 to FNAME
  236. ;
  237.     LXI    H,FCB+1
  238.     LXI    D,FNAME
  239.     LXI    B,8
  240.     CALL    MOVER
  241. ;Move 3 characters from FCB+9 to FNAME+9
  242.     LXI    H,FCB+9
  243.     LXI    D,FNAME+9
  244.     LXI    B,3
  245.     CALL    MOVER
  246. ;Now print filename.type
  247.     CALL    ILPRT
  248.     DB    '    '
  249. FNAME:
  250.     DB    'XXXXXXXX.XXX  ',0
  251. FNAME2:
  252.     CALL    OPN    ;Open file and build CRC
  253.     JZ    AGAIN    ;Branch if bad open or read
  254.     JMP    ABEXT2    ;Otherwise get out
  255. ;
  256. ;Open the file
  257. ;
  258. OPN:
  259.     LXI    D,FCB
  260.     MVI    C,OPEN
  261.     CALL    BDOS
  262.     INR    A
  263.     JNZ    RDINIT
  264.     CALL    ILPRT
  265.     DB    '++Open Failed++',0
  266.     JMP    BADRET    ;Indicate Bad open
  267. ;
  268. ;Initialize CRC to zero and set Bufad to cause initial read
  269. ;
  270. RDINIT:
  271.     LXI    H,0
  272.     SHLD    REM    ;Init remainder to zero
  273.     SHLD    QUANEK    ;Quantity of eighth k
  274.     LXI    H,BASE+100H
  275.     SHLD    BUFAD    ;Init buffer address
  276. ;
  277. ;This is the read loop
  278. ;
  279. READIT:
  280.     LHLD    BUFAD
  281.     MOV    A,H    ;Time to read?
  282.     CPI    BASE SHR 8    ;End of buffer?
  283.     JZ    NORD
  284.     MVI    C,CSTAT
  285.     CALL    BDOS    ;Chck for operator abort
  286.     ORA    A
  287.     JZ    READ2    ;Branch if nothing from operator
  288.     MVI    C,RDCON
  289.     CALL    BDOS    ;Get character from operator
  290.     CPI    'C'-40h    ;Control C?
  291.     JZ    ABEXT2    ;Branch if yes, exit
  292. ;
  293. READ2:
  294.     LXI    D,FCB
  295.     MVI    C,READ    ;Read another sector of file
  296.     CALL    BDOS
  297.     ORA    A    ;Check return code
  298.     JNZ    FINISH    ;Error or EOF
  299.     LHLD    QUANEK    ;Get quantity of eighth K
  300.     INX    H    ;Add 1
  301.     SHLD    QUANEK    ;Put back
  302.     LXI    H,BASE+80H    ;Bufer location
  303. ;
  304. NORD:
  305.     MOV    A,M    ;Get file character
  306.     STA    MESS    ;Save for DIVP
  307.     INX    H
  308.     SHLD    BUFAD    ;Update buffer address
  309.     CALL    DIVP    ;Calculate new CRC
  310.     JMP    READIT    ;GO READ MORE CHARACTERS
  311. ;
  312. FINISH:    CPI    1    ;NORMAL END-OF-FILE?
  313.     JNZ    FILERR    ;NO, IT WAS A READ ERROR
  314.     LHLD    QUANEK    ;Get quantity of eighth K
  315.     LXI    B,7
  316.     DAD    B    ;Round up to next K
  317.     DAD    H    ;Turn into full K
  318.     DAD    H    ;In "H" register
  319.     DAD    H
  320.     DAD    H
  321.     DAD    H
  322.     MOV    A,H
  323.     CALL    SHWDEC    ;Show Number of K
  324.     CALL    ILPRT
  325.     DB    'K   ',0 
  326.     LDA    REM+1    ;GET MSP OF CRC
  327.     CALL    HEXO    ;PRINT IT
  328.     MVI    A,' '
  329.     CALL    TYPE    ;TYPE A SPACE
  330.     LDA    REM    ;GET LSP OF CRC
  331.     CALL    HEXO    ;PRINT IT
  332. GOODRET:
  333.     XRA    A
  334.     RET        ;Return to caller with zero flag set
  335. ;
  336. FILERR:
  337.     CALL    ILPRT    ;Print the message and return
  338.     DB    TAB,TAB,'++FILE READ ERROR++',CR,LF,0
  339. BADRET:            ;General bad return location
  340.     XRA    A    ;Set zero flag
  341.     INR    A    ;reset zero flag
  342.     RET        ;Return to caller
  343. ;
  344. ;---------------------------------------------
  345. ;An 8080 routine for generating a CYCLIC-
  346. ;REDUNDANCY-CHECK.  Character leaves that
  347. ;character in location REM.  By Fred Gutman.
  348. ;From 'EDN' magazine, June 5, 1979 issue, page 84.
  349. ;
  350. DIVP:
  351.     LHLD    REM    ;GET REMAINDER
  352.     MOV    A,H
  353.     ANI    128    ;Q-BIT MASK
  354.     PUSH    PSW    ;SAVE STATUS
  355.     DAD    H    ;2 X R(X)
  356.     LDA    MESS    ;MESSAGE BIT IN LSB
  357.     ADD    L
  358.     MOV    L,A
  359.     POP    PSW
  360.     JZ    QB2    ;IF Q-BIT IS ZERO
  361. ;
  362. QB:
  363.     MOV    A,H
  364.     XRI    0A0H    ;MS HALF OF GEN. POLY
  365.     MOV    H,A
  366.     MOV    A,L
  367.     XRI    97H    ;LS HALF OF GEN. POLY
  368.     MOV    L,A
  369. ;
  370. QB2:
  371.     SHLD    REM
  372.     RET
  373. ;--------------------------------------------
  374. ;
  375. ;Hex output
  376. ;
  377. HEXO:
  378.     PUSH    PSW    ;SAVE FOR RIGHT DIGIT
  379.     RAR        ;RIGHT..
  380.     RAR        ;..JUSTIFY..
  381.     RAR        ;..LEFT..
  382.     RAR        ;..DIGIT..
  383.     CALL    NIBBL    ;PRINT LEFT DIGIT
  384.     POP    PSW    ;RESTORE RIGHT
  385. ;
  386. NIBBL:    ANI    0FH    ;ISOLATE DIGIT
  387.     CPI    10    ;IS IS <10?
  388.     JC    ISNUM    ;YES, NOT ALPHA
  389.     ADI    7    ;ADD ALPHA BIAS
  390. ;
  391. ISNUM:    ADI    '0'    ;MAKE PRINTABLE
  392.     JMP    TYPE    ;PRINT IT, THEN RETURN
  393. ;
  394. ;Inline print routine
  395. ;
  396. ILPRT:    XTHL        ;SAVE HL, GET MSG
  397. ;
  398. ILPLP:    MOV    A,M    ;GET CHAR
  399.     CALL    TYPE    ;OUTPUT IT
  400.     INX    H    ;POINT TO NEXT
  401.     MOV    A,M    ;TEST
  402.     ORA    A    ;..FOR END
  403.     JNZ    ILPLP
  404.     XTHL        ;RESTORE HL, RET ADDR
  405.     RET        ;RET PAST MSG
  406. ;
  407. ;Send carriage return, line feed to output
  408. ;
  409. CRLF:    MVI    A,CR    ;CARRIAGE RETURN
  410.     CALL    TYPE
  411.     MVI    A,LF    ;LINE FEED, FALL INTO 'TYPE'
  412. ;
  413. ;Send character in A register to output
  414. ;
  415. TYPE:    PUSH    B
  416.     PUSH    D
  417.     PUSH    H
  418.     ANI    7FH    ;STRIP PARITY BIT
  419.     MOV    E,A
  420.     PUSH    D
  421.     CALL    WRFILE    ;WRITE TO FILE IF REQUESTED
  422.     POP    d
  423.     mvi    c,WRCON    ;send chracter to console
  424.     call    bdos
  425.     pop    h
  426.     pop    d
  427.     pop    b
  428.     ret
  429. ;
  430. ;    Write character in E register to output file
  431. ;
  432. WRFILE:
  433.     LDA    FFLAG    ;Get file trigger
  434.     CPI    'F'    ;Is it set?
  435.     RNZ        ;No?, return
  436.     MOV    A,E    ;Get character back
  437.     PUT    CATALOG    ;Send it to the file
  438.     RET        ;to caller
  439. ;
  440. ;Multi-file access subroutine. Allows processing
  441. ;of multiple files <i.e. *.ASM> from disk.  This
  442. ;routine builds the proper name in the FCB each
  443. ;time it is called.  carry is set if no more names
  444. ;can be found.  The routine is commented in pseudo
  445. ;code, each pseudo code statement is in <<...>>
  446. ;
  447. MFNAME:
  448.     MVI    C,STDMA
  449.     LXI    D,BASE+80H
  450.     CALL    BDOS
  451.     XRA    A
  452.     STA    FCBEXT
  453.     STA    FCBRNO
  454. ;<<if first time>>
  455.     LDA    MFFLG1
  456.     ORA    A
  457.     JZ    MFN01
  458. ;<<save the requested name>>
  459. ;save orig request
  460.     LXI    H,FCB
  461.     LXI    D,MFREQ
  462.     LXI    B,12
  463.     CALL    MOVER
  464.     LDA    FCB
  465.     STA    MFCUR    ;Save disk in curr FCB
  466. ;<<srchf requested namd>>
  467.     LXI    H,MFREQ
  468.     LXI    D,FCB
  469.     LXI    B,12
  470.     CALL    MOVER
  471.     MVI    C,SRCHF
  472.     LXI    D,FCB
  473.     CALL    BDOS
  474. ;<<else>>
  475.     JMP    MFN02
  476. ;
  477. MFN01:    ;<<srchf current name>>
  478.     LXI    H,MFCUR
  479.     LXI    D,FCB
  480.     LXI    B,12
  481.     CALL    MOVER
  482.     MVI    C,SRCHF
  483.     LXI    D,FCB
  484.     CALL    BDOS
  485. ;<<SRCHN requested name>>
  486.     LXI    H,MFREQ
  487.     LXI    D,FCB
  488.     LXI    B,12
  489.     CALL    MOVER
  490.     MVI    C,SRCHN
  491.     LXI    D,FCB
  492.     CALL    BDOS
  493. ;<<endif>>
  494. MFN02:    ;<<return carry if not found>>
  495.     INR    A
  496.     STC
  497.     RZ
  498. ;<<move name found to current name>>
  499.     DCR    A
  500.     ANI    3
  501.     ADD    A
  502.     ADD    A
  503.     ADD    A
  504.     ADD    A
  505.     ADD    A
  506.     ADI    81H
  507.     MOV    L,A
  508.     MVI    H,BASE SHR 8
  509.     PUSH    H    ;SAVE NAME POINTER
  510.     LXI    D,MFCUR+1
  511.     LXI    B,11
  512.     CALL    MOVER
  513. ;<<move name found to FCB>>
  514.     POP    H
  515.     LXI    D,FCB+1
  516.     LXI    B,11
  517.     CALL    MOVER
  518. ;<<setup FCB>>
  519.     XRA    A
  520.     STA    FCBEXT
  521.     STA    FCBRNO
  522.     STA    MFFLG1    ;TURN OFF 1ST TIME SW
  523.     STA    MFFLG2    ;FLAG INDICATING FOUND AT LEAST ONE
  524. ;<<return>>
  525.     RET
  526. ;------------------------------------------------
  527. ;
  528. ;Check for .$$$ files
  529. ;
  530. TSTBAD:    CALL    TESTIT    ;CHECK FIRST ONE FOR '$'
  531.     RNZ        ;NO, RETURN
  532.     CALL    TESTIT    ;CHECK SECOND ONE
  533.     RNZ        ;NO, RETURN
  534.             ;FALL INTO TESTIT TO CHECK THIRD
  535. ;
  536. TESTIT:    MOV    A,M
  537.     ANI    7FH    ;STRIP ATTRIBUTE
  538.     CPI    '$'    ;CHECK FOR $ FILETYPE
  539.     INX    H
  540.     RET
  541. BADTYP:            ;Check for BAD file type
  542.     MOV    A,M
  543.     ANI    7FH
  544.     CPI    'B'
  545.     RNZ
  546.     INX    H
  547.     MOV    A,M
  548.     ANI    7FH
  549.     CPI    'A'
  550.     RNZ
  551.     INX    H
  552.     MOV    A,M
  553.     ANI    7FH
  554.     CPI    'D'
  555.     RET        ;Return with zero flag set or not
  556. ;
  557. ;Move (BC) bytes from (HL) to (DE)
  558. ;
  559. MOVER:    MOV    A,M
  560.     STAX    D
  561.     INX    H
  562.     INX    D
  563.     DCX    B
  564.     MOV    A,B
  565.     ORA    C
  566.     JNZ    MOVER
  567.     RET
  568. ;
  569. ;Aborted - print reason.  If making output file,
  570. ;close the incomplete file to update CP/M's bit map,
  571. ;then erase it.
  572. ;
  573. ABEXIT:    POP    D    ;GET MSG ADRS
  574.     MVI    C,PRINT
  575.     CALL    BDOS    ;PRINT MSG
  576. ;
  577. ABEXT2:    LDA    FFLAG    ;SEE IF WE ARE MAKING FILE
  578.     CPI    'F'
  579.     JNZ    ABEXT3    ;NO FILE, SKIP FILE STUFF
  580.     FINIS    CATALOG    ;CLOSE INCOMPLETE FILE
  581.     ERASE    CATALOG    ;ERASE INCOMPLETE FILE
  582. ;
  583. ABEXT3:    CALL    ERXIT    ;PRINT MSG, EXIT
  584.     DB    CR,LF,CR,LF,'++ABORTED++$'
  585. ;
  586. ;Exit with message
  587. ;
  588. MSGEXIT:EQU    $    ;EXIT W/"INFORMATIONAL" MSG
  589. ERXIT:    POP    D    ;GET MSG
  590.     MVI    C,PRINT
  591.     CALL    BDOS
  592. ;
  593. ;Exit, restoring stack and return to CCP
  594. ;
  595. EXIT:    LHLD    STACK
  596.     SPHL
  597.     RET        ;TO CCP
  598. ;
  599. SHWDEC:            ;3 Digits, up to 255, with leading 0 suppress
  600.     MVI    B,' '    ;Set for space
  601.     MVI    C,0
  602. SHWDE:
  603.     CPI    100    ;Check if greater than 100
  604.     JC    NOHUNS
  605.     INR    C
  606.     SUI    100
  607.     JMP    SHWDE
  608. NOHUNS:
  609.     PUSH    PSW
  610.     MOV    A,C
  611.     ORA    A
  612.     JZ    NOHN
  613.     MVI    B,'0'    ;Set "0" for next 0
  614. NOHN:
  615.     ADD    B    ;Add space or "0"
  616.     CALL    TYPE
  617.     POP    PSW
  618.     MVI    C,0
  619. CKTENS:
  620.     CPI    10
  621.     JC    NO10S
  622.     INR    C
  623.     SUI    10
  624.     JMP    CKTENS
  625. NO10S:
  626.     PUSH    PSW
  627.     MOV    A,C
  628.     ORA    A    ;Check if any 10s
  629.     JZ    NO10X
  630.     MVI    B,'0'
  631. NO10X:
  632.     ADD    B    ;Add space or "0"
  633.     CALL    TYPE
  634.     POP    PSW
  635.     ADI    '0'
  636.     JMP    TYPE        
  637. ;
  638. SHWDC:            ;2 DIGITS ONLY, 99 only, No 0 supress
  639.     MVI    C,'0'    ;Set up for '0' digit
  640. SHWDC1:
  641.     CPI    10    ;Check if greater than 10
  642.     JC    NOTENS    ;Branch if no tens digits
  643.     INR    C    ;Increment tens digit counter
  644.     SUI    10    ;Subtract 10 from number
  645.     JMP    SHWDC1    ;Branch back to test again
  646. NOTENS:
  647.     PUSH    PSW    ;Save the units digit quantity
  648.     MOV    A,C    ;Get the tens digit quantity
  649.     CALL    TYPE
  650.     POP    PSW    ;Restore the units digit quantity
  651.     ADI    '0'    ;Add ascii digits numeral offset
  652.     JMP    TYPE    ;Display units and return to caller
  653. ;
  654. ;Program storage area
  655. ;
  656. NAMPTR:    DS    2    ;Storage for name start in catalog search
  657. MTCH    DB    0    ;CRC Match counter
  658. NOMTCH    DB    0    ;CRC Don't match counter
  659. BADPAR    DB    0    ;Bad parse counter
  660. MISFIL    DB    0    ;Missing files counter
  661. FFLAG:    DB    0    ;FILE WRITE REQUEST FLAG
  662. FLAGAX:    DB    0    ;All user check flag
  663. REM:    DW    0    ;CRC REMAINDER STORAGE
  664. QUANEK:    DW    0    ;Quantity of eighth K
  665. MSPREM    DS    1    ;Storage for CRC MSP from file
  666. LSPREM    DS    1    ;LSP from file
  667. MESS:    DB    0    ;CRC MESSAGE CHAR GOES HERE
  668. MFFLG1:    DB    1    ;1ST TIME SWITCH
  669. MFFLG2:    DB    1    ;FLAG INDICATING ONE NAME FOUND OR NOT
  670. XFRST:    DB    1    ;1st time check in read
  671. RDCK:    DB    0    ;Open file CRCKLIST or -CATALOG
  672. VERNUM:    DB    0    ;VERSION NUMBER OF CP/M IN USE
  673. ENTUSR:    DB    0    ;ENTRY USER NUMBER
  674. NOWUSR:    DB    0    ;PRESENT USER'S NUMBER
  675. NAMQUAN:    DB    0    ;Quantity of files read    
  676. FRSNAM:    DB    1    ;FIRST NAME IN USER FLAG
  677. MFREQ:    DS    12    ;REQUESTED NAME
  678. MFCUR:    DS    12    ;CURRENT NAME
  679. WHICH    DS    1    ;Flag storage for phase
  680. BUFAD:    DS    2    ;READ BUFFER ADDRESS
  681. STRCNT    DS    2    ;STRING COUNT STORAGE
  682. STRING    DS    11    ;STRING STORAGE
  683. STR1:    DS    12    ;Name storage
  684. STR2:    DS    8    ;Characters after name
  685. STR3:    DS    5    ;Ascii CRC characters
  686. STR4:    DS    80    ;Buffer
  687.     DS    60    ;STACK AREA
  688. STACK:    EQU    $
  689. OLDSTK:    DS    2    ;OLD STACK POINTER SAVED HERE
  690. ;
  691. ;Define location of file write buffer
  692. BUFFERS:EQU    $
  693. ;
  694.     END    CRCK
  695.