home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol004 / crck3.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  7.6 KB  |  426 lines

  1. ;
  2. ;        CRCK.ASM version 3.0
  3. ;         (revised 8/10/80)
  4. ;
  5. ;PROGRAM TO READ ANY CP/M FILE AND PRINT A
  6. ;CYCLIC-REDUNDANCY-CHECK NUMBER BASED ON THE
  7. ;CCITT STANDARD POLYNOMINAL:
  8. ;   X^16 + X^15 + X^13 + X^7 + X^4 + X^2 + X + 1
  9. ;
  10. ;USEFUL FOR CHECKING ACCURACY OF FILE TRANSFERS.
  11. ;MORE ACCURATE THAN A SIMPLE CHECKSUM.
  12. ;
  13. ;COMMANDS:   (drive name may be specified)
  14. ;    CRCK FILENAME.FILETYPE
  15. ;    CRCK *.ASM
  16. ;    CRCK *.*
  17. ;
  18. ;06/27/79 FIRST WRITTEN BY KEITH PETERSEN, W8SDZ
  19. ;
  20. ;08/19/79 ADD CONDITIONAL ASSEMBLY FOR CP/M
  21. ;      ON H8 OR TRS-80.  (KBP)
  22. ;
  23. ;08/20/79 FIX BUG IN READIT ROUTINE WHICH
  24. ;      SHOWED UP ONLY ON ALTCPM OPTION. (KBP)
  25. ;
  26. ;04/21/80 ADD MULTIPLE FILENAME FEATURE, PRINT
  27. ;      NAME OF CURRENT FILE BEING READ, AND
  28. ;      ALLOW OPERATOR ABORT. (KBP)
  29. ;
  30. ;04/23/80 CORRECT OMISSION OF SHR 8 IN MFA ROUTINE.
  31. ;      ERROR ONLY SHOWED UP FOR ALTCPM ASSEMBLY
  32. ;      ADD COLON AFTER ---> FILE:    (KBP)
  33. ;
  34. ;08/10/80 ADD ROUTINES TO ALLOW CONDITIONAL ASSEMBLY
  35. ;         OF WILDCARD ROUTINES AND TO ALLOW "SYSTEM"
  36. ;         FILES TO BE EXCLUDED FROM WILDCARD OPTION.
  37. ;         (BY DAVE HARDY)
  38. ;
  39. TRUE    EQU    1
  40. FALSE    EQU    0
  41. ;
  42. ;
  43. STDCPM    EQU    TRUE    ;TRUE IS STANDARD CP/M
  44. ALTCPM    EQU    FALSE    ;TRUE IS H8 OR TRS-80
  45. WILDCD    EQU    TRUE    ;WANT WILDCARDS IN FILENAME?
  46. SYSFILE    EQU    FALSE    ;WANT SYS FILES IN WILDCARDS?
  47. ;
  48. BASE    SET    0
  49. ;
  50.     IF    ALTCPM
  51. BASE    SET    4200H
  52.     ENDIF        ;ALTCPM
  53. ;
  54. CR    EQU    0DH
  55. LF    EQU    0AH
  56. TAB    EQU    09H
  57. ;
  58.     ORG    BASE+100H
  59. ;
  60.     JMP    BEGIN    ;JUMP AROUND IDENTIFICATION
  61.     DB    'CRCK ver 3.0 8/3/80 '
  62. ;
  63. BEGIN:    LXI    H,0    ;GET STACK...
  64.     DAD    SP    ;POINTER SO WE CAN...
  65.     SHLD    STACK    ;SAVE IT
  66.     LXI    SP,STACK ;INITIALIZE LOCAL STACK
  67.     CALL    START
  68.     DB    'CRCK ver 3.0'
  69.     DB    CR,LF,CR,LF,'$'
  70. ;
  71. START    POP    D    ;GET ID
  72.     MVI    C,PRINT
  73.     CALL    BDOS    ;PRINT ID
  74. ;
  75.     IF    WILDCD
  76. AGAIN    CALL    MFNAME    ;SEE IF FILE NAME TO READ
  77.     ENDIF
  78.     IF    WILDCD AND NOT SYSFILE
  79.     JC    AGEND
  80.     LDA    FCB+10    ;GET SYS ATTRIBUTE
  81.     ANI    80H
  82.     JNZ    AGAIN    ;IGNORE IF SYSTEM FILE
  83.     ENDIF
  84.     IF    WILDCD
  85.     JNC    NAMEPR    ;YES, GO READ IT
  86.     ENDIF
  87.     IF    NOT WILDCD
  88.     JMP    NAMEPR    ;READ SINGLE FILE NAME
  89.     ENDIF
  90. AGEND    CALL    MSGEXIT    ;NONE, PRINT MSG THEN EXIT
  91.     DB    'DONE$'
  92.     IF    NOT WILDCD
  93. AGEND2    CALL    MSGEXIT    ;BAD FILENAME MSG
  94.     DB    '++ WILDCARDS NOT ALLOWED$'
  95.     ENDIF
  96. ;
  97. NAMEPR:    ;PRINT FILENAME.TYPE
  98. ;MOVE 8 CHARACTERS FROM FCB+1 TO FNAME
  99.     LXI    H,FCB+1
  100.     LXI    D,FNAME
  101.     LXI    B,8
  102.     CALL    MOVER
  103. ;MOVE 3 CHARACTERS FROM FCB+9 TO FNAME+9
  104.     LXI    H,FCB+9
  105.     LXI    D,FNAME+9
  106.     LXI    B,3
  107.     CALL    MOVER
  108.     IF    NOT    WILDCD    ;WEED OUT WILDCARDS
  109.     MVI    C,11
  110.     LXI    H,FNAME    ;POINT TO FILENAME
  111. NEXTCH    MOV    A,M    ;CHECK FOR * OR ?
  112.     CPI    '*'
  113.     JZ    AGEND2    ;JUMP OUT IF WILDCARD
  114.     CPI    '?'
  115.     JZ    AGEND2
  116.     DCR    C
  117.     INX    H
  118.     JNZ NEXTCH    ;TRY ALL 11 CHARS IN FILENAME
  119.     ENDIF
  120.     CALL    NAMEP2
  121.     DB    '--> FILE:  '
  122. FNAME:    DB    'XXXXXXXX.XXX',TAB,TAB,'CRC = $'
  123. ;
  124. NAMEP2:    POP    D    ;GET ADRS OF STRING
  125.     MVI    C,PRINT
  126.     CALL    BDOS    ;PRINT FILENAME.TYPE
  127. ;
  128. ;OPEN THE FILE
  129.     LXI    D,FCB
  130.     MVI    C,OPEN
  131.     CALL    BDOS
  132.     INR    A
  133.     JNZ    INITIT
  134.     CALL    ERXIT
  135.     DB    CR,LF,'++OPEN FAILED++$'
  136. ;
  137. ;INITIALIZE THINGS
  138. INITIT:    LXI    H,0
  139.     SHLD    REM    ;INIT CRC REMAINDER TO ZERO
  140.     LXI    H,BASE+100H
  141.     SHLD    BUFAD    ;FORCE INITIAL READ
  142. ;
  143. READIT:    LHLD    BUFAD
  144.     MOV    A,H    ;TIME TO READ?
  145.     CPI    BASE SHR 8
  146.     JZ    NORD    ;NO READ
  147.     MVI    C,CONST
  148.     CALL    BDOS    ;CHECK FOR OPERATOR ABORT
  149.     ORA    A
  150.     JZ    READ2    ;NOTHING FROM OPERATOR
  151.     MVI    C,RDCON
  152.     CALL    BDOS    ;GET CHARACTER INPUTTED
  153.     CPI    'C'-40H    ;CONTROL C?
  154.     JZ    EXIT    ;YES EXIT
  155. ;
  156. READ2:    LXI    D,FCB
  157.     MVI    C,READ
  158.     CALL    BDOS
  159.     ORA    A
  160.     JNZ    FINISH    ;ERROR OR EOF
  161.     LXI    H,BASE+80H ;BUFFER LOCATION
  162. NORD    MOV    A,M
  163.     STA    MESS    ;SAVE FOR DIVP
  164.     INX    H
  165.     SHLD    BUFAD
  166.     CALL    DIVP
  167.     JMP    READIT
  168. ;
  169. FINISH:    LDA    REM+1    ;GET MSP OF CRC
  170.     CALL    HEXO    ;PRINT IT
  171.     MVI    A,' '
  172.     CALL    TYPE    ;TYPE A SPACE
  173.     LDA    REM    ;GET LSP OF CRC
  174.     CALL    HEXO    ;PRINT IT
  175.     LXI    D,NEWLIN ;POINT TO CRLF
  176.     MVI    C,PRINT
  177.     CALL    BDOS    ;PRINT IT
  178.     IF    NOT WILDCD
  179.     JMP    AGEND    ; DONE IF SINGLE FILE NAME
  180.     ENDIF
  181.     IF    WILDCD
  182.     JMP    AGAIN    ;SEE IF MORE FILES TO DO
  183.     ENDIF
  184. ;
  185. NEWLIN:    DB    CR,LF,CR,LF,'$'
  186. ;
  187. ;---------------------------------------------
  188. ;AN 8080 ROUTINE FOR GENERATING A CYCLIC-
  189. ;REDUNDANCY-CHECK.  CHARACTER LEAVES THAT
  190. ;CHARACTER IN LOCATION REM.  BY FRED GUTMAN.
  191. ;FROM 'EDN' MAGAZINE, JUNE 5, 1979 ISSUE, P84.
  192. ;
  193. DIVP:    LHLD    REM    ;GET REMAINDER
  194.     MOV    A,H
  195.     ANI    128    ;Q-BIT MASK
  196.     PUSH    PSW    ;SAVE STATUS
  197.     DAD    H    ;2 X R(X)
  198.     LDA    MESS    ;MESSAGE BIT IN LSB
  199.     ADD    L
  200.     MOV    L,A
  201.     POP    PSW
  202.     JZ    QB2    ;IF Q-BIT IS ZERO
  203. QB:    MOV    A,H
  204.     XRI    0A0H    ;MS HALF OF GEN. POLY
  205.     MOV    H,A
  206.     MOV    A,L
  207.     XRI    97H    ;LS HALF OF GEN. POLY
  208.     MOV    L,A
  209. QB2:    SHLD    REM
  210.     RET
  211. ;--------------------------------------------
  212. ;
  213. ;HEX OUTPUT
  214. ;
  215. HEXO    PUSH    PSW    ;SAVE FOR RIGHT DIGIT
  216.     RAR        ;RIGHT..
  217.     RAR        ;..JUSTIFY..
  218.     RAR        ;..LEFT..
  219.     RAR        ;..DIGIT..
  220.     CALL    NIBBL    ;PRINT LEFT DIGIT
  221.     POP    PSW    ;RESTORE RIGHT
  222. NIBBL    ANI    0FH    ;ISOLATE DIGIT
  223.     CPI    10    ;IS IS <10?
  224.     JC    ISNUM    ;YES, NOT ALPHA
  225.     ADI    7    ;ADD ALPHA BIAS
  226. ISNUM    ADI    '0'    ;MAKE PRINTABLE
  227. ;
  228. TYPE    PUSH    B
  229.     PUSH    D
  230.     PUSH    H
  231.     MOV    E,A
  232.     MVI    C,WRCON
  233.     CALL    BDOS
  234.     POP    H
  235.     POP    D
  236.     POP    B
  237.     RET
  238. ;
  239. ;
  240. ;    MFA.LIB        (revised 4/23/80)
  241. ;
  242. ;MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  243. ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  244. ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  245. ;TIME IT IS CALLED.  JUST CALL "MFNAME" (MULTIPLE
  246. ;FILE NAME) AND THE FCB WILL BE SET UP WITH THE NEXT
  247. ;NAME, READY TO DO NORMAL PROCESSING (OPEN, READ, ETC.)
  248. ;
  249. ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  250. ;
  251. ;------------------------------------------------
  252. ;
  253. ;    MULTI-FILE ACCESS SUBROUTINE
  254. ;
  255. ;THE ROUTINE IS COMMENTED IN PSEUDO CODE,
  256. ;EACH PSEUDO CODE STATEMENT IS IN <<...>>
  257. ;
  258. MFNAME:    ;<<INIT DMA ADDR, FCB>>
  259.     PUSH    B
  260.     PUSH    D
  261.     PUSH    H
  262.     MVI    C,STDMA
  263.     LXI    D,BASE+80H
  264.     CALL    BDOS
  265.     POP    H
  266.     POP    D
  267.     POP    B
  268.     XRA    A
  269.     STA    FCBEXT
  270.     STA    FCBRNO
  271. ;<<IF FIRST TIME>>
  272.     LDA    MFFLG1
  273.     ORA    A
  274.     JNZ    MFN01
  275. ;<<TURN OFF 1ST TIME SW>>
  276.     MVI    A,1
  277.     STA    MFFLG1
  278. ;<<SAVE THE REQUESTED NAME>>
  279. ;SAVE ORIG REQ
  280.     LXI    H,FCB
  281.     LXI    D,MFREQ
  282.     LXI    B,12
  283.     CALL    MOVER
  284.     LDA    FCB
  285.     STA    MFCUR    ;SAVE DISK IN CURR FCB
  286. ;<<SRCHF REQ NAME>>
  287.     LXI    H,MFREQ
  288.     LXI    D,FCB
  289.     LXI    B,12
  290.     CALL    MOVER
  291.     PUSH    B
  292.     PUSH    D
  293.     PUSH    H
  294.     MVI    C,SRCHF
  295.     LXI    D,FCB
  296.     CALL    BDOS
  297.     POP    H
  298.     POP    D
  299.     POP    B
  300. ;<<ELSE>>
  301.     JMP    MFN02
  302. ;
  303. MFN01:    ;<<SRCHF CURR NAME>>
  304.     LXI    H,MFCUR
  305.     LXI    D,FCB
  306.     LXI    B,12
  307.     CALL    MOVER
  308.     PUSH    B
  309.     PUSH    D
  310.     PUSH    H
  311.     MVI    C,SRCHF
  312.     LXI    D,FCB
  313.     CALL    BDOS
  314.     POP    H
  315.     POP    D
  316.     POP    B
  317. ;<<SRCHN REQ NAME>>
  318.     LXI    H,MFREQ
  319.     LXI    D,FCB
  320.     LXI    B,12
  321.     CALL    MOVER
  322.     PUSH    B
  323.     PUSH    D
  324.     PUSH    H
  325.     MVI    C,SRCHN
  326.     LXI    D,FCB
  327.     CALL    BDOS
  328.     POP    H
  329.     POP    D
  330.     POP    B
  331. ;<<ENDIF>>
  332. MFN02:    ;<<RETURN CARRY IF NOT FOUND>>
  333.     INR    A
  334.     STC
  335.     RZ
  336. ;<<MOVE NAME FOUND TO CURR>>
  337.     DCR    A
  338.     ANI    3
  339.     ADD    A
  340.     ADD    A
  341.     ADD    A
  342.     ADD    A
  343.     ADD    A
  344.     ADI    81H
  345.     MOV    L,A
  346.     MVI    H,BASE SHR 8
  347.     PUSH    H    ;SAVE NAME POINTER
  348.     LXI    D,MFCUR+1
  349.     LXI    B,11
  350.     CALL    MOVER
  351. ;<<MOVE NAME FOUND TO FCB>>
  352.     POP    H
  353.     LXI    D,FCB+1
  354.     LXI    B,11
  355.     CALL    MOVER
  356. ;<<SETUP FCB>>
  357.     XRA    A
  358.     STA    FCBEXT
  359.     STA    FCBRNO
  360. ;<<RETURN>>
  361.     RET
  362. ;
  363. ;MOVE SUBROUTINE
  364. ;
  365. MOVER    MOV    A,M
  366.     STAX    D
  367.     INX    H
  368.     INX    D
  369.     DCX    B
  370.     MOV    A,B
  371.     ORA    C
  372.     JNZ    MOVER
  373.     RET
  374. ;
  375. ;------------------------------------------
  376. ;
  377. ;EXIT WITH MESSAGE
  378. ;
  379. MSGEXIT    EQU    $    ;EXIT W/"INFORMATIONAL" MSG
  380. ERXIT    POP    D    ;GET MSG
  381.     MVI    C,PRINT
  382.     CALL    BDOS
  383. ;
  384. ;EXIT, RESTORING STACK AND RETURN
  385. ;
  386. EXIT:    LHLD    STACK
  387.     SPHL
  388.     RET        ;TO CCP
  389. ;
  390. REM:    DW    0    ;REMAINDER STORAGE
  391. BUFAD    DS    2    ;BUFFER ADDRESS
  392. MESS:    DS    1    ;MESSAGE CHAR GOES HERE
  393. ;
  394. ;MULTI-FILE ACCESS WORK AREA
  395. ;
  396. MFFLG1    DB    0    ;1ST TIME SW
  397. MFREQ    DS    12    ;REQ NAME
  398. MFCUR    DS    12    ;CURR NAME
  399. ;
  400.     DS    64    ;STACK AREA
  401. STACK    DS    2
  402. ;
  403. ;BDOS/CBIOS EQUATES
  404. RDCON    EQU    1
  405. WRCON    EQU    2
  406. PRINT    EQU    9
  407. CONST    EQU    11
  408. OPEN    EQU    15
  409. CLOSE    EQU    16
  410. SRCHF    EQU    17
  411. SRCHN    EQU    18
  412. ERASE    EQU    19
  413. READ    EQU    20
  414. WRITE    EQU    21
  415. MAKE    EQU    22
  416. REN    EQU    23
  417. STDMA    EQU    26
  418. BDOS    EQU    BASE+5
  419. FCB    EQU    BASE+5CH 
  420. FCB2    EQU    BASE+6CH
  421. FCBEXT    EQU    FCB+12
  422. FCBRNO    EQU    FCB+32
  423. ;
  424.     END
  425.  
  426.