1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-03-23 07:35:00 +00:00

Mouse API test

This commit is contained in:
David Schmenk 2018-04-28 13:34:05 -07:00
parent 67d0762272
commit 3db676c5dd
4 changed files with 128 additions and 59 deletions

31
src/inc/mouse.plh Normal file
View File

@ -0,0 +1,31 @@
import mouse
//
// Status bits
//
const BUTTON_DOWN = $80
const BUTTON_LAST_DOWN = $40
const MOUSE_MOVED = $20
const VBL_INT = $08
const BUTTON_INT = $04
const MOVE_INT = $02
//
// Mode bits
//
const VBL_INT_ENABLE = $08
const BUTTON_INT_ENABLE= $04
const MOVE_INT_ENABLE = $02
//
// Mouse API
//
struc t_mouse
word chkVbl
word chkMouse
word readMouse // readMouse()#3
word setMouse // setMouse(mode)
word clearMouse
word posMouse // posMouse(x, y)
word clampMouse // clampMouse(xMin, xMax, yMin, yMax)
word homeMouse
word detachMouse
end
end

View File

@ -1,27 +1,14 @@
include "inc/cmdsys.plh"
//
// Status bits
//
const BUTTON_DOWN = $80
const BUTTON_LAST_DOWN = $40
const MOUSE_MOVED = $20
const VBL_INT = $08
const BUTTON_INT = $04
const MOVE_INT = $02
//
// Mode bits
//
const VBL_INT_ENABLE = $08
const BUTTON_INT_ENABLE= $04
const MOVE_INT_ENABLE = $02
//
// Mouse driver
// Mouse driver interface
//
predef chkVbl, chkMouse, readMouse#3, setMouse(mode), clearMouse, posMouse(x, y), clampMouse(xMin, xMax, yMin, yMax), homeMouse, detachMouse
word = @chkVbl, @chkMouse, @readMouse, @setMouse, @clearMouse, @posMouse, @clampMouse, @homeMouse, @detachMouse
word rom
byte slot, index, page, vblDiv, vblInt, mouInt
byte params[]
word setMouseFW, serveMouseFW, readMouseFW, clearMouseFW, posMouseFW, clampMouseFW, homeMouseFW, initMouseFW
word minClamp, maxClamp, xMouse, yMouse, statMouse, modeMouse
byte slot, index, page
word setMouseFW
byte vblDiv, vblInt, mouInt
asm equates
!SOURCE "vmsrc/plvmzp.inc"
end
@ -49,12 +36,29 @@ end
asm mouseEvent
+ INC MOUINT ; INC MOUSE EVENT
end
asm updateMouse#0
asm updateMouse
LDX #$C4
LDY #$40
JMP $C400 ; IIGS REQUIRES THIS HAPPEN IN IRQ
end
export asm readMouse#3
//
// Check for VBL (timer) and Mouse events (atomic read and reset)
//
asm chkEvt(addr)
LDA ESTKL,X
STA ESTKH-1,X
PHP
SEI
LDA (ESTKH-1,X) ; READ INT COUNT
TAY
LDA #$00
STA (ESTKH-1,X) ; CLEAR INT COUNT
PLP
STY ESTKL,X ; RETURN INT COUNT
STA ESTKH,X
RTS
end
asm readMouse#3
LDY #$04
DEX
DEX
@ -77,45 +81,79 @@ export asm readMouse#3
RTS
end
//
// Check for VBL (timer) and Mouse events
//
asm chkEvt(addr)
LDA ESTKL,X
STA ESTKH-1,X
PHP
SEI
LDA (ESTKH-1,X) ; READ INT COUNT
TAY
LDA #$00
STA (ESTKH-1,X) ; CLEAR INT COUNT
PLP
STY ESTKL,X ; RETURN INT COUNT
STA ESTKH,X
RTS
end
//
// Convert VBL interrupts into millisecond timer increment
//
def chkTimer
def chkVblTimer
byte count
word msec
msec = 0
count = chkEvt(@vblInt)
while count
msec = msec + (vblDiv & 2 ?? 16 :: 17)
vblDiv = (vblDiv + 1) % 3
if vblDiv & 2
msec = msec + 16
vblDiv = 0
else
msec = msec + 17
vblDiv++
fin
count--
loop
return msec
end
//
// Check for mouse interrupt events
// Check for VBL/Mouse interrupt events
//
def chkVbl
return chkEvt(@vblInt)
end
def chkMouse
return chkEvt(@mouInt)
end
//
// Mouse routines
//
def setMouse(mode)
return call(setMouseFW, mode, slot, page, $04)
end
def clearMouse
return call(rom + rom->$15, $00, slot, page, $04) // clearMouseFW
end
def posMouse(x, y)
//
// Fill screen holes
//
^($0478 + index) = x
^($0578 + index) = x >> 8
^($04F8 + index) = y
^($05F8 + index) = y >> 8
return call(rom + rom->$16, $00, slot, page, $04) // posMouseFW
end
def clampMouse(xMin, xMax, yMin, yMax)
^$0478 = xMin
^$0578 = xMin >> 8
^$04F8 = xMax
^$05F8 = xMax >> 8
call(rom + rom->$17, $00, slot, page, $04) // clampMouseFW
^$0478 = yMin
^$0578 = yMin >> 8
^$04F8 = yMax
^$05F8 = yMax >> 8
return call(rom + rom->$17, $01, slot, page, $04)) // clampMouseFW
end
def homeMouse
return call(rom + rom->$18, $00, slot, page, $04) // homeMouseFW
end
//
// Detach mouse from interrupts
//
def detachMouse
setMouse(0)
params.0 = 1
params.1 = 0
return syscall($41, @params)
end
//
// Identify Mouse card/slot and initialize
//
for rom = $C100 to $C700 step $0100
@ -134,32 +172,19 @@ for rom = $C100 to $C700 step $0100
slot = rom >> 8
index = slot & $07
page = index << 4
minClamp = $0478
maxClamp = $04F8
xMouse = $0478 + index
yMouse = $04F8 + index
statMouse = $0778 + index
modeMouse = $07F8 + index
setMouseFW = rom + rom->$12
serveMouseFW = rom + rom->$13
readMouseFW = rom + rom->$14
clearMouseFW = rom + rom->$15
posMouseFW = rom + rom->$16
clampMouseFW = rom + rom->$17
homeMouseFW = rom + rom->$18
initMouseFW = rom + rom->$19
//
// Fix-up IRQ routine
//
serviceMouse:2 = serveMouseFW
serviceMouse:7 = statMouse
serviceMouse:2 = rom + rom->$13 // serveMouseFW
serviceMouse:7 = $0778+index
vblEvent.1 = @vblInt
mouseEvent.1 = @mouInt
updateMouse.1 = slot
updateMouse.3 = page
updateMouse:5 = readMouseFW
updateMouse:5 = rom + rom->$14 // readMouseFW
readMouse.1 = index
call(initMouseFW, $00, slot, page, $04)
call(rom + rom->$19, $00, slot, page, $04) // initMouseFW
return modkeep
fin
next

View File

@ -88,6 +88,7 @@ cp samplesrc/dgrtest.pla prodos/bld/DGRTEST.PLA.TXT
cp samplesrc/hello.pla prodos/bld/HELLO.PLA.TXT
cp samplesrc/hgr1test.pla prodos/bld/HGR1TEST.PLA.TXT
cp samplesrc/fibertest.pla prodos/bld/FIBERTEST.PLA.TXT
cp samplesrc/mousetest.pla prodos/bld/MOUSETEST.PLA.TXT
cp samplesrc/mon.pla prodos/bld/MON.PLA.TXT
cp samplesrc/memtest.pla prodos/bld/MEMTEST.PLA.TXT
cp samplesrc/rod.pla prodos/bld/ROD.PLA.TXT
@ -113,6 +114,7 @@ cp inc/fiber.plh prodos/bld/inc/FIBER.PLH.TXT
cp inc/fileio.plh prodos/bld/inc/FILEIO.PLH.TXT
cp inc/fpstr.plh prodos/bld/inc/FPSTR.PLH.TXT
cp inc/fpu.plh prodos/bld/inc/FPU.PLH.TXT
cp inc/mouse.plh prodos/bld/inc/MOUSE.PLH.TXT
cp inc/inet.plh prodos/bld/inc/INET.PLH.TXT
cp inc/longjmp.plh prodos/bld/inc/LONGJMP.PLH.TXT
cp inc/memmgr.plh prodos/bld/inc/MEMMGR.PLH.TXT

View File

@ -0,0 +1,11 @@
include "inc/cmdsys.plh"
include "inc/mouse.plh"
var count
mouse:setmouse(VBL_INT_ENABLE)
while count < 100
count = count + mouse:chkVBL()
puti(count); putln
loop
done