1; GEOS KERNAL by Berkeley Softworks
2; reverse engineered by Maciej Witkowiak, Michael Steil
3;
4; Menus: RecoverMenu, RecoverAllMenus syscalls and misc
5
6.include "const.inc"
7.include "geossym.inc"
8.include "geosmac.inc"
9.include "config.inc"
10.include "gkernal.inc"
11.include "c64.inc"
12
13.import Menu_0
14.import DoMenu0
15.import _Sleep
16.import menuOptionTab
17.import _MouseOff
18.import menuRight
19.import menuLeft
20.import menuBottom
21.import menuTop
22.import GetMenuDesc
23.import menuLimitTabL
24.import menuLimitTabH
25.import menuOptNumber
26.import _InvertRectangle
27.import _HorizontalLine
28.import _VerticalLine
29
30.import Ddec
31.import Rectangle
32.import SetPattern
33
34.global CopyMenuCoords
35.global DrawMenu
36.global MenuDoInvert
37.global MenuRestoreFont
38.global MenuStoreFont
39.global Menu_3
40.global Menu_4
41.global Menu_5
42.global RcvrMnu0
43.global _RecoverMenu
44.global _RecoverAllMenus
45
46.segment "menu3"
47
48Menu_3:
49	ldy r10H
50	ldx r1H
51	bbsf 7, menuOptNumber, @1
52	lda r11H
53	sta menuLimitTabH,y
54	ldx r11L
55@1:	txa
56	sta menuLimitTabL,y
57	rts
58
59Menu_4:
60	bcc @1
61	bbrf 7, menuOptNumber, @2
62.ifdef wheels_size_and_speed
63	bmi @3
64.else
65	bra @3
66.endif
67@1:	bbrf 7, menuOptNumber, @3
68@2:	AddVB 2, r1H
69	rts
70@3:	AddVW_ 4, r11
71	rts
72
73;---------------------------------------------------------------
74_RecoverAllMenus:
75	jsr GetMenuDesc
76	jsr _RecoverMenu
77	dec menuNumber
78	bpl _RecoverAllMenus
79	lda #0
80	sta menuNumber
81	rts
82
83;---------------------------------------------------------------
84_RecoverMenu:
85	jsr CopyMenuCoords
86RcvrMnu0:
87	lda RecoverVector
88	ora RecoverVector+1
89	bne @1
90.ifndef wheels_size_and_speed
91	lda #0
92.endif
93	jsr SetPattern
94	jmp Rectangle
95@1:	jmp (RecoverVector)
96
97.if ((menuVSeparator | menuHSeparator)<>0)
98DrawMenu:
99.ifdef wheels
100	lda menuOptNumber
101	bpl LEFAE
102	and #$1F
103	subv 1
104	beq LEFAE
105	sta r2L
106	MoveW menuLeft, r3
107	MoveW menuRight, r4
108LEF9E:	ldx r2L
109	lda menuLimitTabL,x
110	sta r11L
111	lda #$FF
112	jsr _HorizontalLine
113	dec r2L
114	bne LEF9E
115LEFAE:	rts
116.else
117	lda menuOptNumber
118	and #%00011111
119	subv 1
120	beq @5
121	sta r2L
122	bbsf 7, menuOptNumber, @2
123.if (menuVSeparator<>0)
124	lda menuTop
125	addv 1
126	sta r3L
127	lda menuBottom
128	subv 1
129	sta r3H
130@1:	ldx r2L
131	lda menuLimitTabL,x
132	sta r4L
133	lda menuLimitTabH,x
134	sta r4H
135	lda #menuVSeparator
136	jsr _VerticalLine
137	dec r2L
138	bne @1
139.endif
140.if (menuHSeparator<>0)
141	rts
142.endif
143@2:
144.if (menuHSeparator<>0)
145	MoveW menuLeft, r3
146	inc r3L
147	bne @3
148	inc r3H
149@3:	MoveW menuRight, r4
150	ldx #r4
151	jsr Ddec
152@4:	ldx r2L
153	lda menuLimitTabL,x
154	sta r11L
155	lda #menuHSeparator
156	jsr _HorizontalLine
157	dec r2L
158	bne @4
159.endif
160@5:	rts
161.endif
162.endif
163
164CopyMenuCoords:
165	ldx #6
166@1:	lda menuTop-1,x
167	sta r2-1,x
168	dex
169	bne @1
170	rts
171
172Menu_5:
173	jsr _MouseOff
174	jsr Menu_7
175	jsr MenuDoInvert
176	lda r9L
177	ldx menuNumber
178	sta menuOptionTab,x
179	jsr Menu_8
180	bbsf 7, r1L, Menu_52
181.ifdef wheels
182	bvc LEFE4
183	jsr LEFE4
184	lda r0L
185	ora r0H
186	bne Menu_52
187	rts
188Menu_52:
189	inc menuNumber
190	jmp DoMenu0
191LEFE4:  ldx menuNumber
192	lda menuOptionTab,x
193	jmp (r0)
194.else
195.ifndef newMenu_5
196	bvs Menu_51
197	MoveB selectionFlash, r0L
198	LoadB r0H, NULL
199	jsr _Sleep
200	jsr Menu_7
201	jsr MenuDoInvert
202	MoveB selectionFlash, r0L
203	LoadB r0H, NULL
204	jsr _Sleep
205	jsr Menu_7
206.else
207Menu_5Help:
208	MoveB selectionFlash, r0L
209	LoadB r0H, NULL
210	jsr _Sleep
211	jmp Menu_7
212
213Menu_5:
214	jsr _MouseOff
215	jsr Menu_7
216	jsr MenuDoInvert
217	lda r9L
218	ldx menuNumber
219	sta menuOptionTab,x
220	jsr Menu_8
221	bbsf 7, r1L, Menu_52
222	bvs Menu_51
223	jsr Menu_5Help
224	jsr MenuDoInvert
225	jsr Menu_5Help
226.endif
227	jsr MenuDoInvert
228	jsr Menu_7
229	ldx menuNumber
230	lda menuOptionTab,x
231	pha
232	jsr Menu_8
233	pla
234	jmp (r0)
235
236Menu_51:
237	jsr Menu_6
238	lda r0L
239	ora r0H
240	bne Menu_52
241	rts
242Menu_52:
243	inc menuNumber
244	jmp DoMenu0
245
246Menu_6:
247	ldx menuNumber
248	lda menuOptionTab,x
249	pha
250	jsr Menu_8
251	pla
252	jmp (r0)
253.endif
254
255.ifdef wheels ; xxx moved
256MenuDoInvert:
257  	PushB dispBufferOn
258	LoadB dispBufferOn, ST_WR_FORE
259	jsr _InvertRectangle
260	PopB dispBufferOn
261	rts
262
263        .byte 0, 0, 0, 0, 0 ; ???
264.endif
265
266Menu_7:
267	lda menuOptNumber
268	and #%00011111
269	tay
270	lda menuOptNumber
271	bmi @4
272@1:	dey
273	lda mouseXPos+1
274	cmp menuLimitTabH,y
275.ifdef bsw128
276	beq @X
277	bcs @Y
278.else
279	bne @2
280.endif
281@X:	lda mouseXPos
282	cmp menuLimitTabL,y
283@2:	bcc @1
284@Y:	iny
285	lda menuLimitTabL,y
286	sta r4L
287	lda menuLimitTabH,y
288	sta r4H
289	dey
290	lda menuLimitTabL,y
291	sta r3L
292	lda menuLimitTabH,y
293	sta r3H
294	sty r9L
295.ifndef wheels
296	cpy #0
297	bne @3
298	inc r3L
299	bne @3
300	inc r3H
301.endif
302@3:	ldx menuTop
303	inx
304	stx r2L
305	ldx menuBottom
306	dex
307	stx r2H
308	rts
309@4:	lda mouseYPos
310@5:	dey
311	cmp menuLimitTabL,y
312	bcc @5
313	iny
314	lda menuLimitTabL,y
315	sta r2H
316	dey
317	lda menuLimitTabL,y
318	sta r2L
319	sty r9L
320	cpy #0
321	bne @6
322	inc r2L
323@6:	MoveW menuLeft, r3
324.ifdef wheels_size ; code reuse
325.import IncR3
326	jsr IncR3
327.else
328	inc r3L
329	bne @7
330	inc r3H
331@7:
332.endif
333	MoveW menuRight, r4
334	ldx #r4
335.ifdef wheels_size_and_speed
336	jmp Ddec
337.else
338	jsr Ddec
339	rts
340.endif
341
342Menu_8:
343	jsr Menu_0
344	iny
345	iny
346	lda (r0),y
347	sta r1L
348	iny
349	lda (r0),y
350	tax
351	iny
352	lda (r0),y
353	sta r0H
354	stx r0L
355	rts
356
357.ifndef wheels ; xxx moved
358MenuDoInvert:
359	PushB dispBufferOn
360	LoadB dispBufferOn, ST_WR_FORE
361	jsr _InvertRectangle
362	PopB dispBufferOn
363	rts
364.endif
365
366MenuStoreFont:
367	ldx #9
368@1:	lda g_baselineOffset-1,x
369	sta saveFontTab-1,x
370	dex
371	bne @1
372	rts
373
374MenuRestoreFont:
375	ldx #9
376@1:	lda saveFontTab-1,x
377	sta g_baselineOffset-1,x
378	dex
379	bne @1
380	rts
381