1; GEOS KERNAL by Berkeley Softworks
2; reverse engineered by Maciej Witkowiak, Michael Steil
3;
4; Menus: DoMenu, ReDoMenu, DoPreviousMenu, GotoFirstMenu 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
14.import _PutString
15.import MenuStringFault
16.import MenuRestoreFont
17.import Menu_3
18.import Menu_4
19.import MenuStoreFont
20.import ResetMseRegion
21.import _GetSerialNumber
22.import _GraphicsString
23.import _RecoverMenu
24.import _MouseOff
25.import _StartMouseMode
26.import menuRight
27.import menuLeft
28.import menuBottom
29.import menuTop
30.import menuLimitTabH
31.import menuLimitTabL
32.import menuOptNumber
33.import DrawMenu
34.import _SetPattern
35.import CopyMenuCoords
36.import menuStackH
37.import menuStackL
38.import menuOptionTab
39.import _UseSystemFont
40.import _FrameRectangle
41.import _Rectangle
42
43.import GraphicsString
44.import GetSerialNumber
45
46.ifdef wheels
47.import _HorizontalLine
48.endif
49
50.global DoMenu0
51.global GetMenuDesc
52.global Menu_0
53.global _DoPreviousMenu
54.global _ReDoMenu
55.global _GotoFirstMenu
56.global _DoMenu
57
58.segment "menu1"
59
60;---------------------------------------------------------------
61; DoMenu                                                  $C151
62;
63; Function:  Display and activate the menu structure pointed to
64;            by r0
65
66; Pass:      a   nbr of menu to place mouse on
67;            r0  address of menu table
68; Destroyed: a, x, y, r0 - r13
69;            ex: .byte top,bottom
70;                .word left,right
71;                .byte nbr_menu|type
72;
73;                .word text1
74;                .byte type
75;                .word subMenu1 .etc...
76;      subMenu1: .byte top,bottom
77;                .word left,right
78;                .byte nbr_items|type
79;
80;                .word text1a
81;                .byte type
82;                .word domenu1 .etc...
83;---------------------------------------------------------------
84_DoMenu:
85	sta menuOptionTab
86	ldx #0
87	stx menuNumber
88	beq DoMenu1
89DoMenu0:
90	ldx menuNumber
91	lda #NULL
92	sta menuOptionTab,x
93DoMenu1:
94	lda r0L
95	sta menuStackL,x
96	lda r0H
97	sta menuStackH,x
98	jsr GetMenuDesc
99	sec
100DoMenu1_1:
101	php
102	PushB dispBufferOn
103	LoadB dispBufferOn, ST_WR_FORE
104	PushW r11
105	jsr CopyMenuCoords
106	lda #0
107	jsr _SetPattern
108	jsr _Rectangle
109.ifdef wheels
110	lda r2H
111	sta r11L
112	lda #$ff
113	bit menuOptNumber
114	bpl @X
115	jsr _FrameRectangle
116	bra @Y
117@X:	jsr _HorizontalLine
118	lda r2L
119	sta r11L
120	lda #$ff
121	jsr _HorizontalLine
122.else
123	lda #$ff
124	jsr _FrameRectangle
125.endif
126@Y:	PopW r11
127	jsr Menu_1
128.if ((menuVSeparator | menuHSeparator)<>0)
129	jsr DrawMenu
130.endif
131	PopB dispBufferOn
132	plp
133	bbsf 6, menuOptNumber, @1
134	bcc @4
135@1:	ldx menuNumber
136	ldy menuOptionTab,x
137	bbsf 7, menuOptNumber, @2
138	lda menuLimitTabL,y
139	sta r11L
140	lda menuLimitTabH,y
141	sta r11H
142	iny
143	lda menuLimitTabL,y
144	clc
145	adc r11L
146	sta r11L
147	lda menuLimitTabH,y
148	adc r11H
149	sta r11H
150.ifdef bsw128
151	lsr r11H
152.else
153	ror r11H
154.endif
155	ror r11L
156	lda menuTop
157	add menuBottom
158	ror
159	tay
160	bra @3
161@2:	lda menuLimitTabL,y
162	iny
163	clc
164	adc menuLimitTabL,y
165.ifdef bsw128
166	ror
167.else
168	lsr
169.endif
170	tay
171	lda menuLeft
172	add menuRight
173	sta r11L
174	lda menuLeft+1
175	adc menuRight+1
176	sta r11H
177	lsr r11H
178	ror r11L
179@3:	sec
180@4:	bbrf MOUSEON_BIT, mouseOn, @5
181.ifdef wheels_size_and_speed
182	smbf ICONSON_BIT, mouseOn
183.else
184	smbf ICONSON_BIT, mouseOn
185.endif
186@5:	smbf MENUON_BIT, mouseOn
187	jmp _StartMouseMode
188
189;---------------------------------------------------------------
190_ReDoMenu:
191	jsr _MouseOff
192	jmp DoPrvMn1
193
194;---------------------------------------------------------------
195_GotoFirstMenu:
196	php
197	sei
198@1:
199.ifdef wheels
200	lda menuNumber
201.else
202	CmpBI menuNumber, 0
203.endif
204	beq @2
205	jsr _DoPreviousMenu
206	bra @1
207@2:	plp
208	rts
209
210_DoPreviousMenu:
211	jsr _MouseOff
212	jsr _RecoverMenu
213	dec menuNumber
214DoPrvMn1:
215	jsr GetMenuDesc
216	clc
217	jmp DoMenu1_1
218
219Menu_0:
220	pha
221	ldy menuNumber
222	lda menuStackL,y
223	sta r0L
224	lda menuStackH,y
225	sta r0H
226	PopB r8L
227	asl
228	asl
229	adc r8L
230	adc #7
231	tay
232	rts
233
234GetMenuDesc:
235	ldx menuNumber
236	lda menuStackL,x
237	sta r0L
238	lda menuStackH,x
239	sta r0H
240	ldy #6
241	lda (r0),y
242	sta menuOptNumber
243	dey
244@1:	lda (r0),y
245	sta mouseTop,y
246	sta menuTop,y
247	dey
248	bpl @1
249
250.ifdef trap1
251	; If the user has changed where GetSerialNumber points to,
252	; this will sabotage the KERNAL call GraphicsString.
253	lda GetSerialNumber + 1 - $FF,y
254	add #<(_GraphicsString - _GetSerialNumber)
255	sta GraphicsString + 1 - $FF,y
256.endif
257
258	MoveW menuLeft, r11
259	MoveB menuTop, r1H
260	bbsf 6, menuOptNumber, @2
261	jsr ResetMseRegion
262@2:	rts
263
264Menu_1:
265	jsr MenuStoreFont
266	jsr _UseSystemFont
267	LoadB r10H, 0
268	sta g_currentMode
269	sec
270	jsr Menu_4
271@1:	jsr Menu_3
272	clc
273	jsr Menu_4
274	jsr Menu_2
275	clc
276	jsr Menu_4
277	bbrf 7, menuOptNumber, @2
278	lda r1H
279	sec
280	adc g_curHeight
281	sta r1H
282	MoveW menuLeft, r11
283	sec
284	jsr Menu_4
285@2:
286.ifdef wheels_size_and_speed
287	inc r10H
288.else
289	AddVB 1, r10H
290.endif
291	lda menuOptNumber
292	and #%00011111
293	cmp r10H
294	bne @1
295	jsr MenuRestoreFont
296	jmp Menu_3
297
298Menu_2:
299	PushW r10
300	lda r10H
301	jsr Menu_0
302	lda (r0),y
303	tax
304	iny
305	lda (r0),y
306	sta r0H
307	stx r0L
308	PushW g_leftMargin
309	PushW g_rightMargin
310	PushW StringFaultVec
311.ifdef wheels_size_and_speed
312	lda #$00
313	sta g_leftMargin+1
314	sta g_leftMargin
315.else
316	LoadW__ g_leftMargin, 0
317.endif
318	sec
319	lda menuRight
320	sbc #1
321	sta g_rightMargin
322	lda menuRight+1
323	sbc #0
324	sta g_rightMargin+1
325	LoadW StringFaultVec, MenuStringFault
326	PushB r1H
327.ifdef wheels
328	bit menuOptNumber
329	bmi @1
330	sec
331	lda menuBottom
332	sbc g_curHeight
333	sbc #1
334	sta r1H
335@1:	clc
336	adc g_baselineOffset
337	adc #1
338	sta r1H
339.else
340	AddB_ g_baselineOffset, r1H
341	inc r1H
342.endif
343	jsr _PutString
344	PopB r1H
345	PopW StringFaultVec
346	PopW g_rightMargin
347	PopW g_leftMargin
348	PopW r10
349	rts
350
351