Base USB HID Driver#
This driver includes the basic functions to access an USB HID Device. This Driver will include the device dependent code.
01000 .LI OFF 01010 **************************** 01020 ** 6502 USB DEVELOPMENT ** 01030 ** (C) 2004 BY ABBUC ** 01040 ** REGIONALGRUPPE FFM ** 01050 ** USB HID BASE DRIVER ** 01060 ** FOR USB SL811HS ** 01070 ** VERSION 2.0 20041213 ** 01080 ** LICENSED UNDER THE ** 01090 ** GNU PUBLIC LICENSE ** 01100 ** (GPL) VERS. 2 OR LATER ** 01110 ** ** 01120 **************************** 01130 ; 01140 .OR $7000 01150 .OF "D:RUMBPAD2.COM" <--- change this name 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 SETVBV = $E45C 01780 XITVBV = $E462 01790 VCOUNT = $D40B 01800 CONSOL = $D01F 01810 ; 01820 ------------------------------ 01830 USBRESET 01840 LDA #$AE ; SET SOF 01850 LDX #SOFCNT ; HIGH COUNT 01860 JSR REGSTORE 01870 ; 01880 LDA #$08 ; RESET USB 01890 LDX #MCNTRL ; FULLSPEED 01900 JSR REGSTORE 01910 ; 01920 LDA #$10 01930 JSR PAUSE 01940 ; 01950 LDA #00 01960 LDX #MCNTRL 01970 JMP REGSTORE 01980 ; 02000 ------------------------------ 02010 QUERYUSBRESET 02020 ; OUT: A=0 NO USB RESET 02030 ; A!=0 USBRESET 02040 ; 02050 LDX #INTSTAT 02060 JSR REGFETCH 02070 AND #USBRSET 02080 RTS 02090 ------------------------------ 02100 CLEARIRQ 02110 LDA #$FF 02120 LDX #INTSTAT 02130 JMP REGSTORE 02140 ------------------------------ 02150 SPEED 02160 ; OUT: A=0 LOW SPEED DEVICE 02170 ; A!=0 HIGH SPEED DEVICE 02180 ; OR ERROR 02190 ; 02200 JSR USBRESET 02210 JSR CLEARIRQ 02220 LDA #10 02230 JSR PAUSE 02240 JSR QUERYUSBRESET 02250 BEQ .1 ; NO RESET 02260 JSR CLEARIRQ 02270 LDA #$FF 02280 RTS 02290 ; 02300 .1 LDX #INTSTAT 02310 JSR REGFETCH 02320 AND #DMASTAT 02330 BNE .2 02340 ; 02350 ; LOW SPEED 02360 ; 02370 LDA #$AE 02380 LDX #SOFCNT 02390 JSR REGSTORE 02400 ; 02410 LDA #$E0 02420 LDX #CDTASET 02430 JSR REGSTORE 02440 ; 02450 LDA #$05 02460 LDX #MCNTRL 02470 JSR REGSTORE 02480 ; 02490 JSR SETUPUSB 02500 LDA #$00 02510 ; 02520 ; FULL SPEED OR ERROR 02530 ; 02540 .2 02550 RTS 02560 ------------------------------ 02570 SETUPUSB 02580 LDA #$50 02590 LDX #EPC0+EPPS 02600 JSR REGSTORE 02610 ; 02620 LDA #$00 02630 LDX #EPC0+EPTC 02640 JSR REGSTORE 02650 ; 02660 LDA #$01 02670 LDX #EPC0 02680 JSR REGSTORE 02690 ; 02700 LDA #25 02710 JSR PAUSE 02720 ; 02730 JMP CLEARIRQ 02750 ------------------------------ 02760 INITDEVICE 02770 LDA #08 02780 LDX #MCNTRL 02790 JSR REGSTORE 02800 ; 02810 LDA #14 02820 JSR PAUSE 02830 ; 02840 LDA #$21 02850 LDX #MCNTRL 02860 JSR REGSTORE 02870 ; 02880 LDA #$10 ; $10 ADDR 02890 LDX #BUFADR ; DATABUF 02900 JSR REGSTORE 02910 ; 02920 LDA #$8 ; 8 BYTE 02930 LDX #BUFLEN ; DATABUF 02940 JSR REGSTORE 02950 ; 02960 LDA #$E0 ; 1MS EOP 02970 LDX #SOFLOW 02980 JSR REGSTORE 02990 ; 03000 LDA #$EE 03010 LDX #SOFCNT 03020 JSR REGSTORE 03030 ; 03040 ; SET BUFFER FOR SETUP-ADDRESS 03050 ; REQUEST = 1 03060 ; 03070 LDY #8 03080 .1 TYA 03090 CLC 03100 ADC #$F ; BUF ADDR 03110 TAX 03120 LDA SETADDR-1,Y 03130 JSR REGSTORE 03140 DEY 03150 BNE .1 03160 ; 03170 LDA #00 ; WE USE 03180 LDX #FNADDR ; ADDR 0 03190 JSR REGSTORE 03200 ; 03210 LDA #SETPID 03220 LDX #PIDEP 03230 JSR REGSTORE 03240 ; 03250 .2 LDA #07 03260 JSR PROCESS 03270 AND #04 03280 BNE .2 03290 ; 03300 LDA #20 03310 JSR PAUSE 03320 ; 03330 LDA #INPID 03340 LDX #PIDEP 03350 JSR REGSTORE 03360 ; 03370 LDA #03 03380 JSR PROCESS 03390 ; 03400 ; SELECT CONFIGURATION 1 03410 ; 03420 LDY #8 03430 .3 TYA 03440 CLC 03450 ADC #$F 03460 TAX 03470 LDA SETCONF-1,Y 03480 JSR REGSTORE 03490 DEY 03500 BNE .3 03510 ; 03520 LDA #01 03530 LDX #FNADDR ; NEW ADDR 03540 JSR REGSTORE 03550 ; 03560 LDA #SETPID 03570 LDX #PIDEP 03580 JSR REGSTORE 03590 ; 03600 .4 LDA #07 03610 JSR PROCESS 03620 AND #04 03630 ; 03640 BNE .4 03650 ; 03660 LDA #INPID 03670 LDX #PIDEP 03680 JSR REGSTORE 03690 ; 03700 LDA #03 03710 JSR PROCESS 03720 ; 03730 LDA #INPID 03740 ORA #01 03750 LDX #PIDEP 03760 JMP REGSTORE 03770 ; 03790 ------------------------------ 03800 ; PRINT INLINE STRING 03810 ; END MARKER '@' 03820 ; 03830 PRINT PLA get Return address 03840 STA $D0 from Stack 03850 PLA and store 03860 STA $D1 as pointer 03870 ; 03880 INCP INC $D0 increase 03890 BNE .1 pointer 03900 INC $D1 03910 .1 LDX #0 read Char from RAM 03920 LDA ($D0,X) 03930 CMP #'@ End? 03940 BEQ ENDPR yes==> 03950 JSR PUTCHAR Print Char 03960 JMP INCP back to loop 03970 ; 03980 ENDPR LDA $D1 store pointer 03990 PHA as new 04000 LDA $D0 return address 04010 PHA on stack 04020 RTS continue pgm 04030 ; after text 04040 ------------------------------ 04050 PUTCHAR TAX Print char 04060 LDA $E407 with OS 04070 PHA Routine 04080 LDA $E406 04090 PHA 04100 TXA 04110 RTS JUMP 04120 ------------------------------ 04130 CR LDA #$9B 04140 JMP PUTCHAR 04150 ------------------------------ 04160 WAITDEVICE 04170 JSR PRINT 04180 .HX 9B 04190 .AS "ATARI USB HID DRIVER" 04200 .HX 9B 04210 .AS "Version 2.0 / GNU License" 04220 .HX 9B 04230 .AS "(c) 2004 ABBUC e.V." 04240 .HX 9B 04250 .AS "H. Reminder, T. Grasel, C. Strotmann" 04260 .HX 9B9B40 04270 JSR PRINTDEVICE 04280 JSR CR 04290 JSR PRINTVERSION 04300 JSR CR 04310 JSR PRINTCOPY 04320 JSR CR 04330 JSR CR 04350 JSR PRINT 04360 .AS "WAIT FOR DEVICE, [START] TO SKIP..." 04370 .HX 9B40 04380 .1 JSR SPEED 04390 BEQ .2 04400 ; QUERY CONSOL KEYS 04410 LDA CONSOL 04420 AND #1 ; START KEY 04430 BEQ .3 ; SKIP USB 04440 BNE .1 04450 ; 04460 .2 JSR PRINT 04470 .AS "LOW SPEED DEVICE DETECTED!" 04480 .HX 9B40 04490 ; 04500 JSR INITDEVICE 04510 JSR PRINT 04520 .AS "JOYSTICK INITILIZED." 04530 .HX 9B40 04540 LDX /VBI 04550 LDY #VBI 04560 LDA #7 04570 JSR SETVBV 04580 RTS 04590 ; 04600 .3 JSR PRINT 04610 .AS "USB detection skipped," 04620 .HX 9B 04630 .AS "no USB Driver installed!" 04640 .HX 9B40 04650 RTS 04660 ------------------------------ 04670 RESPART .OR $600 04680 ------------------------------ 04690 REGFETCH 04700 ; IN: X=USB REGISTER 04710 ; OUT: A=USB DATA 04720 STX USBSEL 04730 LDA USBDTA 04740 RTS 04750 ------------------------------ 04760 REGSTORE 04770 ; IN: A=USB DATA 04780 ; X=USB REGISTER 04790 STX USBSEL 04800 STA USBDTA 04810 RTS 04820 ------------------------------ 04830 PAUSE 04840 ; IN: A=NUMBER OF 1/50 SEC 04850 TAX 04860 .1 LDA VCOUNT 04870 BNE .1 04880 DEX 04890 BNE .1 04900 RTS 04910 ------------------------------ 04920 PROCESS 04930 ; IN: A=USB COMMAND 04940 ; OUT: A=RETURNCODE 04950 PHA 04960 LDA #01 04970 LDX #INTSTAT 04980 JSR REGSTORE 04990 ; 05000 PLA 05010 LDX #CTL 05020 JSR REGSTORE 05030 ; 05040 .1 LDX #INTSTAT 05050 JSR REGFETCH 05060 AND #$01 05070 BEQ .1 05080 ; 05090 LDX #PKSTAT 05100 JMP REGFETCH 05120 ------------------------------ 05130 DEVICE .IN "D:RUMBPAD2.SRC" <--- change this include for device dependent code 05140 ------------------------------ 05150 .OR $2E0 05160 .DA WAITDEVICE 05170 ------------------------------