1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-07 23:29:39 +00:00

Use Timer2 for mouse polling.

This follows a suggestion by Sijmen Schouten in issue #818.
Platoterm64 now works with mouse at 1200 baud.

Bump MOUSE_API_VERSION in asminc/mouse-kernel.inc.

Fix typo in testcode/lib/mouse-test.c.
This commit is contained in:
Christian Groessler 2019-01-29 22:00:55 +01:00
parent 7a034f505b
commit 055c294ac0
5 changed files with 122 additions and 41 deletions

View File

@ -103,7 +103,7 @@
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; The mouse API version, stored in MOUSE_HDR::VERSION ; The mouse API version, stored in MOUSE_HDR::VERSION
MOUSE_API_VERSION = $05 MOUSE_API_VERSION = $06
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; Bitmapped mouse driver flags, stored in MOUSE_HDR::FLAGS. ; Bitmapped mouse driver flags, stored in MOUSE_HDR::FLAGS.

View File

@ -134,6 +134,7 @@ YPosWrk: .res 2
irq_enabled: .res 1 ; flag indicating that the high frequency polling interrupt is enabled 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) 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 how_long: .res 1 ; counter for how many VBI interrupts the mouse hasn't been moved
in_irq: .res 1 ; flag indicating high-frequency polling interrupt is active
.if .defined (AMIGA_MOUSE) .or .defined (ST_MOUSE) .if .defined (AMIGA_MOUSE) .or .defined (ST_MOUSE)
dumx: .res 1 dumx: .res 1
@ -145,11 +146,11 @@ oldval: .res 1
.endif .endif
.ifndef __ATARIXL__ .ifndef __ATARIXL__
OldT1: .res 2 OldT2: .res 2
.else .else
.data .data
set_VTIMR1_handler: set_VTIMR2_handler:
.byte $4C, 0, 0 .byte $4C, 0, 0
.endif .endif
@ -226,29 +227,29 @@ INSTALL:
; Setup pointer to wrapper install/deinstall function. ; Setup pointer to wrapper install/deinstall function.
lda libref lda libref
sta set_VTIMR1_handler+1 sta set_VTIMR2_handler+1
lda libref+1 lda libref+1
sta set_VTIMR1_handler+2 sta set_VTIMR2_handler+2
; Install my handler. ; Install my handler.
sec sec
lda #<T1Han lda #<T2Han
ldx #>T1Han ldx #>T2Han
jsr set_VTIMR1_handler jsr set_VTIMR2_handler
.else .else
lda VTIMR1 lda VTIMR2
sta OldT1 sta OldT2
lda VTIMR1+1 lda VTIMR2+1
sta OldT1+1 sta OldT2+1
php php
sei sei
lda #<T1Han lda #<T2Han
sta VTIMR1 sta VTIMR2
lda #>T1Han lda #>T2Han
sta VTIMR1+1 sta VTIMR2+1
plp plp
.endif .endif
@ -257,20 +258,12 @@ INSTALL:
sta AUDCTL sta AUDCTL
lda #0 lda #0
sta AUDC1 sta AUDC2
lda #15 lda #15
sta AUDF1 sta AUDF2
sta STIMER 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 lda PORTA
and #$0f and #$0f
sta old_porta_vbi sta old_porta_vbi
@ -290,23 +283,23 @@ UNINSTALL:
; uninstall timer irq routine ; uninstall timer irq routine
lda POKMSK lda POKMSK
and #%11111110 ; timer 1 disable and #%11111101 ; timer 2 disable
sta IRQEN sta IRQEN
sta POKMSK sta POKMSK
.ifdef __ATARIXL__ .ifdef __ATARIXL__
clc clc
jsr set_VTIMR1_handler jsr set_VTIMR2_handler
.else .else
php php
sei sei
lda OldT1 lda OldT2
sta VTIMR1 sta VTIMR2
lda OldT1+1 lda OldT2+1
sta VTIMR1+1 sta VTIMR2+1
plp plp
.endif .endif
@ -503,7 +496,7 @@ IRQ: lda PORTA ; mouse port contents
; Turn mouse polling IRQ back on ; Turn mouse polling IRQ back on
lda POKMSK lda POKMSK
ora #%00000001 ; timer 1 enable ora #%00000010 ; timer 2 enable
sta POKMSK sta POKMSK
sta IRQEN sta IRQEN
sta irq_enabled sta irq_enabled
@ -533,7 +526,7 @@ IRQ: lda PORTA ; mouse port contents
sta irq_enabled sta irq_enabled
lda POKMSK lda POKMSK
and #%11111110 ; timer 1 disable and #%11111101 ; timer 2 disable
sta IRQEN sta IRQEN
sta POKMSK sta POKMSK
@ -620,13 +613,18 @@ IRQ: lda PORTA ; mouse port contents
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
; T1Han: Local IRQ routine to poll mouse ; T2Han: Local IRQ routine to poll mouse
; ;
T1Han: lda CRITIC ; if CRITIC flag is set, disable the T2Han: lda CRITIC ; if CRITIC flag is set, disable the
bne disable_me ; high frequency polling IRQ, in order bne disable_me ; high frequency polling IRQ, in order
; not to interfere with SIO I/O (e.g. ; not to interfere with SIO I/O (e.g.
; floppy access) ; floppy access or serial I/O)
lda in_irq ; handler entered again?
bne skip ; yes, ignore this interrupt
inc in_irq
cli ; enable IRQs so that we don't block them for too long
tya tya
pha pha
@ -803,6 +801,8 @@ mmexit: sty oldval
tax tax
pla pla
tay tay
dec in_irq
skip:
.ifdef __ATARIXL__ .ifdef __ATARIXL__
rts rts
.else .else
@ -819,7 +819,7 @@ mmexit: sty oldval
disable_me: disable_me:
lda POKMSK lda POKMSK
and #%11111110 ; timer 1 disable and #%11111101 ; timer 2 disable
sta IRQEN sta IRQEN
sta POKMSK sta POKMSK
lda #0 lda #0

View File

@ -5,8 +5,8 @@
.export mouse_libref .export mouse_libref
.ifdef __ATARIXL__ .ifdef __ATARIXL__
.import set_VTIMR1_handler .import set_VTIMR2_handler
mouse_libref := set_VTIMR1_handler mouse_libref := set_VTIMR2_handler
.else .else
.import _exit .import _exit
mouse_libref := _exit mouse_libref := _exit

View File

@ -0,0 +1,81 @@
;
; Atari XL shadow RAM timer IRQ #2 handler
;
; Christian Groessler, chris@groessler.org, 2019
;
;DEBUG = 1
.ifdef __ATARIXL__
SHRAM_HANDLERS = 1
.include "atari.inc"
.include "romswitch.inc"
.export set_VTIMR2_handler
.segment "LOWBSS"
VTIMR2_handler: .res 3
.segment "BSS"
old_VTIMR2_handler:
.res 2
.segment "LOWCODE"
; timer interrupt handler:
; disable ROM, call user handler, enable ROM again
my_VTIMR2_handler:
disable_rom_quick
jsr VTIMR2_handler
enable_rom_quick
pla
rti
.segment "CODE"
; install or remove VTIMR2 handler
; input: CF - 0/1 for remove/install handler
; AX - pointer to handler (if CF=1)
; registers destroyed
set_VTIMR2_handler:
bcc @remove
; install vector
stx VTIMR2_handler+2
sta VTIMR2_handler+1 ; save passed vector in low memory
lda #$4C ; "JMP" opcode
sta VTIMR2_handler
lda VTIMR2
sta old_VTIMR2_handler
lda VTIMR2+1
sta old_VTIMR2_handler+1
lda #<my_VTIMR2_handler
php
sei
sta VTIMR2
lda #>my_VTIMR2_handler
sta VTIMR2+1
plp
rts
@remove: php
sei
lda old_VTIMR2_handler
sta VTIMR2
lda old_VTIMR2_handler+1
sta VTIMR2+1
plp
rts
.endif ; .ifdef __ATARIXL__

View File

@ -7,7 +7,7 @@
** **
** Compile with "-DSTATIC_MOUSE" to statically link all available drivers. ** Compile with "-DSTATIC_MOUSE" to statically link all available drivers.
** Compile with "-DMOUSE_DRIVER=<driver_sym>" to statically link the given driver. ** Compile with "-DMOUSE_DRIVER=<driver_sym>" to statically link the given driver.
** E.g., -DMOUSE_DRIVER=atrsts_mou to just link with the Atari ST mouse driver. ** E.g., -DMOUSE_DRIVER=atrst_mou to just link with the Atari ST mouse driver.
*/ */