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