User Tools

Site Tools


base:drivecode

Drivecode

As the 1541 also has a 6502 and 2KB RAM it can be used for parallel computation. However RAM is scarce and there is a serious bottleneck when synchronizing the c64 with the 1541: the serial bus. So the transfer of the dataset must be taken into account when offloading work to the floppy. Also the drive works @ 1MHz and no badlines interrupt the work of the processor, so there is a slight clock skew between c64 and 1541. When uploading code, you can only use the area from $0300 to $07ff as drop-zone for your code. However if you upload only a small transfer-routine first that hijacks the floppy (SEI + never return to ROM), you can basically upload code to any location on the floppy (But be aware of the stack).

The example code given here, uploads a small code snippet to the 1541 that generates a data set from $00..$ff stored in the zeropage of the floppy and then continuously transferring that data to c64. For faster upload of code to the 1541 just do your own transfer-routines for the other direction. The example from wegi will give some valuebale hints as well: Drivecalc vectors

!convtab pet
!cpu 6510

data1 = $00
data2 = $72

drivecode_start = $0300
drivecode_exec = $0310

         * = $3000
upload_code
         lda #$00
         sta $90
         lda #$08
         sta $ba
         ldx #$05   ;upload 5 * $20 bytes to 1541
.l0
         inc $d020
         jsr listen

         ldy #$00
-
         lda mw_comm,y
         jsr $ffa8
         iny
         cpy #$06
         bne -

         ldy #$00
-
dc_addr  lda drivecode,y
         jsr $ffa8
         iny
         cpy #$20
         bne -
         jsr $ffae
         tya
         clc
         adc dc_addr+1
         sta dc_addr+1
         bcc +
         inc dc_addr+2
+
         tya
         clc
         adc mw_dest
         sta mw_dest
         bcc +
         inc mw_dest+1
+
         dex
         bne .l0

start_code
         jsr listen

         ldy #$00
-
         lda me_comm,y
         jsr $ffa8
         iny
         cpy #$05
         bne -
         jsr $ffae
         lda #$03
         sta $dd00

         lda #$50
         cmp $d012
         bne *-3
         lda #$4f
         cmp $d012
         bne *-3

-
         jsr receive
         jmp -

!macro rcv_1byte_sync {
.poll
         lda $d012
         sbc #$31
         bcc +
         and #$07
         cmp #$01
         bcc .poll
+
}
!macro rcv_1byte {
         lda #%00001011
         sta $dd00
         nop
         eor #%00001000
         sta $dd00
         lda #$ff
         eor $dd00
         lsr
         lsr
         eor $dd00
         lsr
         lsr
         eor $dd00
         lsr
         asr #$fe       ;lets carry be cleared after lsr!
         eor $dd00
}

receive
         ldx #$00
         sei
         clc
-
         +rcv_1byte_sync
         +rcv_1byte
         sta $0400,x
         +rcv_1byte_sync
         +rcv_1byte
         sta $0480,x
         inx
         bpl -
         cli
         rts

listen
         lda $ba
         jsr $ffb1
         lda #$6f
         jmp $ff93

mw_comm
         !text "m-w"
mw_dest  !byte <drivecode_start
         !byte >drivecode_start
         !byte $20

me_comm
         !text "m-e"
         !byte <drivecode_exec
         !byte >drivecode_exec

drivecode
!pseudopc drivecode_start {
.data1 = $00
.data2 = $80
starter
bin2ser
         !byte %1111, %0111, %1101, %0101, %1011, %0011, %1001, %0001
         !byte %1110, %0110, %1100, %0100, %1010, %0010, %1000, %0000

         lda #$7a
         sta $1802
         ldy #$00
         sty $1800
         sei
         ldx #$00
-
         txa
         sta .data1,x
         eor #$80
         sta .data2,x
         inx
         bpl -

!macro snd_1byte {
         ldx #$0f
         sbx #$00
         lsr
         lsr
         lsr
         lsr
         sta .y1+1
         lda bin2ser,x
.poll
         bit $1800
         bpl .poll
         sta $1800
         asl
         and #$0a
         sta $1800
.y1      lda bin2ser
         sta $1800
         asl
         and #$0a
         sta $1800
}

-
         ldy #$00
send2c64
         lda .data1,y
         +snd_1byte
         lda .data2,y
         +snd_1byte
         iny
         bpl send2c64
         bmi -
}
base/drivecode.txt · Last modified: 2015-04-17 04:31 (external edit)