From e6530d68dd51c9c310b7a9aa346bb19d126b4910 Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Wed, 15 Feb 2017 15:45:49 +0100 Subject: [PATCH] Fix joystick driver. Add interruptor support. Note that the joystick driver doesn't support combined movements (like left/up or right/down). This should be fixed. --- asminc/creativision.inc | 4 + include/creativision.h | 65 +++++++++------- libsrc/creativision/crt0.s | 8 +- libsrc/creativision/irq.s | 40 ++++++++++ libsrc/creativision/joy/creativision-stdjoy.s | 76 ++++++++++--------- testcode/lib/joy-test.c | 12 +-- 6 files changed, 132 insertions(+), 73 deletions(-) create mode 100644 libsrc/creativision/irq.s diff --git a/asminc/creativision.inc b/asminc/creativision.inc index bd30bc462..59b26101b 100644 --- a/asminc/creativision.inc +++ b/asminc/creativision.inc @@ -36,3 +36,7 @@ ZP_JOY1_DIR = $13 ZP_JOY0_BUTTONS = $16 ZP_JOY1_BUTTONS = $17 +;** BIOS +BIOS_IRQ1_ADDR = $FF3F +BIOS_IRQ2_ADDR = $FF52 +BIOS_NMI_RESET_ADDR = $F808 diff --git a/include/creativision.h b/include/creativision.h index adaa1caab..5cc99b7af 100644 --- a/include/creativision.h +++ b/include/creativision.h @@ -1,9 +1,38 @@ -/* CreatiVision Header */ +/*****************************************************************************/ +/* */ +/* creativision.h */ +/* */ +/* Creativision system specific definitions */ +/* */ +/* */ +/* */ +/* (C) 2013 cvemu */ +/* (C) 2017 Christian Groessler */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ #ifndef _CVISION_H - #define _CVISION_H +/* Character codes */ #define CH_VLINE 33 #define CH_HLINE 34 #define CH_ULCORNER 35 @@ -11,12 +40,13 @@ #define CH_LLCORNER 37 #define CH_LRCORNER 38 +/* no support for dynamically loadable drivers */ #define DYN_DRV 0 /* Colours - from TMS9918 */ #define C_TRANSPARENT 0 #define C_BLACK 1 -#define C_MED_GREEN 2 +#define C_MED_GREEN 2 #define C_LIGHT_GREEN 3 #define C_DARK_BLUE 4 #define C_LIGHT_BLUE 5 @@ -31,29 +61,10 @@ #define C_GREY 14 #define C_WHITE 15 -/* Joystick states */ -#define JOY_UP 5 -#define JOY_DOWN 1 -#define JOY_LEFT 7 -#define JOY_RIGHT 3 -#define JOY_LEFT_UP 6 -#define JOY_LEFT_DOWN 8 -#define JOY_RIGHT_UP 4 -#define JOY_RIGHT_DOWN 2 -#define JOY_LBUTTON 1 -#define JOY_RBUTTON 2 - -/* Joystick values */ -#define JOY_LEFT_DIR 1 -#define JOY_RIGHT_DIR 2 -#define JOY_LEFT_BUTTONS 3 -#define JOY_RIGHT_BUTTONS 4 - /* Protos */ -void __fastcall__ psg_outb( unsigned char b ); -void __fastcall__ psg_delay( unsigned char b ); -void psg_silence( void ); -void __fastcall__ bios_playsound( void *a, unsigned char b); -unsigned char __fastcall__ joystate( unsigned char which ); +void __fastcall__ psg_outb(unsigned char b); +void __fastcall__ psg_delay(unsigned char b); +void psg_silence(void); +void __fastcall__ bios_playsound(void *a, unsigned char b); -#endif +#endif /* #ifndef _CVISION_H */ diff --git a/libsrc/creativision/crt0.s b/libsrc/creativision/crt0.s index ccae38e81..6faec38eb 100644 --- a/libsrc/creativision/crt0.s +++ b/libsrc/creativision/crt0.s @@ -4,11 +4,13 @@ .export _exit .export __STARTUP__ : absolute = 1 ; Mark as startup + .export irq2 .import zerobss, copydata .import initlib, donelib, callmain .import __VECTORS_LOAD__, __VECTORS_RUN__, __VECTORS_SIZE__ .import __ZP_LAST__, __STACKSIZE__, __RAM_START__ + .include "creativision.inc" .include "zeropage.inc" ; ------------------------------------------------------------------------ @@ -61,8 +63,8 @@ loop: jmp loop .segment "VECTORS" -irq1: jmp $FF3F -irq2: jmp $FF52 +irq1: jmp BIOS_IRQ1_ADDR +irq2: jmp BIOS_IRQ2_ADDR ; ------------------------------------------------------------------------ ; Define CART setup values for BIOS. @@ -92,7 +94,7 @@ irq2: jmp $FF52 ; BIOS Vector after NMI or RESET ; Keeping with retail cartridges, we jump back to BIOS ROM and have it ; setup zeropage etc, and show the Creativision logo and copyright. - .addr $F808 + .addr BIOS_NMI_RESET_ADDR ; BIOS Short Interrupt Handler ; Vectored from BIOS ROM:FE2C. This should contain a pointer to the user's diff --git a/libsrc/creativision/irq.s b/libsrc/creativision/irq.s new file mode 100644 index 000000000..f154c9199 --- /dev/null +++ b/libsrc/creativision/irq.s @@ -0,0 +1,40 @@ +; +; IRQ handling (CreatiVision version) +; + + .export initirq, doneirq + .import callirq, irq2 + + .include "creativision.inc" + +; ------------------------------------------------------------------------ + +.segment "ONCE" + +initirq: + lda #IRQStub + jmp setvec + +; ------------------------------------------------------------------------ + +.code + +doneirq: + lda #BIOS_IRQ2_ADDR +setvec: sei + sta irq2+1 + stx irq2+2 + cli + rts + +; ------------------------------------------------------------------------ + +.segment "CODE" + +IRQStub: + cld ; Just to be sure + jsr callirq ; Call the functions + jmp BIOS_IRQ2_ADDR ; Jump to the BIOS IRQ vector + diff --git a/libsrc/creativision/joy/creativision-stdjoy.s b/libsrc/creativision/joy/creativision-stdjoy.s index f24a8045b..37b927d08 100644 --- a/libsrc/creativision/joy/creativision-stdjoy.s +++ b/libsrc/creativision/joy/creativision-stdjoy.s @@ -49,7 +49,7 @@ ; ------------------------------------------------------------------------ ; Constants -JOY_COUNT = 2 ; Number of joysticks we support +JOY_COUNT = 2 ; Number of joysticks we support ; ------------------------------------------------------------------------ ; Code @@ -66,7 +66,7 @@ JOY_COUNT = 2 ; Number of joysticks we support INSTALL: lda #JOY_ERR_OK ldx #0 -; rts ; Fall through +; rts ; Fall through ; ------------------------------------------------------------------------ ; UNINSTALL routine. Is called before the driver is removed from memory. @@ -91,14 +91,14 @@ COUNT: ; READJOY: - and #1 ; fix joystick number - bne READJOY_1 ; read right joystick + and #1 ; fix joystick number + bne READJOY_1 ; read right joystick ; Read left joystick ldx ZP_JOY0_DIR lda ZP_JOY0_BUTTONS - jmp convert ; convert joystick state to sane cc65 values + jmp convert ; convert joystick state to sane cc65 values ; Read right joystick @@ -108,8 +108,8 @@ READJOY_1: lda ZP_JOY1_BUTTONS lsr a lsr a - ;jmp convert ; convert joystick state to sane cc65 values - ; fall thru... + ;jmp convert ; convert joystick state to sane cc65 values + ; fall thru... ; ------------------------------------------------------------------------ ; convert: make runtime lib compatible values @@ -119,7 +119,7 @@ READJOY_1: convert: ldy #0 - sty retval ; initialize return value + sty retval ; initialize return value ; ------ ; buttons: @@ -127,7 +127,7 @@ convert: ; values were shifted to the right to be identical). ; Why are there two bits indicating a pressed trigger? ; According to the "Second book of programs for the Dick Smith Wizard" - ; (pg. 88ff), the left hand fire button gives the value of + ; (pg. 88ff), the left hand fire button gives the value of ; %00010001 and the right hand button gives %00100010 ; Why two bits? Am I missing something? Can there be cases that just ; one of those bits is set? @@ -137,7 +137,7 @@ convert: and #%00010001 beq cnv_1 - inc retval ; left button pressed + inc retval ; left button pressed cnv_1: tya and #%00100010 @@ -145,45 +145,47 @@ cnv_1: tya lda #$02 ora retval - sta retval ; right button pressed + sta retval ; right button pressed ; ------ ; direction: cnv_2: txa - ; tested with https://sourceforge.net/projects/creativisionemulator - ; $49 - %01001001 - up - ; $41 - %01000001 - down - ; $4D - %01001101 - left - ; $45 - %01000101 - right - ; - ; are these correct? "Second book of programs for the Dick Smith Wizard" pg. 85 says something different - ; ignored for now... - ; $85 - %10000101 - up + right - ; $8D - %10001101 - down + left - ; $89 - %10001001 - up + left - ; $85 - %10000101 - down + right (emulator bug?) + ; tested with https://sourceforge.net/projects/creativisionemulator + ; $49 - %01001001 - up + ; $41 - %01000001 - down + ; $4D - %01001101 - left + ; $45 - %01000101 - right + ; + ; are these correct? "Second book of programs for the Dick Smith Wizard" pg. 85 says something different + ; ignored for now... + ; $85 - %10000101 - up + right + ; $8D - %10001101 - down + left + ; $89 - %10001001 - up + left + ; $85 - %10000101 - down + right (emulator bug?) - bit testbit ; bit #0 set? - beq done ; no, no direction + bit testbit ; bit #0 set? + beq done ; no, no direction - and #%00001100 ; mask out other bits - tax - lda #%00000100 ; init bitmask -loop: dex - bmi done2 - asl a - bne loop + and #%00001100 ; mask out other bits + lsr a + lsr a + tax + lda #%00000100 ; init bitmask +loop: dex + bmi done2 + asl a + bne loop -done2: ora retval - rts +done2: ora retval + rts -done: lda retval - rts +done: lda retval + rts ; ------------------------------------------------------------------------ ; .data -testbit:.byte $01 +testbit:.byte $01 ; ------------------------------------------------------------------------ ; diff --git a/testcode/lib/joy-test.c b/testcode/lib/joy-test.c index 0a5c80902..fc751ebdc 100644 --- a/testcode/lib/joy-test.c +++ b/testcode/lib/joy-test.c @@ -46,7 +46,7 @@ int main (void) clrscr (); count = joy_count (); -#ifdef __ATARI5200__ +#if defined(__ATARI5200__) || defined(__CREATIVISION__) cprintf ("JOYSTICKS: %d", count); #else cprintf ("Driver supports %d joystick(s)", count); @@ -55,13 +55,13 @@ int main (void) for (i = 0; i < count; ++i) { gotoxy (0, i+1); j = joy_read (i); -#ifdef __ATARI5200__ +#if defined(__ATARI5200__) || defined(__CREATIVISION__) cprintf ("%1d:%-3s%-3s%-3s%-3s%-3s%-3s", i, - (j & joy_masks[JOY_UP])? " U " : " u ", - (j & joy_masks[JOY_DOWN])? " D " : " d ", - (j & joy_masks[JOY_LEFT])? " L " : " l ", - (j & joy_masks[JOY_RIGHT])? " R " : " r ", + (j & joy_masks[JOY_UP])? " U " : " ", + (j & joy_masks[JOY_DOWN])? " D " : " ", + (j & joy_masks[JOY_LEFT])? " L " : " ", + (j & joy_masks[JOY_RIGHT])? " R " : " ", (j & joy_masks[JOY_FIRE])? " 1 " : " ", (j & joy_masks[JOY_FIRE2])? " 2 " : " "); #else