diff --git a/include/x16/mouse.a02 b/include/x16/mouse.a02 new file mode 100644 index 0000000..5b8de89 --- /dev/null +++ b/include/x16/mouse.a02 @@ -0,0 +1,53 @@ +;Mouse Control Assembly Language Routines for Commander x16 computer + + SUBROUTINE _MOUSE + +;Mouse Mode Constants for MCNFG Routine +MHIDE EQU $00 ;Hide Mouse +MSHOW EQU $01 ;Show Mouse +MCSTM EQU $FF ;Show Mouse - Custom Sprite + +;Mouse Button Bitmasks +MBLEFT EQU $01 ;Left Mouse Button +MBMIDL EQU $04 ;Middle Mouse Button +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) + +;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 + RTS + +;mread() - Read Mouse +;Sets: MOUSEX, MOUSEY, MOUSEB +;Affects: X +;Returns: A = Result Code: $00 = Success +MREAD: LDX #MOUSEX ;Set Data Address + JSR $FF6B ;Execute Kernal mouse_get Routine + STA MOUSEB ;Store Mouse Button Status + LDA #0 ;Return Success + RTS + +;mscan() - Scan Mouse +;Retrieves mouse state for subsequent mread() +;This is called during the default interrupt +;handler so should only be called if the interrupt +;routine is entirey replaced. +MSCAN EQU $FF71 ;Aliased to Kernal mouse_scan routine diff --git a/include/x16/mouse.h02 b/include/x16/mouse.h02 new file mode 100644 index 0000000..0912d56 --- /dev/null +++ b/include/x16/mouse.h02 @@ -0,0 +1,72 @@ +/* Mouse Control Functions * + * for Commander X16 Computer */ + +/* Mouse Mode constants for mcnfg() */ +#define MHIDE $00 //Hide Mouse +#define MSHOW $01 //Show Mouse - Default Cursor +#define MCSTM $FF //Show Mouse - Custom Cursor + +/* Mouse Button bitmasks for mouseb * + * 0 means button not supported */ +#define MBLEFT $01 //Left Mouse Button +#define MBMIDL $03 //Middle Mouse Button +#define MBRGHT $02 //Right Mouse Button + +/* Mouse Scale Factor constants for mcnfgs() */ +#define MSNONE $00 //Do Not Change Resolution +#define MSLOW $01 //Low Resolution (320x240) +#define MSHIGH $02 //High Resolution (640x480) + +/* Mouse Status Variables * + * Set by mread() */ +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 * + * #MSHOW - Show Mouse * + * #MCSTM - Show (Custom) * + * Returns: $00 - Success * + * $FF - Mouse Not Present */ +char mcnfg(); + +/* Configure Mouse and Select Scale * + * Args: char mode - Mouse Mode * + * #MHIDE - Hide Mouse * + * #MSHOW - Show Mouse * + * #MCSTM - Show (Custom) * + * char scale - Scale Factor * + * #MSNONE - No Change * + * #MSLOW - 320x200 * + * #MSHIGH - 640x480 * + * Returns: $00 - Success * + * $FF - Mouse Not Present */ +char mcnfgs(); + +/* Read Mouse * + * Sets: mousex, mousey, mouseb * + * Returns: $00 - Success * + * $FF - Mouse Not Present */ +char mread(); + +/* Scan Mouse * + * Retrieves mouse state for mread() * + * Does not need to be called unless * + * the entire default interrupt * + * routine is replaced. */ +char mscan(); diff --git a/x16/mousetst.c02 b/x16/mousetst.c02 new file mode 100644 index 0000000..9ea3e2b --- /dev/null +++ b/x16/mousetst.c02 @@ -0,0 +1,95 @@ +/******************************** + * MOUSETST - Test mouse module * + * for Commander X16 computer * + ********************************/ + +//use -h option on command line +#include +#include + +alias char rambnk = $9F61; //RAM Bank Select Register + +char i,j,r; +char aa,yy,xx; +int yx; + +char key; //Last Keypress +char scale; //Mouse Scaling Factor + +void prtbtn(aa,yy,xx) { + putchr(' '); + if (aa & yy) xx = '*'; + putchr(xx); +} + +void prtbyt(aa) { + putchr('$'); + prbyte(aa); +} + +void prtwrd(.,yy,xx) { + putchr('$'); + prbyte(yy); + prbyte(xx); +} + + +/* Print Kernal Mouse Status */ +void prtsts() { + putstr("MSTS: "); prtbyt(mousev.msts); + if (mousev.msts:-) putstr(" ON"); else putstr(" OFF"); + putstr(" SCALE: "); prhex(mousev.msts); +} + +/* Print Kernal Mouse Variables */ +void prtkmv() { + push rambnk; //Save RAM Bank + rambnk = 0; //Set RAM Bank to Kernal Variables + newlin(); //Skip a Line + prtsts(); newlin(); + putstr("XMIN: "); prtwrd(mousev.xmin); newlin(); + putstr("XMAX: "); prtwrd(mousev.xmax); newlin(); + putstr("XMIN: "); prtwrd(mousev.ymin); newlin(); + putstr("XMAX: "); prtwrd(mousev.ymax); newlin(); + putstr("XPOS: "); prtwrd(mousev.xpos); newlin(); + putstr("XPOS: "); prtwrd(mousev.xpos); newlin(); + putstr("BTNS: "); prtwrd(mousev.btns); newlin(); + pop rambnk; //Retore RAM Bank +} + +void error() { + putstr(); + newlin(); + goto exit; +} + +main: + + scale = #MSLOW; //Set to mcnfg() default + + //Enable Mouse + if (mcnfg(#MSHOW)) error("ERROR ENABLING MOUSE"); + + while() { + key = getkey(); + if (key == #ESCKEY) break; + if (key == ' ') { + scale = (scale == #MSLOW) ? #MSHIGH : #MSLOW; + mcnfg(#MHIDE); //Disable, then Enable with + mcnfgs(#MSHOW, scale); //New Scaling + } + if (mread()) error("ERROR READING MOUSE"); + crsrhm(); + putstr("SCALE: "); prhex(scale); newlin(); + putstr("MOUSEX: "); prtwrd(mousex); newlin(); + putstr("MOUSEY: "); prtwrd(mousey); newlin(); + putstr("MOUSEB: "); prtbyt(mouseb); + prtbtn(mouseb, #MBLEFT, 'L'); + prtbtn(mouseb, #MBMIDL, 'M'); + prtbtn(mouseb, #MBRGHT, 'R'); newlin(); + //prtkmv(); //Print Kernal Mouse Variables + } + + mcnfg(#MHIDE); //Hide Mouse + + goto exit;