From fb2e898922816c6d21f2ba4b439df638fba6bb8f Mon Sep 17 00:00:00 2001 From: Curtis F Kaylor Date: Mon, 27 Apr 2020 12:45:06 -0400 Subject: [PATCH] Updated Commander X16 modules joystk and mouse --- include/x16/joystk.a02 | 159 ++++++++++++++++++++--------------------- include/x16/joystk.h02 | 24 ++++++- include/x16/mouse.a02 | 13 ++-- include/x16/mouse.h02 | 13 ---- 4 files changed, 106 insertions(+), 103 deletions(-) diff --git a/include/x16/joystk.a02 b/include/x16/joystk.a02 index 5cb1e84..ffcf29f 100644 --- a/include/x16/joystk.a02 +++ b/include/x16/joystk.a02 @@ -1,29 +1,15 @@ ;Joystick Constants and Functions for Commander X16 Computer +;NOTE: As of R35, joystick_scan() has not been added to the +;vsync() interrupt routine. This will be in R36, so development +;on this module is currently on hold + SUBR _JOYSTK JYSTKS EQU 2 ;Number of Joysticks -.GETJOY EQU $FF06 ;Kernal GETJOY Routine -.JYDATA EQU $02BC ;Joystick 0 Data -;JOY1 JOY2 -;$02BC $02BF | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | -; NES | A | B |SEL|STA|UP |DN |LT |RT | -; SNES | B | Y |SEL|STA|UP |DN |LT |RT | -; -;$02BD $20C0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | -; NES | 0 | 0 | 0 | 0 | 0 | 0 | 0 |KBD| -; SNES | A | X | L | R | 1 | 1 | 1 | 1 | -; -;$02BE $02C1 $00 = joystick present -; $FF = joystick not present - -;The Joystick Button is mapped to -;A,B on the NES Controller and -;A,B,X,Y on the SNES Controller - -;Select and Start are Ignored as Bits 4 and 5 of the return value -;are always 0 because returning $FF means no controller found +JOY0 EQU $A031 ;Joystick 0 Status +JOY1 EQU $A034 ;Joystick 1 Status ;Joystick Bit Masks JOYUP EQU $08 ;Up @@ -54,75 +40,88 @@ JOYSNS EQU $02 ;SNS Controller ; TEMP2 - Extended Result (Buttons) ;Destroys: TEMP3 ;Returns: A = Joystick Status (Joystick Bit Masks +; The Joystick Button is mapped to +; A,B on the NES Controller and +; A,B,X,Y on the SNES Controller ; Y = Extended Status (Extended Bit Masks) +; Used with Extended Bitmasks to check +; A,B,X,Y,Select, Start, Left and Right ; X = Controller Type (0=Keyboard, 1=NES, 2=SNES) JOYSTK: CMP #JYSTKS ;If Invalid Joystick Number BCS .JOYSTE ; Return ERROR - STA TEMP0 ;Save Joystick Number - BYTE $FF -JOYSTL: WAI ;Wait for Interrupt - LDA $9F27 ; Check Vera Interrupt Register - AND #$01 ; If Not Vera Interrupt - BEQ JOYSTL ; Loop - JSR .GETJOY ;Call Kernal GETJOY Routine - LDA TEMP0 ;Retrieve Joystick Number - ASL ;Multiply it by 3 - ADC TEMP0 ;(Assumes Number<128) - TAX ;and Copy to X-Register - LDA .JYDATA+2,X ;If Controller Not Present - BNE .JOYSTE ; Return ERROR - LDA .JYDATA,X ;Get Base Status - EOR #$FF ;Invert Bits - JSR .JOYEXT ;Build Extended Results - AND #$CF ;Mask off Select and Start -.JOYSTX RTS - -;Return Error -.JOYSTE LDA #$FF - RTS - -;Build Extended Result -.JOYEXT STA TEMP0 ;Save Controller Status + JSR JOYGET ;Read Joystick State + EOR #$FF ;Invert Controller Status + STA TEMP0 ;and Save in TEMP0 + STX TEMP1 ;Save Extended Status in TEMP1 + TYA ;If Controller Not Present + BNE .JOYSTF ; Return $FF, $FF, $FF +;JOYEXT ;Process Extended Bits STZ TEMP3 ;Clear Button Mask - LDA .JYDATA+1,X ;Get Extended Status + LDA TEMP1 ;Get Extended Status BIT #$0E ;Check Bits 1 - 3 - BNE .JOYEXS ;If NES/Keyboard - STA TEMP1 ; Save for Debugging - EOR #$01 ; Invert Extended Bits + BNE .JOYSNS ;If NES/Keyboard +;JOYNES ; Process NES Buttons + EOR #$01 ; Invert Extended Bit 0 TAX ; and Copy to X LDA TEMP0 ; Get Controller Status AND #$F0 ; Isolate Bits 4-7 TAY ; and Copy Back to Y - BRA .JOYEXX ;Else -.JOYEXS JSR .JOYSNS ; Process SNES Buttons -.JOYEXX LDA TEMP0 ;Restore Controller Status - ORA TEMP3 ;Combine Buttons + BRA .JOYSTX ;Else +.JOYSNS ; Process SNES Buttons + LDX #2 ; Set Controller Type to 2 + LDA TEMP1 ; and Save Result + AND #$C0 ; Isolate SNES A,X Buttons + STA TEMP3 ; and Save in Button Mask + LDA TEMP1 ; Retrieve Extended Buttons + AND #$30 ; Isolate L and R + ASL ; and Shift to Bits 2 and 3 + ASL + BIT TEMP1 ; Get Ext Status High Bits + BCC +2 ; If Extended Bit 7 was Set + ORA #$80 ; Set Buttons Bit 7 (A) + BVC +2 ; If Extended Bit 6 was Set + ORA #$20 ; Set Buttons Bit 1 (X) + STA TEMP2 ; Save Buttons A,X,L,R + LDA TEMP0 ; Retrieve Controller Status + AND #$30 ; Isolate Select and Start + ORA TEMP2 ; Combine with A,X,L,R + BIT TEMP2 ; Get Status High Bits + BCC +2 ; If Status Bit 7 was Set + ORA #$40 ; Set Buttons Bit 6 (B) + BVC +2 ; If Status Bit 6 was Set + ORA #$01 ; Set Buttons Bit 0 (Y) + STA TEMP2 ; Save Buttons in TEMP2 + TAY ; and Copy to Y +.JOYSTX ;Build Joystick Status + LDA TEMP0 ; Restore Controller Status + ORA TEMP3 ; Combine Buttons + AND #$CF ; Mask off Select and Start + RTS +.JOYSTE ;Return Error + LDA #$FF ;Return $FF, $FF, $FF + TAY +.JOYSTF TAX ;A, Y already $FF RTS -;Process SNES Buttons -.JOYSNS LDX #2 ;Set Controller Type to 2 - EOR #$FF ;Invert Extended Bits - STA TEMP1 ; and Save Result - AND #$C0 ;Isolate SNES A,X Buttons - STA TEMP3 ;and Save in Button Mask - LDA TEMP1 ;Retrieve Extended Buttons - AND #$30 ;Isolate L and R - ASL ;and Shift to Bits 2 and 3 - ASL - BIT TEMP1 ;Get Ext Status High Bits - BCC +2 ;If Extended Bit 7 was Set - ORA #$80 ; Set Buttons Bit 7 (A) - BVC +2 ;If Extended Bit 6 was Set - ORA #$20 ; Set Buttons Bit 1 (X) - STA TEMP2 ;Save Buttons A,X,L,R - LDA TEMP0 ;Retrieve Controller Status - AND #$30 ;Isolate Select and Start - ORA TEMP2 ;Combine with A,X,L,R - BIT TEMP2 ;Get Status High Bits - BCC +2 ;If Status Bit 7 was Set - ORA #$40 ; Set Buttons Bit 6 (B) - BVC +2 ;If Status Bit 6 was Set - ORA #$01 ; Set Buttons Nit 0 (Y) - STA TEMP2 ;Save Buttons in TEMP2 - TAY ; and Copy to Y - RTS +;joyscn() - Queries the Joysticks and Saves their State +;Note: The default interrupt handler already takes care +;of this, so this routine should only be called if the +;interrupt handler has been completely replaced. +JOYSCN EQU $FF53 ;Kernal joystick_scan Routine + +;joyget(j) - Get State of Joystick Number j +;Args: A = Joystick Number (0 or 1) +;Returns: A = Joystick Status Bits +; | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +; NES | A | B |SEL|STA|UP |DN |LT |RT | +; SNES | B | Y |SEL|STA|UP |DN |LT |RT | +; X = Joystick Extended Status Bits +; | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +; NES | 0 | 0 | 0 | 0 | 0 | 0 | 0 |KBD| +; SNES | A | X | L | R | 1 | 1 | 1 | 1 | +; Y = Joystick Present +; $00 = Joystick Present +; $FF = Joystick Not Present +;Note: Status Bits will be 0 if Pressed, 1 if Not +JOYGET EQU $FF56 ;Kernal joystick_get Routine + diff --git a/include/x16/joystk.h02 b/include/x16/joystk.h02 index 0d61cdb..0192701 100644 --- a/include/x16/joystk.h02 +++ b/include/x16/joystk.h02 @@ -1,3 +1,5 @@ +/* Module Development on Hold until R36 */ + /* Joystick Functions for Commander X-16 Computer * * Supports Keyboard, NES, and SNES Controllers * * A and B on Keyboard and SNES Controller and * @@ -34,10 +36,28 @@ #define JOYNES $01 //NES Controller #define JOYSNS $02 //SNS Controller +struct joysts {char btnsts, extsts, status;}; +struct joysts joy0, joy1; + /* Read Joystick Status * * Args: j = Joystick Number * * Returns: char j = Joystick Status * * $FF = Not Present * - * char b = Extended Status * - * char c = Controller Type */ + * char x = Extended Status * + * char t = Controller Type */ char joystk(); + +/* Get Joystick Raw Status * + * X16 Specific System Routine * + * Args: j = Joystick Number * + * Returns: char j = Joystick Raw Status Bits * + * char x = Extended Raw Status Bits * + * char t = Joystick Status * + * $FF = Not Present */ +char joyget(); + +/* Query Joysticks and Save State * + * X16 Specific System Routine * + * Called by the default interrupt handler */ +void joyscn(); + diff --git a/include/x16/mouse.a02 b/include/x16/mouse.a02 index 5b8de89..8602acb 100644 --- a/include/x16/mouse.a02 +++ b/include/x16/mouse.a02 @@ -15,24 +15,21 @@ MBRGHT EQU $02 ;Right Mouse Button ;Mouse Scaling Constants ;Specific to the X16 MSNONE EQU $00 ;Do Not Change Resolution -MSLOW EQU $02 ;Low Resolution (320x240) -MSHIGH EQU $01 ;High Resolution (640x480) +MSLOW EQU $01 ;Low Resolution (320x240) +MSHIGH EQU $02 ;High Resolution (640x480) ;Mouse Status Variables MOUSEX EQU $02 ;Mouse X Position (ABI Register R0) MOUSEY EQU $04 ;Mouse Y Position (ABI Register R1) MOUSEB EQU $06 ;Mouse Button Status (ABI Register R2L) -;Kernal Internal Mouse Variables -MOUSEV EQU $A021 ;Valid for Kernal Version R37 - ;mcnfg(mode) - Configure Mouse ;Args: A = Mode ;Affects: X,Y ;Returns: A = Result Code: $00 = Success -MCNFG: LDX #MSLOW ;Set Scale for 320x240 Screen -MCNFGS: JSR $FF68 ;Kernal mouse_config Routine - LDA #0 ;Return Success +MCNFG: LDX #MSLOW ;Set Scale for 320x240 Screen +MCNFGS: JSR $FF68 ;Kernal mouse_config Routine + LDA #0 ;Return Success RTS ;mread() - Read Mouse diff --git a/include/x16/mouse.h02 b/include/x16/mouse.h02 index 0912d56..abebd37 100644 --- a/include/x16/mouse.h02 +++ b/include/x16/mouse.h02 @@ -23,19 +23,6 @@ int mousex; //Mouse X Position int mousey; //Mouse Y Position char mouseb; //Mouse Button Status -/* Kernal Internal Mouse Variables */ -struct mouset { - char msts; //$80=on; 1/2: scale - int xmin; //min x coordinate - int xmax; //max x coordinate - int ymin; //min y coordinate - int ymax; //max y coordinate - int xpos; //x coordinate - int ypos; //y coordinate - char btns; //buttons (1: left, 2: right, 4: third) -}; -struct mouset mousev; - /* Configure Mouse * * Args: char mode - Mouse Mode * * #MHIDE - Hide Mouse *