Boulder Dash 1 Patch for USB Joypad#

Append this behind Boulder Dash 1 binary.


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