base:drivecode
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
Previous revision | |||
— | base:drivecode [2021-10-11 01:44] (current) – Fixed the heading ftc | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== 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 ; | ||
+ | .l0 | ||
+ | inc $d020 | ||
+ | jsr listen | ||
+ | |||
+ | ldy #$00 | ||
+ | - | ||
+ | lda mw_comm,y | ||
+ | jsr $ffa8 | ||
+ | iny | ||
+ | cpy #$06 | ||
+ | bne - | ||
+ | |||
+ | ldy #$00 | ||
+ | - | ||
+ | dc_addr | ||
+ | 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 | ||
+ | - | ||
+ | | ||
+ | | ||
+ | sta $0400,x | ||
+ | | ||
+ | | ||
+ | sta $0480,x | ||
+ | inx | ||
+ | bpl - | ||
+ | cli | ||
+ | rts | ||
+ | |||
+ | listen | ||
+ | lda $ba | ||
+ | jsr $ffb1 | ||
+ | lda #$6f | ||
+ | jmp $ff93 | ||
+ | |||
+ | mw_comm | ||
+ | !text " | ||
+ | mw_dest | ||
+ | !byte > | ||
+ | !byte $20 | ||
+ | |||
+ | me_comm | ||
+ | !text " | ||
+ | !byte < | ||
+ | !byte > | ||
+ | |||
+ | 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 | ||
+ | | ||
+ | lda .data2,y | ||
+ | | ||
+ | iny | ||
+ | bpl send2c64 | ||
+ | bmi - | ||
+ | } | ||
+ | </ |
base/drivecode.txt · Last modified: 2021-10-11 01:44 by ftc