home *** CD-ROM | disk | FTP | other *** search
RISC OS BBC BASIC V Source | 1997-01-29 | 23.2 KB | 869 lines |
- Richard Atterer 1996
- =0:sp=13:lr=14:
- $" at line ";
- 0save$=":4.$.Coding.MyMenu.!MyMenu.!RunImage"
- type$="Module"
- ,size%=5<<10:
- code% size%:L%=code%+size%
- debugging%=0
- debugging%
- "Lib:Debug2"
- washerefile$="RAM:IWasHere"
- *washerefile$="<MyMenu$Dir>.^.IWasHere"
- Message_SaveDesktop=10
- Message_MenusDeleted=&400C9
- Message_HelpRequest=&502
- Message_HelpReply=&503
- !code%=3:
- "OS_Word",14,code%:
- "Territory_ConvertDateAndTime",1,code%,code%+8,256,"%DY %M3 %CE%YR"
- ,A%:d$="":
- B%=code%+8
- A%-1:d$=d$+
- "Territory_ConvertDateAndTime",1,code%,code%+8,256,"%ZDY
- %CE%YR"
- ,A%:date$="":
- B%=code%+8
- A%-1:date$=date$+
- p%=12
- 2:O%=code%:P%=0
- :p=p%:
- B%,B%,C%:
- p%=14
- C%>0 p=p%
- [optp
- -;______...____________________;__________
- .module
- dcd start
- dcd initialisation
- dcd finalisation
- dcd servicecall
- dcd titlestring
- dcd helpstring
- dcd commandtable
- #-;________________________________________
- .postfilter
- &/teq r0,#6 ;mouse clicks
- '.teqne r0,#8 ;key presses
- movnes pc,lr
- stmfd sp !,{lr}
- *#ldrb r14,[r12,#interceptwimp]
- +4teq r14,#0 ;is flag byte =0 ?
- mvnne r0,#0
- -7ldmfd sp !,{pc}^ ;y > don't intercept!
- /,.postfiltermask dcd%11100011100000110011
- 0-;________________________________________
- .initialisation
- stmfd sp !,{r7,r11,lr}
- debugging%
- [optp
- bl IWasHere_NewFile
- adr r0,module
- d("module start=^0^"):]
- :[optp
- ldr r11,[r12]
- teq r11,#0
- mov r4,#0
- strne r4,[r11,#lastopened]
- bne init2
- mov r0,#6
- mov r3,#rmablocksize%
- swi "XOS_Module"
- ldmvsfdsp !,{r7,r11,lr}
- orrvss pc,lr,#1<<28
- mov r11,r2
- mov r4,#0
- str r4,[r11,#taskhandle]
- str r4,[r11,#lastopened]
- str r4,[r11,#relocadr]
- K str r4,[r11,#keyspressed]
- str r4,[r11,#keys]
- mov r0,#17
- adr r1,menufile
- swi "XOS_File"
- teq r0,#1
- bne init_stop3
- mov r6,r2,lsl#24
- mov r7,r3
- mov r0,#17
- debugging%
- [optp
- adr r1,menuscan-1024
- add r1,r1,#1024:]
- [optp
- adr r1,menuscan:]
- :[optp
- swi "XOS_File"
- teq r0,#0
- `9beq scanfile ;MenuScan doesn't exist
- teq r0,#1
- bne init_stop3
- teq r2,r6,lsl#24
- teqne r3,r7
- beq init3
- .scanfile
- d("scanning menu")
- adr r0,scanutil
- swi "XOS_CLI"
- bvs init_stop2
- d("menu scanned")
- .init3
- mov r0,#&4f
- debugging%
- [optp
- adr r1,menuscan-1024
- add r1,r1,#1024:]
- [optp
- adr r1,menuscan:]
- :[optp
- x,swi "XOS_Find" ;open file
- bvs init_stop2
- mov r1,r0
- mov r0,#4
- add r2,r11,#totalsize
- mov r3,#6<<2
- ~5swi "XOS_GBPB" ;read 6 word header
- bvs init_stop
- ldrb r3,[r11,#ondemand]
- <teq r3,#0 ;load all or just hotkeys?
- ldr r4,[r11,#hotkeysize]
- /movne r3,r4 ;just hotkeys
- &ldreq r3,[r11,#totalsize] ;all
- movne r0,#&8000
- strne r0,[r11,#menublock]
- mov r0,#13
- mov r2,r11
- swi "XOS_Module"
- bvs init_stop
- mov r11,r2
- str r11,[r12]
- mov r0,#4
- add r2,r11,#hotkeys
- swi "XOS_GBPB"
- bvs init_stop
- mov r0,#0
- (swi "XOS_Find" ;close
- bvs init_stop2
- .init2
- ldr r0,[r11,#menublock]
- teq r0,#&8000
- ldrne r0,[r11,#hotkeysize]
- addne r0,r0,r11
- addne r0,r0,#hotkeys
- strne r0,[r11,#menublock]
- !mov r0,#&10 ;=event vector
- adr r1,event
- mov r2,r11
- swi "OS_Claim"
- d("EventV claimed")
- mov r0,#14
- "mov r1,#11 ;=keypress event
- swi "OS_Byte"
- ldr r1,[r11,#mouse]
- teq r1,#0
- &movne r1,#10 ;=mouse button event
- swine "OS_Byte"
- adr r0,titlestring
- adr r1,postfilter
- mov r2,r11
- ,mov r3,#0 ;all tasks
- ldr r4,postfiltermask
- &swi "Filter_RegisterPostFilter"
- d("init finished")
- ldmfd sp !,{r7,r11,pc}^
- ;____________
- .init_stop3
- mov r2,r0
- mov r0,#19
- swi "XOS_File"
- b init_stop2
- .init_stop
- mov r7,r0
- mov r0,#0
- swi "XOS_Find"
- .init_stop2
- movvs r7,r0
- .init_stop1
- mov r0,#7
- mov r2,r11
- swi "XOS_Module"
- movvc r0,r7
- ldmfd sp !,{r7,r11,lr}
- orrs pc,lr,#1<<28
- -;________________________________________
- .finalisation
- stmfd sp !,{r14}
- ldr r12,[r12]
- d("final1")
- ldr r0,[r12,#taskhandle]
- cmp r0,#0
- ldrgt r1,task
- swigt "XWimp_CloseDown"
- mov r1,#0
- str r1,[r12,#taskhandle]
- d("final2")
- adr r0,titlestring
- adr r1,postfilter
- mov r2,r12
- mov r3,#0
- ldr r4,postfiltermask
- (swi "Filter_DeRegisterPostFilter"
- d("final3")
- mov r0,#13
- "mov r1,#11 ;=keypress event
- swi "OS_Byte"
- d("final4")
- ldr r1,[r12,#mouse]
- teq r1,#0
- &movne r1,#10 ;=mouse button event
- swine "OS_Byte"
- d("final5")
- !mov r0,#&10 ;=event vector
- adr r1,event
- mov r2,r12
- swi "XOS_Release"
- d("EventV released")
- ldmfd sp !,{pc}
- -;________________________________________
- .event
- teq r0,#10
- teqne r0,#11
- movnes pc,lr
- stmfd sp !,{r0,r3-r7,lr}
- teq r0,#10
- beq mouseevent
- ldrb r3,[r12,#keyspressed]
- teq r1,#0
- ldr r4,[r12,#keys]
- subeq r3,r3,#1
- addne r3,r3,#1
- moveq r4,r4,lsr#8
- orrne r4,r2,r4,lsl#8
- Ktst r3,#1<<31 ;in case keys were pressed down while the
- Lmovne r3,#0 ;module started up (which is likely if you
- Cmovne r4,#0 ;double-clicked the application!)
- strb r3,[r12,#keyspressed]
- str r4,[r12,#keys]
- teq r3,#0
- ldmeqfdsp !,{r0,r3-r7,pc}^
- mov r0,#&ff
- and r5,r0,r4,lsr#8
- and r6,r0,r4,lsr#16
- mov r7,r4,lsr#24
- and r4,r4,#&ff
- 4cmp r4,r5:movgt r0,r4:movgt r4,r5:movgt r5,r0
- 4cmp r4,r6:movgt r0,r4:movgt r4,r6:movgt r6,r0
- 4cmp r4,r7:movgt r0,r4:movgt r4,r7:movgt r7,r0
- 4cmp r5,r6:movgt r0,r5:movgt r5,r6:movgt r6,r0
- 4cmp r5,r7:movgt r0,r5:movgt r5,r7:movgt r7,r0
- 4cmp r6,r7:movgt r0,r6:movgt r6,r7:movgt r7,r0
- orr r4,r4,r5,lsl#8
- orr r4,r4,r6,lsl#16
- orr r4,r4,r7,lsl#24
- add r5,r12,#hotkeys
- ldr r6,[r12,#hotkeysize]
- .keyevent1
- ldmia r5!,{r0,r7}
- 6teq r4,r0 ;compare with hotkey
- beq keyevent2
- .keyevent3
- subs r6,r6,#8
- bne keyevent1
- ldmfd sp !,{r0,r3-r7,pc}^
- .keyevent2
- and r0,r7,#3
- add r0,r0,#1
- #Istrb r0,[r12,#interceptwimp];non-zero > key presses are intercepted
- $3teq r0,r3 ;same nr of keys?
- bne keyevent3
- &:str r7,[r12,#pollword] ;will always be non-zero
- ldmfd sp !,{r0,r3-r7,pc}^
- ;____________
- .mouseevent
- +.teq r3,#%010 ;MENU button
- ,4teqeq r1,#0 ;X coordinate = 0?
- ldreq r0,[r12,#mouse]
- streq r0,[r12,#pollword]
- /Jstreqb r3,[r12,#interceptwimp];non-zero > mouse clicks are intercepted
- ldmfd sp !,{r0,r3-r7,pc}^
- 2-.menufile dcb"<MyMenu$M>.Menu":dcb0:align
- 34.scanutil dcb"/<MyMenu$Dir>.ScanUtil":dcb0:align
- 4-;________________________________________
- .servicecall
- teq r1,#&49
- teqne r1,#&4a
- teqne r1,#&27
- movnes pc,lr
- stmfd sp !,{r7,lr}
- ldr r12,[r12]
- ?4teq r1,#&49 ;Service_StartWimp
- bne service2
- ldr r7,[r12,#taskhandle]
- teq r7,#0
- mvneq r7,#0
- streq r7,[r12,#taskhandle]
- adreq r0,commandtable
- moveq r1,#0
- ldmfd sp !,{r7,pc}^
- .service2
- J6teq r1,#&4a ;Service_StartedWimp
- bne service3
- ldr r7,[r12,#taskhandle]
- cmn r7,#1
- moveq r7,#0
- streq r7,[r12,#taskhandle]
- ldmfd sp !,{r7,pc}^
- .service3
- S1;teq r1,#&27 ;Service_Reset
- mov r7,#0
- str r7,[r12,#taskhandle]
- ldmfd sp !,{r7,pc}^
- W-;________________________________________
- .mycommand
- stmfd sp !,{r14}
- mov r2,r0
- adr r1,titlestring
- mov r0,#2
- swi "XOS_Module"
- ldmfd sp !,{pc}
- .titlestring
- dcb "MyMenu":dcb0
- .helpstring
- dEdcb "MyMenu":dcb9:dcb9:dcb"0.90 ("+d$+") by Richard Atterer":dcb0
- .commandtable
- f"dcb"Desktop_MyMenu":dcb0:align
- dcd mycommand
- dcd0:dcd0:dcd0:dcb0
- i align
- .task dcb"TASK"
- .messagelist
- dcd Message_SaveDesktop
- dcd Message_MenusDeleted
- dcd Message_HelpRequest
- q .mask
- r dcd%110000000001100101110001
- t1.menuscan dcb"<MyMenu$M>.MenuScan":dcb0:align
- u-;________________________________________
- wP; If menu is loaded on demand, we have to deal with the following situations
- x<; in order to claim/release application memory correctly
- y6; (in brackets the changing values of 'menusopen')
- {1;When no menu or another task's menu is open:
- |1; - hotkey; opens one of our menus ( 0 -> 1 )
- }-; - hotkey; executes *commands ( 0 -> 0 )
- ~#;When one of our menus is open:
- I; - hotkey; would open the SAME menu which is already open ( 1 -> 1 )
- 6; - hotkey; opens a DIFFERENT menu ( 1 -> 2 -> 1 )
- -; - hotkey; executes *commands ( 1 -> 1 )
- L; - a menu entry which leads to a submenu is clicked; opens the submenu,
- .; closes the parent menu ( 1 -> 2 -> 1 )
- J; - a menu entry executing *commands is clicked with SELECT ( 1 -> 0 )
- J; - a menu entry executing *commands is clicked with ADJUST ( 1 -> 1 )
- N; - our menu is closed because the user clicks outside it, or another task
- ; opens one ( 1 -> 0 )
- -;________________________________________
- .err_nomem
- dcd 1<<30
- +dcb "Not enough free memory":dcb0:align
- .nomemory
- mov r0,#0
- mvn r1,#0
- swi "XWimp_SlotSize"
- adr r0,err_nomem
- .wimperror
- mov r1,#1
- adr r2,titlestring
- swi "XWimp_ReportError"
- b poll
- -;________________________________________
- .start
- ldr r12,[r12]
- ldr r0,[r12,#taskhandle]
- cmp r0,#0
- ldrgt r1,task
- swigt "XWimp_CloseDown"
- movgt r0,#0
- strgt r0,[r12,#taskhandle]
- mov r0,#300
- ldr r1,task
- adr r2,titlestring
- adr r3,messagelist
- swi "XWimp_Initialise"
- bvs closedown
- str r1,[r12,#taskhandle]
- mov r0,#0
- str r0,[r12,#pollword]
- str r0,[r12,#oldpollword]
- str r0,[r12,#keys]
- strb r0,[r12,#keyspressed]
- add sp,r12,#mystackend
- ;____________
- .poll
- d("Poll")
- ldr r0,mask
- ldr r1,[r12,#oldpollword]
- teq r1,#0
- bicne r0,r0,#1
- bicne r0,r0,#1<<22
- add r1,r12,#buf
- add r3,r12,#pollword
- swi "XWimp_Poll"
- bvs closedown
- teq r0,#0
- beq null_reason
- teq r0,#9
- beq menu_selection
- teq r0,#13
- beq pollword_nonzero
- teq r0,#17
- teqne r0,#18
- teqne r0,#19
- bne poll
- .user_message
- ldr r0,[r1,#16]
- "teq r0,#Message_SaveDesktop
- beq mess_savedesk
- ,eor r2,r0,#Message_MenusDeleted
- (teq r2,#Message_MenusDeleted
- beq menusdeleted
- +eor r2,r0,#Message_HelpRequest
- 'teq r2,#Message_HelpRequest
- beq helprequest
- teq r0,#0
- bne poll
- ;____________
- .closedown
- mvn r0,#0
- ldr r0,[r12,#taskhandle]
- ldr r1,task
- swi "XWimp_CloseDown"
- adr r3,titlestring
- swi "OS_ExitAndDie"
- ;____________
- O;note - we needn't read MyMenu$Dir to a buffer on startup because it is not
- J;possible that more than one copy of the program runs at the same time
- ;(cf 3-247)
- .mess_savedesk
- mov r5,r1
- ldmia r1,{r2}
- adr r0,variable
- add r1,r1,r2
- mov r6,r1
- sub r2,sp,r1
- mov r3,#0
- swi "XOS_ReadVarVal"
- bvs savedesk_error
- mov r0,#
- ldr r1,[r5,#20]
- swi "XOS_BPut"
- bvs savedesk_error
- mov r0,#2
- mov r3,r2
- mov r2,r6
- swi "XOS_GBPB"
- bvs savedesk_error
- mov r0,#10
- swi "XOS_BPut"
- bvs savedesk_error
- b poll
- ;______
- .savedesk_error
- mov r11,r0
- add r1,r12,#buf
- ldr r0,[r1,#8]
- str r0,[r1,#12]
- mov r0,#19
- ldr r2,[r1,#4]
- swi "XWimp_SendMessage"
- movvc r0,r11
- b wimperror
- (.variable dcb"MyMenu$Dir":dcb0:align
- -;________________________________________
- 6;'menusopen' may become 2 for
- E call to Wimp_Poll
- I; 1. When one menu is open and a hotkey combination is pressed which
- ; opens a DIFFERENT menu
- K; 2. When an item leading to a submenu is clicked (which will open the
- .; submenu and close its 'parent' menu)
- .menusdeleted
- ldrb r0,[r12,#menusopen]
- subs r0,r0,#1
- strgeb r0,[r12,#menusopen]
- d("menusdeleted^^menusopen is now ^0^")
- streq r0,[r12,#lastopened]
- bleq forgetmenu
- b poll
- -;________________________________________
- .menu_selection
- d("menu_selection")
- mov r6,r1
- add r1,r12,#buf+192
- " swi "Wimp_GetPointerInfo"
- ldr r0,[r1,#8]
- $+strb r0,[r12,#reopenmenu] ;non-zero
- ldr r2,[r12,#menublock]
- ldr r5,[r12,#lastopened]
- ldmia r6!,{r3}
- *G.menusel1 ;for each item in returned Wimp block
- add r3,r3,#1
- ,"ldr r1,[r5,r3,lsl#2]
- ldmia r6!,{r3}
- .4cmn r3,#1 ;further submenus?
- beq execmenu_exec
- 0=bic r1,r1,#&f<<28 ;y > get address of submenu
- add r1,r2,r1
- .menusel2
- ldr r4,[r5],#32
- rsb r4,r4,r4,lsl#3
- add r5,r5,r4,lsl#2
- cmp r5,r1
- blo menusel2
- sub r5,r5,#32
- sub r5,r5,r4,lsl#2
- b menusel1
- ;-;________________________________________
- .execitem12
- mov r11,r0
- mov r0,#0
- swi "XOS_Find"
- mov r0,r11
- .execitem6
- mov r1,#2
- adr r2,titlestring
- swi "XWimp_ReportError"
- b execitem8
- G-;________________________________________
- .pollword_nonzero
- d("pollword_nonzero")
- ldr r0,[r12,#pollword]
- L str r0,[r12,#oldpollword]
- mov r0,#0
- str r0,[r12,#pollword]
- b poll
- ;____________
- .null_reason
- S!ldr r11,[r12,#oldpollword]
- d("null_reason^^oldpollword=^11^")
- cmn r11,#1
- V"streqb r0,[r12,#interceptwimp]
- W streq r0,[r12,#oldpollword]
- beq poll
- mvn r0,#0
- [ str r0,[r12,#oldpollword]
- bic r11,r11,#1<<31
- mov r11,r11,lsr#2
- mov r10,r11,lsr#16
- bic r11,r11,r10,lsl#16
- mov r0,#0
- str r0,[r12,#pollword]
- strb r0,[r12,#reopenmenu]
- ;____________
- f-;r10=nr of menu, r11=nr of (submenu) item
- .execmenu
- d("execmenu^^nr of menu=^10^, nr of item=^11^")
- ldrb r0,[r12,#ondemand]
- teq r0,#0
- ldreq r6,[r12,#menublock]
- lMbeq execmenu3 ;> not on demand, ie menu already in memory
- nNldrb r0,[r12,#menusopen] ;will contain 0 unless hotkey pressed when a
- o8teq r0,#0 ;menu was already open
- movne r6,#&8000
- bne execmenu3
- ldr r3,[r12,#totalsize]
- ldr r4,[r12,#hotkeysize]
- sub r0,r3,r4
- mov r3,r0
- mvn r1,#0
- swi "XWimp_SlotSize"
- bvs wimperror
- cmp r0,r3
- blt nomemory
- mov r0,#&4f
- adr r1,menuscan
- swi "XOS_Find"
- blvs forgetmenu
- bvs wimperror
- mov r1,r0
- mov r0,#3
- mov r2,#&8000
- 5add r4,r4,#24 ;for 24 byte header
- swi "XOS_GBPB"
- blvs forgetmenu
- bvs wimperror
- mov r0,#0
- str r0,[r12,#relocadr]
- swi "XOS_Find"
- d("execmenu^^loaded on demand")
- blvs forgetmenu
- bvs wimperror
- mov r6,#&8000
- ;______
- 1.execmenu3 ;r6=ptr to menu
- d("execmenu3^^reloc")
- ldr r0,[r12,#relocadr]
- Csubs r1,r6,r0 ;relocadr <>0 after a soft reset!
- beq execmenu4
- Qldr r4,[r12,#nrofmenus] ;the direct pointers in menu tree need updating
- str r6,[r12,#relocadr]
- mov r0,r1
- d("execmenu^^nr of menus=^4^, amount=^0^")
- 0.execmenu1 ;for each menu
- ldr r2,[r0],#4+28
- add r0,r0,r2,lsl#2
- ldmia r0,{r3}
- 9tst r3,#1<<8 ;title data indirected?
- ldrne r3,[r0,#-28]
- addne r3,r3,r1
- strne r3,[r0,#-28]
- A.execmenu2 ;for each item (r2=nr of items)
- ldmib r0,{r3,r5-r6}
- cmn r3,#1
- addne r3,r3,r1
- tst r5,#1<<8
- addne r6,r6,r1
- stmib r0,{r3,r5-r6}
- add r0,r0,#24
- subs r2,r2,#1
- bne execmenu2
- subs r4,r4,#1
- bne execmenu1
- ;______
- .execmenu4
- ldr r5,[r12,#menublock]
- mov r2,r5
- .execmenu5
- subs r10,r10,#1
- ldrpl r0,[r5],#4+28
- rsbpl r0,r0,r0,lsl#3
- addpl r5,r5,r0,lsl#2
- bpl execmenu5
- add r1,r5,#4
- ldr r1,[r1,r11,lsl#2]
- ;______
- B;r1=word of item to be executed, r2=ptr to start of menu data,
- K;r5=addr of header before wimp menu data, somewhere before current menu
- .execmenu_exec
- d("exec^^word of item=^1^, start of menu data=^2^, menu header=^5^")
- Qmovs r3,r1,lsr#30 ;menu / memory *comm offset /file *comm offset?
- bic r1,r1,#&f<<28
- bne execitem
- 'add r4,r2,r1 ;menu
- .execmenu6
- Qldr r0,[r5],#32 ;search for header before menu pointed to by R1
- rsb r0,r0,r0,lsl#3
- add r5,r5,r0,lsl#2
- cmp r5,r4
- blo execmenu6
- sub r5,r5,r0,lsl#2
- sub r5,r5,#32
- ldr r6,[r12,#lastopened]
- Dteq r5,r6 ;would this re-open the same menu?
- beq poll
- ;ldrneb r0,[r12,#menusopen]
- ;addne r0,r0,#1
- ;strneb r0,[r12,#menusopen]
- str r5,[r12,#lastopened]
- add r1,r12,#buf
- !swi "XWimp_GetPointerInfo"
- bvs wimperror
- ldmia r1,{r2-r3}
- sub r2,r2,#64
- mov r1,r4
- swi "XWimp_CreateMenu"
- bvs wimperror
- ldrb r0,[r12,#menusopen]
- add r0,r0,#1
- strb r0,[r12,#menusopen]
- b poll
- ;____________
- .execitem
- ;teq r3,#%01 ;are *commands in memory?
- $bne execitem3 ;n
- d("execitem^^memory")
- ldr r2,[r12,#menublock]
- add r0,r2,r1
- .execitem1
- mov r2,r0
- ldrb r1,[r0]
- >cmp r1,#32 ;is this a 'packed' command?
- blt execitem5
- d("execitem/mem^^*$0^")
- Fswi "XWimp_StartTask" ;COULD use OS_CLI, but this is safer
- add r0,r2,#1
- .execitem2
- ldrb r1,[r0],#1
- cmp r1,#32
- bge execitem2
- =teq r1,#0 ;was this the last command?
- $bne execitem1 ;n
- b execitem8
- .execitem5
- ldrb r3,[r0,#1]
- orr r3,r3,r1,lsl#8
- sub r0,r0,r3
- d("execitem/mempacked^^*$0^")
- swi "XWimp_StartTask"
- add r0,r2,#3
- ldrb r1,[r0,#-1]
- teq r1,#0
- bne execitem1
- b execitem8
- ;____________
- .execitem3
- d("execitem^^file")
- mov r2,r1
- mov r0,#&4f
- adr r1,menufile+1024
- sub r1,r1,#1024
- swi "XOS_Find"
- bvs execitem6
- mov r1,r0
- mov r0,#1
- 0swi "XOS_Args" ;write seq ptr
- mov r0,#6
- ldr r3,[r12,#osclilen]
- 9swi "XOS_Module" ;claim temporary buffer
- bvs execitem12
- ldrb r4,[r12,#special]
- mov r3,r2
- .execitem4
- swi "XOS_BGet"
- bvs execitem11
- .execitem7
- strb r0,[r3],#1
- cmp r0,#32
- bge execitem4
- mov r0,r2
- swi "XWimp_StartTask"
- swi "XOS_BGet"
- bvs execitem11
- (0teq r0,r4 ;last command?
- movne r3,r2
- bne execitem7
- .execitem11
- mov r0,#7
- swi "XOS_Module"
- mov r0,#0
- swi "XOS_Find"
- ;______
- .execitem8
- ldrb r0,[r12,#reopenmenu]
- d("execitem^^reopenmenu=^0^")
- teq r0,#0
- 7/beq execitem9 ;hotkey press
- 84tst r0,#1 ;entry with ADJUST
- moveq r0,#0
- streq r0,[r12,#lastopened]
- ;Hstreqb r0,[r12,#menusopen] ;'decrease' (no Message_MenusDeleted!)
- beq execitem10
- ldr r1,[r12,#lastopened]
- ldmia r1!,{r0}
- add r1,r1,r0,lsl#2
- @Nswi "XWimp_CreateMenu" ;DON'T increase menusopen - is already 1 coz
- AQbvs wimperror ;NO Msg_MenusDeleted when menu sel. is returned
- b poll
- .execitem9
- ENldrb r0,[r12,#menusopen] ;will be 1 if hotkey pressed while menu open
- .execitem10
- G@teq r0,#0 ;0 if item clicked with SELECT
- bleq forgetmenu
- b poll
- J-;________________________________________
- .forgetmenu
- MC;test whether menu was loaded only on demand, de-allocate if so
- stmfd sp !,{r0-r2,r4,lr}
- ldrb r0,[r12,#ondemand]
- teq r0,#0
- ldmeqfdsp !,{r0-r2,r4,pc}^
- mov r0,#0
- strb r0,[r12,#menusopen]
- mvn r1,#0
- swi "XWimp_SlotSize"
- ;swi 256+7
- d("menu forgotten")
- ldmfd sp !,{r0-r2,r4,pc}^
- Y-;________________________________________
- .helprequest
- adr r2,helpreplytext
- add r3,r1,#20
- .helpreq1
- ldrb r0,[r2],#1
- strb r0,[r3],#1
- teq r0,#0
- bne helpreq1
- c7mov r0,#((helpreplytextend-helpreplytext)+23)
- stmia r1,{r0}
- e&mov r0,#Message_HelpReply
- f(orr r0,r0,#Message_HelpReply
- str r0,[r1,#16]
- ldr r0,[r1,#8]
- str r0,[r1,#12]
- mov r0,#17
- ldr r2,[r1,#4]
- swi "XWimp_SendMessage"
- bvc poll
- b wimperror
- .helpreplytext
- dcb"Name:
- MyMenu
- s,dcb"Purpose: User-designed menu trees|M"
- t)dcb"Author:
- 1996 Richard Atterer|M"
- u1dcb"Version: V0.90 ("+date$+") Freeware":dcb0
- .helpreplytextend
- w-;________________________________________
- debugging%
- [optp
- align
- debug(p,washerefile$,20):]
- :[optp
- rmablock(p)
- -;________________________________________
- ]O%+=128:[optp:]:O%-=128
- 2)=0 A$=
- i%=code%
- 128:$i%=A$:
- "Size: ";O%-code%"/&"~O%-code%" bytes (";
- ((O%-code%)/102.4+.5)/10" kBytes)."'"Time: ";
- /100" seconds."
- "Save "+save$+" "+
- ~code%+" "+
- "SetType "+save$+" "+type$
- REPEAT:A%=INKEY(0):MOUSEB%,B%,C%:UNTIL A%>-1ORC%>0
- SYS"OS_Module",11,code%,O%-code%
- rmablock(p)
- P%:Otemp%=O%:[optp
- -;________________________________________
- ;offsets in RMA block
- .taskhandle dcd0
- .pollword dcd0
- .oldpollword dcd0
- .relocadr dcd0
- Q.keyspressed dcb0 ;nr of keys currently pressed, possibly also >4
- ?.menusopen dcb0 ;0, 1 or, for a short time, 2
- Q.reopenmenu dcb0 ;>0 to check whether menu 2B reopened in execitem
- N.interceptwimp dcb0:align ;>0 for the postfilter to intercept all keys
- E.keys dcd0 ;key last pressed is in lowest byte
- B.menublock dcd0 ;ptr to header before first menu
- ;.lastopened dcd0 ;addr of menu last opened
- +.buf ]:O%+=256:P%+=256:[optp
- +.mystack ]:O%+= 20:P%+= 20:[optp
- .mystackend
- ;______
- C;the following variables are loaded from start of file MenuScan
- .totalsize dcd0
- .hotkeysize dcd0
- .osclilen dcd0
- .nrofmenus dcd0
- .ondemand dcb0;NB byte
- &.special dcb0;NB byte:align
- .mouse dcd0
- .hotkeys
- .rmablocksize%
- -;________________________________________
- O%=Otemp%:=0
- d(a$)
- debugging%
- [optp
- bl IWasHere
- dcb a$:dcb0:align:]
-