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.a86 < prev    next >
Text File  |  1985-03-10  |  20KB  |  1,009 lines

  1.     TITLE    'CRCBUILD.A86'
  2. ;
  3. ;CP/M-86 version by    Bill Bolton,
  4. ;            Software Tools RCPM,
  5. ;            P.O. Box 357,
  6. ;            Kenmore,
  7. ;            QLD, 4069,
  8. ;            Australia
  9. ;
  10. ;International    61-7-378-9530+
  11. ;Domestic    (07) 378-9530    300bps CCITT V.21 standard
  12. ;
  13. ;    *********** NOTE WELL ************
  14. ;
  15. ;    This version uses the "old" CRC polynomial code as
  16. ;    incorrectly described in EDN all those years back
  17. ;    and generates the same CRCKs as most other CRC programs,
  18. ;    including the CRC options in YAM, MODEM and MEX.
  19. ;    The "new" CRC polynomial version of CRC, although
  20. ;    a technically correct implementation of the polynomial,
  21. ;    produces entirely different CRC values than those found in
  22. ;    the CRCKLIST, CRCKFILE and -CATALOG files on most public
  23. ;    domain disks. Even though the "old" polynomial code doesn't
  24. ;    implement the polynomial correctly, it still works just as
  25. ;    effectively as the correct polynomial for the purposes of
  26. ;    identifying the integrity of files on a disk.
  27. ;
  28. ;This version is built on the 8086 small memory model and should
  29. ;be GENCMD with the following command
  30. ;
  31. ;    GENCMD CRCBUILD
  32. ;
  33. ;Original CP/M-80 Version by JOHN L. RAFF WB2MDG/KAPP8107
  34. ;
  35. ;VERSION LIST, most recent version first
  36. ;
  37. ;04/Aug/84 CP/M-86 version created from CP/M-80 version. Removed
  38. ;       all in line prints and restructured for 8086 small
  39. ;       memory model. Removed a number of superfluous labels
  40. ;       and some unused data storage. Now uses operating
  41. ;       system 96 byte stack and tested for catalogs
  42. ;       upto 99 entries. If there are more than 100 entries
  43. ;       in a catalog, ID numbers after 99 will display
  44. ;       oddly (the CP/M-80 version does this too).
  45. ;       Version 1.0, Bill Bolton, Software Tools, Australia
  46. ;
  47. ;CRCBUILD IS A PROGRAM TO BUILD A CP/M FILE IN SIG/M 
  48. ;-CATALOG FORMAT AND PRINT A CYCLIC-REDUNDANCY-CHECK
  49. ;NUMBER BASED ON THE CCITT STANDARD POLYNOMINAL:
  50.  
  51. ;   X^16 + X^15 + X^13 + X^7 + X^4 + X^2 + X + 1
  52. ;  
  53. ;    (well almost, see above comments)
  54. ;
  55. ;DEFINE TRUE AND FALSE
  56. ;
  57. FALSE    EQU    0
  58. TRUE    EQU    NOT FALSE
  59. ;
  60. ;CONDITIONAL ASSEMBLY SWITCHES
  61. ;
  62. NOSYS    EQU    FALSE            ;TRUE IF SYS FILES NOT WANTED
  63. ;
  64. BASE    EQU    0
  65. ;
  66. ;DEFINE WRITE BUFFER SIZE (PRESENTLY SET FOR 8K)
  67. ;
  68. BSIZE    EQU    8*1024            ;DISK WRITE BUFFER SIZE
  69. ;
  70. ;BDOS EQUATES
  71. ;
  72. RDCON    EQU    1
  73. WRCON    EQU    2
  74. PRINT    EQU    9
  75. READCONSOLE EQU    10            ;READ CONSOLE BUFFER
  76. CSTAT    EQU    11
  77. OPEN    EQU    15
  78. CLOSE    EQU    16
  79. SRCHF    EQU    17
  80. SRCHN    EQU    18
  81. DELETE    EQU    19
  82. READ    EQU    20
  83. WRITE    EQU    21
  84. MAKE    EQU    22
  85. RENAME    EQU    23
  86. STDMA    EQU    26
  87. BDOS    EQU    224
  88. FCB    EQU    5CH
  89. FCBEXT    EQU    FCB+12
  90. FCBRNO    EQU    FCB+32
  91. FCB2    EQU    6CH
  92. TBUF    EQU    80H
  93. STRLMT    EQU    80            ;STRING LENGTH LIMIT
  94. ;
  95. TAB    EQU    07H            ;ASCII tab
  96. LF    EQU    0AH            ;ASCII line feed
  97. CR    EQU    0DH            ;ASCII carriage return
  98. EOF    EQU    1AH            ;CP/M end of file marker
  99. ;
  100. SECT    EQU    128            ;Size BDOS like to handle
  101. CATSIZ    EQU    2000H
  102. M    EQU    Byte Ptr 0[BX]
  103. ;
  104. ;PROGRAM STARTS HERE
  105. ;
  106.     CSEG
  107.     ORG    0
  108. ;
  109. BEGIN:
  110.     XOR    AL,AL
  111.     MOV    Byte Ptr NAMQUAN,AL    ;ZERO THE QUANTITY OF FILES READ
  112. ;    MOV    BX,0            ;GET STACK...
  113. ;    ADD    BX,SP            ;POINTER SO WE CAN..
  114. ;    MOV    Word Ptr STACK,BX    ;SAVE IT
  115. ;    MOV    SP,(Offset STACK)    ;INITIALIZE LOCAL STACK
  116. BGN2:
  117.     CALL    CRLF            ;TURN UP A NEW LINE
  118.     MOV    BX,(Offset SIGNON)    ;Tell them who we are
  119.     CALL    DISPLAY
  120.     MOV    AL,Byte Ptr .FCB+1
  121.     CMP    AL,' '            ;SEE IF NAME THERE
  122.     JNZ    BEGIN2            ;YES, CONTINUE
  123.     MOV    DX,FCB+2        ;PUT TOTAL DIRECTORY PATTERN
  124.     MOV    BX,FCB+1        ;IN FCB
  125.     MOV    M,'?'            ;ALL "?"
  126.     MOV    CX,10            ;4 CHARACTERS
  127.     CALL    MOVER            ;MOVE IT
  128.     JMPS    BEGIN2            ;GO GET UM
  129. ;
  130. THRNUM:                    ;CHECK FOR THREE ASCII NUMBERS
  131.     CALL    TWONUM
  132.     JZ    THR1
  133.     RET                ;RETURN IF NOT NUMBERS
  134.  
  135. THR1:
  136.     CALL    NUM
  137.     JNZ    THR2
  138.     RET                ;RETURN IF A NUMBER
  139.  
  140. THR2:
  141.     CMP    AL,'.'            ;CHECK FOR A PERIOD
  142.     JZ    THR3
  143.     RET                ;RETURN IF NOT A PERIOD
  144.  
  145. THR3:
  146.     DEC    BX            ;OTHERWISE BACK UP ONE CHARACTER
  147.     DEC    CH            ;AND ONE COUNT
  148.     CMP    AL,AL            ;SET ZERO FLAG
  149.     RET
  150. ;
  151. TWONUM:
  152.     CALL    NUM
  153.     JZ    NUM
  154.     RET
  155. ;
  156. NUM:
  157.     MOV    AL,M            ;GET THE CHARACTER
  158.     INC    BX            ;FOR NEXT CHARACTER
  159.     INC    CH            ;INCREMENT FOR NEXT COUNT
  160.     CMP    AL,'0'            ;IS IT LESS THAN 0
  161.     JB    NUMNOT            ;BRANCH IF IT IS
  162.     CMP    AL,'9'+1        ;IS IT GREATER THAN 9?
  163.     JNB    NUMNOT
  164.     CMP    AL,AL            ;SET ZERO FLAG
  165.     RET
  166. ;
  167. NUMNOT:
  168.     CMP    AL,'0'            ;SHOULD NOT BE EQUAL, RESET ZERO FLAG
  169.     RET
  170. ;
  171. BEG2NG:
  172.     MOV    BX,(Offset WRONG)
  173.     CALL    DISPLAY
  174. BEGIN2:
  175.     MOV    BX,(Offset ENTER)
  176.     CALL    DISPLAY
  177.     MOV    DX,(Offset STR4)    ;POINT TO STRING 4
  178.     MOV    AL,5            ;INDICATE SIZE OF BUFFER 
  179.     MOV    SI,DX
  180.     MOV    [SI],AL
  181.     MOV    CL,READCONSOLE        ;READ CONSOLE BUFFER
  182.     INT    BDOS            ;GO GET THE STRING
  183.     MOV    BX,(Offset STR4)+1    ;POINT TO QUANTITY CHARACTERS ENTERED
  184.     MOV    CL,M            ;GET THE COUNT
  185.     MOV    AL,3            ;CHECK FOR THREE CHARACTERS
  186.     CMP    AL,CL            ;IN BUFFER
  187.     JNZ    BEG2NG            ;BRANCH IF NOT 3 CHARACTERS
  188.     MOV    CH,0            ;ZERO COUNTER
  189.     LAHF                ;POINT TO FIRST CHARACTER
  190.     INC    BX
  191.     SAHF
  192. BEG2A:
  193.     CALL    NUM            ;IS IT A DECIMAL NUMBER?
  194.     JNZ    BEG2NG            ;BRANCH IF NOT A DECIMAL NUMBER
  195.     MOV    AL,CH            ;CHECK QUANTITY OF CHARACTERS
  196.     CMP    AL,3
  197.     JNZ    BEG2A            ;BRANCH IF NOT END OF CHARACTERS YET
  198.     MOV    M,0            ;ENSURE TERMINATION OF STRING
  199.     MOV    BX,(Offset STR4)+2    ;COPY NUMBER INTO FILE STRING
  200.     MOV    DX,(Offset FNAME1)
  201.     MOV    CX,3            ;COUNT
  202.     CALL    MOVER
  203.     MOV    AL,'F'            ;INDICATE WRITE FILE OPEN
  204.     MOV    Byte Ptr FFLAG,AL
  205. ;
  206. ;'DECLARE' FCB FOR OUTPUT FILE
  207. ;(TEMPORARILY NAMED -CATALOG.$$$)
  208. ;
  209.     JMP    MAKCAT
  210. ;
  211. PUTCATALOG:
  212.     LAHF
  213.     XCHG    AL,AH
  214.     PUSH    AX
  215.     MOV    BX,Word Ptr CATLEN
  216.     XCHG    BX,DX
  217.     MOV    BX,Word Ptr CATPTR
  218.     MOV    AL,BL
  219.     SUB    AL,DL
  220.     MOV    AL,BH
  221.     SBB    AL,DH
  222.     JNB    PUTCAT_1
  223.     JMP    PUTCAT_5
  224. ;
  225. PUTCAT_1:
  226.     MOV    BX,0
  227.     MOV    Word Ptr CATPTR,BX
  228. PUTCAT_2:
  229.     XCHG    BX,DX
  230.     MOV    BX,Word Ptr CATLEN
  231.     MOV    AL,DL
  232.     SUB    AL,BL
  233.     MOV    AL,DH
  234.     SBB    AL,BH
  235.     JNB    PUTCAT_4
  236.     MOV    BX,Word Ptr CATADR
  237.     ADD    BX,DX
  238.     XCHG    BX,DX
  239.     MOV    CL,STDMA
  240.     INT    BDOS
  241.     MOV    DX,(Offset FCBCAT)
  242.     MOV    CL,WRITE
  243.     INT    BDOS
  244.     OR    AL,AL
  245.     JNZ    PUTCAT_3
  246.     MOV    DX,SECT
  247.     MOV    BX,Word Ptr CATPTR
  248.     ADD    BX,DX
  249.     MOV    Word Ptr CATPTR,BX
  250.     JMPS    PUTCAT_2
  251. ;
  252. PUTCAT_3:
  253.     MOV    CL,PRINT
  254.     MOV    DX,(Offset FULLMSG)
  255.     INT    BDOS
  256.     POP    AX
  257.     XCHG    AL,AH
  258.     JMP    FILERR
  259. ;
  260. PUTCAT_4:
  261.     MOV    DX,TBUF
  262.     MOV    CL,STDMA
  263.     INT    BDOS
  264.     MOV    BX,0
  265.     MOV    Word Ptr CATPTR,BX
  266. PUTCAT_5:
  267.     XCHG    BX,DX
  268.     MOV    BX,Word Ptr CATADR
  269.     ADD    BX,DX
  270.     XCHG    BX,DX
  271.     POP    AX
  272.     XCHG    AL,AH
  273.     SAHF
  274.     MOV    SI,DX
  275.     MOV    [SI],AL
  276.     MOV    BX,Word Ptr CATPTR
  277.     LAHF
  278.     INC    BX
  279.     SAHF
  280.     MOV    Word Ptr CATPTR,BX
  281.     RET
  282. ;
  283. MAKCAT:
  284.     XOR    AL,AL
  285.     MOV    Byte Ptr FCBCAT+12,AL
  286.     MOV    Byte Ptr FCBCAT+32,AL
  287.     MOV    BX,CATSIZ
  288.     MOV    Word Ptr CATLEN,BX
  289.     MOV    BX,0
  290.     MOV    Word Ptr CATPTR,BX
  291.     MOV    CL,DELETE
  292.     MOV    DX,(Offset FCBCAT)
  293.     INT    BDOS
  294.     MOV    CL,MAKE
  295.     MOV    DX,(Offset FCBCAT)
  296.     INT    BDOS
  297.     INC    AL
  298.     JNZ    AGAIN
  299.     MOV    CL,PRINT
  300.     MOV    DX,(Offset SPACE)
  301.     INT    BDOS
  302.     JMP    FILERR
  303. ;
  304. AGAIN:
  305. ;    MOV    SP,(Offset STACK)    ;RE-INIT STACK POINTER
  306.     MOV    AL,0            ;INDICATE IN BUILDING PHASE
  307.     MOV    Byte Ptr WHICH,AL    ;SAVE FLAG
  308.     CALL    MFNAME            ;SEARCH FOR NAMES
  309.     JNAE    AGN_2    
  310.     JMP    NAMTST            ;ANOTHER FOUND, PRINT NAME
  311. ;
  312. AGN_2:
  313.     MOV    AL,Byte Ptr MFFLG2    ;NOTHING FOUND, CHECK...
  314.     OR    AL,AL            ;... NAME FOUND FLAG
  315.     JZ    DONE            ;AT LEAST ONE WAS FOUND
  316.     JMP    ABEXIT            ;PRINT MSG, THEN EXIT
  317. ;
  318. DONE:                    ;CLOSE -CATALOG.$$$
  319.     MOV    BX,(Offset FNAME1)
  320.     MOV    DX,(Offset DONEX)
  321.     MOV    CX,3
  322.     CALL    MOVER
  323.     MOV    BX,(Offset FOOT1)
  324.     CALL    DISPLAY
  325.     MOV    AL,Byte Ptr NAMQUAN
  326.     CALL    SHWDC
  327.     MOV    BX,(Offset FOOT2)
  328.     CALL    DISPLAY
  329. DONE_2:
  330.     MOV    BX,Word Ptr CATPTR
  331.     MOV    AL,BL
  332.     AND    AL,(SECT-1) AND 0FFH
  333.     JNZ    DONE_3
  334.     MOV    Word Ptr CATLEN,BX
  335. DONE_3:
  336.     MOV    AL,EOF
  337.     LAHF
  338.     XCHG    AL,AH
  339.     PUSH    AX
  340.     XCHG    AL,AH
  341.     CALL    PUTCATALOG
  342.     POP    AX
  343.     XCHG    AL,AH
  344.     SAHF
  345.     JNZ    DONE_2
  346.     MOV    CL,CLOSE
  347.     MOV    DX,(Offset FCBCAT)
  348.     INT    BDOS
  349.     INC    AL
  350.     JNZ    DONE_4
  351.     MOV    CL,PRINT
  352.     MOV    DX,(Offset CLSMSG)
  353.     INT    BDOS
  354. DONE_4:
  355.     MOV    BX,(Offset STR4)+2    ;POINT TO BEGINNING OF STRING
  356.     MOV    DX,(Offset FCBFINAL)+9    ;LOCATION OF NAME TYPE
  357.     MOV    CX,3            ;QUANTITY TO MOVE
  358.     CALL    MOVER
  359. ;
  360. ;    ERASE ANY EXISTING OLD FILE
  361. ;
  362. ERASE:
  363.     MOV    CL,DELETE
  364.     MOV    DX,(Offset FCBFINAL)
  365.     INT    BDOS
  366. ;
  367. ;    RENAME -CATALOG.$$$ TO -CATALOG.NNN
  368.     JMPS    REN_2
  369. ;
  370. RENS:
  371.     PUSH    BX
  372.     MOV    CX,16
  373.     LAHF
  374.     ADD    BX,CX
  375.     RCR    SI,1
  376.     SAHF
  377.     RCL    SI,1
  378. REN_1:
  379.     MOV    SI,DX
  380.     MOV    AL,[SI]
  381.     MOV    M,AL
  382.     LAHF
  383.     INC    DX
  384.     SAHF
  385.     LAHF
  386.     INC    BX
  387.     SAHF
  388.     DEC    CL
  389.     JNZ    REN_1
  390.     POP    DX
  391.     MOV    CL,RENAME
  392.     INT    BDOS
  393.     RET
  394. ;
  395. REN_2:
  396.     MOV    BX,(Offset FCBCAT)
  397.     MOV    DX,(Offset FCBFINAL)
  398.     CALL    RENS
  399. ;
  400. ;NOW EXIT TO CP/M
  401. DONE_5:
  402.     MOV    BX,(Offset DONEMSG)    ;Display end then exit 
  403.     CALL    DISPLAY
  404.     JMP    EXIT
  405. ;
  406. ;IGNORE FILES WITH .$$$ FILETYPE (THEY ARE USUALLY
  407. ;ZERO-LENGTH AND CLUTTER UP OUR DISPLAY.  WE ALSO
  408. ;WANT TO IGNORE OUR OWN CRCKLIST.$$$ TEMPORARY FILE).
  409. ;
  410. NAMTST:
  411.     MOV    BX,FCB+9        ;POINT TO FILETYPE IN FCB
  412.     PUSH    BX            ;MAY NEED POINTER FOR BAD CHECK
  413.     CALL    TSTBAD            ;CHECK FOR .$$$ FILES
  414.     JNZ    NAMTST_1    
  415.     JMP    AGAIN            ;IF ZERO FLAG, IGNORE THEM
  416. ;
  417. NAMTST_1:
  418.     POP    BX            ;RESTORE POINTER
  419.     CALL    BADTYP            ;CHECK FOR .BAD FILES
  420.     JNZ    NAMTST_2    
  421.     JMP    AGAIN            ;BRANCH IF IT IS
  422. ;
  423. NAMTST_2:
  424.     MOV    BX,(Offset NUMBER)
  425.     CALL    DISPLAY
  426.     MOV    AL,Byte Ptr NAMQUAN
  427.     INC    AL            ;INCREMENT COUNT
  428.     MOV    Byte Ptr NAMQUAN,AL
  429.     CALL    SHWDC            ;SHOW THE COUNT
  430. ;
  431. ;MOVE 8 CHARACTERS FROM FCB+1 TO FNAME
  432. ;
  433.     MOV    BX,FCB+1
  434.     MOV    DX,(Offset FNAME)
  435.     MOV    CX,8
  436.     CALL    MOVER
  437. ;MOVE 3 CHARACTERS FROM FCB+9 TO FNAME+9
  438.     MOV    BX,FCB+9
  439.     MOV    DX,(Offset FNAME)+9
  440.     MOV    CX,3
  441.     CALL    MOVER
  442. ;NOW PRINT FILENAME.TYPE
  443.     MOV    BX,(Offset FILEN)
  444.     CALL    DISPLAY
  445. FNAME2:
  446.     CALL    OPN            ;OPEN FILE AND BUILD CRC
  447.     JNZ    FNAME_3    
  448.     JMP    AGAIN            ;BRANCH IF BAD OPEN OR READ
  449. ;
  450. FNAME_3:
  451.     JMP    ABEXT_2            ;OTHERWISE GET OUT
  452. ;
  453. ;OPEN THE FILE
  454. ;
  455. OPN:
  456.     MOV    DX,FCB
  457.     MOV    CL,OPEN
  458.     INT    BDOS
  459.     INC    AL
  460.     JNZ    RDINIT
  461.     MOV    BX,(Offset FAIL)
  462.     CALL    DISPLAY
  463.     JMP    BADRET            ;INDICATE BAD OPEN
  464. ;
  465. ;INITIALIZE CRC TO ZERO AND SET BUFAD TO CAUSE INITIAL READ
  466. ;
  467. RDINIT:
  468.     MOV    BX,0
  469.     MOV    Word Ptr REMAIN,BX        ;INIT REMAINDER TO ZERO
  470.     MOV    Word Ptr QUANEK,BX    ;QUANTITY OF EIGHTH K
  471.     MOV    BX,BASE+100H
  472.     MOV    Word Ptr BUFAD,BX    ;INIT BUFFER ADDRESS
  473. ;
  474. ;THIS IS THE READ LOOP
  475. ;
  476. READIT:
  477.     MOV    BX,Word Ptr BUFAD
  478.     MOV    AL,BH            ;TIME TO READ?
  479.     CMP    AL,BASE SHR 8        ;END OF BUFFER?
  480.     JZ    NORD
  481.     MOV    CL,CSTAT
  482.     INT    BDOS            ;CHCK FOR OPERATOR ABORT
  483.     OR    AL,AL
  484.     JZ    READ2            ;BRANCH IF NOTHING FROM OPERATOR
  485.     MOV    CL,RDCON
  486.     INT    BDOS            ;GET CHARACTER FROM OPERATOR
  487.     CMP    AL,'C'-40H        ;CONTROL C?
  488.     JNZ    READ2    
  489.     JMP    ABEXT_2            ;BRANCH IF YES, EXIT
  490. ;
  491. READ2:
  492.     MOV    DX,FCB
  493.     MOV    CL,READ            ;READ ANOTHER SECTOR OF FILE
  494.     INT    BDOS
  495.     OR    AL,AL            ;CHECK RETURN CODE
  496.     JNZ    FINISH            ;ERROR OR EOF
  497.     MOV    BX,Word Ptr QUANEK    ;GET QUANTITY OF EIGHTH K
  498.     INC    BX            ;ADD 1
  499.     MOV    Word Ptr QUANEK,BX    ;PUT BACK
  500.     MOV    BX,BASE+80H        ;BUFER LOCATION
  501. ;
  502. NORD:
  503.     MOV    AL,M            ;GET FILE CHARACTER
  504.     MOV    Byte Ptr MESS,AL    ;SAVE FOR DIVP
  505.     INC    BX
  506.     MOV    Word Ptr BUFAD,BX    ;UPDATE BUFFER ADDRESS
  507.     CALL    DIVP            ;CALCULATE NEW CRC
  508.     JMPS    READIT            ;GO READ MORE CHARACTERS
  509. ;
  510. FINISH:
  511.     CMP    AL,1            ;NORMAL END-OF-FILE?
  512.     JNZ    FILERR            ;NO, IT WAS A READ ERROR
  513.     MOV    BX,Word Ptr QUANEK    ;GET QUANTITY OF EIGHTH K
  514.     MOV    CX,7
  515.     LAHF                ;ROUND UP TO NEXT K
  516.     ADD    BX,CX
  517.     SAHF
  518.     SHL    BX,1            ;TURN INTO FULL K
  519.     SHL    BX,1            ;IN "H" REGISTER
  520.     SHL    BX,1
  521.     SHL    BX,1
  522.     SHL    BX,1
  523.     MOV    AL,BH
  524.     CALL    SHWDEC            ;SHOW NUMBER OF K
  525.     MOV    BX,(Offset KSIZE)
  526.     CALL    DISPLAY
  527.     MOV    AL,Byte Ptr REMAIN+1    ;GET MSP OF CRC
  528.     CALL    HEXO            ;PRINT IT
  529.     MOV    AL,' '
  530.     CALL    TYPER            ;TYPE A SPACE
  531.     MOV    AL,Byte Ptr REMAIN        ;GET LSP OF CRC
  532.     CALL    HEXO            ;PRINT IT
  533. GOODRET:
  534.     XOR    AL,AL
  535.     RET                ;RETURN TO CALLER WITH ZERO FLAG SET
  536. ;
  537. FILERR:
  538.     MOV    BX,(Offset FERROR)
  539.     CALL    DISPLAY        ;PRINT THE MESSAGE AND RETURN
  540. BADRET:                ;GENERAL BAD RETURN LOCATION
  541.     XOR    AL,AL            ;SET ZERO FLAG
  542.     INC    AL            ;RESET ZERO FLAG
  543.     RET                ;RETURN TO CALLER
  544. ;
  545. ;---------------------------------------------
  546. ;AN 8086 ROUTINE FOR GENERATING A CYCLIC-
  547. ;REDUNDANCY-CHECK.  CHARACTER LEAVES THAT
  548. ;CHARACTER IN LOCATION REM.  BY FRED GUTMAN.
  549. ;FROM 'EDN' MAGAZINE, JUNE 5, 1979 ISSUE, PAGE 84.
  550. ;
  551. DIVP:
  552.     MOV    BX,Word Ptr REMAIN    ;GET REMAINDER
  553.     MOV    AL,BH
  554.     AND    AL,128            ;Q-BIT MASK
  555.     LAHF                ;SAVE STATUS
  556.     XCHG    AL,AH
  557.     PUSH    AX
  558.     SHL    BX,1            ;2 X R(X)
  559.     MOV    AL,Byte Ptr MESS    ;MESSAGE BIT IN LSB
  560.     ADD    AL,BL
  561.     MOV    BL,AL
  562.     POP    AX
  563.     XCHG    AL,AH
  564.     SAHF
  565.     JZ    QB2            ;IF Q-BIT IS ZERO
  566. ;
  567. QB:
  568.     MOV    AL,BH
  569.     XOR    AL,0A0H            ;MS HALF OF GEN. POLY
  570.     MOV    BH,AL
  571.     MOV    AL,BL
  572.     XOR    AL,97H            ;LS HALF OF GEN. POLY
  573.     MOV    BL,AL
  574. ;
  575. QB2:
  576.     MOV    Word Ptr REMAIN,BX
  577.     RET
  578. ;
  579. ;--------------------------------------------
  580. ;
  581. ;HEX OUTPUT
  582. ;
  583. HEXO:
  584.     LAHF                ;SAVE FOR RIGHT DIGIT
  585.     XCHG    AL,AH
  586.     PUSH    AX
  587.     XCHG    AL,AH
  588.     RCR    AL,1            ;RIGHT..
  589.     RCR    AL,1            ;..JUSTIFY..
  590.     RCR    AL,1            ;..LEFT..
  591.     RCR    AL,1            ;..DIGIT..
  592.     CALL    NIBBL            ;PRINT LEFT DIGIT
  593.     POP    AX            ;RESTORE RIGHT
  594.     XCHG    AL,AH
  595. ;
  596. NIBBL:
  597.     AND    AL,0FH            ;ISOLATE DIGIT
  598.     CMP    AL,10            ;IS IS <10?
  599.     JB    ISNUM            ;YES, NOT ALPHA
  600.     ADD    AL,7            ;ADD ALPHA BIAS
  601. ;
  602. ISNUM:
  603.     ADD    AL,'0'            ;MAKE PRINTABLE
  604.     JMPS    TYPER            ;PRINT IT, THEN RETURN
  605. ;
  606. ;INLINE PRINT ROUTINE
  607. ;
  608. DISPLAY:
  609.     MOV    AL,M            ;GET CHAR
  610.     CALL    TYPER            ;OUTPUT IT
  611.     INC    BX            ;POINT TO NEXT
  612.     MOV    AL,M            ;TEST
  613.     CMP    AL,'$'            ;..FOR END
  614.     JNZ    DISPLAY
  615.     RET                ;RET PAST MSG
  616. ;
  617. ;SEND CARRIAGE RETURN, LINE FEED TO OUTPUT
  618. ;
  619. CRLF:
  620.     MOV    AL,CR            ;CARRIAGE RETURN
  621.     CALL    TYPER
  622.     MOV    AL,LF            ;LINE FEED, FALL INTO 'TYPE'
  623. ;
  624. ;SEND CHARACTER IN A REGISTER TO OUTPUT
  625. ;
  626. TYPER:
  627.     PUSH    CX
  628.     PUSH    DX
  629.     PUSH    BX
  630.     AND    AL,7FH            ;STRIP PARITY BIT
  631.     MOV    DL,AL
  632.     PUSH    DX
  633.     CALL    WRFILE            ;WRITE TO FILE IF REQUESTED
  634.     POP    DX
  635.     MOV    CL,WRCON        ;SEND CHRACTER TO CONSOLE
  636.     INT    BDOS
  637.     POP    BX
  638.     POP    DX
  639.     POP    CX
  640.     RET
  641. ;
  642. ;    WRITE CHARACTER IN E REGISTER TO OUTPUT FILE
  643. ;
  644. WRFILE:
  645.     MOV    AL,Byte Ptr FFLAG    ;GET FILE TRIGGER
  646.     CMP    AL,'F'            ;IS IT SET?
  647.     JZ    WRF_1
  648.     RET                ;NO?, RETURN
  649. ;
  650. WRF_1:
  651.     MOV    AL,DL            ;GET CHARACTER BACK
  652.     CALL    PUTCATALOG
  653.     RET                ;TO CALLER
  654. ;
  655. ;MULTI-FILE ACCESS SUBROUTINE. ALLOWS PROCESSING
  656. ;OF MULTIPLE FILES <I.E. *.ASM> FROM DISK.  THIS
  657. ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  658. ;TIME IT IS CALLED.  CARRY IS SET IF NO MORE NAMES
  659. ;CAN BE FOUND.  THE ROUTINE IS COMMENTED IN PSEUDO
  660. ;CODE, EACH PSEUDO CODE STATEMENT IS IN <<...>>
  661. ;
  662. MFNAME:
  663.     MOV    CL,STDMA
  664.     MOV    DX,BASE+80H
  665.     INT    BDOS
  666.     XOR    AL,AL
  667.     MOV    Byte Ptr .FCBEXT,AL
  668.     MOV    Byte Ptr .FCBRNO,AL
  669. ;<<IF FIRST TIME>>
  670.     MOV    AL,Byte Ptr MFFLG1
  671.     OR    AL,AL
  672.     JZ    MFN01
  673. ;<<SAVE THE REQUESTED NAME>>
  674. ;SAVE ORIG REQUEST
  675.     MOV    BX,FCB
  676.     MOV    DX,(Offset MFREQ)
  677.     MOV    CX,12
  678.     CALL    MOVER
  679.     MOV    AL,Byte Ptr .FCB
  680.     MOV    Byte Ptr MFCUR,AL    ;SAVE DISK IN CURR FCB
  681. ;<<SRCHF REQUESTED NAMD>>
  682.     MOV    BX,(Offset MFREQ)
  683.     MOV    DX,FCB
  684.     MOV    CX,12
  685.     CALL    MOVER
  686.     MOV    CL,SRCHF
  687.     MOV    DX,FCB
  688.     INT    BDOS
  689. ;<<ELSE>>
  690.     JMPS    MFN02
  691. ;
  692. MFN01:                    ;<<SRCHF CURRENT NAME>>
  693.     MOV    BX,(Offset MFCUR)
  694.     MOV    DX,FCB
  695.     MOV    CX,12
  696.     CALL    MOVER
  697.     MOV    CL,SRCHF
  698.     MOV    DX,FCB
  699.     INT    BDOS
  700. ;<<SRCHN REQUESTED NAME>>
  701.     MOV    BX,(Offset MFREQ)
  702.     MOV    DX,FCB
  703.     MOV    CX,12
  704.     CALL    MOVER
  705.     MOV    CL,SRCHN
  706.     MOV    DX,FCB
  707.     INT    BDOS
  708. ;<<ENDIF>>
  709. MFN02:                    ;<<RETURN CARRY IF NOT FOUND>>
  710.     INC    AL
  711.     STC
  712.     JNZ    MFN03
  713.     RET
  714. ;
  715. ;<<MOVE NAME FOUND TO CURRENT NAME>>
  716. MFN03:
  717.     DEC    AL
  718.     AND    AL,3
  719.     ADD    AL,AL
  720.     ADD    AL,AL
  721.     ADD    AL,AL
  722.     ADD    AL,AL
  723.     ADD    AL,AL
  724.     ADD    AL,81H
  725.     MOV    BL,AL
  726.     MOV    BH,BASE SHR 8
  727.     PUSH    BX            ;SAVE NAME POINTER
  728.     MOV    DX,(Offset MFCUR)+1
  729.     MOV    CX,11
  730.     CALL    MOVER
  731. ;<<MOVE NAME FOUND TO FCB>>
  732.     POP    BX
  733.     MOV    DX,FCB+1
  734.     MOV    CX,11
  735.     CALL    MOVER
  736. ;<<SETUP FCB>>
  737.     XOR    AL,AL
  738.     MOV    Byte Ptr .FCBEXT,AL
  739.     MOV    Byte Ptr .FCBRNO,AL
  740.     MOV    Byte Ptr MFFLG1,AL    ;TURN OFF 1ST TIME SW
  741.     MOV    Byte Ptr MFFLG2,AL    ;FLAG INDICATING FOUND AT LEAST ONE
  742. ;<<RETURN>>
  743.     RET
  744. ;------------------------------------------------
  745. ;
  746. ;CHECK FOR .$$$ FILES
  747. ;
  748. TSTBAD:
  749.     CALL    TESTIT            ;CHECK FIRST ONE FOR '$'
  750.     JZ    TSTBAD_1    
  751.     RET                ;NO, RETURN
  752.  
  753. TSTBAD_1:
  754.     CALL    TESTIT            ;CHECK SECOND ONE
  755.     JZ    TESTIT    
  756.     RET                ;NO, RETURN
  757. ;
  758. ;FALL INTO TESTIT TO CHECK THIRD
  759. ;
  760. TESTIT:
  761.     MOV    AL,M
  762.     AND    AL,7FH            ;STRIP ATTRIBUTE
  763.     CMP    AL,'$'            ;CHECK FOR $ FILETYPE
  764.     LAHF
  765.     INC    BX
  766.     SAHF
  767.     RET
  768. ;
  769. BADTYP:                ;CHECK FOR BAD FILE TYPE
  770.     MOV    AL,M
  771.     AND    AL,7FH
  772.     CMP    AL,'B'
  773.     JZ    BADTYP_1
  774.     RET
  775. ;
  776. BADTYP_1:
  777.     INC    BX
  778.     MOV    AL,M
  779.     AND    AL,7FH
  780.     CMP    AL,'A'
  781.     JZ    BADTYP_2
  782.     RET
  783. ;
  784. BADTYP_2:
  785.     INC    BX
  786.     MOV    AL,M
  787.     AND    AL,7FH
  788.     CMP    AL,'D'
  789.     RET                ;RETURN WITH ZERO FLAG SET OR NOT
  790. ;
  791. ;MOVE (BC) BYTES FROM (HL) TO (DE)
  792. ;
  793. MOVER:
  794.     MOV    AL,M
  795.     MOV    SI,DX
  796.     MOV    [SI],AL
  797.     INC    BX
  798.     INC    DX
  799.     DEC    CX
  800.     MOV    AL,CH
  801.     OR    AL,CL
  802.     JNZ    MOVER
  803.     RET
  804. ;
  805. ;ABORTED - PRINT REASON.  IF MAKING OUTPUT FILE,
  806. ;CLOSE THE INCOMPLETE FILE TO UPDATE CP/M'S BIT MAP,
  807. ;THEN ERASE IT.
  808. ;
  809. ABEXIT:
  810.     MOV    DX,(Offset NFOUND)
  811.     MOV    CL,PRINT
  812.     INT    BDOS            ;PRINT MSG
  813. ;
  814. ABEXT_2:
  815.     MOV    AL,Byte Ptr FFLAG    ;SEE IF WE ARE MAKING FILE
  816.     CMP    AL,'F'
  817.     JNZ    ABEXT_6            ;NO FILE, SKIP FILE STUFF
  818. ABEXT_3:
  819.     MOV    BX,Word Ptr CATPTR
  820.     MOV    AL,BL
  821.     AND    AL,(SECT-1) AND 0FFH
  822.     JNZ    ABEXT_4
  823.     MOV    Word Ptr CATLEN,BX
  824. ABEXT_4:
  825.     MOV    AL,EOF
  826.     LAHF
  827.     XCHG    AL,AH
  828.     PUSH    AX
  829.     XCHG    AL,AH
  830.     CALL    PUTCATALOG
  831.     POP    AX
  832.     XCHG    AL,AH
  833.     SAHF
  834.     JNZ    ABEXT_3
  835.     MOV    CL,CLOSE
  836.     MOV    DX,(Offset FCBCAT)
  837.     INT    BDOS
  838.     INC    AL
  839.     JNZ    ABEXT_5
  840.     MOV    CL,PRINT
  841.     MOV    DX,(Offset CLSMSG)
  842.     INT    BDOS
  843. ABEXT_5:
  844.     MOV    CL,DELETE
  845.     MOV    DX,(Offset FCBCAT)
  846.     INT    BDOS
  847. ;
  848. ABEXT_6:
  849.     MOV    DX,(Offset ABORT)
  850.     MOV    CL,PRINT
  851.     INT    BDOS
  852. ;
  853. ;EXIT, RESTORING STACK AND RETURN TO CCP
  854. ;
  855. EXIT:
  856. ;    MOV    BX,Word Ptr STACK
  857. ;    MOV    SP,BX
  858.     MOV    CX,0
  859.     MOV    DX,0
  860.     INT    BDOS            ;TO CCP
  861. ;
  862. SHWDEC:                ;3 DIGITS, UP TO 255, WITH LEADING 0 SUPPRESS
  863.     MOV    CH,' '            ;SET FOR SPACE
  864.     MOV    CL,0
  865. SHWDE:
  866.     CMP    AL,100            ;CHECK IF GREATER THAN 100
  867.     JB    NOHUNS
  868.     INC    CL
  869.     SUB    AL,100
  870.     JMPS    SHWDE
  871. NOHUNS:
  872.     LAHF
  873.     XCHG    AL,AH
  874.     PUSH    AX
  875.     MOV    AL,CL
  876.     OR    AL,AL
  877.     JZ    NOHN
  878.     MOV    CH,'0'            ;SET "0" FOR NEXT 0
  879. NOHN:
  880.     ADD    AL,CH            ;ADD SPACE OR "0"
  881.     CALL    TYPER
  882.     POP    AX
  883.     XCHG    AL,AH
  884.     MOV    CL,0
  885. CKTENS:
  886.     CMP    AL,10
  887.     JB    NO10S
  888.     INC    CL
  889.     SUB    AL,10
  890.     JMPS    CKTENS
  891. NO10S:
  892.     LAHF
  893.     XCHG    AL,AH
  894.     PUSH    AX
  895.     MOV    AL,CL
  896.     OR    AL,AL            ;CHECK IF ANY 10S
  897.     JZ    NO10X
  898.     MOV    CH,'0'
  899. NO10X:
  900.     ADD    AL,CH            ;ADD SPACE OR "0"
  901.     CALL    TYPER
  902.     POP    AX
  903.     XCHG    AL,AH
  904.     ADD    AL,'0'
  905.     JMP    TYPER
  906. ;
  907. SHWDC:                    ;2 DIGITS ONLY, 99 ONLY, NO 0 SUPRESS
  908.     MOV    CL,'0'            ;SET UP FOR '0' DIGIT
  909. SHWDC1:
  910.     CMP    AL,10            ;CHECK IF GREATER THAN 10
  911.     JB    NOTENS            ;BRANCH IF NO TENS DIGITS
  912.     INC    CL            ;INCREMENT TENS DIGIT COUNTER
  913.     SUB    AL,10            ;SUBTRACT 10 FROM NUMBER
  914.     JMPS    SHWDC1            ;BRANCH BACK TO TEST AGAIN
  915. NOTENS:
  916.     LAHF                ;SAVE THE UNITS DIGIT QUANTITY
  917.     XCHG    AL,AH
  918.     PUSH    AX
  919.     MOV    AL,CL            ;GET THE TENS DIGIT QUANTITY
  920.     CALL    TYPER
  921.     POP    AX            ;RESTORE THE UNITS DIGIT QUANTITY
  922.     XCHG    AL,AH
  923.     ADD    AL,'0'            ;ADD ASCII DIGITS NUMERAL OFFSET
  924.     JMP    TYPER            ;DISPLAY UNITS AND RETURN TO CALLER
  925. ;
  926.     DSEG
  927.     ORG    100H
  928. ;
  929. FCBCAT    DB    0,'-CATALOG$$$'
  930.     DB    0
  931.     RS    20
  932. CATADR    DW    (Offset CATBUF)
  933. CATLEN    DW    CATSIZ
  934. CATPTR    RS    2
  935. ;
  936. SIGNON    DB    'CRCBUILD, CP/M-86 Ver 1.0, 04/Aug/84, Bill Bolton',CR,LF
  937.     DB    'CTL-S pauses, CTL-C aborts',CR,LF,'$'
  938. ;
  939. WRONG    DB    CR,LF,'Incorrect characters',CR,LF,'$'
  940. ;
  941. ENTER    DB    'Enter -CATALOG.xxx number (three digits) - ','$'
  942. ;
  943. FOOT1    DB    CR,LF,'Software Tools RCPM - MISC Volume Number - '
  944. DONEX    DB    'NNN, ','$'
  945. ;
  946. FOOT2    DB    ' Files cataloged.',CR,LF,'$'
  947. ;
  948. DONEMSG    DB    CR,LF,'DONE$'
  949. ;
  950. NUMBER    DB    CR,LF
  951. FNAME1    DB    'NNN.','$'
  952. ;
  953. FILEN    DB    '    '
  954. FNAME    DB    'XXXXXXXX.XXX  ','$'
  955. ;
  956. FAIL    DB    '++Open Failed++','$'
  957. ;
  958. KSIZE    DB    'K   ','$'
  959. ;
  960. FERROR    DB    TAB,TAB,'++ FILE READ ERROR ++',CR,LF,'$'
  961. ;
  962. NFOUND    DB    '++ FILE NOT FOUND ++$'
  963. ;
  964. ABORT    DB    CR,LF,CR,LF,'++ ABORTED ++$'
  965. ;
  966. FULLMSG    DB    CR,LF
  967.     DB    'DISK FULL: CATALOG'
  968.     DB    '$'
  969. ;
  970. SPACE    DB    CR,LF
  971.     DB    'NO DIR SPACE: CATALOG'
  972.     DB    '$'
  973. ;
  974. CLSMSG    DB    CR,LF
  975.     DB    'CANNOT CLOSE CATALOG'
  976.     DB    '$'
  977. ;
  978. FCBFINAL    RS    0
  979.     DB    0,'-CATALOGNNN'
  980.     DB    0
  981.     RS    20
  982. ;
  983. ;PROGRAM STORAGE AREA
  984. ;
  985. FFLAG    DB    0            ;FILE WRITE REQUEST FLAG
  986. REMAIN    DW    0            ;CRC REMAINDER STORAGE
  987. QUANEK    DW    0            ;QUANTITY OF EIGHTH K
  988. MESS    DB    0            ;CRC MESSAGE CHAR GOES HERE
  989. MFFLG1    DB    1            ;1ST TIME SWITCH
  990. MFFLG2    DB    1            ;FLAG INDICATING ONE NAME FOUND OR NOT
  991. NAMQUAN    DB    0            ;QUANTITY OF FILES READ    
  992. MFREQ    RS    12            ;REQUESTED NAME
  993. MFCUR    RS    12            ;CURRENT NAME
  994. WHICH    RS    1            ;FLAG STORAGE FOR PHASE
  995. BUFAD    RS    2            ;READ BUFFER ADDRESS
  996. STRCNT    RS    2            ;STRING COUNT STORAGE
  997. STRING    RS    11            ;STRING STORAGE
  998. STR1    RS    12            ;NAME STORAGE
  999. STR2    RS    8            ;CHARACTERS AFTER NAME
  1000. STR3    RS    5            ;ASCII CRC CHARACTERS
  1001. STR4    RS    80            ;BUFFER
  1002. ;
  1003. ;DEFINE LOCATION OF FILE WRITE BUFFER
  1004. ;
  1005. CATBUF    EQU    (Offset $)
  1006. ;
  1007.     END
  1008.  
  1009.