;--------------------------------------
; 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
