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:
parent
67d0762272
commit
3db676c5dd
31
src/inc/mouse.plh
Normal file
31
src/inc/mouse.plh
Normal 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
|
@ -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
|
||||
|
@ -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
|
||||
|
11
src/samplesrc/mousetest.pla
Normal file
11
src/samplesrc/mousetest.pla
Normal 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
|
Loading…
x
Reference in New Issue
Block a user