1; GEOS KERNAL by Berkeley Softworks
2; reverse engineered by Maciej Witkowiak, Michael Steil
3;
4; Mouse: MouseUp, MouseOff, StartMouseMode, ClearMouseMode syscalls
5
6
7.include "const.inc"
8.include "geossym.inc"
9.include "geosmac.inc"
10.include "config.inc"
11.include "gkernal.inc"
12.include "c64.inc"
13.include "inputdrv.inc"
14.include "banks.inc"
15.include "kernal.inc"
16
17.import _DoPreviousMenu
18.import menuOptNumber
19.import ProcessClick
20.import Menu_5
21.import menuRight
22.import menuLeft
23.import menuBottom
24.import menuTop
25.import _DisablSprite
26
27.import CallRoutine
28.import PosSprite
29.import DrawSprite
30.import MouseUp
31.import NormalizeX
32.ifndef bsw128
33.import EnablSprite
34.endif
35
36.import gjsrfar
37
38.global _MouseOff
39.global _StartMouseMode
40.global ProcessMouse
41.global _ClearMouseMode
42.global _MouseUp
43
44.ifdef wheels
45.global ResetMseRegion
46.endif
47
48.segment "mouse2"
49
50_StartMouseMode:
51	bcc @1
52	lda r11L
53	ora r11H
54	beq @1
55.ifdef bsw128
56	ldx #r11
57	jsr NormalizeX
58.endif
59	MoveW r11, mouseXPos
60	sty mouseYPos
61	jsr SlowMouse
62@1:	LoadW mouseVector, CheckClickPos
63	LoadW mouseFaultVec, DoMouseFault
64	LoadB faultData, NULL
65	jmp MouseUp
66
67_ClearMouseMode:
68	LoadB mouseOn, NULL
69CMousMd1:
70	LoadB r3L, NULL
71	jmp _DisablSprite
72
73_MouseOff:
74	rmbf MOUSEON_BIT, mouseOn
75	jmp CMousMd1
76
77_MouseUp:
78	smbf MOUSEON_BIT, mouseOn
79.ifdef bsw128
80	smbf_ 0, mobenble
81.endif
82	rts
83
84ProcessMouse:
85	jsr UpdateMouse
86	jsr CheckMsePos
87	LoadB r3L, 0
88	rts
89
90CheckMsePos:
91	ldy mouseLeft
92	ldx mouseLeft+1
93	lda mouseXPos+1
94	bmi @2
95	cpx mouseXPos+1
96	bne @1
97	cpy mouseXPos
98@1:	bcc @3
99	beq @3
100@2:	smbf OFFLEFT_BIT, faultData
101	sty mouseXPos
102	stx mouseXPos+1
103@3:	ldy mouseRight
104	ldx mouseRight+1
105	cpx mouseXPos+1
106	bne @4
107	cpy mouseXPos
108@4:	bcs @5
109	smbf OFFRIGHT_BIT, faultData
110	sty mouseXPos
111	stx mouseXPos+1
112@5:	ldy mouseTop
113	CmpBI mouseYPos, 228
114	bcs @6
115	cpy mouseYPos
116	bcc @7
117	beq @7
118@6:	smbf OFFTOP_BIT, faultData
119	sty mouseYPos
120@7:	ldy mouseBottom
121	cpy mouseYPos
122	bcs @8
123	smbf OFFBOTTOM_BIT, faultData
124	sty mouseYPos
125@8:	bbrf MENUON_BIT, mouseOn, @B
126	lda mouseYPos
127; x16-emulator:
128; When opening a menu, GEOS repositions the mouse. x16-emulator
129; only knows absolute mouse positions based on the system mouse
130; position, so this has no effect. The next time the mouse is
131; read, it will be a its original location, which is above the
132; menu, so the menu gets closed. As a hack, disable the check.
133; The side effect of this is that the mouse can escape the menu
134; vertically, and weird things can happen.
135; The correct fix is to not reposition the mouse, and dismiss the
136; menu on a *click* outside.
137;	cmp menuTop
138;	bcc @A
139	cmp menuBottom
140	beq @9
141	bcs @A
142@9:	CmpW mouseXPos, menuLeft
143	bcc @A
144	CmpW mouseXPos, menuRight
145	bcc @B
146	beq @B
147@A:	smbf OFFMENU_BIT, faultData
148@B:	rts
149
150.ifdef wheels ; this got moved :(
151.import ScreenDimensions
152ResetMseRegion:
153	ldy #5
154@1:	lda ScreenDimensions,y
155	sta mouseTop,y
156	dey
157	bpl @1
158	rts
159.endif
160
161CheckClickPos:
162	lda mouseData
163	bmi @4
164.ifdef wheels_size_and_speed
165	bit mouseOn
166	bpl @4
167	bvc @3
168.else
169	lda mouseOn
170	and #SET_MSE_ON
171	beq @4
172	lda mouseOn
173	and #SET_MENUON
174	beq @3
175.endif
176	CmpB mouseYPos, menuTop
177	bcc @3
178	cmp menuBottom
179	beq @1
180	bcs @3
181@1:	CmpW mouseXPos, menuLeft
182	bcc @3
183	CmpW mouseXPos, menuRight
184	beq @2
185	bcs @3
186@2:	jmp Menu_5
187@3:	bbrf ICONSON_BIT, mouseOn, @4
188	jmp ProcessClick
189@4:	lda otherPressVec
190	ldx otherPressVec+1
191	jmp CallRoutine
192
193.ifndef wheels_size
194	rts ; ???
195.endif
196
197DoMouseFault:
198.ifdef wheels_size_and_speed
199	bit mouseOn
200	bpl @3
201	bvc @3
202.else
203	lda #$c0
204	bbrf MOUSEON_BIT, mouseOn, @3
205	bvc @3
206.endif
207	lda menuNumber
208	beq @3
209	bbsf OFFMENU_BIT, faultData, @2
210
211.ifdef wheels_size_and_speed
212	lda #SET_OFFTOP
213	bit menuOptNumber
214	bmi @X
215	lda #SET_OFFLEFT
216@X:	and faultData
217.else
218	ldx #SET_OFFTOP
219	lda #$C0
220	tay
221	bbsf 7, menuOptNumber, @1
222	ldx #SET_OFFLEFT
223@1:	txa
224	and faultData
225.endif
226	bne @2
227.ifndef wheels_size_and_speed ; seems unnecessary?
228	tya
229.endif
230	bbsf 6, menuOptNumber, @3
231@2:	jsr _DoPreviousMenu
232@3:	rts
233
234
235.export MouseInit
236MouseInit:
237	lda #1 ; default pointer
238	ldx #2 ; scale
239	jsr gjsrfar
240	.word mouse_config
241	.byte BANK_KERNAL
242	rts
243
244SlowMouse:
245SetMouse:
246	rts ;XXX X16 TODO
247
248tmpFire = mouseAccel ; reuse of unused location
249
250UpdateMouse:
251	jsr gjsrfar
252	.word mouse_scan
253	.byte BANK_KERNAL
254
255	ldx #r0
256	jsr gjsrfar
257	.word mouse_get
258	.byte BANK_KERNAL
259	and #1
260	eor #1
261	cmp tmpFire
262	beq :+
263	sta tmpFire
264	lsr
265	ror
266	sta mouseData
267	smbf MOUSE_BIT, pressFlag
268:	lda r0H
269	lsr
270	sta mouseXPos + 1
271	lda r0L
272	ror
273	sta mouseXPos
274	lsr r1H
275	lda r1L
276	ror
277	sta mouseYPos
278	rts
279
280