I'll give this a try. Netscape and IE users should see this; my
a0pologies to the rest of you. Attached to this mailing is a schematic of
my 8-user GameLink II board. This replaces my paper clips and rubber band
solution if you want to try more than two-player games. I had created
printed circuit artwork for this (and managed to make about two of them).
It required 1 to 8 SIO connectors (the kind that exist in every Atari
8-bit computer or other peripheral) (I still have a good supply). J1 had
to be plugged in first, as it is the one that provided the power to the
74LS21 or 7421 (don't use CMOS devices). It worked with at least 4 Ataris
connected, and I tested with resistive loads and program loops to
simulate 8.
Schemat urzadzenia
Refer to "Maze of AGDAgon" program notes for more info. Jeff
Potter Okay. It took a while to remember some of the little tricks
in writing SIO bus interrupt handlers (like remember your interrupt
routine is called *after* a PHA instruction has been performed). Here is
actual Action source code for a really simple application. It reads the
joystick and sends out a word which affects the color of the other's
screen. As a check, it shows the color it sent as the background color on
its own screen. If two Ataris aren't connected, the program loops slowly,
and speeds up when a connection occurs (using the already mentioned
GameLink II hardware available from your local authorized AGDA distributor
:^)
BTW: if you wait too long after you've launched the program,
attract mode sets in. Even though you are resetting the color registers,
attract mode XORs your values with other ones. Press any key to stop this
annoying behavior (actual fix is left to the student as an
exercise).
This source will compile to binary executable directly
(no need to include the Action library routines, I didn't use any). So
after compiling, the program will run without the Action cartridge. You
must press RESET after running this program to restore the default
interrupt vectors.
Warning: this program only does what I set out
to do, so modifications you make are likely to cause you a lot of grief. I
can be of some help.
Jeff Potter
===================================================================== ; ;
GameLink II demo program ; coded to *not* use Action library
routines ; created 9/21/97 J.D.Potter ; modified 9/29/97
J.D.Potter ; BYTE stick0=$0278, ;joystick 0 color0=$02C4,
;playfield 0 color2=$02C6, ;background
colo r color4=$02C8, ;border color sskctl=$0232, ;skctl
shadow audf3=$D204, ;Channel 3 frequency audf4=$D206, ;Channel 4
frequency audctl=$D208, ;pokey control skres=$D20A, ;serial port
reset serin=$D20D, ;serial port input serout=$D20D, ;serial port
output irqen=$D20E, ;irq interrupt enable skctl=$D20F ;serial port
control
BYTE pokmsk=$0010, ;pokey irq mask rtclok=$0014, ;jiffy
clock LSB status=$0030, ;sio status recvdn=$0039, ;sio receive
done xmtdon=$003A ;sio xmit done
CARD vserin=$020A, ;receive int
vector vseror=$020C, ;xmit ready int vector vseroc=$020E ;xmit
complete int vector
DEFINE PHA="$48" DEFINE TXA="$8A" DEFINE
TYA="$98" DEFINE PLA="$68" DEFINE TAX="$AA" DEFINE
TAY="$A8" DEFINE RTI="$40" DEFINE SEI="$78" DEFINE
CLI="$58" DEFINE pushregs="[$8A $48 $98 $48]" DEFINE pullrti="[$68
$A8 $68 $AA $68 $40]"
; ; setup receive interrupt ; PROC
rxen() skres=$CF sskctl=(sskctl&$07)%$13
skctl=sskctl pokmsk=(pokmsk&$C7)%$20 irqen=pokmsk RETURN
; ;
setup transmit interrupt ; PROC
txen() skres=$CF sskctl=(sskctl&$07)%$23 skctl=sskctl pokmsk=(pokmsk&$C7)%$10 irqen=pokmsk RETURN
; ;
setup output complete interrupt ; PROC
ocen() skres=$CF skctl=sskctl pokmsk=(pokmsk&$C7)%$08 irqen=pokmsk RETURN
; ;
setup null interrupt ; PROC
nxen() skres=$FF sskctl=(sskctl&$07)%$23 skctl=sskctl pokmsk=(pokmsk&$C7) irqen=pokmsk RETURN
; ;
Output complete handler; setup to receive ; PROC
ocr() pushregs rxen() xmtdon=1
recvdn=0 status=1 pullrti RETURN
; ; Receive
complete handler (one byte) ; PROC rxr() BYTE i pushregs i
= skctl ;read status skres=$FF ;clear
IF i&$80
THEN status = $8C ;input frame error ELSEIF i&$20 THEN status
= $8E ;overrun error ELSE status = 1 FI
color2 = serin ;set
color
recvdn = 1 pullrti RETURN
; ; Transmit ready
handler (one byte) ; replace with real routines to handle things
like ; multi-byte count-down, etc. ; PROC
txr() pushregs ocen() pullrti RETURN
; ; sets up
serial bus speed, interrupt vectors ; (press RESET to undo
this) ; PROC setup() audf4 = $00 ;19kbps audf3 = $28 audctl
= $28 recvdn = 0 xmtdon = 0 [SEI] vserin = rxr ;point the 3
int vectors vseror = txr ;to the right routines vseroc =
ocr [CLI] RETURN
; ; Main Program ; PROC
main() BYTE i, x, colorx
setup() colorx = 0 DO recvdn =
0
; wait for a jiffy i = rtclok DO x = stick0 ;read
joystick UNTIL i # rtclok OD
; update internal colorx
variable IF (x & $01)=0 THEN colorx ==+$10 ELSEIF (x &
$02)=0 THEN colorx ==-$10 FI
IF (x & $04)=0
THEN colorx ==-$01 ELSEIF (x & $08)=0 THEN colorx
==+$01 FI
; send colorx to other node txen() ;enable transmit
Int serout = colorx ;send color color4 = colorx ;set own border
color
; wait for xmit done DO UNTIL xmtdon OD xmtdon =
0
; receiving is automatic ; (controlled by interrupt
routine) ; other colorx gets written to us
rtclok =
$F0 DO UNTIL (recvdn=1) OR (rtclok=0) OD
OD
RETURN
Materiał jest po angielsku, ale sądzę że
jest godny uwagi !!!
Materiał ten nadesłał Michał Szwanke |