mirror of
https://github.com/blondie7575/WeeGUI.git
synced 2024-09-28 21:54:56 +00:00
- Fixed a bug where the first click on a button wouldn't highlight it
- Fixed dragging near buttons leaving trails sometimes - Fixed a number of interrupt integrity issues with mouse pointer - Fixed mouse slot scan start from wrong place - Added dirty background recovery to mouse pointer - Added safety to prevent mouse pointer stamping - Fixed some rendering bugs when mouse pointer is in vicinity of updated views
This commit is contained in:
parent
6d6c8bc95e
commit
addac4355b
4
gui.s
4
gui.s
@ -80,7 +80,7 @@ WGInit:
|
|||||||
SAVE_AXY
|
SAVE_AXY
|
||||||
|
|
||||||
jsr WG80
|
jsr WG80
|
||||||
; jsr WGInitApplesoft
|
jsr WGInitApplesoft
|
||||||
|
|
||||||
ldy #15 ; Clear our block allocators
|
ldy #15 ; Clear our block allocators
|
||||||
WGInit_clearMemLoop:
|
WGInit_clearMemLoop:
|
||||||
@ -127,7 +127,7 @@ WG80:
|
|||||||
.include "rects.s"
|
.include "rects.s"
|
||||||
.include "views.s"
|
.include "views.s"
|
||||||
.include "mouse.s"
|
.include "mouse.s"
|
||||||
;.include "applesoft.s"
|
.include "applesoft.s"
|
||||||
.include "memory.s"
|
.include "memory.s"
|
||||||
|
|
||||||
|
|
||||||
|
BIN
guidemo.dsk
BIN
guidemo.dsk
Binary file not shown.
236
mouse.s
236
mouse.s
@ -193,7 +193,7 @@ WGCallMouse_redirect:
|
|||||||
WGFindMouse:
|
WGFindMouse:
|
||||||
SAVE_AX
|
SAVE_AX
|
||||||
|
|
||||||
ldx #5
|
ldx #7
|
||||||
|
|
||||||
WGFindMouse_loop:
|
WGFindMouse_loop:
|
||||||
txa ; Compute slot firmware locations for this loop
|
txa ; Compute slot firmware locations for this loop
|
||||||
@ -268,20 +268,32 @@ WGMouseInterruptHandler:
|
|||||||
cld ; ProDOS interrupt handlers must open with this
|
cld ; ProDOS interrupt handlers must open with this
|
||||||
|
|
||||||
SAVE_AXY
|
SAVE_AXY
|
||||||
SETSWITCH PAGE2OFF ; Make sure we don't mess up page 4 screen holes!
|
|
||||||
|
|
||||||
CALLMOUSE SERVEMOUSE
|
CALLMOUSE SERVEMOUSE
|
||||||
bcs WGMouseInterruptHandler_disregard
|
bcs WGMouseInterruptHandler_disregard
|
||||||
|
|
||||||
|
sei
|
||||||
|
|
||||||
|
lda PAGE2 ; Need to preserve text bank, because we may interrupt rendering
|
||||||
|
pha
|
||||||
|
SETSWITCH PAGE2OFF
|
||||||
|
|
||||||
|
ldx WG_MOUSE_SLOT
|
||||||
|
lda MOUSTAT,x ; Check interrupt status bits first, because READMOUSE clears them
|
||||||
|
and #MOUSTAT_MASK_BUTTONINT
|
||||||
|
bne WGMouseInterruptHandler_button
|
||||||
|
|
||||||
jsr WGUndrawPointer ; Erase the old mouse pointer
|
jsr WGUndrawPointer ; Erase the old mouse pointer
|
||||||
|
|
||||||
; Read the mouse state. Note that interrupts need to remain
|
; Read the mouse state. Note that interrupts need to remain
|
||||||
; off until after the data is copied.
|
; off until after the data is copied.
|
||||||
sei
|
|
||||||
CALLMOUSE READMOUSE
|
CALLMOUSE READMOUSE
|
||||||
|
|
||||||
; Read mouse position and transform it into screen space
|
|
||||||
ldx WG_MOUSE_SLOT
|
ldx WG_MOUSE_SLOT
|
||||||
|
lda MOUSTAT,x ; Movement/button status bits are now valid
|
||||||
|
sta WG_MOUSE_STAT
|
||||||
|
|
||||||
|
; Read mouse position and transform it into screen space
|
||||||
lsr MOUSE_XH,x
|
lsr MOUSE_XH,x
|
||||||
ror MOUSE_XL,x
|
ror MOUSE_XL,x
|
||||||
lsr MOUSE_XH,x
|
lsr MOUSE_XH,x
|
||||||
@ -306,19 +318,27 @@ WGMouseInterruptHandler:
|
|||||||
lda MOUSE_YL,x
|
lda MOUSE_YL,x
|
||||||
sta WG_MOUSEPOS_Y
|
sta WG_MOUSEPOS_Y
|
||||||
|
|
||||||
lda MOUSTAT,x ; Read status bits first, because READMOUSE clears them
|
jsr WGDrawPointer ; Redraw the pointer
|
||||||
sta WG_MOUSE_STAT
|
bra WGMouseInterruptHandler_intDone
|
||||||
|
|
||||||
cli ; Once we've read all the state, we can re-enable interrupts
|
WGMouseInterruptHandler_disregard:
|
||||||
|
; Carry will still be set here, to notify ProDOS that
|
||||||
lda WG_MOUSE_STAT ; Check for rising edge of button state
|
; this interrupt was not ours
|
||||||
and #MOUSTAT_MASK_DOWN
|
RESTORE_AXY
|
||||||
beq WGMouseInterruptHandler_intDone
|
rts
|
||||||
and #MOUSTAT_MASK_WASDOWN
|
|
||||||
bne WGMouseInterruptHandler_intDone
|
|
||||||
|
|
||||||
WGMouseInterruptHandler_button:
|
WGMouseInterruptHandler_button:
|
||||||
lda WG_MOUSEPOS_X
|
|
||||||
|
CALLMOUSE READMOUSE
|
||||||
|
ldx WG_MOUSE_SLOT
|
||||||
|
lda MOUSTAT,x ; Movement/button status bits are now valid
|
||||||
|
sta WG_MOUSE_STAT
|
||||||
|
|
||||||
|
bit WG_MOUSE_STAT ; Check for rising edge of button state
|
||||||
|
bpl WGMouseInterruptHandler_intDone
|
||||||
|
bvs WGMouseInterruptHandler_intDone
|
||||||
|
|
||||||
|
lda WG_MOUSEPOS_X ; Where did we click?
|
||||||
sta PARAM0
|
sta PARAM0
|
||||||
lda WG_MOUSEPOS_Y
|
lda WG_MOUSEPOS_Y
|
||||||
sta PARAM1
|
sta PARAM1
|
||||||
@ -329,19 +349,21 @@ WGMouseInterruptHandler_button:
|
|||||||
sta WG_PENDINGACTIONVIEW
|
sta WG_PENDINGACTIONVIEW
|
||||||
|
|
||||||
WGMouseInterruptHandler_intDone:
|
WGMouseInterruptHandler_intDone:
|
||||||
jsr WGDrawPointer ; Redraw the pointer
|
pla ; Restore text bank
|
||||||
|
bpl WGMouseInterruptHandler_intDoneBankOff
|
||||||
|
SETSWITCH PAGE2ON
|
||||||
|
bra WGMouseInterruptHandler_done
|
||||||
|
|
||||||
|
WGMouseInterruptHandler_intDoneBankOff:
|
||||||
|
SETSWITCH PAGE2OFF
|
||||||
|
|
||||||
|
WGMouseInterruptHandler_done:
|
||||||
RESTORE_AXY
|
RESTORE_AXY
|
||||||
|
|
||||||
|
cli
|
||||||
clc ; Notify ProDOS this was our interrupt
|
clc ; Notify ProDOS this was our interrupt
|
||||||
rts
|
rts
|
||||||
|
|
||||||
WGMouseInterruptHandler_disregard:
|
|
||||||
; Carry will still be set here, to notify ProDOS that
|
|
||||||
; this interrupt was not ours
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; WGUndrawPointer
|
; WGUndrawPointer
|
||||||
@ -349,53 +371,10 @@ WGMouseInterruptHandler_disregard:
|
|||||||
; Side effects: Clobbers BASL,BASH
|
; Side effects: Clobbers BASL,BASH
|
||||||
;
|
;
|
||||||
WGUndrawPointer:
|
WGUndrawPointer:
|
||||||
SAVE_AXY
|
pha
|
||||||
|
lda #$80
|
||||||
lda WG_MOUSEACTIVE
|
jsr renderPointer
|
||||||
beq WGUndrawPointer_done ; Mouse not enabled
|
pla
|
||||||
lda WG_MOUSEBG
|
|
||||||
beq WGUndrawPointer_done ; Mouse pointer has never rendered
|
|
||||||
|
|
||||||
ldx WG_MOUSEPOS_Y
|
|
||||||
cpx #24
|
|
||||||
bcs WGUndrawPointer_done
|
|
||||||
|
|
||||||
lda TEXTLINES_L,x ; Compute video memory address of point
|
|
||||||
sta BASL
|
|
||||||
lda TEXTLINES_H,x
|
|
||||||
sta BASH
|
|
||||||
|
|
||||||
lda WG_MOUSEPOS_X
|
|
||||||
cmp #80
|
|
||||||
bcs WGUndrawPointer_done
|
|
||||||
|
|
||||||
lsr
|
|
||||||
clc
|
|
||||||
adc BASL
|
|
||||||
sta BASL
|
|
||||||
lda #$0
|
|
||||||
adc BASH
|
|
||||||
sta BASH
|
|
||||||
|
|
||||||
lda WG_MOUSEPOS_X ; X even?
|
|
||||||
and #$01
|
|
||||||
bne WGUndrawPointer_xOdd
|
|
||||||
|
|
||||||
SETSWITCH PAGE2ON ; Restore the background
|
|
||||||
ldy #$0
|
|
||||||
lda WG_MOUSEBG
|
|
||||||
sta (BASL),y
|
|
||||||
bra WGUndrawPointer_done
|
|
||||||
|
|
||||||
WGUndrawPointer_xOdd:
|
|
||||||
SETSWITCH PAGE2OFF ; Restore the background
|
|
||||||
ldy #$0
|
|
||||||
lda WG_MOUSEBG
|
|
||||||
sta (BASL),y
|
|
||||||
|
|
||||||
WGUndrawPointer_done:
|
|
||||||
SETSWITCH PAGE2OFF ; Turn this off so we don't mess up page 4 screen holes!
|
|
||||||
RESTORE_AXY
|
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
@ -403,17 +382,50 @@ WGUndrawPointer_done:
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; WGDrawPointer
|
; WGDrawPointer
|
||||||
; Plots the mouse pointer at current location
|
; Plots the mouse pointer at current location
|
||||||
; Side effects: Clobbers BASL,BASH
|
|
||||||
;
|
;
|
||||||
WGDrawPointer:
|
WGDrawPointer:
|
||||||
|
pha
|
||||||
|
lda #0
|
||||||
|
jsr renderPointer
|
||||||
|
pla
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
; WGPointerDirty
|
||||||
|
; Updates the background behind the mouse pointer without
|
||||||
|
; modifying it's current render state. Assumes pointer is not
|
||||||
|
; currently visible
|
||||||
|
;
|
||||||
|
WGPointerDirty:
|
||||||
|
pha
|
||||||
|
lda #%11000000
|
||||||
|
jsr renderPointer
|
||||||
|
pla
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
; renderPointer
|
||||||
|
; Performs mouse-pointer-related rendering
|
||||||
|
; A: 0=draw, %10000000=undraw, %11000000=recapture background
|
||||||
|
;
|
||||||
|
renderPointer:
|
||||||
SAVE_AXY
|
SAVE_AXY
|
||||||
|
sta renderPointerMode
|
||||||
|
lda BASL ; Need to preserve BAS, because we may interrupt rendering
|
||||||
|
pha
|
||||||
|
lda BASH
|
||||||
|
pha
|
||||||
|
lda PAGE2 ; Need to preserve text bank, because we may interrupt rendering
|
||||||
|
pha
|
||||||
|
|
||||||
lda WG_MOUSEACTIVE
|
lda WG_MOUSEACTIVE
|
||||||
beq WGDrawPointer_done ; Mouse not enabled
|
beq renderPointer_done ; Mouse not enabled
|
||||||
|
|
||||||
ldx WG_MOUSEPOS_Y
|
ldx WG_MOUSEPOS_Y
|
||||||
cpx #24
|
cpx #24
|
||||||
bcs WGDrawPointer_done
|
bcs renderPointer_done ; Mouse out of range (vertically)
|
||||||
|
|
||||||
lda TEXTLINES_L,x ; Compute video memory address of point
|
lda TEXTLINES_L,x ; Compute video memory address of point
|
||||||
sta BASL
|
sta BASL
|
||||||
@ -422,41 +434,88 @@ WGDrawPointer:
|
|||||||
|
|
||||||
lda WG_MOUSEPOS_X
|
lda WG_MOUSEPOS_X
|
||||||
cmp #80
|
cmp #80
|
||||||
bcs WGDrawPointer_done
|
bcs renderPointer_done ; Mouse out of range (horizontally)
|
||||||
|
|
||||||
lsr
|
lsr
|
||||||
clc
|
clc
|
||||||
adc BASL
|
adc BASL
|
||||||
sta BASL
|
sta BASL
|
||||||
lda #$0
|
lda #0
|
||||||
adc BASH
|
adc BASH
|
||||||
sta BASH
|
sta BASH
|
||||||
|
|
||||||
lda WG_MOUSEPOS_X ; X even?
|
lda WG_MOUSEPOS_X ; X even?
|
||||||
and #$01
|
and #$01
|
||||||
bne WGDrawPointer_xOdd
|
bne renderPointer_xOdd
|
||||||
|
|
||||||
SETSWITCH PAGE2ON
|
SETSWITCH PAGE2ON
|
||||||
ldy #$0
|
|
||||||
lda (BASL),y ; Save background
|
|
||||||
sta WG_MOUSEBG
|
|
||||||
lda #CH_MOUSEPOINTER ; Draw the pointer
|
|
||||||
sta (BASL),y
|
|
||||||
bra WGDrawPointer_done
|
|
||||||
|
|
||||||
WGDrawPointer_xOdd:
|
bit renderPointerMode ; Draw or undraw?
|
||||||
|
bpl renderPointer_draw
|
||||||
|
bvc renderPointer_undraw
|
||||||
|
|
||||||
|
renderPointer_draw:
|
||||||
|
lda (BASL) ; Save background
|
||||||
|
cmp #CH_MOUSEPOINTER ; Make sure we never capture ourselves and leave a "stamp"
|
||||||
|
beq renderPointer_drawSaved
|
||||||
|
sta WG_MOUSEBG
|
||||||
|
|
||||||
|
renderPointer_drawSaved:
|
||||||
|
bit renderPointerMode ; Recapture or draw?
|
||||||
|
bvs renderPointer_done
|
||||||
|
|
||||||
|
lda #CH_MOUSEPOINTER ; Draw the pointer
|
||||||
|
sta (BASL)
|
||||||
|
bra renderPointer_done
|
||||||
|
|
||||||
|
renderPointer_undraw:
|
||||||
|
lda WG_MOUSEBG
|
||||||
|
beq renderPointer_done ; No saved background yet
|
||||||
|
sta (BASL)
|
||||||
|
bra renderPointer_done
|
||||||
|
|
||||||
|
renderPointer_xOdd:
|
||||||
SETSWITCH PAGE2OFF
|
SETSWITCH PAGE2OFF
|
||||||
ldy #$0
|
|
||||||
lda (BASL),y ; Save background
|
|
||||||
sta WG_MOUSEBG
|
|
||||||
lda #CH_MOUSEPOINTER ; Draw the pointer
|
|
||||||
sta (BASL),y
|
|
||||||
|
|
||||||
WGDrawPointer_done:
|
bit renderPointerMode ; Draw or undraw?
|
||||||
SETSWITCH PAGE2OFF ; Turn this off so we don't mess up page 4 screen holes!
|
bpl renderPointer_drawOdd
|
||||||
|
bvc renderPointer_undraw
|
||||||
|
|
||||||
|
renderPointer_drawOdd:
|
||||||
|
lda (BASL) ; Save background
|
||||||
|
cmp #CH_MOUSEPOINTER ; Make sure we never capture ourselves and leave a "stamp"
|
||||||
|
beq renderPointer_drawOddSaved
|
||||||
|
sta WG_MOUSEBG
|
||||||
|
|
||||||
|
renderPointer_drawOddSaved:
|
||||||
|
bit renderPointerMode ; Recapture or draw?
|
||||||
|
bvs renderPointer_done
|
||||||
|
|
||||||
|
lda #CH_MOUSEPOINTER ; Draw the pointer
|
||||||
|
sta (BASL)
|
||||||
|
bra renderPointer_done
|
||||||
|
|
||||||
|
renderPointer_done:
|
||||||
|
pla ; Restore text bank
|
||||||
|
bpl renderPointer_doneBankOff
|
||||||
|
SETSWITCH PAGE2ON
|
||||||
|
bra renderPointer_doneBAS
|
||||||
|
|
||||||
|
renderPointer_doneBankOff:
|
||||||
|
SETSWITCH PAGE2OFF
|
||||||
|
|
||||||
|
renderPointer_doneBAS:
|
||||||
|
pla ; Restore BAS
|
||||||
|
sta BASH
|
||||||
|
pla
|
||||||
|
sta BASL
|
||||||
|
|
||||||
RESTORE_AXY
|
RESTORE_AXY
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
renderPointerMode:
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; Mouse API state
|
; Mouse API state
|
||||||
@ -470,7 +529,6 @@ WG_MOUSEPOS_Y:
|
|||||||
.byte 11
|
.byte 11
|
||||||
WG_MOUSE_STAT:
|
WG_MOUSE_STAT:
|
||||||
.byte 0
|
.byte 0
|
||||||
|
|
||||||
WG_MOUSEBG:
|
WG_MOUSEBG:
|
||||||
.byte 0
|
.byte 0
|
||||||
|
|
||||||
|
6
views.s
6
views.s
@ -647,6 +647,7 @@ focusCurrent:
|
|||||||
lda WG_FOCUSVIEW
|
lda WG_FOCUSVIEW
|
||||||
jsr WGSelectView
|
jsr WGSelectView
|
||||||
|
|
||||||
|
LDY_ACTIVEVIEW
|
||||||
lda WG_VIEWRECORDS+9,y
|
lda WG_VIEWRECORDS+9,y
|
||||||
ora #%10000000
|
ora #%10000000
|
||||||
sta WG_VIEWRECORDS+9,y
|
sta WG_VIEWRECORDS+9,y
|
||||||
@ -743,16 +744,13 @@ WGPendingViewAction:
|
|||||||
lda WG_PENDINGACTIONVIEW
|
lda WG_PENDINGACTIONVIEW
|
||||||
bmi WGPendingViewAction_done
|
bmi WGPendingViewAction_done
|
||||||
|
|
||||||
jsr WGUndrawPointer
|
|
||||||
|
|
||||||
jsr WGSelectView
|
jsr WGSelectView
|
||||||
jsr WGViewFocus
|
jsr WGViewFocus
|
||||||
jsr WGViewFocusAction
|
jsr WGViewFocusAction
|
||||||
jsr delayShort
|
jsr delayShort
|
||||||
jsr WGViewUnfocus
|
jsr WGViewUnfocus
|
||||||
|
|
||||||
jsr WGDrawPointer ; Leave pointer hidden, but ensure
|
jsr WGPointerDirty ; If we redrew anything, the pointer BG will be stale
|
||||||
jsr WGUndrawPointer ; Background is correct when it moves next
|
|
||||||
|
|
||||||
lda #$ff
|
lda #$ff
|
||||||
sta WG_PENDINGACTIONVIEW
|
sta WG_PENDINGACTIONVIEW
|
||||||
|
Loading…
Reference in New Issue
Block a user