;-------------------------------------- ; Network I/O Atari program 7-27-94 ; Mike Fenton ;-------------------------------------- ; ; This program works in conjunction ; with "ACENet1.s". ; ; (You will probably need to print out ; this program and type it in on your ; Atari computer.) ; ; Don't use this program unless you ; know what you're doing! *** I will ; not be responsible if you damage your ; computer! *** ; ; Using this program incorrectly could ; cause damage to your parallel port, ; the Atari PIA, or both. Exercise ; extreme caution! ; ; This program transfers a disk image ; from D1: to the Amiga via the cable. ; ; Doesn't let user select number of ; sides just yet. ; ; This is the 32K version of this ; program. In order to make it work in ; 16K, change the org to $2000 and the ; main buffer to $2800. org $5000 go: lda #1 jsr print ; print msg1 start: lda #2 jsr print ; print msg2 ia1: lda $D01F ; get console key and #7 cmp #7 beq ia1 cmp #6 ; start beq ia2 rts ; cancel ia2: lda $22F sta $D3 ; save DMA lda #0 sta $22F ; clear DMA sta $D400 lda $D302 and #$FB ; clear bit 2 sta $D302 lda #$5F ; give me 0-3,4,6 out sta $D300 lda $D302 ora #4 ; set bit 2 sta $D302 lda #$60 sta setup+5 ; buffer=$6000 lda #128 sta setup+8 ; number bytes=128 sta size1 lda #1 sta setup+10 ; sector=1 lda #0 sta setup+4 sta setup+9 sta setup+11 sta size1+1 ldy #11 aa1: lda setup,y sta $300,y dey bpl aa1 jsr $E459 ; get sector bpl aa2 rts ; leave program aa2: lda #'N' sta $302 ; get aux lda #$40 sta $303 ; input lda #LOW auxbuf sta $304 lda #HIGH auxbuf sta $305 ; buffer lda #12 sta $308 lda #0 sta $309 ; length=12 bytes jsr $E459 bpl ng1 lda #40 ; set default config sta auxbuf ; tracks lda #18 sta auxbuf+3 ; sectors/track lda #0 sta auxbuf+4 ; sides-1 ng1: lda auxbuf sta trks ; tracks=aux(0) lda auxbuf+3 sta secs ; sectors=aux(3) lda auxbuf+4 sta sides ; sides=aux(4) lda #3 sta $CF ; set size count jmp doio setup: db $31,1,'R',$40,0,$60,15,0 db 128,0,1,0 auxbuf: db 40,0,0,18,0,0 db 0,128,1,$41,0,0 size1: db 128,0 trks: db 40 secs: db 18 sides: db 0 doio: lda secs sta $CE ; # sectors (1 trk) n1: lda setup+11 bne nk1 lda setup+10 cmp #4 ; sector=4? bne nk1 lda auxbuf+6 ; b/s msb sta setup+9 lda auxbuf+7 ; b/s lsb sta setup+8 ; size=aux(b/s) nk1: lda #2 sta $D2 ; 2 reads max r1: ldy #11 l1: lda setup,y ; copy setup data sta $300,y dey bpl l1 dec $D2 bmi r2 jsr $E459 ; get sector bmi r1 r2: clc lda setup+8 adc setup+4 sta setup+4 lda setup+9 adc setup+5 sta setup+5 ; next buffer inc setup+10 bne n2 inc setup+11 n2: dec $CE ; next sector bne n1 lda #0 sta setup+4 lda #$60 sta setup+5 ; buffer=$6000 lda #$4F sta $D300 ; send d4=0 jsr wait0 ; wait d5=0 ldy #0 ; count=0 sty $D2 ; clear chksum lda #$60 sta $D1 sty $D0 ; ($D0)=$6000 lda secs ; # of sectors sta $CE ; ******** main I/O routine ********** ; each byte is transmitted one nibble ; at a time (low, then high)-- ; data line 4 alternates high and ; low to facilitate the handshaking-- ; the Amiga replies each data send by ; alternating the data 5 line-- ; between each data send is a send -1 ; which makes lines go high until the ; next data send--the Amiga waits for ; the lines to go high and then waits ; for data loop1: lda ($D0),y ; get data tax ; save clc adc $D2 ; add to chksum adc #0 sta $D2 ; store txa ; restore and #$F ; get low nib ora #$50 sta $D300 ; send d4=1 jsr wait1 ; wait d5=1 lda #$4F sta $D300 ; send -1 (d4=0) jsr wait0 ; wait d5=0 lda ($D0),y ; get data lsr A lsr A lsr A lsr A ; get high nib ora #$50 ; d6=1 sta $D300 ; send d4=1 jsr wait1 ; wait d5=1 lda #$4F sta $D300 ; send -1 (d4=0) jsr wait0 ; wait d5=0 iny cpy size1 ; finished? bne loop1 ldy #0 ; count=0 clc lda size1 adc $D0 sta $D0 lda size1+1 adc $D1 sta $D1 ; next buffer dec $CF ; put off set size bne nk2 ; till sector 3 done lda auxbuf+7 sta size1 ; bytes/sector lsb lda auxbuf+6 sta size1+1 ; bytes/sector msb nk2: dec $CE bne loop1 ; next sector lda $D2 ; get chksum and #$F ; get low nib ora #$50 sta $D300 ; send d4=1 jsr wait1 ; wait d5=1 lda #$4F sta $D300 ; send -1 (d4=0) jsr wait0 ; wait d5=0 lda $D2 lsr A lsr A lsr A lsr A ; get high nib ora #$10 sta $D300 ; send d4=1,d6=0 jsr wait1 ; wait d5=1 done1: lda #$5F sta $D300 ; set all bits jsr wait0 ; wait d5=0 dec trks ; next track bne s2 lda sides ; another side? beq done2 lda auxbuf sta trks ; reset # of tracks dec sides ; next side s2: lda #$1F ; set d6=0,d4=1 sta $D300 jsr wait1 ; wait d5=1 jmp doio done2: lda #0 sta $D300 ; send all clear jsr wait1 ; wait d5=1 lda $D302 and #$FB ; clear bit 2 sta $D302 lda #0 sta $D300 ; all bits in lda $D302 ora #4 ; set bit 2 sta $D302 lda $D3 sta $22F ; restore DMA sta $D400 jmp start wait0: lda $D300 ; get port and #$20 ; get bit 5 bne wait0 rts wait1: lda $D300 ; get port and #$20 ; get bit 5 beq wait1 rts print: sta $C2 ; store msg # lda #LOW Msg1 sta $C0 lda #HIGH Msg1 sta $C1 ; C0=msg1 pr3: dec $C2 ; next msg beq pr4 ldy #0 pr1: lda ($C0),y ; (C0)=0? beq pr2 inc $C0 ; C0++ bne pr1 inc $C1 bne pr1 pr2: inc $C0 ; C0++ bne pr3 inc $C1 bne pr3 pr4: ldy #0 ; index=0 pr5: sty $C2 lda ($C0),y ; A=char beq pr6 jsr printj ; output char ldy $C2 iny ; next bne pr5 pr6: rts ; done printj: tax ; X=A lda $E407 pha lda $E406 ; ($E406=PUT E:) pha txa ; A=X rts ; jmp ($E406)+1 Msg1: db '/\/\/\/\/\/\/\/\/\/' db '\/\/\/\/\/\/\/\/\/\',$9B db '\ Atari-Amiga Netwo' db 'rk Transfer v1.0 /',$9B db '/ by Mike Fento' db 'n (c) 1994 \',$9B db '\/\/\/\/\/\/\/\/\/\' db '/\/\/\/\/\/\/\/\/\/',$9B db $9B,$9B,0 Msg2: db 'Insert the disk int' db 'o drive 1 and press',$9B db '[START] to begin ' db 'transfer.',$9B,$9B db 'Press [OPTION] to cancel.' db $9B,$9B,$9B,0 end $5000