home *** CD-ROM | disk | FTP | other *** search
- ;Little Red Reader MS-DOS file copier program
- ;written 92/10/03 by Craig Bruce for C= Hacking Net Magazine
-
- .org $8000
- .obj "@:lrr.bin"
-
- ;====jump table and parameters interface ====
-
- jmp initPackage
- jmp loadDirectory
- jmp copyFile
-
- .byte $cb,131 ;identification
- .byte 0,0,0,0
-
- errno .buf 1 ;(location pk+15)
- sourceDevice .buf 1
- sourceType .buf 1 ;$00=1571, $ff=1581
- startCluster .buf 2
- lenML .buf 2 ;length medium and low bytes
-
- ;====global declaraions====
-
- kernelListen = $ffb1
- kernelSecond = $ff93
- kernelUnlsn = $ffae
- kernelAcptr = $ffa2
- kernelCiout = $ffa8
- kernelSpinp = $ff47
- kernelChkout = $ffc9
- kernelClrchn = $ffcc
- kernelChrout = $ffd2
-
- st = $d0
- ciaClock = $dd00
- ciaFlags = $dc0d
- ciaData = $dc0c
-
- clusterBlockCount .buf 1 ;1 or 2
- fatBlocks .buf 1 ;up to 3
- rootDirBlocks .buf 1 ;up to 8
- rootDirEntries .buf 1 ;up to 128
- totalSectors .buf 2 ;up to 1440
- firstFileBlock .buf 1
- firstRootDirBlock .buf 1
- fileClusterCount .buf 2
-
- bufCylinder .buf 1
- bufSide .buf 1
- formatParms .buf 6
-
- ;====hardware level====
-
- sendU0 = * ;( .A=burstCommandCode ) : .CS=err
- pha
- lda #0
- sta st
- lda sourceDevice
- jsr kernelListen
- lda #$6f
- jsr kernelSecond
- lda #"u"
- jsr kernelCiout
- bit st
- bmi sendU0Error
- lda #"0"
- jsr kernelCiout
- pla
- jsr kernelCiout
- bit st
- bmi sendU0Error
- clc
- rts
-
- sendU0Error = *
- lda #5
- sta errno
- sec
- rts
-
- toggleClock = *
- lda ciaClock
- eor #$10
- sta ciaClock
- rts
-
- serialWait = *
- lda #$08
- - bit ciaFlags
- beq -
- rts
-
- getBurstByte = *
- jsr serialWait
- ldx ciaData
- jsr toggleClock
- txa
- rts
-
- mountDisk = * ;() : .CS=err
- lda #%00011010
- jsr sendU0
- bcc +
- rts
- + jsr kernelUnlsn
- bit st
- bmi sendU0Error
- clc
- jsr kernelSpinp
- bit ciaFlags
- jsr toggleClock
- jsr getBurstByte
- sta errno
- and #$0f
- cmp #2
- bcs mountExit
- ldy #0
- - jsr getBurstByte
- sta formatParms,y
- iny
- cpy #6
- bcc -
- clc
- ;** set interleave
- lda #%00001000
- jsr sendU0
- bcc +
- rts
- + lda #1 ;interleave of 1 for 1581
- bit sourceType
- bmi +
- lda #4 ;interleave of 4 for 1571
- + jsr kernelCiout
- jsr kernelUnlsn
- mountExit = *
- rts
-
- bufptr = 2
- secnum = 4
-
- readTrack = * ;( .A=cylinder, .X=side ) : trackbuf, .CS=err
- pha
- txa
- and #$01
- asl
- asl
- asl
- asl
- bit sourceType
- bpl +
- eor #$10
- + jsr sendU0
- bcc +
- rts
- + pla ;cylinder number
- jsr kernelCiout
- lda #1 ;start sector number
- jsr kernelCiout
- lda #9 ;sector count
- jsr kernelCiout
- jsr kernelUnlsn
- sei
- clc
- jsr kernelSpinp
- bit ciaFlags
- jsr toggleClock
- lda #<trackbuf
- ldy #>trackbuf
- sta bufptr
- sty bufptr+1
- lda #0
- sta secnum
- - bit sourceType
- bmi +
- jsr get1571BufPtr
- + jsr readSector
- bcs trackExit
- inc secnum
- lda secnum
- cmp #9
- bcc -
- clc
- trackExit = *
- cli
- rts
-
- get1571BufPtr = *
- lda #<trackbuf
- sta bufptr
- ldx secnum
- clc
- lda #>trackbuf
- adc bufptr1571,x
- sta bufptr+1
- rts
-
- bufptr1571 = *
- .byte 0,8,16,6,14,4,12,2,10
-
- readSector = * ;( bufptr ) : .CS=err
- jsr getBurstByte
- sta errno
- and #$0f
- cmp #2
- bcc +
- rts
- + ldx #2
- ldy #0
-
- readByte = *
- lda #$08
- - bit ciaFlags
- beq -
- lda ciaClock
- eor #$10
- sta ciaClock
- lda ciaData
- sta (bufptr),y
- iny
- bne readByte
- inc bufptr+1
- dex
- bne readByte
- rts
-
- ;====logical sector level====
-
- initPackage = *
- lda #$0e
- sta $ff00
- lda #$ff
- sta bufCylinder
- sta bufSide
- clc
- rts
-
- sectorSave = 5
-
- readBlock = * ;( .A=cylinder,.X=side,.Y=sector ) : .AY=blkPtr,.CS=err
- cmp bufCylinder
- bne readBlockPhysical
- cpx bufSide
- bne readBlockPhysical
- dey
- tya
- asl
- clc
- adc #>trackbuf
- tay
- lda #<trackbuf
- clc
- rts
-
- readBlockPhysical = *
- sta bufCylinder
- stx bufSide
- sty sectorSave
- jsr readTrack
- bcc readBlockPhysicalOk
- lda errno
- and #$0f
- cmp #11 ;disk change
- beq +
- sec
- rts
- + jsr mountDisk
- lda bufCylinder
- ldx bufSide
- ldy sectorSave
- bcc readBlockPhysical
- rts
-
- readBlockPhysicalOk = *
- lda bufCylinder
- ldx bufSide
- ldy sectorSave
- jmp readBlock
-
- divideBy18 = * ;( .AY=number ) : .A=quotient, .Y=remainder
- ;** could repeatedly subtract 360 here
- ldx #$ff
- - inx
- sec
- sbc #18
- bcs -
- dey
- bpl -
- clc
- adc #18
- iny
- tay
- txa
- rts
-
- convertLogicalBlockNum = * ;( .AY=blockNum ) : .A=cyl, .X=side, .Y=sec
- jsr divideBy18
- ldx #0
- cpy #9
- bcc +
- pha
- tya
- sbc #9
- tay
- pla
- ldx #1
- + iny
- rts
-
- destPtr = 6
- curCylinder = 8
- curSide = 9
- curSector = 10
- blockCountdown = 11
- sourcePtr = 12
-
- copyBlocks = * ;( .AY=startBlock, .X=blockCount, ($6)=dest ) : .CS=err
- stx blockCountdown
- jsr convertLogicalBlockNum
- sta curCylinder
- stx curSide
- sty curSector
-
- copyBlockLoop = *
- lda curCylinder
- ldx curSide
- ldy curSector
- jsr readBlock
- bcc +
- rts
- + sta sourcePtr
- sty sourcePtr+1
- ldx #2
- ldy #0
- - lda (sourcePtr),y
- sta (destPtr),y
- iny
- lda (sourcePtr),y
- sta (destPtr),y
- iny
- bne -
- inc sourcePtr+1
- inc destPtr+1
- dex
- bne -
- inc curSector
- lda curSector
- cmp #10
- bcc +
- lda #1
- sta curSector
- inc curSide
- lda curSide
- cmp #2
- bcc +
- lda #0
- sta curSide
- inc curCylinder
- + dec blockCountdown
- bne copyBlockLoop
- clc
- rts
-
- readCluster = * ;( .AY=clusterNumber ) : clusterBuf, .CS=err
- ;** convert cluster number to logical block number
- sec
- sbc #2
- bcs +
- dey
- + ldx clusterBlockCount
- cpx #1
- beq +
- asl
- sty 7
- rol 7
- ldy 7
- + clc
- adc firstFileBlock
- bcc +
- iny
-
- ;** read logical blocks comprising cluster
- + ldx #<clusterBuf
- stx 6
- ldx #>clusterBuf
- stx 7
- ldx clusterBlockCount
- jmp copyBlocks
-
- ;====MS-DOS format level====
-
- bootBlock = 2
-
- loadDirectory = * ;( ) : .AY=dirbuf, .X=dirEntries, .CS=err
- lda #$0e
- sta $ff00
-
- ;** get parameters from boot sector
- lda #0
- ldy #0
- jsr convertLogicalBlockNum
- jsr readBlock
- bcc +
- rts
- + sta bootBlock
- sty bootBlock+1
- ldy #13 ;get cluster size
- lda (bootBlock),y
- sta clusterBlockCount
- cmp #3
- bcc +
-
- invalidParms = *
- lda #60
- sta errno
- sec
- rts
-
- + ldy #16 ;check FAT replication count, must be 2
- lda (bootBlock),y
- cmp #2
- bne invalidParms
- ldy #22 ;get FAT size in sectors
- lda (bootBlock),y
- sta fatBlocks
- cmp #4
- bcs invalidParms
- ldy #17 ;get directory size
- lda (bootBlock),y
- sta rootDirEntries
- cmp #129
- bcs invalidParms
- lsr
- lsr
- lsr
- lsr
- sta rootDirBlocks
- ldy #19 ;get total sector count
- lda (bootBlock),y
- sta totalSectors
- iny
- lda (bootBlock),y
- sta totalSectors+1
- ldy #24 ;check sectors per track, must be 9
- lda (bootBlock),y
- cmp #9
- bne invalidParms
- ldy #26
- lda (bootBlock),y
- cmp #2 ;check number of sides, must be 2
- bne invalidParms
- ldy #14 ;check number of boot sectors, must be 1
- lda (bootBlock),y
- cmp #1
- bne invalidParms
-
- ;** get derived parameters
- lda fatBlocks ;first root directory sector
- asl
- clc
- adc #1
- sta firstRootDirBlock
- clc ;first file sector
- adc rootDirBlocks
- sta firstFileBlock
- lda totalSectors ;number of file clusters
- ldy totalSectors+1
- sec
- sbc firstFileBlock
- bcs +
- dey
- + sta fileClusterCount
- sty fileClusterCount+1
- lda clusterBlockCount
- cmp #2
- bne +
- lsr fileClusterCount+1
- ror fileClusterCount
-
- ;** load FAT
- + lda #<fatbuf
- ldy #>fatbuf
- sta 6
- sty 7
- lda #1
- ldy #0
- ldx fatBlocks
- jsr copyBlocks
- bcc +
- rts
-
- ;** load actual directory
- + lda #<dirbuf
- ldy #>dirbuf
- sta 6
- sty 7
- lda firstRootDirBlock
- ldy #0
- ldx rootDirBlocks
- jsr copyBlocks
- bcc +
- rts
- + lda #<dirbuf
- ldy #>dirbuf
- ldx rootDirEntries
- clc
- rts
-
- entryAddr = 2
- entryWork = 4
- entryBits = 5
- entryData0 = 6
- entryData1 = 7
- entryData2 = 8
-
- getFatEntry = * ;( .AY=fatEntryNumber ) : .AY=fatEntryValue
- sta entryBits
- ;** divide by two
- sty entryAddr+1
- lsr entryAddr+1
- ror
-
- ;** times three
- sta entryWork
- ldx entryAddr+1
- asl
- rol entryAddr+1
- clc
- adc entryWork
- sta entryAddr
- txa
- adc entryAddr+1
- sta entryAddr+1
-
- ;** add base, get data
- clc
- lda entryAddr
- adc #<fatbuf
- sta entryAddr
- lda entryAddr+1
- adc #>fatbuf
- sta entryAddr+1
- ldy #2
- - lda (entryAddr),y
- sta entryData0,y
- dey
- bpl -
- lda entryBits
- and #1
- bne +
-
- ;** case 1: first 12-bit cluster
- lda entryData1
- and #$0f
- tay
- lda entryData0
- rts
-
- ;** case 2: second 12-bit cluster
- + lda entryData1
- ldx #4
- - lsr entryData2
- ror
- dex
- bne -
- ldy entryData2
- rts
-
- ;====file copy level====
-
- transMode = 14
- lfn = 15
- cbmDataPtr = $60
- cbmDataLen = $62
- cluster = $64
-
- copyFileCluster = * ;( cluster, lfn, transMode ) : .CS=err
- lda cluster
- ldy cluster+1
- jsr readCluster
- bcc +
- rts
- + lda #<clusterBuf
- ldy #>clusterBuf
- sta cbmDataPtr
- sty cbmDataPtr+1
- lda #0
- sta cbmDataLen
- lda clusterBlockCount
- asl
- sta cbmDataLen+1
-
- ;**get next cluster
- lda cluster
- ldy cluster+1
- jsr getFatEntry
- sta cluster
- sty cluster+1
- cmp #$ff
- bne copyFileClusterData
- cpy #$0f
- bne copyFileClusterData
- lda lenML
- sta cbmDataLen
- lda #$01
- ldx clusterBlockCount
- cpx #1
- beq +
- lda #$03
- + and lenML+1
- bne +
- ldx lenML
- beq copyFileClusterData
- + sta cbmDataLen+1
-
- copyFileClusterData = *
- jsr commieOut
- rts
-
- cbmDataLimit = $66
-
- commieOut = * ;( cbmDataPtr, cbmDataLen ) : .CS=err
- ldx lfn
- bne +
- clc
- rts
- + jsr kernelChkout
- bcc commieOutMore
- sta errno
- rts
-
- commieOutMore = *
- lda #255
- ldx cbmDataLen+1
- bne +
- lda cbmDataLen
- + sta cbmDataLimit
- ldy #0
- - lda (cbmDataPtr),y
- bit transMode
- bpl +
- tax
- lda transBuf,x
- beq commieNext
- + jsr kernelChrout
- commieNext = *
- iny
- cpy cbmDataLimit
- bne -
-
- clc
- lda cbmDataPtr
- adc cbmDataLimit
- sta cbmDataPtr
- bcc +
- inc cbmDataPtr+1
- + sec
- lda cbmDataLen
- sbc cbmDataLimit
- sta cbmDataLen
- bcs +
- dec cbmDataLen+1
- + lda cbmDataLen
- ora cbmDataLen+1
- bne commieOutMore
- jsr kernelClrchn
- clc
- rts
-
- copyFile = * ;( startCluster, lenML, .A=transMode, .X=lfn ) : .CS=err
- ldy #$0e
- sty $ff00
- sta transMode
- stx lfn
- lda startCluster
- ldy startCluster+1
- sta cluster
- sty cluster+1
- jmp +
- - jsr copyFileCluster
- bcc +
- rts
- + lda cluster
- cmp #$ff
- bne -
- lda cluster+1
- cmp #$0f
- bne -
- clc
- rts
-
- transBuf = *
- ;0 1 2 3 4 5 6 7 8 9 a b c d e f
- .byte $00,$00,$00,$00,$00,$00,$00,$00,$14,$09,$0d,$00,$93,$00,$00,$00 ;0
- .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;1
- .byte $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f ;2
- .byte $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f ;3
- .byte $40,$c1,$c2,$c3,$c4,$c5,$c6,$c7,$c8,$c9,$ca,$cb,$cc,$cd,$ce,$cf ;4
- .byte $d0,$d1,$d2,$d3,$d4,$d5,$d6,$d7,$d8,$d9,$da,$5b,$5c,$5d,$5e,$5f ;5
- .byte $c0,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f ;6
- .byte $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5a,$db,$dc,$dd,$de,$df ;7
- .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;8
- .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;9
- .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;a
- .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;b
- .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;c
- .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;d
- .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;e
- .byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;f
-
- ;====bss storage====
-
- bss = *
- trackbuf = bss
- clusterBuf = trackbuf+4608
- fatbuf = clusterBuf+1024
- dirbuf = fatbuf+1536
- end = dirbuf+4096
-