From 07d49f143bd0b36192c5101d8040052c6de7847f Mon Sep 17 00:00:00 2001 From: lintbe Date: Wed, 12 Feb 2014 23:48:10 +0100 Subject: [PATCH 1/3] Fixing ca65 for 65816 jml and jmp opcodes added a missing addressing mode for jmp/jml : Absolute Indexed Long that opcode can be written like jmp[$1234] or jml[$1234] removed Absolute Inderect addressing mode for jml since it's not a long adressing mode --- src/ca65/ea65.c | 2 +- src/ca65/instr.c | 29 +++++++++++++++-------------- src/ca65/instr.h | 3 ++- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/ca65/ea65.c b/src/ca65/ea65.c index 48c4a2c07..21e9073ac 100644 --- a/src/ca65/ea65.c +++ b/src/ca65/ea65.c @@ -110,7 +110,7 @@ void GetEA (EffAddr* A) A->AddrModeSet = AM65_DIR_IND_LONG_Y; } else { /* [dir] */ - A->AddrModeSet = AM65_DIR_IND_LONG; + A->AddrModeSet = AM65_DIR_IND_LONG | AM65_ABS_IND_LONG; } } else if (CurTok.Tok == TOK_LPAREN) { diff --git a/src/ca65/instr.c b/src/ca65/instr.c index 277676614..73fd83a78 100644 --- a/src/ca65/instr.c +++ b/src/ca65/instr.c @@ -516,8 +516,8 @@ static const struct { { "INC", 0x000006F, 0x00, 4, PutAll }, { "INX", 0x0000001, 0xe8, 0, PutAll }, { "INY", 0x0000001, 0xc8, 0, PutAll }, - { "JML", 0x0000810, 0x5c, 1, PutAll }, - { "JMP", 0x0010818, 0x4c, 6, PutAll }, + { "JML", 0x4000010, 0x5c, 1, PutAll }, + { "JMP", 0x4010818, 0x4c, 6, PutAll }, { "JSL", 0x0000010, 0x20, 7, PutAll }, { "JSR", 0x0010018, 0x20, 7, PutAll }, { "LDA", 0x0b8f6fc, 0xa0, 0, PutAll }, @@ -800,61 +800,61 @@ static unsigned char EATab[10][AM65I_COUNT] = { 0x00, 0x00, 0x05, 0x0D, 0x0F, 0x15, 0x1D, 0x1F, 0x00, 0x19, 0x12, 0x00, 0x07, 0x11, 0x17, 0x01, 0x00, 0x00, 0x00, 0x03, 0x13, 0x09, 0x00, 0x09, - 0x00, 0x00 + 0x00, 0x00, 0x00 }, { /* Table 1 */ 0x08, 0x08, 0x04, 0x0C, 0x00, 0x14, 0x1C, 0x00, 0x14, 0x1C, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00 + 0x00, 0x00, 0x70 }, { /* Table 2 */ 0x00, 0x00, 0x24, 0x2C, 0x0F, 0x34, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, - 0x00, 0x00 + 0x00, 0x00, 0x00 }, { /* Table 3 */ 0x3A, 0x3A, 0xC6, 0xCE, 0x00, 0xD6, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00 + 0x00, 0x00, 0x00 }, { /* Table 4 */ 0x1A, 0x1A, 0xE6, 0xEE, 0x00, 0xF6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00 + 0x00, 0x00, 0x00 }, { /* Table 5 */ 0x00, 0x00, 0x60, 0x98, 0x00, 0x70, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00 + 0x00, 0x00, 0x00 }, { /* Table 6 */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00 + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x90 }, { /* Table 7 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00 + 0x00, 0x00, 0x00 }, { /* Table 8 */ 0x00, 0x40, 0x01, 0x41, 0x00, 0x09, 0x49, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00 + 0x00, 0x00, 0x00 }, { /* Table 9 */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00 + 0x00, 0x00, 0x00 }, }; @@ -898,6 +898,7 @@ unsigned char ExtBytes[AM65I_COUNT] = { 1, /* Immidiate byte */ 2, /* Blockmove (65816) */ 7, /* Block transfer (HuC6280) */ + 2, /* Absolute Indirect long */ }; /* Table that encodes the additional bytes for each SWEET16 instruction */ diff --git a/src/ca65/instr.h b/src/ca65/instr.h index 9a219b424..201f03802 100644 --- a/src/ca65/instr.h +++ b/src/ca65/instr.h @@ -84,6 +84,7 @@ #define AM65_IMM_IMPLICIT 0x00800000UL #define AM65_BLOCKMOVE 0x01000000UL #define AM65_BLOCKXFER 0x02000000UL +#define AM65_ABS_IND_LONG 0x04000000UL /* Bitmask for all ZP operations that have correspondent ABS ops */ #define AM65_SET_ZP (AM65_DIR | AM65_DIR_X | AM65_DIR_Y | AM65_DIR_IND | AM65_DIR_X_IND) @@ -107,7 +108,7 @@ #define AM65I_IMM_ACCU 21 #define AM65I_IMM_INDEX 22 #define AM65I_IMM_IMPLICIT 23 -#define AM65I_COUNT 26 +#define AM65I_COUNT 27 From 9fae57963d4f8189b3b4103b4bc1bc6c8632ff28 Mon Sep 17 00:00:00 2001 From: lintbe Date: Thu, 13 Feb 2014 10:26:08 +0100 Subject: [PATCH 2/3] removing \t from source file --- src/ca65/instr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ca65/instr.h b/src/ca65/instr.h index 201f03802..ead36a0c2 100644 --- a/src/ca65/instr.h +++ b/src/ca65/instr.h @@ -84,7 +84,7 @@ #define AM65_IMM_IMPLICIT 0x00800000UL #define AM65_BLOCKMOVE 0x01000000UL #define AM65_BLOCKXFER 0x02000000UL -#define AM65_ABS_IND_LONG 0x04000000UL +#define AM65_ABS_IND_LONG 0x04000000UL /* Bitmask for all ZP operations that have correspondent ABS ops */ #define AM65_SET_ZP (AM65_DIR | AM65_DIR_X | AM65_DIR_Y | AM65_DIR_IND | AM65_DIR_X_IND) From b477023783bcb779131a07710833a503b123b354 Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Fri, 14 Feb 2014 01:40:21 +0100 Subject: [PATCH 3/3] Turn off mouse polling interrupt if the mouse hasn't been moved for some time. Turn it back on when the mouse is moved again. Since the polling interrupt runs at a rather high frequency (1kHz), this saves many processor cycles when the mouse is inactive. --- libsrc/atari/mou/atrst.s | 105 ++++++++++++++++++++++++++++++++------- 1 file changed, 87 insertions(+), 18 deletions(-) diff --git a/libsrc/atari/mou/atrst.s b/libsrc/atari/mou/atrst.s index 773e171e1..35fd768f3 100644 --- a/libsrc/atari/mou/atrst.s +++ b/libsrc/atari/mou/atrst.s @@ -11,6 +11,13 @@ ; is being built. ; +;DEBUG = 1 + +DISABLE_TIMEOUT = 30 ; # of vertical blank interrupts after which, if + ; no mouse motion occurred, the polling IRQ gets + ; disabled. + ; VBI frequency is 50Hz for PAL and 60Hz for NTSC + .include "zeropage.inc" .include "mouse-kernel.inc" .include "atari.inc" @@ -98,6 +105,10 @@ Buttons: .res 1 ; Button mask XPosWrk: .res 2 YPosWrk: .res 2 +irq_enabled: .res 1 ; flag indicating that the high frequency polling interrupt is enabled +old_porta_vbi: .res 1 ; previous PORTA value of the VBI interrupt (IRQ) +how_long: .res 1 ; counter for how many VBI interrupts the mouse hasn't been moved + .if .defined (AMIGA_MOUSE) .or .defined (ST_MOUSE) dumx: .res 1 dumy: .res 1 @@ -226,10 +237,17 @@ INSTALL: sta AUDF1 sta STIMER +.if 0 ; the IRQ will now be dynamically enabled when the mouse is moved lda POKMSK ora #%00000001 ; timer 1 enable sta POKMSK sta IRQEN + sta irq_enabled +.endif + + lda PORTA + and #$0f + sta old_porta_vbi ; Done, return zero (= MOUSE_ERR_OK) @@ -444,23 +462,60 @@ IOCTL: lda #