home *** CD-ROM | disk | FTP | other *** search
- ;crc.asm
- ;============================================================
- ; Command: crc patternlist
- ;============================================================
- ; This is the same as CHECK but also does a CRC for the file.
- ; CRC is somewhat slower than CHECK
-
- len = $005d
- tlen = $0060
- blks = $0024
- tblks = $0026
-
- int04 = $1704
- int0a = $170a
- int0b = $170b
- int0e = $170e
- int16 = $1716
- int17 = $1717
- cl = $1bf7
- cdr = $1bf8
- cdv = $1bf9
- sw1 = $1bfc
-
- fnbank = $00c7
- pntr = $00ec
- hexa = $b8c2
- primm = $ff7d
- second = $ff93
- tksa = $ff96
- acptr = $ffa5
- ciout = $ffa8
- untlk = $ffab
- unlsn = $ffae
- listen = $ffb1
- talk = $ffb4
- setlfs = $ffba
- setnam = $ffbd
- open = $ffc0
- close = $ffc3
- chkin = $ffc6
- chkout = $ffc9
- clrchn = $ffcc
- chrin = $ffcf
- chrout = $ffd2
- stop = $ffe1
-
- star = $0b00
- .wor star
- * = star
-
-
- jmp check
- dw Date
-
- check ldx #1 ; check for filename list
- jsr int04
- bcc check0 ; got at least one.
- jsr primm
- .asc 13,"Syntax: crc patternlist",13,0
- jmp int0e
-
- check0 lda #0
- sta tblks
- sta tblks+1
- sta tlen
- sta tlen+1
- sta tlen+2
- sta tfils
- sta tfils+1
- stx parm ; start with parameter 1 and work up
- jsr eqwls
- jsr GenCRC
- jsr primm
- .asc 13," d:filename type bytes blks crc",13,0
- jsr eqwls
- main ldx parm
- jsr int04 ; make sure parm is there
- bcc chkit ; got one
- sum jmp smmry ; parameters all used up
-
- chkit jsr int16 ; get 1st matching filename
- bcs chknxt ; no matches. next parameter
- lda cl
- sta cll
- jsr ocmd ; open "#" file
- bcc chkagn ; ok
- jsr int0b ; error opening. print ds$
- jmp int0e ; and abort
- chkagn jsr chkfil ; check this file
- jsr prtit ; display results
- jsr stop ; check for stop key
- beq sum
- jsr int17 ; check for more matches
- bcc chkagn ; ok. go again
- jsr ccmd ; close "#" file
- chknxt inc parm
- bne main ; always
-
- ;-----------------------------------
- ; Subroutine: get file's statistics
- ;-----------------------------------
-
- chkfil lda $1b01 ; 1st (track,sector)
- sta ibuf
- lda $1b02
- sta ibuf+1
- lda #0 ; reset length
- sta len
- sta len+1
- sta len+2
- sta crc
- sta crc+1
- sta blks
- sta blks+1
- cf jsr link ; get block
- lda ibuf+1 ; maybe length
- sec
- sbc #1
- ldx ibuf
- beq cf0 ; end of file. got length of last block in .a
- lda #254
- cf0 clc
- adc len
- sta len
- bcc cf1
- inc len+1
- bne cf1
- inc len+2
- cf1 inc blks
- bne cf2
- inc blks+1
- cf2 lda ibuf
- bne cf
- clc
- lda len
- adc tlen
- sta tlen
- lda len+1
- adc tlen+1
- sta tlen+1
- lda len+2
- adc tlen+2
- sta tlen+2
- clc
- lda blks
- adc tblks
- sta tblks
- lda blks+1
- adc tblks+1
- sta tblks+1
- inc tfils
- bne tf
- inc tfils+1
- tf rts
-
- ;------------------------------------
- ; subroutine: get next block of file
- ;------------------------------------
-
- link lda ibuf ; track 0
- bne lk0 ; no. go on
- rts
-
- lk0 jsr br ; get 1st four bytes of block
- lda blks
- ora blks+1
- bne lk1 ; skip if not 1st block of file
- lda ibuf+2
- sta ldad
- lda ibuf+3
- sta ldad+1
- lk1 rts
-
- ;-------------------
- ; send disk command
- ;-------------------
-
- u1 ldy #9 ; store at offset 8
- lda ibuf ; get track
- jsr d3 ; convert to ascii
- iny
- lda ibuf+1 ; repeat for sector
- jsr d3
- ldy #0 ; and send u1 or u2
- sndcmd lda edv ; device to exec from
- jsr listen
- lda #$6f
- jsr second
- sc0 lda dskcmd,y
- beq sc1
- jsr ciout
- iny
- bne sc0
- sc1 jmp unlsn
-
- dskcmd .asc "u1: 03 0 ttt sss", 0
-
- ;-------------------------------------
- ; convert .a to ascii for b-r and b-w
- ;-------------------------------------
-
- d3 ldx #$ff ; print .a as ###
- d4 inx
- sec
- sbc #100
- bcs d4
- adc #100
- jsr d5
- d2 ldx #$ff ; print .a as ##
- d6 inx
- sec
- sbc #10
- bcs d6
- adc #10
- jsr d5
- tax
- d5 pha
- txa
- ora #$30
- sta dskcmd,y
- iny
- pla
- rts
-
- br jsr u1
- lda edv ; read in a block
- jsr talk
- lda esa
- ora #$60
- jsr tksa
- ldy #0
- brfb jsr acptr
- cpy #4
- bcs nst
- sta ibuf,y
- nst cpy #2
- bcc ncrc
- ldx ibuf
- bne dcrc
- cpy ibuf+1
- beq dcrc
- bcs ncrc
- dcrc jsr updcrc
- ncrc iny
- bne brfb
- jmp untlk
-
- ocmd jsr int0a ; get free la,sa
- sta ccmd+1
- ldx cdv
- stx edv
- jsr setlfs
- tya
- sta esa
- ldy #4
- jsr d2
- lda cdr
- sta dskcmd+7
- lda #1
- ldx #<num
- ldy #>num
- jsr setnam
- lda #0
- sta fnbank
- jsr open
- bcc ocmd0
- ccmd lda #0
- jsr close
- sec
- ocmd0 rts
-
- num .asc "#"
-
- ;-------------------------------
- ; display results of file check
- ;-------------------------------
-
- cr lda #13
- .byt $2c
- qt lda #34
- .byt $2c
- sp lda #" "
- jmp chrout
-
- prtit jsr cr ; new line
- jsr qt ; print "d:filename"
- lda cll ; recall drive letter
- jsr chrout
- lda #":"
- jsr chrout
- ldy #0
- pr0 lda $1b03,y
- cmp #$a0
- beq pr11
- jsr chrout
- iny
- cpy #16
- bne pr0
- pr11 jsr qt
- pr1 jsr sp
- lda pntr
- cmp #21
- bne pr1
- bit $1b00 ; protected?
- bvc pr2
- lda #">"
- .byt $2c
- pr2 lda #" "
- jsr chrout
- lda $1b00
- and #7
- cmp #5
- bcc pr3
- lda #0
- pr3 tay
- lda spur,y
- jsr chrout
- lda spur+5,y
- jsr chrout
- lda spur+10,y
- jsr chrout
- jsr sp
- clc ; claculate end address
- lda ldad
- adc len
- sta ead
- lda ldad+1
- adc len+1
- sta ead+1
- jsr h2a ; print length in bytes
- jsr sp
- lda blks+1
- ldx blks
- jsr linprt
- jsr sp
- lda crc+1
- jsr hexa
- lda crc
- jsr hexa
- jsr sp
- lda $1b00
- and #7
- cmp #2
- beq prg
- cmp #4
- beq rel
- bne notprg
- prg lda #"$"
- jsr chrout
- lda ldad+1
- jsr hexa
- lda ldad
- jsr hexa
- lda #"-"
- jsr chrout
- sec
- lda ead
- sbc #2
- sta ead
- lda ead+1
- sbc #0
- jsr hexa
- lda ead
- jsr hexa
- notprg rts
-
- rel jsr primm
- .asc "rl =", 0
- lda #0
- ldx $1b00+21
- jmp linprt
-
-
- spur .asc "?spur"
- .asc "?erse"
- .asc "?qgrl"
-
- ;-------------------------------
- ;output a hex # in ascii decimal
- ;-------------------------------
-
-
- h2a ldx #0 ; initialize indexes
- ldy #0
- sty $02
- loop lda #"0" ; initialize digit
- sta ascii,x
- loop2 sec
- lda len
- sbc table,y
- pha ; increment the digit?
- lda len+1
- sbc table+1,y
- pha
- lda len+2
- sbc table+2,y
- bcc nxdigt ; branch if 'no'
- sta len+2
- pla
- sta len+1
- pla ; adjust the hex value
- sta len ; and increment the digit
- lda #$ff
- sta $02
- inc ascii,x
- bne loop2
-
- nxdigt pla
- pla
- iny ; prepare for next digit
- iny
- iny
- iny
- inx
- bit $02
- bmi nadj
- lda #" "
- sta ascii-1,x
- nadj cpx #8
- bcc loop
- npr nop
- ldy #0 ; prepare to send number
- loop3 cpy #2
- beq pcom
- cpy #5
- bne nocom
- pcom lda ascii-1,y
- cmp #" "
- beq ppcom
- lda #","
- ppcom jsr chrout
- nocom lda ascii,y
- jsr chrout
- iny
- cpy #8
- bcc loop3
- rts ; done, return
-
-
- table .wor 38528, 152
- .wor 16960, 15
- .wor 34464, 1
- .wor 10000, 0
- .wor 1000, 0
- .wor 100, 0
- .wor 10, 0
- .wor 1, 0
-
- smmry jsr cr
- jsr eqwls
- jsr cr
- ldx tfils
- lda tfils+1
- jsr linprt
- jsr primm
- .asc " file(s)", 0
- sm0 jsr sp
- lda pntr
- cmp #26
- bne sm0
- lda tlen
- sta len
- lda tlen+1
- sta len+1
- lda tlen+2
- sta len+2
- jsr h2a
- jsr sp
- ldx tblks
- lda tblks+1
- jsr linprt
- jsr cr
- jmp int0e
-
- eqwls ldy #52
- eq lda #"="
- jsr chrout
- dey
- bne eq
- rts
-
- linprt ldy #$60
- sty npr
- stx len
- sta len+1
- lda #0
- sta len+2
- jsr h2a
- lda #$ea
- sta npr
- ldy #4
- lpt lda ascii,y
- jsr chrout
- iny
- cpy #8
- bne lpt
- rts
-
-
- ;------------------------
- ; subroutine: Update CRC
- ;------------------------
-
- updcrc pha ; save char
- sty uc+1 ; save .y
- eor crc
- tay
- lda crclo,y
- eor crc+1
- sta crc
- lda crchi,y
- sta crc+1
- uc ldy #0
- pla
- rts
-
- crc .wor 0
-
-
- ;----------------------------------
- ; Subroutine - Generate CRC tables
- ;----------------------------------
-
- LO = $24
- HI = $26
- AX = $28
- AL = AX
- AH = AX+1
-
- crclo = $0400
- crchi = $0500
-
-
- GenCRC lda #<crclo
- sta LO
- sta HI
- lda #>crclo
- sta LO+1
- sta HI+1
- inc HI+1
- ldy #0
- Gen0 sty AL
- lda #0
- sta AH
- ldx #8
- Gen2 lsr AH
- ror AL
- bcc Gen4
- lda AL
- eor #$01
- sta AL
- lda AH
- eor #$a0
- sta AH
- Gen4 dex
- bne Gen2
- lda AL
- sta (LO),y
- lda AH
- sta (HI),y
- iny
- bne Gen0
- rts
-
- ascii *=*+8
- parm *=*+1
- cll *=*+1
- ibuf *=*+4
- ldad *=*+2
- ead *=*+2
- edv *=*+1
- esa *=*+1
- tfils *=*+2
-
- .end
-