; ; GameLink II demo program ; created 9/21/97 J.D.Potter ; modified 10/27/97 J.D.Potter ; ; The following line includes the runtime ; library, trimmed of excess fat. ; INCLUDE "D2:RUNTIME.RTC" BYTE stick0=$0278, ;joystick 0 color0=$02C4, ;playfield 0 color2=$02C6, ;background color 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 BYTE POINTER bufr, ;data in buffer bufx ;dat out buffer BYTE xmtcnt, ;transmit counter rcvcnt ;receive counter 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=$FF sskctl=(sskctl&$07)%$13 skctl=sskctl pokmsk=(pokmsk&$C7)%$20 irqen=pokmsk RETURN ; ; setup transmit interrupt ; PROC txen() skres=$FF sskctl=(sskctl&$07)%$23 skctl=sskctl pokmsk=(pokmsk&$C7)%$10 irqen=pokmsk RETURN ; ; setup output complete interrupt ; PROC ocen() skres=$FF 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 ; 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 i = serin IF i>239 THEN rcvcnt = i ELSE bufr^=i ;store value bufr==+1 rcvcnt==+1 IF (rcvcnt=0) THEN recvdn = 1 FI FI pullrti RETURN ; ; Transmit ready handler ; PROC txr() pushregs xmtcnt==+1 IF (xmtcnt=1) THEN ocen() ELSE serout=bufx^ bufx==+1 FI 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, wordx, wordy BYTE recvx, recvy ;must be in this order setup() wordx = 0 wordy = 0 DO recvdn = 0 ; wait for a jiffy i = rtclok DO x = stick0 ;read joystick UNTIL i # rtclok OD ; update internal variables IF (x & $01)=0 THEN wordy ==+1 IF (wordy > 239) THEN wordy = 0 FI ELSEIF (x & $02)=0 THEN wordy ==-1 IF (wordy = 255) THEN wordy = 239 FI FI IF (x & $04)=0 THEN wordx ==-1 IF (wordx = 255) THEN wordx = 239 FI ELSEIF (x & $08)=0 THEN wordx ==+1 IF (wordx > 239) THEN wordx = 0 FI FI ; send to other node bufr = @recvx bufx = @wordx xmtcnt = -2 ;inverse word count txen() ;enable transmit Int serout = xmtcnt ;send first byte ; wait for xmit done ; could do something more constructive here DO UNTIL xmtdon OD xmtdon = 0 ; receiving is automatic ; (controlled by interrupt routine) PrintF("x = %U, y = %U ", wordx, wordy) i = rtclok DO UNTIL (recvdn=1) OR (i+15 = rtclok) OD PrintF("x = %U, y = %U%E", recvx, recvy) OD RETURN