; STK 05/2026 ; read disk from commodore 1570/1571 drive using burstmode ; stores each track in ram, starting at next page after program ; then writes track to image file ; bank 15:sys start,tracks,source device,target device,,image name * = $1dcd comname = $9236 ; check for comma and get+set filename setlfs = $ffba setbnk = $ff68 setnam = $ffbd open = $ffc0 close = $ffc3 chkout = $ffc9 clrchn = $ffcc chrout = $ffd2 readst = $f755 ; readst without rs-232 serial = $0a1c ; fast serial flag d1icr = $dc0d d1sdr = $dc0c d2pra = $dd00 stat = $fa buffer = $fb ; $fb+$fc cmdadr = $fd ; address of command: $fd+$fe scsize = $01 fastclr = %10111111 ; clear fast serial flag clkch = %00010000 ; change clock statmask= %00001111 ; mask controller status buffhigh= >prgend ; highbyte buffer-1 cmdlg = sectab-cmdbuf; command length (read) track = cmdbuf+3 ; track in command number = cmdbuf+5 ; number of sectors to read next = cmdbuf+6 ; next track cmdilg = cmdbuf-cmdint; command length (set interleave) inter = cmdint+3 ; interleave cmddlg = cmdint-cmddsk; command length (inquire disk) lfncmd = 15 ; lfn of command channel lfnimg = 1 ; lfn of image file maxs1 = 35 ; last track on side 1 maxs2 = 70 ; last track on side 2 sta endtrk ; store end track lda #1 ; store first track sta track stx srcdev ; store source device number tya ; transfer target device number into x tax ; open image file lda #lfnimg ; logical file number ldy #1 ; secondary address jsr setlfs ldx #1 ; filename in bank 1 jsr setbnk jsr comname ; check for comma, get filename from basic and set it jsr open ; open command channel lda #lfncmd ; logical file number ldx srcdev ; device number ldy #15 ; secondary address jsr setlfs ; lda #0 ; no filename jsr setnam jsr open ; set sector interleave ; in case it was altered by another program ldx #cmdint lda #cmdilg jsr sendcom ; inquire disk ldx #cmddsk lda #cmddlg jsr sendcom ; setup parameters for track copy copy ldx track ; copy number of sectors lda sectab-1,x sta number ; into number cpx #maxs1 ; last track on side 1? beq nonext ; -> dont increase next track cpx #maxs2 ; last track on side 2? beq nonext ; -> dont increase next track inx ; increase next track nonext stx next ; store next track in next lda #0 ; buffer is next page sta buffer ; behind program lda #buffhigh+1 sta buffer+1 clc ; calculate page behind buffer adc number sta buffmax ; and store in buffmax ; read sectors read lda #0 ; clear status sta stat lda serial ; clear fast serial flag and #fastclr sta serial ldx #cmdbuf lda #cmdlg jsr sendcom bit serial ; check speed of drive bvs noerr jmp error ; burst mode not supported noerr sei bit d1icr ldx number ; number of sectors lda d2pra ; get byte eor #clkch ; change state of clock sta d2pra readit lda #8 wait1 bit d1icr ; wait for byte beq wait1 lda d2pra ; read serial port eor #clkch ; change state of clock sta d2pra lda d1sdr ; read status sta stat and #statmask ; only disk controller status cmp #2 ; sector found? bcs error ldy #0 topread lda #8 wait2 bit d1icr ; wait for byte beq wait2 lda d2pra ; toggle clock eor #clkch sta d2pra lda d1sdr ; get data sta (buffer),y ; store into buffer iny bne topread dex beq wrtrk ; all sectors of track? -> write to image lda buffer+1 ; calculate next buffer clc adc inter ; sector+interleave cmp buffmax bcc buffok ; sector exists sbc number ; >maxsector-> sub number of sectors buffok sta buffer+1 jmp readit ; write track wrtrk ldx #lfnimg ; output to image file jsr chkout ldx track ; copy number of sectors lda sectab-1,x tax ; into x lda #buffhigh+1 ; set highbyte of buffer start sta buffer+1 ldy #0 ; write sector wrsec lda (buffer),y jsr chrout jsr readst ; error? bne error iny bne wrsec inc buffer+1 ; set highbyte of buffer to next sector dex ; count number of sectors down bne wrsec ; next sector jsr clrchn ; clear channels ldx track ; last track? cpx endtrk beq donerd ; yes -> goto end inx ; no -> increase track number stx track jmp copy ; and continue error jsr clrchn ; clear channels sec ; error: c=1 bcs end donerd clc ; no error: c=0 end cli lda #lfncmd ; close command channel jsr close lda #lfnimg ; close image file jmp close ; send command (x/y: address, a: length) sendcom stx cmdadr sty cmdadr+1 pha ldx #lfncmd ; output to channel jsr chkout ldy #0 ; send U0-command pla tax sendit lda (cmdadr),y jsr chrout iny dex bne sendit jmp clrchn ; clear channels srcdev !byte 8 ; source device number endtrk !byte 70 ; end track buffmax !byte 0 ; high byte end of buffer+1 ; "U0",4: inquire disk cmddsk !byte "U","0",4 ; "U0",8,interleave: set sector interleave ; interleave is set to default value (5) cmdint !byte "U","0",8,5 ; "U0",0,track,sector,number,next track: read tracks ; first track is 1, first sector is 0 cmdbuf !byte "U","0",0,254,0,255,2 ; number of sectors on tracks sectab !byte 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21 !byte 19,19,19,19,19,19,19 !byte 18,18,18,18,18,18 !byte 17,17,17,17,17 !byte 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21 !byte 19,19,19,19,19,19,19 !byte 18,18,18,18,18,18 !byte 17,17,17,17,17 prgend !byte 0