0100 ; LIGHT GUN DETECTOR
0110 ; BY MATTHEW RATCLIFF
0120 ; (c)1988, ANTIC PUBLISHING
0130 *= $5000
0140 .OPT OBJ
0150 ;
0160 LPENH = 564
0170 LPENV = 565
0180 STICK0 = 632
0190 GUNHERE = 14 ; Reading on port with gun
0200 GUNFIRE = 15 ; Gunport=15 when trigger pressed
0210 GUNPORT = $0600 ; Store gun port index here
0220 ;
0230 ; GUNDET -Look for the light gun
0240 ; don't return until found.
0250 ; When found, return the port
0260 ; number of the gun in the
0270 ; X register, and put it
0280 ; in the GUNPORT memory location
0290 ; NOTE:
0300 ; Detect LOW to HIGH on joystick
0310 ; ports since the OS on XL/XE's
0320 ; copy ports 0 & 1 to 2 & 3.
0330 ; On 400/800, any port 0-3
0340 ; is valid for gun.
0350 ;
0360 GUNDET
0370 LDX #0 ; First port
0380 WAIT
0390 LDA STICK0,X
0400 CMP #GUNHERE
0410 BEQ GUNFOUND
0420 ;
0430 INX
0440 CPX #3
0450 BNE WAIT
0460 ;
0470 BEQ GUNDET
0480 ;
0490 GUNFOUND
0500 STX GUNPORT
0510 RTS
0520 ;
0530 ; GUNREAD - A successful GUNDET
0540 ; is assumed, and GUNPORT RAM
0550 ; register is set to the proper
0560 ; joystick port for reading
0570 ; the light gun.
0580 ;
0590 ; On Exit:
0600 ; X = LPENH
0610 ; Y = LPENV
0620 ; A = STICk(GUNPORT)
0630 ; Zero flag is SET if the
0640 ; trigger is being pressed.
0650 ;
0660 GUNREAD
0670 LDX GUNPORT
0680 LDA STICK0,X
0690 LDX LPENH
0700 LDY LPENV
0710 CMP #GUNFIRE
0720 RTS
0730 ;
0740 ; A simple test routine
0750 ; to use from DDT.
0760 ; The first BRK occurs after
0770 ; the gun is detected.
0780 ; At this BRK inspect
0790 ; the X register for the proper
0800 ; port number. Continue program
0810 ; from there. The next break
0820 ; occurs when the trigger is
0830 ; pressed.
0840 ;
0850 *= $6000
0860 GUNTEST
0870 JSR GUNDET
0880 BRK
0890 ;
0900 SHOOTEMUP
0910 JSR GUNREAD
0920 BNE SHOOTEMUP
0930 ;
0940 BRK