home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / c128 / text / examples.arc / CRC.A < prev    next >
Encoding:
Text File  |  1989-12-01  |  20.4 KB  |  576 lines

  1. ;crc.asm
  2. ;============================================================
  3. ; Command:  crc patternlist
  4. ;============================================================
  5. ; This is the same as CHECK but also does a CRC for the file.
  6. ; CRC is somewhat slower than CHECK
  7.                                   
  8. len         = $005d               
  9. tlen        = $0060               
  10. blks        = $0024               
  11. tblks       = $0026               
  12.                                   
  13. int04       = $1704               
  14. int0a       = $170a               
  15. int0b       = $170b               
  16. int0e       = $170e               
  17. int16       = $1716               
  18. int17       = $1717               
  19. cl          = $1bf7               
  20. cdr         = $1bf8               
  21. cdv         = $1bf9               
  22. sw1         = $1bfc               
  23.                                   
  24. fnbank      = $00c7               
  25. pntr        = $00ec               
  26. hexa        = $b8c2               
  27. primm       = $ff7d               
  28. second      = $ff93               
  29. tksa        = $ff96               
  30. acptr       = $ffa5               
  31. ciout       = $ffa8               
  32. untlk       = $ffab               
  33. unlsn       = $ffae               
  34. listen      = $ffb1               
  35. talk        = $ffb4               
  36. setlfs      = $ffba               
  37. setnam      = $ffbd               
  38. open        = $ffc0               
  39. close       = $ffc3               
  40. chkin       = $ffc6               
  41. chkout      = $ffc9               
  42. clrchn      = $ffcc               
  43. chrin       = $ffcf               
  44. chrout      = $ffd2               
  45. stop        = $ffe1               
  46.                                   
  47. star        = $0b00
  48.             .wor star             
  49.             * = star              
  50.                                   
  51.  
  52.             jmp check
  53.             dw Date
  54.                       
  55. check       ldx #1                ; check for filename list
  56.             jsr int04             
  57.             bcc check0            ; got at least one.
  58.             jsr primm             
  59.             .asc 13,"Syntax:  crc patternlist",13,0
  60.             jmp int0e             
  61.                                   
  62. check0      lda #0
  63.             sta tblks             
  64.             sta tblks+1           
  65.             sta tlen              
  66.             sta tlen+1            
  67.             sta tlen+2            
  68.             sta tfils             
  69.             sta tfils+1           
  70.             stx parm              ; start with parameter 1 and work up
  71.             jsr eqwls
  72.             jsr GenCRC
  73.             jsr primm             
  74.             .asc 13," d:filename          type      bytes blks  crc",13,0
  75.             jsr eqwls             
  76. main        ldx parm              
  77.             jsr int04             ; make sure parm is there
  78.             bcc chkit             ; got one
  79. sum         jmp smmry             ; parameters all used up
  80.                                   
  81. chkit       jsr int16             ; get 1st matching filename
  82.             bcs chknxt            ; no matches. next parameter
  83.             lda cl                
  84.             sta cll               
  85.             jsr ocmd              ; open "#" file
  86.             bcc chkagn            ; ok
  87.             jsr int0b             ; error opening. print ds$
  88.             jmp int0e             ; and abort
  89. chkagn      jsr chkfil            ; check this file
  90.             jsr prtit             ; display results
  91.             jsr stop              ; check for stop key
  92.             beq sum               
  93.             jsr int17             ; check for more matches
  94.             bcc chkagn            ; ok. go again
  95.             jsr ccmd              ; close "#" file
  96. chknxt      inc parm              
  97.             bne main              ; always
  98.                                   
  99. ;-----------------------------------
  100. ; Subroutine: get file's statistics
  101. ;-----------------------------------
  102.                                   
  103. chkfil      lda $1b01             ; 1st (track,sector)
  104.             sta ibuf              
  105.             lda $1b02             
  106.             sta ibuf+1            
  107.             lda #0                ; reset length
  108.             sta len               
  109.             sta len+1             
  110.             sta len+2             
  111.             sta crc               
  112.             sta crc+1             
  113.             sta blks              
  114.             sta blks+1            
  115. cf          jsr link              ; get block
  116.             lda ibuf+1            ; maybe length
  117.             sec                   
  118.             sbc #1                
  119.             ldx ibuf              
  120.             beq cf0               ; end of file. got length of last block in .a
  121.             lda #254              
  122. cf0         clc                   
  123.             adc len               
  124.             sta len               
  125.             bcc cf1               
  126.             inc len+1             
  127.             bne cf1               
  128.             inc len+2             
  129. cf1         inc blks              
  130.             bne cf2               
  131.             inc blks+1            
  132. cf2         lda ibuf              
  133.             bne cf                
  134.             clc                   
  135.             lda len               
  136.             adc tlen              
  137.             sta tlen              
  138.             lda len+1             
  139.             adc tlen+1            
  140.             sta tlen+1            
  141.             lda len+2             
  142.             adc tlen+2            
  143.             sta tlen+2            
  144.             clc                   
  145.             lda blks              
  146.             adc tblks             
  147.             sta tblks             
  148.             lda blks+1            
  149.             adc tblks+1           
  150.             sta tblks+1           
  151.             inc tfils             
  152.             bne tf                
  153.             inc tfils+1           
  154. tf          rts                   
  155.                                   
  156. ;------------------------------------
  157. ; subroutine: get next block of file
  158. ;------------------------------------
  159.                                   
  160. link        lda ibuf              ; track 0
  161.             bne lk0               ; no. go on
  162.             rts                   
  163.                                   
  164. lk0         jsr br                ; get 1st four bytes of block
  165.             lda blks              
  166.             ora blks+1            
  167.             bne lk1               ; skip if not 1st block of file
  168.             lda ibuf+2            
  169.             sta ldad              
  170.             lda ibuf+3            
  171.             sta ldad+1            
  172. lk1         rts                   
  173.                                   
  174. ;-------------------
  175. ; send disk command
  176. ;-------------------
  177.                                   
  178. u1          ldy #9                ; store at offset 8
  179.             lda ibuf              ; get track
  180.             jsr d3                ; convert to ascii
  181.             iny                   
  182.             lda ibuf+1            ; repeat for sector
  183.             jsr d3                
  184.             ldy #0                ; and send u1 or u2
  185. sndcmd      lda edv               ; device to exec from
  186.             jsr listen            
  187.             lda #$6f              
  188.             jsr second            
  189. sc0         lda dskcmd,y          
  190.             beq sc1               
  191.             jsr ciout             
  192.             iny                   
  193.             bne sc0               
  194. sc1         jmp unlsn             
  195.                                   
  196. dskcmd      .asc "u1: 03 0 ttt sss", 0 
  197.                                   
  198. ;-------------------------------------
  199. ; convert .a to ascii for b-r and b-w
  200. ;-------------------------------------
  201.                                   
  202. d3          ldx #$ff              ; print .a as ###
  203. d4          inx                   
  204.             sec                   
  205.             sbc #100              
  206.             bcs d4                
  207.             adc #100              
  208.             jsr d5                
  209. d2          ldx #$ff              ; print .a as ##
  210. d6          inx                   
  211.             sec                   
  212.             sbc #10               
  213.             bcs d6                
  214.             adc #10               
  215.             jsr d5                
  216.             tax                   
  217. d5          pha                   
  218.             txa                   
  219.             ora #$30              
  220.             sta dskcmd,y          
  221.             iny                   
  222.             pla                   
  223.             rts                   
  224.                                   
  225. br          jsr u1                
  226.             lda edv               ; read in a block
  227.             jsr talk              
  228.             lda esa               
  229.             ora #$60              
  230.             jsr tksa              
  231.             ldy #0                
  232. brfb        jsr acptr             
  233.             cpy #4                
  234.             bcs nst               
  235.             sta ibuf,y            
  236. nst         cpy #2                
  237.             bcc ncrc              
  238.             ldx ibuf              
  239.             bne dcrc              
  240.             cpy ibuf+1            
  241.             beq dcrc              
  242.             bcs ncrc              
  243. dcrc        jsr updcrc            
  244. ncrc        iny                   
  245.             bne brfb              
  246.             jmp untlk             
  247.                                   
  248. ocmd        jsr int0a             ; get free la,sa
  249.             sta ccmd+1            
  250.             ldx cdv               
  251.             stx edv               
  252.             jsr setlfs            
  253.             tya                   
  254.             sta esa               
  255.             ldy #4                
  256.             jsr d2                
  257.             lda cdr               
  258.             sta dskcmd+7          
  259.             lda #1                
  260.             ldx #<num             
  261.             ldy #>num             
  262.             jsr setnam            
  263.             lda #0                
  264.             sta fnbank            
  265.             jsr open              
  266.             bcc ocmd0             
  267. ccmd        lda #0                
  268.             jsr close             
  269.             sec                   
  270. ocmd0       rts                   
  271.                                   
  272. num         .asc "#"              
  273.                                   
  274. ;-------------------------------
  275. ; display results of file check
  276. ;-------------------------------
  277.                                   
  278. cr          lda #13               
  279.             .byt $2c              
  280. qt          lda #34               
  281.             .byt $2c              
  282. sp          lda #" "              
  283.             jmp chrout            
  284.                                   
  285. prtit       jsr cr                ; new line
  286.             jsr qt                ; print "d:filename"
  287.             lda cll               ; recall drive letter
  288.             jsr chrout            
  289.             lda #":"              
  290.             jsr chrout            
  291.             ldy #0                
  292. pr0         lda $1b03,y           
  293.             cmp #$a0              
  294.             beq pr11              
  295.             jsr chrout            
  296.             iny                   
  297.             cpy #16               
  298.             bne pr0               
  299. pr11        jsr qt                
  300. pr1         jsr sp                
  301.             lda pntr              
  302.             cmp #21               
  303.             bne pr1               
  304.             bit $1b00             ; protected?
  305.             bvc pr2               
  306.             lda #">"              
  307.             .byt $2c              
  308. pr2         lda #" "              
  309.             jsr chrout            
  310.             lda $1b00             
  311.             and #7                
  312.             cmp #5                
  313.             bcc pr3               
  314.             lda #0                
  315. pr3         tay                   
  316.             lda spur,y            
  317.             jsr chrout            
  318.             lda spur+5,y          
  319.             jsr chrout            
  320.             lda spur+10,y         
  321.             jsr chrout            
  322.             jsr sp                
  323.             clc                   ; claculate end address
  324.             lda ldad              
  325.             adc len               
  326.             sta ead               
  327.             lda ldad+1            
  328.             adc len+1             
  329.             sta ead+1             
  330.             jsr h2a               ; print length in bytes
  331.             jsr sp                
  332.             lda blks+1            
  333.             ldx blks              
  334.             jsr linprt            
  335.             jsr sp                
  336.             lda crc+1             
  337.             jsr hexa              
  338.             lda crc               
  339.             jsr hexa              
  340.             jsr sp                
  341.             lda $1b00             
  342.             and #7                
  343.             cmp #2                
  344.             beq prg               
  345.             cmp #4                
  346.             beq rel               
  347.             bne notprg            
  348. prg         lda #"$"              
  349.             jsr chrout            
  350.             lda ldad+1            
  351.             jsr hexa              
  352.             lda ldad              
  353.             jsr hexa              
  354.             lda #"-"              
  355.             jsr chrout            
  356.             sec                   
  357.             lda ead               
  358.             sbc #2                
  359.             sta ead               
  360.             lda ead+1             
  361.             sbc #0                
  362.             jsr hexa              
  363.             lda ead               
  364.             jsr hexa              
  365. notprg      rts                   
  366.                                   
  367. rel         jsr primm             
  368.             .asc "rl =", 0        
  369.             lda #0                
  370.             ldx $1b00+21          
  371.             jmp linprt            
  372.                                   
  373.                                   
  374. spur        .asc "?spur"          
  375.             .asc "?erse"          
  376.             .asc "?qgrl"          
  377.                                   
  378. ;-------------------------------
  379. ;output a hex # in ascii decimal
  380. ;-------------------------------
  381.                                   
  382.                                   
  383. h2a         ldx #0                ; initialize indexes
  384.             ldy #0                
  385.             sty $02               
  386. loop        lda #"0"              ; initialize digit
  387.             sta ascii,x           
  388. loop2       sec                   
  389.             lda len               
  390.             sbc table,y           
  391.             pha                   ; increment the digit?
  392.             lda len+1             
  393.             sbc table+1,y         
  394.             pha                   
  395.             lda len+2             
  396.             sbc table+2,y         
  397.             bcc nxdigt            ; branch if 'no'
  398.             sta len+2             
  399.             pla                   
  400.             sta len+1             
  401.             pla                   ; adjust the hex value
  402.             sta len               ; and increment the digit
  403.             lda #$ff              
  404.             sta $02               
  405.             inc ascii,x           
  406.             bne loop2             
  407.                                   
  408. nxdigt      pla                   
  409.             pla                   
  410.             iny                   ; prepare for next digit
  411.             iny                   
  412.             iny                   
  413.             iny                   
  414.             inx                   
  415.             bit $02               
  416.             bmi nadj              
  417.             lda #" "              
  418.             sta ascii-1,x         
  419. nadj        cpx #8                
  420.             bcc loop              
  421. npr         nop                   
  422.             ldy #0                ; prepare to send number
  423. loop3       cpy #2                
  424.             beq pcom              
  425.             cpy #5                
  426.             bne nocom             
  427. pcom        lda ascii-1,y         
  428.             cmp #" "              
  429.             beq ppcom             
  430.             lda #","              
  431. ppcom       jsr chrout            
  432. nocom       lda ascii,y           
  433.             jsr chrout            
  434.             iny                   
  435.             cpy #8                
  436.             bcc loop3             
  437.             rts                   ; done, return
  438.                                   
  439.                                   
  440. table       .wor 38528, 152       
  441.             .wor 16960, 15        
  442.             .wor 34464, 1         
  443.             .wor 10000, 0         
  444.             .wor  1000, 0         
  445.             .wor   100, 0         
  446.             .wor    10, 0         
  447.             .wor     1, 0         
  448.                                   
  449. smmry       jsr cr                
  450.             jsr eqwls             
  451.             jsr cr                
  452.             ldx tfils             
  453.             lda tfils+1           
  454.             jsr linprt            
  455.             jsr primm             
  456.             .asc " file(s)", 0    
  457. sm0         jsr sp                
  458.             lda pntr              
  459.             cmp #26               
  460.             bne sm0               
  461.             lda tlen              
  462.             sta len               
  463.             lda tlen+1            
  464.             sta len+1             
  465.             lda tlen+2            
  466.             sta len+2             
  467.             jsr h2a               
  468.             jsr sp                
  469.             ldx tblks             
  470.             lda tblks+1           
  471.             jsr linprt            
  472.             jsr cr                
  473.             jmp int0e             
  474.                                   
  475. eqwls       ldy #52               
  476. eq          lda #"="              
  477.             jsr chrout            
  478.             dey                   
  479.             bne eq                
  480.             rts                   
  481.                                   
  482. linprt      ldy #$60              
  483.             sty npr               
  484.             stx len               
  485.             sta len+1             
  486.             lda #0                
  487.             sta len+2             
  488.             jsr h2a               
  489.             lda #$ea              
  490.             sta npr               
  491.             ldy #4                
  492. lpt         lda ascii,y           
  493.             jsr chrout            
  494.             iny                   
  495.             cpy #8                
  496.             bne lpt               
  497.             rts                   
  498.                                   
  499.                                   
  500. ;------------------------
  501. ; subroutine: Update CRC
  502. ;------------------------
  503.                                   
  504. updcrc      pha                   ; save char
  505.             sty uc+1              ; save .y
  506.             eor crc               
  507.             tay                   
  508.             lda crclo,y           
  509.             eor crc+1             
  510.             sta crc               
  511.             lda crchi,y           
  512.             sta crc+1             
  513. uc          ldy #0                
  514.             pla                   
  515.             rts                   
  516.                                   
  517. crc         .wor 0                
  518.                                   
  519.  
  520. ;----------------------------------
  521. ; Subroutine - Generate CRC tables
  522. ;----------------------------------
  523.  
  524. LO          = $24
  525. HI          = $26
  526. AX          = $28
  527. AL          = AX
  528. AH          = AX+1
  529.  
  530. crclo       = $0400
  531. crchi       = $0500
  532.  
  533.  
  534. GenCRC      lda #<crclo
  535.             sta LO
  536.             sta HI
  537.             lda #>crclo
  538.             sta LO+1
  539.             sta HI+1
  540.             inc HI+1
  541.             ldy #0
  542. Gen0        sty AL
  543.             lda #0
  544.             sta AH
  545.             ldx #8
  546. Gen2        lsr AH
  547.             ror AL
  548.             bcc Gen4
  549.             lda AL
  550.             eor #$01
  551.             sta AL
  552.             lda AH
  553.             eor #$a0
  554.             sta AH
  555. Gen4        dex
  556.             bne Gen2
  557.             lda AL
  558.             sta (LO),y
  559.             lda AH
  560.             sta (HI),y
  561.             iny
  562.             bne Gen0
  563.             rts
  564.                                   
  565. ascii       *=*+8                 
  566. parm        *=*+1                 
  567. cll         *=*+1                 
  568. ibuf        *=*+4                 
  569. ldad        *=*+2                 
  570. ead         *=*+2                 
  571. edv         *=*+1                 
  572. esa         *=*+1                 
  573. tfils       *=*+2                 
  574.                                   
  575.             .end                  
  576.