Tested with a Logitec Attack 3 analog Jpystick. Other analog Joysticks might work. Please send feedback.
Will work with Atari Basic, Turbo Basic, ACTION!, XFORTH.
Load driver and use Stick(0) and Strig(0) as normal.
Signals from original Joystick in Port A will overwrite USB Joystick compatibility 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) |
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 ------------------------------
{{{