This basic loader implements part of the prlink protocol, and it can
be used to transfer the prlink server to your computer if you do not
have any means for data transfer.

The following listing contains a bootstrap program for the PET and the
4/8 bit version of the prlink cable.  Modifications for other hosts
(VIC-20 and C64/C128) and cables follow this main listing.

 99 hs=201:rem system type
 100 av=32:ack=59468: rem ack (out) is cb2
 110 dat=59471: rem port a
 120 ddr=59459
 130 sv=2:srobe=59469: rem strobe (in) is ca1
 199 rem *** init handshaking lines
 200 poke ack, (peek(ack) and 254) or (128+64+32)
 300 print "waiting for command":gosub990
 310 printby
 320 if by then 330
 322 by=hs:gosub 1190
 324 by=0:gosub 1200:gosub 1200:gosub 1200:gosub 1200
 326 goto 300
 330 if by=1 then gosub2000:goto300
 340 print"(unknown function)":goto 300
 989 rem *** switch from send to receive, then receive a byte
 990 poke ddr,0
 999 rem *** receive a byte
 1000 if (peek(sr) and sv) = 0 then 1000
 1010 poke sr,sv
 1020 by = peek(dat)
 1030 i= peek(ack): i = (i or av) - (i and av) : poke ack,i
 1040 return
 1189 rem *** switch from receive to send, then send a byte
 1190 rem
 1199 rem *** send a byte
 1200 if (peek(sr) and sv) = 0 then 1200
 1210 poke sr,sv
 1220 poke ddr,15:poke dat,by
 1230 i= peek(ack): i = (i or av) - (i and av) : poke ack,i
 1240 if (peek(sr) and sv) = 0 then 1240
 1250 poke sr,sv
 1260 poke dat,by/16
 1270 i= peek(ack): i = (i or av) - (i and av) : poke ack,i
 1280 return
 1999 rem *** load
 2000 gosub1000:print"bank"by
 2010 by=0:gosub1190
 2020 gosub990:f=by:gosub1000:f=f+256*by:print"from"f
 2030 gosub1000:t=by:gosub1000:t=t+256*by:print"to  "t
 2040 for a=f to t-1
 2050 gosub1000:printa,by
 2060 next
 2070 return

Modifications
-------------
To really do the load function (after everything seems to work),
change the print in line 2050 to poke.

Here are the modifications for the VIC-20 and C64, using the
4-bit/8-bit cable:

VIC-20:
 99 hs=20:rem system type
 100 av=32:ack=37148: rem ack (out) is cb2
 110 dat=37136: rem port b
 120 ddr=37138
 130 sv=16:srobe=37149: rem strobe (in) is cb1
 200

C64 and C128:
 99 hs=64:rem or 128
 100 av=4:ack=56576: rem ack (out) is pa2 
 110 dat=56577: rem port b
 120 ddr=56579
 130 sv=16:srobe=56589: rem strobe (in) is -flag
 200 pokeack+2,peek(ack+2)orav:pokeack,peek(ack)orav

If you want to use the PC64 cable instead, apply these (additional)
patches:

 990 poke ddr,15
 1030 poke ack,peek(ack) and (255-av)
 1040 if (peek(sr) and sv) = 0 then 1040
 1050 poke sr,sv
 1060 by = peek(dat) and 240 or (by/16)
 1070 poke ack,peek(ack) or av
 1080 return
 1230 poke ack,peek(ack) and (255-av)
 1270 poke ack,peek(ack) or av

If you want to use the Kontros interface on the C64, C128 or VIC-20,
you will need to make these changes instead of the PC64 patch.  You
will also need to make the modifications for VIC-20 or C64, as shown
earlier.

 200 poke ack+2, peek(ack+2) and (255-av)
 990 pokeddr,0:pokedat,0
 1030
 1190 if(peek(sr)andsv)=0then1190
 1195 pokesr,sv:poke ddr,255
 1200 poke dat,by
 1210 if (peek(sr) and sv) = 0 then 1210
 1220 poke sr,sv
 1230 return
 1240
 1250
 1260
 1270
 1280

For the VIC-20 (using the Kontros cable), make this additional change:
 200 poke ack, (peek(ack) and 14) or (128+32)
 1030 poke dat,by
