Atari USB analog Joystick Driver#
Tested with a Logitec Attack 3 analog Jpystick. Other analog Joysticks might work. Please send feedback.
Generic VBI Driver#
Will work with Atari Basic, Turbo Basic, ACTION!, XFORTH.
Compatibility Mode#
Load driver and use Stick(0) and Strig(0) as normal.
Signals from original Joystick in Port A will overwrite USB Joystick compatibility mode.
USB Analog Joystick Mode#
Label | Mem | Values | |
---|---|---|---|
USBHORZ | $0270 | horizontal values (127-0 left move, 128 = no move, 129-255 right move) | |
USBVERT | $0271 | vertical values (127-0 up move, 128 = no move, 129-255 down move) | |
USBTRIG0 | $0272 | Buttons 1-8 (each bit, bit set = Button pressed) | |
USBTRIG1 | $0273 | Buttons 9-10 (each bit, bit set = Button pressed) | |
USBTHRUS | $0274 | Thrust (0-255) |
Source Code (BiboAssembler)#
01000 .LI OFF 01010 **************************** 01020 ** 6502 USB DEVELOPMENT ** 01030 ** (C) 2004 BY ABBUC ** 01040 ** REGIONALGRUPPE FFM ** 01050 ** ANALOG JOYSTICK DRIVER ** 01060 ** FOR USB SL811HS ** 01070 ** VERSION 1.0 20041114 ** 01080 ** LICENSED UNDER THE ** 01090 ** GNU PUBLIC LICENSE ** 01100 ** (GPL) VERS. 2 OR LATER ** 01110 ** ** 01120 **************************** 01130 ; 01140 .OR $3500 01150 .OF "D:USBJOYST.COM" 01160 ; 01170 ; SL811 MEMORY ADDRESSES 01180 ; CHANGE ACCORDING TO YOUR 01190 ; CONFIGURATION 01200 USBSEL = $D500 01210 USBDTA = $D501 01220 ; 01230 ; USB REGISTER SL811 01240 ; 01250 CTL = $00 ; USBA HOST CTL 01260 BUFADR = $01 ; BUFFER ADDRESS 01270 BUFLEN = $02 ; BUFFER LEN 01280 PIDEP = $03 ; HOST PID 01290 PKSTAT = $03 ; PAKET STATUS 01300 FNADDR = $04 ; USB ADDR (WO) 01310 MCNTRL = $05 ; MAIN CONTROL 01320 CDTASET = $0E 01330 SOFCNT = $0F ; CNTRL 2 REG 01340 SOFLOW = $0E ; SOF LOW 01350 INTSTAT = $0D ; IRQ STATUS 01360 ; 01370 ; USB CONSTANTS 01380 ; 01390 ; INTENA AND INTSTAT MASKS 01400 EP0DONE = $01 01410 EP1DONE = $02 01420 EP2DONE = $04 01430 EP3DONE = $08 01440 DMADONE = $10 01450 SOFRECV = $20 01460 USBRSET = $40 01470 DMASTAT = $80 01480 ; 01490 ; ENDPOINT CONTROL REG 01500 EPC0 = $00 ; ENDPOINT 0 01510 EPC1 = $10 ; ENDPOINT 1 01520 EPC2 = $20 ; ENDPOINT 2 01530 EPC3 = $30 ; ENDPOINT 3 01540 ; 01550 ; ENDPOINT REGISTER OFFSET 01560 ; 01570 EPC = $00 ; CONTROL 01580 EPBA = $01 ; BASE ADDRESS 01590 EPBL = $02 ; BASE LENGTH 01600 EPPS = $03 ; PACKET STATUS 01610 EPTC = $04 ; TRANSFERCOUNT 01620 ; 01630 ; PID VALUES 01640 ; 01650 SOFPID = $05 ; SOF PID 01660 INPID = $90 ; PACKET ID 01670 SETPID = $D0 ; SET ADDRESS REQ 01680 ; 01690 ; SET ADDRESS PACKET 01700 ; 01710 SETADDR .HX 0005010000000000 01720 ; 01730 ; SET CONFIG PACKET 01740 ; 01750 SETCONF .HX 0009010000000000 01760 ; 01770 ; ATARI MEMORY LOCATIONS 01780 ; 01790 STICK0 = $0278 01800 STRIG0 = $0284 01810 ; 01820 ; USB JOYSTICK SHADOW REGISTER 01830 ; 01840 USBHORZ = $0270 01850 USBVERT = $0271 01860 USBTRIG0 = $0272 01870 USBTRIG1 = $0273 01880 USBTHRUS = $0274 01890 ; 01900 SETVBV = $E45C 01910 XITVBV = $E462 01920 VCOUNT = $D40B 01930 CONSOL = $D01F 01940 ; 01950 ------------------------------ 01960 USBRESET 01970 LDA #$AE ; SET SOF 01980 LDX #SOFCNT ; HIGH COUNT 01990 JSR REGSTORE 02000 ; 02010 LDA #$08 ; RESET USB 02020 LDX #MCNTRL ; FULLSPEED 02030 JSR REGSTORE 02040 ; 02050 LDA #$10 02060 JSR PAUSE 02070 ; 02080 LDA #00 02090 LDX #MCNTRL 02100 JSR REGSTORE 02110 ; 02120 RTS 02130 ------------------------------ 02140 QUERYUSBRESET 02150 ; OUT: A=0 NO USB RESET 02160 ; A!=0 USBRESET 02170 ; 02180 LDX #INTSTAT 02190 JSR REGFETCH 02200 AND #USBRSET 02210 RTS 02220 ------------------------------ 02230 CLEARIRQ 02240 LDA #$FF 02250 LDX #INTSTAT 02260 JMP REGSTORE 02270 ------------------------------ 02280 SPEED 02290 ; OUT: A=0 LOW SPEED DEVICE 02300 ; A!=0 HIGH SPEED DEVICE 02310 ; OR ERROR 02320 ; 02330 JSR USBRESET 02340 JSR CLEARIRQ 02350 LDA #10 02360 JSR PAUSE 02370 JSR QUERYUSBRESET 02380 BEQ .1 ; NO RESET 02390 JSR CLEARIRQ 02400 LDA #$FF 02410 RTS 02420 ; 02430 .1 LDX #INTSTAT 02440 JSR REGFETCH 02450 AND #DMASTAT 02460 BNE .2 02470 ; 02480 ; LOW SPEED 02490 ; 02500 LDA #$AE 02510 LDX #SOFCNT 02520 JSR REGSTORE 02530 ; 02540 LDA #$E0 02550 LDX #CDTASET 02560 JSR REGSTORE 02570 ; 02580 LDA #$05 02590 LDX #MCNTRL 02600 JSR REGSTORE 02610 ; 02620 JSR SETUPUSB 02630 LDA #$00 02640 ; 02650 ; FULL SPEED OR ERROR 02660 ; 02670 .2 02680 RTS 02690 ------------------------------ 02700 SETUPUSB 02710 LDA #$50 02720 LDX #EPC0+EPPS 02730 JSR REGSTORE 02740 ; 02750 LDA #$00 02760 LDX #EPC0+EPTC 02770 JSR REGSTORE 02780 ; 02790 LDA #$01 02800 LDX #EPC0 02810 JSR REGSTORE 02820 ; 02830 LDA #25 02840 JSR PAUSE 02850 ; 02860 JSR CLEARIRQ 02870 RTS 02880 ------------------------------ 02890 INITJOYST 02900 LDA #08 02910 LDX #MCNTRL 02920 JSR REGSTORE 02930 ; 02940 LDA #14 02950 JSR PAUSE 02960 ; 02970 LDA #$21 02980 LDX #MCNTRL 02990 JSR REGSTORE 03000 ; 03010 LDA #$10 ; $10 ADDR 03020 LDX #BUFADR ; DATABUF 03030 JSR REGSTORE 03040 ; 03050 LDA #$8 ; 8 BYTE 03060 LDX #BUFLEN ; DATABUF 03070 JSR REGSTORE 03080 ; 03090 LDA #$E0 ; 1MS EOP 03100 LDX #SOFLOW 03110 JSR REGSTORE 03120 ; 03130 LDA #$EE 03140 LDX #SOFCNT 03150 JSR REGSTORE 03160 ; 03170 ; SET BUFFER FOR SETUP-ADDRESS 03180 ; REQUEST = 1 03190 ; 03200 LDY #8 03210 .1 TYA 03220 CLC 03230 ADC #$F ; BUF ADDR 03240 TAX 03250 LDA SETADDR-1,Y 03260 JSR REGSTORE 03270 DEY 03280 BNE .1 03290 ; 03300 LDA #00 ; WE USE 03310 LDX #FNADDR ; ADDR 0 03320 JSR REGSTORE 03330 ; 03340 LDA #SETPID 03350 LDX #PIDEP 03360 JSR REGSTORE 03370 ; 03380 .2 LDA #07 03390 JSR PROCESS 03400 AND #04 03410 BNE .2 03420 ; 03430 LDA #20 03440 JSR PAUSE 03450 ; 03460 LDA #INPID 03470 LDX #PIDEP 03480 JSR REGSTORE 03490 ; 03500 LDA #03 03510 JSR PROCESS 03520 ; 03530 ; SELECT CONFIGURATION 1 03540 ; 03550 LDY #8 03560 .3 TYA 03570 CLC 03580 ADC #$F 03590 TAX 03600 LDA SETCONF-1,Y 03610 JSR REGSTORE 03620 DEY 03630 BNE .3 03640 ; 03650 LDA #01 03660 LDX #FNADDR ; NEW ADDR 03670 JSR REGSTORE 03680 ; 03690 LDA #SETPID 03700 LDX #PIDEP 03710 JSR REGSTORE 03720 ; 03730 .4 LDA #07 03740 JSR PROCESS 03750 AND #04 03760 ; 03770 BNE .4 03780 ; 03790 LDA #INPID 03800 LDX #PIDEP 03810 JSR REGSTORE 03820 ; 03830 LDA #03 03840 JSR PROCESS 03850 ; 03860 LDA #INPID 03870 ORA #01 03880 LDX #PIDEP 03890 JSR REGSTORE 03900 ; 03910 RTS 03920 ------------------------------ 03930 ; PRINT INLINE STRING 03940 ; END MARKER '@' 03950 ; 03960 PRINT PLA get Return address 03970 STA $D0 from Stack 03980 PLA and store 03990 STA $D1 as pointer 04000 ; 04010 INCP INC $D0 increase 04020 BNE .1 pointer 04030 INC $D1 04040 .1 LDX #0 read Char from RAM 04050 LDA ($D0,X) 04060 CMP #'@ End? 04070 BEQ ENDPR yes==> 04080 JSR PUTCHAR Print Char 04090 JMP INCP back to loop 04100 ; 04110 ENDPR LDA $D1 store pointer 04120 PHA as new 04130 LDA $D0 return address 04140 PHA on stack 04150 RTS continue pgm 04160 ; after text 04170 ------------------------------ 04180 PUTCHAR TAX Print char 04190 LDA $E407 with OS 04200 PHA Routine 04210 LDA $E406 04220 PHA 04230 TXA 04240 RTS JUMP 04250 ------------------------------ 04260 WAITJOYSTICK 04270 JSR PRINT 04280 .HX 9B 04290 .AS "ATARI USB JOYSTICK DRIVER" 04300 .HX 9B 04310 .AS "Version 1.0 / GNU License" 04320 .HX 9B 04330 .AS "(c) 2004 ABBUC e.V." 04340 .HX 9B 04350 .AS "H. Reminder, T. Grasel, C. Strotmann" 04360 .HX 9B9B 04370 .AS "WAIT FOR DEVICE, [START] TO SKIP..." 04380 .HX 9B40 04390 .1 JSR SPEED 04400 BEQ .2 04410 ; QUERY CONSOL KEYS 04420 LDA CONSOL 04430 AND #1 ; START KEY 04440 BEQ .3 ; SKIP USB 04450 BNE .1 04460 ; 04470 .2 JSR PRINT 04480 .AS "LOW SPEED DEVICE DETECTED!" 04490 .HX 9B40 04500 ; 04510 JSR INITJOYST 04520 JSR PRINT 04530 .AS "JOYSTICK INITILIZED." 04540 .HX 9B40 04550 LDX /JOYVBI 04560 LDY #JOYVBI 04570 LDA #7 04580 JSR SETVBV 04590 RTS 04600 ; 04610 .3 JSR PRINT 04620 .AS "USB detection skipped," 04630 .HX 9B 04640 .AS "no USB Driver installed!" 04650 .HX 9B40 04660 RTS 04670 ------------------------------ 04680 RESPART .OR $600 04690 ; 04700 ; THRESHOLD ANALOG->DIGITAL 04710 THLEFT .HX 60 04720 THRIGHT .HX A0 04730 THUP .HX 60 04740 THDOWN .HX A0 04750 ------------------------------ 04760 REGFETCH 04770 ; IN: X=USB REGISTER 04780 ; OUT: A=USB DATA 04790 STX USBSEL 04800 LDA USBDTA 04810 RTS 04820 ------------------------------ 04830 REGSTORE 04840 ; IN: A=USB DATA 04850 ; X=USB REGISTER 04860 STX USBSEL 04870 STA USBDTA 04880 RTS 04890 ------------------------------ 04900 PAUSE 04910 ; IN: A=NUMBER OF 1/50 SEC 04920 TAX 04930 .1 LDA VCOUNT 04940 BNE .1 04950 DEX 04960 BNE .1 04970 RTS 04980 ------------------------------ 04990 GETJOYSTICK 05000 ; 05010 LDA #03 05020 JSR PROCESS 05030 ; AND #01 05040 ; BEQ .2 ; NO DATA 05050 ; 05060 LDX #$10 05070 JSR REGFETCH 05080 STA USBHORZ 05090 LDX #$11 05100 JSR REGFETCH 05110 STA USBVERT 05120 LDX #$12 05130 JSR REGFETCH 05140 STA USBTHRUS 05150 LDX #$13 05160 JSR REGFETCH 05170 STA USBTRIG0 05180 LDX #$14 05190 JSR REGFETCH 05200 STA USBTRIG1 05210 ; 05220 .2 RTS 05230 ------------------------------ 05240 PROCESS 05250 ; IN: A=USB COMMAND 05260 ; OUT: A=RETURNCODE 05270 PHA 05280 LDA #01 05290 LDX #INTSTAT 05300 JSR REGSTORE 05310 ; 05320 PLA 05330 LDX #CTL 05340 JSR REGSTORE 05350 ; 05360 .1 LDX #INTSTAT 05370 JSR REGFETCH 05380 AND #$01 05390 BEQ .1 05400 ; 05410 LDX #PKSTAT 05420 JSR REGFETCH 05430 RTS 05440 ------------------------------ 05450 USB2ATA 05460 LDA #$0F 05470 STA STICK0 05480 LDA #1 05490 STA STRIG0 05500 ; 05510 LDA USBTRIG0 05520 ORA USBTRIG1 05530 BEQ GETSTICK 05540 LDA #0 05550 STA STRIG0 05560 ; 05570 GETSTICK 05580 LDA STICK0 05590 LDX USBHORZ 05600 CPX THLEFT 05610 BCC .1 ; LEFT 05620 CPX THRIGHT 05630 BCS .2 ; RIGHT 05640 BCC .10 05650 .1 EOR #$04 ; LEFT 05660 BPL .3 05670 .2 EOR #$08 ; RIGHT 05680 .3 STA STICK0 05690 .10 05700 LDX USBVERT 05710 CPX THUP 05720 BCC .11 ; UP 05730 CPX THDOWN 05740 BCS .12 ; DOWN 05750 BCC .20 05760 .11 EOR #$01 ; UP 05770 BNE .13 05780 .12 EOR #$02 ; DOWN 05790 .13 STA STICK0 05800 .20 RTS 05810 ------------------------------ 05820 JOYVBI 05830 LDA STICK0 05840 EOR #$0F 05850 BNE .1 05860 LDA STRIG0 05870 BEQ .1 05880 ; 05890 JSR GETJOYSTICK 05900 JSR USB2ATA 05910 .1 JMP XITVBV 05920 ------------------------------ 05930 .OR $2E0 05940 .DA WAITJOYSTICK 05950 ------------------------------