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