Home » Archimedes archive » Acorn User » AU 1994-08.adf » !WimpTools_WimpTools » !WimpTools/WmpLb_Code
!WimpTools/WmpLb_Code
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Acorn User » AU 1994-08.adf » !WimpTools_WimpTools |
Filename: | !WimpTools/WmpLb_Code |
Read OK: | ✔ |
File size: | C0D3 bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM >WmpLb_Code 20REM (c) Matt Lewis 30REM 40REM 50ON ERROR ERROR EXT ERL,REPORT$+" at line "+STR$ERL 60: 70MODE0 80date$=MID$(TIME$,5,11) 90SwiNumber=&47C80 100ErrorBase=&809B00 110blk=&400 120DIM store% &2000 130ws=12 140sp=13 150link=14 160pc=15 170: 180tasks=0 190activetasks=4 200: 210FOR pass%=4 TO 7 STEP 3 220O%=store% 230P%=0 240[ OPT pass% 250; 260; ************************************************************************ 270; * MODULE HEADER CODE * 280; ************************************************************************ 290; 300.start 310EQUD 0 ; start up code 320EQUD initmod ; initialisation code 330EQUD finishmod ; finalisation code 340EQUD 0 ; service module code 350EQUD title ; module title string 360EQUD helpst ; module help string 370EQUD 0 ; help and command table 380EQUD SwiNumber ; swi base number 390EQUD swicode ; swi handling code 400EQUD switable ; swi decoding table 410EQUD 0 ; swi decoding code 420; 430; ************************************************************************ 440; * MODULE SUPPORT CODE * 450; ************************************************************************ 460; 470.title 480EQUS "WimpTools" 490EQUB 0 500ALIGN 510.helpst 520EQUS "Wimp Tools" 530EQUB 9 540EQUS "1.43 ("+date$+") by Matt Lewis � Weird Sheep Software" 550EQUB 0 560ALIGN 570ALIGN 580; 590.initmod ; set up module and claim 600 STMFD (sp)!,{link} ; module workspace 610 MOV r1,ws 620 LDR ws,[ws] 630 CMP ws,#0 ; are we already active? 640 LDMNEFD (sp)!,{pc} 650 MOV r0,#6 660 MOV r3,#&800 ; claim space of 2K 670 SWI "OS_Module" 680 STR r2,[r1] 690 MOV r0,#0 700 STR r0,[r2] ; clear number of active tasks to 0 710 STR r0,[r2,#4] ; clear active task flags 720 LDMFD (sp)!,{pc} 730; 740.finishmod ; shut down module and relinquish 750 STMFD (sp)!,{link} ; module memory space 760 TEQ r10,#0 770 LDMEQFD (sp)!,{pc} 780 LDR ws,[ws] 790 LDR r0,[ws] ; check any tasks using this module 800 TEQ r0,#0 ; if so relinquish their space 810 BEQ finishmod2 820 LDR r1,[ws,#4] 830 MOV r3,#1 840 ADD r4,ws,#32 ; data starts at block + 32 850 MOV r0,#7 860.finishmod1 870 TST r1,r3 ; is the bit set in the flag? 880 BNE finishmod1a 890 ADD r4,r4,#32 ; no - goto next block 900 MOV r3,r3,LSL#1 910 TST r3,#1<<31 ; is it bit 31 - illegal therefore no more 920 BEQ finishmod1 930 B finishmod2 940.finishmod1a 950 MOV r5,#0 ; blocks used 960.finishmodloop 970 LDR r2,[r4,r5] 980 TEQ r2,#0 990 SWINE "XOS_Module" ; any allocated - if so release memory! 1000 ADD r5,r5,#4 1010 TEQ r5,#32 1020 BNE finishmodloop 1030.finishmod2 1040 MOV r0,#7 1050 MOV r2,ws 1060 SWI "OS_Module" 1070 LDMFD (sp)!,{pc} 1080; 1090; ************************************************************************ 1100; * SWI HANDLER * 1110; ************************************************************************ 1120; 1130.switable ; table of swi names recognised 1140EQUS "WSWimpTools" ; by this module 1150EQUB 0 1160EQUS "Version" 1170EQUB 0 1180EQUS "TaskIcon" 1190EQUB 0 1200EQUS "PopOpenWindow" 1210EQUB 0 1220EQUS "OpenPaneWindow" 1230EQUB 0 1240EQUS "PopOpenPaneWindow" 1250EQUB 0 1260EQUS "CloseWindow" 1270EQUB 0 1280EQUS "ToggleIcon" 1290EQUB 0 1300EQUS "SetIconSelect" 1310EQUB 0 1320EQUS "GetIconSelectState" 1330EQUB 0 1340EQUS "SetIconEnable" 1350EQUB 0 1360EQUS "GetIconEnableState" 1370EQUB 0 1380EQUS "SetIconText" 1390EQUB 0 1400EQUS "GetIconText" 1410EQUB 0 1420EQUS "SetIconValidation" 1430EQUB 0 1440EQUS "GetIconValidation" 1450EQUB 0 1460EQUS "SetWindowTitle" 1470EQUB 0 1480EQUS "GetWindowTitle" 1490EQUB 0 1500EQUS "UpdateWindow" 1510EQUB 0 1520EQUS "MakeMenuHeader" 1530EQUB 0 1540EQUS "MakeMenuItem" 1550EQUB 0 1560EQUS "SetMenuItemText" 1570EQUB 0 1580EQUS "GetMenuItemText" 1590EQUB 0 1600EQUS "MakeMenuItemLast" 1610EQUB 0 1620EQUS "SetMenuItemTick" 1630EQUB 0 1640EQUS "GetMenuItemTick" 1650EQUB 0 1660EQUS "SetMenuItemMessage" 1670EQUB 0 1680EQUS "GetMenuItemMessage" 1690EQUB 0 1700EQUS "SetMenuItemEnable" 1710EQUB 0 1720EQUS "GetMenuItemEnable" 1730EQUB 0 1740EQUS "SetMenuItemOptions" 1750EQUB 0 1760EQUS "GetMenuItemOptions" 1770EQUB 0 1780EQUS "AttachSubMenu" 1790EQUB 0 1800EQUS "LoadMenus" 1810EQUB 0 1820EQUS "IconBarMenu" 1830EQUB 0 1840EQUS "MenuAdjust" 1850EQUB 0 1860EQUS "MakeMenu" 1870EQUB 0 1880EQUS "GetText" 1890EQUB 0 1900EQUS "StartDrag" 1910EQUB 0 1920EQUS "SendSave" 1930EQUB 0 1940EQUS "SendLoad" 1950EQUB 0 1960EQUS "SendSaveAck" 1970EQUB 0 1980EQUS "SendLoadAck" 1990EQUB 0 2000EQUS "LoadTemplates" 2010EQUB 0 2020EQUS "WindowConvertParameter" 2030EQUB 0 2040EQUS "GetTemplateInfo" 2050EQUB 0 2060EQUS "LoseTemplateFonts" 2070EQUB 0 2080EQUS "Register" 2090EQUB 0 2100EQUS "DeRegister" 2110EQUB 0 2120EQUS "LoadSprites" 2130EQUB 0 2140EQUS "GetLeaf" 2150EQUB 0 2160ALIGN 2170EQUD 0 2180; 2190.swicode ; SWI start up code 2200 STMFD (sp)!,{link} 2210 STMFD (sp)!,{r8-r11} 2220 LDR ws,[ws] ; load r12 with the workspace pointer 2230 CMP r11,#49 ; check offset number 2240 BGT dontknowswi ; error if too big for this module 2250 MOV r9,r11,LSL#2 ; calculate offset for jump 2260 ADD r9,r9,pc ; taking into account ARM 2270 MOV pc,r9 ; pipelining by adjusting by 4 bytes 2280; 2290; the following is the 2300; SWI jump table 2310; 2320 B version 2330 B taskicon 2340 B popwind 2350 B openpanewindow 2360 B popopenpanewindow 2370 B closewind 2380 B toggleicon 2390 B setselect 2400 B geticonselect 2410 B seticonenable 2420 B geticonenable 2430 B seticontext 2440 B geticontext 2450 B seticonvalidation 2460 B geticonvalidation 2470 B setwindowtitle 2480 B getwindowtitle 2490 B updatewindow 2500 B menuheader 2510 B makemenuitem 2520 B setmenuitem 2530 B getmenuitem 2540 B setmenuitemlast 2550 B settick 2560 B gettick 2570 B setmessage 2580 B getmessage 2590 B setenable 2600 B getenable 2610 B setmenuoptions 2620 B getmenuoptions 2630 B attachsub 2640 B loadmenus 2650 B iconbarmenu 2660 B menuadjust 2670 B makemenu 2680 B gettext 2690 B startdrag 2700 B sendsave 2710 B sendload 2720 B sendsaveack 2730 B sendloadack 2740 B loadtemplates 2750 B windowconvert 2760 B gettemplateinfo 2770 B losetemplatefonts 2780 B register 2790 B deregister 2800 B loadsprites 2810 B swigetleaf 2820; 2830; ************************************************************************ 2840; * MAIN SWI CODING * 2850; ************************************************************************ 2860; 2870.exitswi ; restore registers and exit module 2880 LDMFD (sp)!,{r8-r11} 2890 LDMFD (sp)!,{pc} 2900; 2910.makeerror ; make error message 2920 LDMFD (sp)!,{r8-r11} ; r0 points to error message block 2930 LDMFD (sp)!,{link} 2940 ORR link,link,#1<<28 2950 MOVS pc,link 2960; 2970.strnotindirected ; error message 2980 LDMFD (sp)!,{r1} 2990.strnotindirected2 3000 ADR r0,notindstr 3010 B makeerror 3020; 3030.notindstr 3040EQUD ErrorBase+2 3050EQUS "Icon/Menu string is not indirected" 3060EQUB 0 3070ALIGN 3080; 3090.dontknowswi ; error message 3100 ADR r0,dontknowstr 3110 B makeerror 3120; 3130; 3140.dontknowstr 3150EQUD ErrorBase+1 3160EQUS "WimpLib does not recognise that SWI" 3170EQUB 0 3180ALIGN 3190; 3200; r0 = 0 returns r0 = version number 3210; r0 =-1 prints version 3220; 3230.version 3240 CMP r0,#0 3250 MOVEQ r0,#142 3260 BEQ exitswi 3270 SWI "OS_WriteS" 3280EQUS "Wimp Library Version 1.42 ("+date$+")" 3290EQUB 10 3300EQUB 10 3310EQUB 13 3320EQUB 0 3330ALIGN 3340 B exitswi 3350; 3360; this subroutine checks a register and if it points to the table of window 3370; names and handles checks r0. If r0 < &100 then it contains a window 3380; number. Otherwise it contains the address of a window string. It 3390; converts the string or number to the window handle using 3400; Window Convert Parameter 3410; 3420; convertname1 - r1 carries the address of the handle block 3430; 3440.convertname1 3450 STMFD (sp)!,{r1,r2,link} 3460 MOV r2,r0 3470 CMP r2,#&100 3480 MOVLT r0,#2 3490 MOVGE r0,#4 3500 SWI "XWSWimpTools_WindowConvertParameter" 3510 LDMFD (sp)!,{r1,r2,pc} 3520; 3530; convertname3 - r3 carries the address of the handle block 3540; 3550.convertname3 3560 STMFD (sp)!,{r1,r2,link} 3570 MOV r1,r3 3580 MOV r2,r0 3590 CMP r2,#&100 3600 MOVLT r0,#2 3610 MOVGE r0,#4 3620 SWI "XWSWimpTools_WindowConvertParameter" 3630 LDMFD (sp)!,{r1,r2,pc} 3640; 3650; 3660; convertname4 - r4 carries the address of the handle block 3670; 3680.convertname4 3690 STMFD (sp)!,{r1,r2,link} 3700 MOV r1,r4 3710 MOV r2,r0 3720 CMP r2,#&100 3730 MOVLT r0,#2 3740 MOVGE r0,#4 3750 SWI "XWSWimpTools_WindowConvertParameter" 3760 LDMFD (sp)!,{r1,r2,pc} 3770; 3780; r0 = window handle 3790; 3800.popwind 3810 STMFD (sp)!,{r1} 3820 TEQ r1,#0 3830 BLNE convertname1 3840 ADD r1,ws,#blk 3850 STR r0,[r1] 3860 SWI "XWimp_GetWindowState" 3870 SWIVC "XWimp_OpenWindow" 3880 LDMFD (sp)!,{r1} 3890 B exitswi 3900; 3910; r1 = block returned by Poll 2 3920; r2 = icon to fit pane to 3930; r3 = window handle of pane window 3940; 3950.openpanewindow 3960 TEQ r4,#0 3970 BEQ openpanewindow1 3980 STMFD (sp)!,{r0} 3990 MOV r0,r3 4000 BL convertname4 4010 MOV r3,r0 4020 LDMFD (sp)!,{r0} 4030.openpanewindow1 4040 LDR r8,[r1] 4050 LDR r9,[r1,#20] 4060 LDR r10,[r1,#4] 4070 SUB r10,r10,r9 4080 LDR r9,[r1,#24] 4090 LDR r11,[r1,#16] 4100 SUB r11,r11,r9 4110 MOV r9,r1 4120 ADD r1,ws,#blk 4130 ADD r1,r1,#40 4140 STR r8,[r1] 4150 STR r2,[r1,#4] 4160 SWI "XWimp_GetIconState" 4170 BVS exitswi 4180 STMFD (sp)!,{r4-r7} 4190 LDR r4,[r1,#8] 4200 ADD r4,r4,r10 4210 LDR r5,[r1,#12] 4220 ADD r5,r5,r11 4230 LDR r6,[r1,#16] 4240 ADD r6,r6,r10 4250 LDR r7,[r1,#20] 4260 ADD r7,r7,r11 4270 STR r3,[r1] 4280 SWI "XWimp_GetWindowState" 4290 LDMVSFD (sp)!,{r4-r7} 4300 BVS exitswi 4310 STR r4,[1,#4] 4320 STR r5,[r1,#8] 4330 STR r6,[r1,#12] 4340 STR r7,[r1,#16] 4350 LDR r8,[r9,#28] 4360 STR r8,[r1,#28] 4370 LDMFD (sp)!,{r4-r7} 4380 SWI "XWimp_OpenWindow" 4390 BVS exitswi 4400 MOV r1,r9 4410 STR r3,[r1,#28] 4420 SWI "XWimp_OpenWindow" 4430 B exitswi 4440; 4450; As above but r0 = window handle 4460; 4470.popopenpanewindow 4480 STMFD (sp)!,{r1} 4490 ADD r1,ws,#blk 4500 TEQ r4,#0 4510 BLNE convertname4 4520 STR r0,[r1] 4530 SWI "XWimp_GetWindowState" 4540 LDMVSFD (sp)!,{r1} 4550 BVS exitswi 4560 MVN r8,#0 4570 STR r8,[r1,#28] 4580 SWI "XWSWimpTools_OpenPaneWindow" 4590 LDMFD (sp)!,{r1} 4600 B exitswi 4610; 4620; r0 = window handle 4630; 4640.closewind 4650 STMFD (sp)!,{r1} 4660 TEQ r1,#0 4670 BLNE convertname1 4680 ADD r1,ws,#blk 4690 STR r0,[r1] 4700 SWI "XWimp_CloseWindow" 4710 LDMFD (sp)!,{r1} 4720 B exitswi 4730; 4740; GETSTATE 4750; -------- 4760; this routine sets up a block to get an icons state 4770; 4780.getstate 4790 STMFD (sp)!,{r7,link} 4800 MOV r7,r1 4810 ADD r1,ws,#blk 4820 STR r0,[r1,#0] 4830 STR r7,[r1,#4] 4840 LDMFD (sp)!,{r7,pc} 4850; 4860; r0 = window handle 4870; r1 = icon handle 4880; returns : 4890; r0 = new icon state true or false (-1 or 0) 4900; 4910.toggleicon 4920 STMFD (sp)!,{r1} 4930 TEQ r3,#0 4940 BLNE convertname3 4950 BL getstate 4960 SWI "XWimp_GetIconState" 4970 BVS toggleout 4980 LDR r9,[r1,#24] 4990 AND r9,r9,#1<<21 5000 MOV r11,#1<<21 5010 EOR r9,r9,r11 5020 MOV r10,r9 5030 STR r9,[r1,#8] 5040 STR r11,[r1,#12] 5050 SWI "XWimp_SetIconState" 5060 BVS toggleout 5070 MVN r0,#0 5080 CMP r10,#0 5090 MOVEQ r0,#0 5100.toggleout 5110 LDMFD (sp)!,{r1} 5120 B exitswi 5130; 5140; r0 = window handle 5150; r1 = icon handle 5160; r2 = true or false to set or unset (-1 or 0) 5170; 5180.setselect 5190 STMFD (sp)!,{r1} 5200 TEQ r3,#0 5210 BLNE convertname3 5220 BL getstate 5230 SWI "XWimp_GetIconState" 5240 BVS setselectout 5250 AND r9,r2,#1<<21 5260 STR r9,[r1,#8] 5270 MOV r9,#1<<21 5280 STR r9,[r1,#12] 5290 SWI "XWimp_SetIconState" 5300.setselectout 5310 LDMFD (sp)!,{r1} 5320 B exitswi 5330; 5340; r0 = window handle 5350; r1 = icon handle 5360; returns : 5370; r2 = true or false to set or unset (-1 or 0) 5380; 5390.geticonselect 5400 STMFD (sp)!,{r1} 5410 TEQ r3,#0 5420 BLNE convertname3 5430 BL getstate 5440 SWI "XWimp_GetIconState" 5450 BVS exitswi 5460 LDR r9,[r1,#24] 5470 AND r9,r9,#1<<21 5480 MVN r0,#0 5490 CMP r9,#0 5500 MOVEQ r0,#0 5510.getselectout 5520 LDMFD (sp)!,{r1} 5530 B exitswi 5540; 5550; r0 = window handle 5560; r1 = icon handle 5570; r2 = true or false to set or unset (-1 or 0) 5580; 5590.seticonenable 5600 STMFD (sp)!,{r1} 5610 TEQ r3,#0 5620 BLNE convertname3 5630 BL getstate 5640 SWI "XWimp_GetIconState" 5650 BVS enableout 5660 AND r9,r2,#1<<22 5670 STR r9,[r1,#8] 5680 MOV r9,#1<<22 5690 STR r9,[r1,#12] 5700 SWI "XWimp_SetIconState" 5710.enableout 5720 LDMFD (sp)!,{r1} 5730 B exitswi 5740; 5750; r0 = window handle 5760; r1 = icon handle 5770; returns 5780; r2 = true or false to set or unset (-1 or 0) 5790; 5800.geticonenable 5810 STMFD (sp)!,{r1} 5820 TEQ r3,#0 5830 BLNE convertname3 5840 BL getstate 5850 SWI "XWimp_GetIconState" 5860 BVS getenableout 5870 LDR r9,[r1,#24] 5880 AND r9,r9,#1<<22 5890 MVN r0,#0 5900 CMP r9,#0 5910 MOVEQ r0,#0 5920.getenableout 5930 LDMFD (sp)!,{r1} 5940 B exitswi 5950; 5960; r0 = window handle 5970; r1 = icon handle 5980; r2 = string ending in a control character ie ASCII < 33 5990; 6000.seticontext 6010 STMFD (sp)!,{r1} 6020 TEQ r3,#0 6030 BLNE convertname3 6040 BL getstate 6050 SWI "XWimp_GetIconState" 6060 BVS settextout 6070 LDR r9,[r1,#24] 6080 TST r9,#1<<8 6090 BEQ strnotindirected 6100 MOV r9,#0 6110 STR r9,[r1,#8] 6120 STR r9,[r1,#12] 6130 MOV r9,r2 6140 LDR r10,[r1,#28] 6150 LDR r11,[r1,#36] 6160 BL copystring 6170 SWI "XWimp_SetIconState" 6180.settextout 6190 LDMFD (sp)!,{r1} 6200 B exitswi 6210; 6220; r0 = window handle 6230; r1 = icon handle 6240; returns : 6250; r0 = text string 6260; 6270.geticontext 6280 STMFD (sp)!,{r1} 6290 TEQ r3,#0 6300 BLNE convertname3 6310 BL getstate 6320 SWI "XWimp_GetIconState" 6330 BVS gettextout 6340 LDR r9,[r1,#24] 6350 TST r9,#1<<8 6360 ADDEQ r0,r1,#28 6370 BEQ gettextout 6380 LDR r0,[r1,#28] 6390.gettextout 6400 LDMFD (sp)!,{r1} 6410 B exitswi 6420; 6430; r0 = window handle 6440; r1 = icon handle 6450; r2 = string ending in a control character ie ASCII < 33 6460; 6470.seticonvalidation 6480 STMFD (sp)!,{r1} 6490 TEQ r3,#0 6500 BLNE convertname3 6510 BL getstate 6520 SWI "XWimp_GetIconState" 6530 BVS setvalidout 6540 LDR r9,[r1,#24] 6550 TST r9,#1<<8 6560 BEQ strnotindirected 6570 MOV r9,0 6580 STR r9,[r1,#8] 6590 STR r9,[r1,#12] 6600 MOV r9,r2 6610 LDR r10,[r1,#32] 6620 MOV r11,#255 6630 BL copystring 6640 SWI "XWimp_SetIconState" 6650.setvalidout 6660 LDMFD (sp)!,{r1} 6670 B exitswi 6680; 6690; r0 = window handle 6700; r1 = icon handle 6710; returns : 6720; r0 = text string 6730; 6740.geticonvalidation 6750 STMFD (sp)!,{r1} 6760 TEQ r3,#0 6770 BLNE convertname3 6780 BL getstate 6790 SWI "XWimp_GetIconState" 6800 BVS getvalidout 6810 LDR r9,[r1,#24] 6820 TST r9,#1<<8 6830 BEQ strnotindirected 6840 LDR r0,[r1,#32] 6850.getvalidout 6860 LDMFD (sp)!,{r1} 6870 B exitswi 6880; 6890; r0 = window handle 6900; r2 = text string 6910; 6920.setwindowtitle 6930 STMFD (sp)!,{r1} 6940 TEQ r3,#0 6950 BLNE convertname3 6960 ADD r1,ws,#blk 6970 STR r0,[r1] 6980 SWI "XWimp_GetWindowInfo" 6990 BVS settitleout 7000 LDR r8,[r1,#60] 7010 TST r8,#1<<8 7020 BEQ wstrnotindirected 7030 MOV r9,r2 7040 LDR r10,[r1,#76] 7050 LDR r11,[r1,#84] 7060 BL copystring 7070.settitleout 7080 LDMFD (sp)!,{r1} 7090 B exitswi 7100; 7110.wstrnotindirected ; error message 7120 LDMFD (sp)!,{r1} 7130 ADR r0,wnotindstr 7140 B makeerror 7150; 7160.wnotindstr 7170EQUD ErrorBase+12 7180EQUS "Window title string is not indirected" 7190EQUB 0 7200ALIGN 7210; 7220; r0 = window handle 7230; 7240; returns 7250; 7260; r2 = text string 7270; 7280.getwindowtitle 7290 STMFD (sp)!,{r1} 7300 TEQ r3,#0 7310 BLNE convertname3 7320 ADD r1,ws,#blk 7330 STR r0,[r1] 7340 SWI "XWimp_GetWindowInfo" 7350 BVS gettitleout 7360 LDR r8,[r1,#60] 7370 TST r8,#1<<8 7380 ADDEQ r2,r1,#76 7390 BEQ gettitleout 7400 LDR r2,[r1,#76] 7410.gettitleout 7420 LDMFD (sp)!,{r1} 7430 B exitswi 7440; 7450; r0 = window handle 7460; 7470.updatewindow 7480 STMFD (sp)!,{r1,r2,r3,r4} 7490 TEQ r1,#0 7500 BLNE convertname1 7510 ADD r1,ws,#blk 7520 STR r0,[r1] 7530 SWI "XWimp_GetWindowState" 7540 BVS updatewindow1 7550 LDR r0,[r1,#32] 7560 TST r0,#1<<16 7570 BEQ updatewindow1 7580 SWI "XWimp_GetWindowOutline" 7590 LDR r0,[r1,#4] 7600 LDR r2,[r1,#8] 7610 LDR r3,[r1,#12] 7620 LDR r4,[r1,#16] 7630 MOV r1,r0 7640 MVN r0,#0 7650 SWIVC "XWimp_ForceRedraw" 7660.updatewindow1 7670 LDMFD (sp)!,{r1,r2,r3,r4} 7680 B exitswi 7690; 7700; r0 = menu block 7710; r1 = menu string 7720; r2 = width of menu in OS units 7730; returns: 7740; r0 = position in menu block for first menu item 7750; 7760.menuheader 7770 MOV r9,r1 7780 MOV r10,r0 7790 MOV r11,#11 7800 BL copystring 7810 LDR r9,(menudata) 7820 STR r9,[r0,#12] 7830 STR r2,[r0,#16] 7840 MOV r9,#44 7850 STR r9,[r0,#20] 7860 MOV r9,#0 7870 STR r9,[r0,#24] 7880 ADD r0,r0,#28 7890 B exitswi 7900.menudata 7910EQUD &00070207 7920; 7930.makemenuitem 7940 TEQ r3,#0 7950 BEQ makemenuitem2 7960 LDR r8,(textdata) 7970 TEQ r4,#0 7980 ORRNE r8,r8,#&F000 7990 ORRNE r2,r2,#1<<2 8000 STR r2,[r0] 8010 STR r8,[r0,#8] 8020 MOV r9,r1 8030 MOV r10,r3 8040 MOV r11,#255 8050 BL copystring 8060 STR r3,[r0,#12] 8070 TEQ r4,#0 8080 STREQ r11,[r0,#20] 8090 STRNE r4,[r0,#20] 8100 MVN r8,#0 8110 STR r8,[r0,#16] 8120 STR r8,[r0,#4] 8130 MOV r3,r10 8140 ADD r0,r0,#24 8150 B exitswi 8160.textdata 8170EQUD &07000121 8180.textdata2 8190EQUD &07000021 8200; 8210; r0 = menu block 8220; r1 = text string 8230; r2 = options 8240; returns: 8250; r0 = position of next menu item ( for next make menu item call ) 8260; 8270.makemenuitem2 8280 STR r2,[r0,#0] 8290 MVN r8,#0 8300 STR r8,[r0,#4] 8310 LDR r8,(textdata2) 8320 STR r8,[r0,#8] 8330 ADD r10,r0,#12 8340 MOV r9,r1 8350 MOV r11,#11 8360 BL copystring 8370 ADD r0,r0,#24 8380 B exitswi 8390; 8400; r0 = menu block 8410; r1 = menu item number ( starting at 0 ) 8420; r2 = menu string 8430; 8440.setmenuitem 8450 ADD r8,r0,#28 8460 ADD r8,r8,r1,LSL#4 8470 ADD r8,r8,r1,LSL#3 8480 LDR r9,[r8,#8] 8490 TST r9,#1<<8 8500 BEQ strnotindirected2 8510 LDR r10,[r8,#12] 8520 MOV r9,r2 8530 LDR r11,[r8,#20] 8540 BL copystring 8550 B exitswi 8560; 8570; r0 = menu block 8580; r1 = menu item number ( starting at 0 ) 8590; returns: 8600; r0 = menu item text 8610; 8620.getmenuitem 8630 ADD r8,r0,#28 8640 ADD r8,r8,r1,LSL#4 8650 ADD r8,r8,r1,LSL#3 8660 LDR r0,[r8,#8] 8670 TST r0,#1<<8 8680 ADDEQ r0,r8,#12 8690 BEQ exitswi 8700 LDR r0,[r8,#12] 8710 B exitswi 8720; 8730.setmenuitemlast 8740 ADD r8,r0,#28 8750 ADD r8,r8,r1,LSL#4 8760 ADD r8,r8,r1,LSL#3 8770 LDR r0,[r8,#0] 8780 MVN r10,#&80 8790 AND r2,r2,#&80 8800 AND r0,r0,r10 8810 ORR r0,r0,#&80 8820 STR r0,[r8,#0] 8830 B exitswi 8840; 8850.settick 8860 ADD r8,r0,#28 8870 ADD r8,r8,r1,LSL#4 8880 ADD r8,r8,r1,LSL#3 8890 MVN r9,#1 8900 LDR r0,[r8,#0] 8910 AND r0,r0,r9 8920 AND r2,r2,#1 8930 ORR r0,r0,r2 8940 STR r0,[r8,#0] 8950 B exitswi 8960; 8970.gettick 8980 ADD r8,r0,#28 8990 ADD r8,r8,r1,LSL#4 9000 ADD r8,r8,r1,LSL#3 9010 LDR r10,[r8,#0] 9020 TST r10,#1 9030 MOV r0,#0 9040 MVNNE r0,#0 9050 B exitswi 9060; 9070.setmessage 9080 ADD r8,r0,#28 9090 ADD r8,r8,r1,LSL#4 9100 ADD r8,r8,r1,LSL#3 9110 MVN r9,#1<<3 9120 LDR r0,[r8,#0] 9130 AND r0,r0,r9 9140 AND r2,r2,#1<<3 9150 ORR r0,r0,r2 9160 STR r0,[r8,#0] 9170 B exitswi 9180; 9190.getmessage 9200 ADD r8,r0,#28 9210 ADD r8,r8,r1,LSL#4 9220 ADD r8,r8,r1,LSL#3 9230 LDR r10,[r8,#0] 9240 TST r10,#1<<3 9250 MOV r0,#0 9260 MVNNE r0,#0 9270 B exitswi 9280; 9290.setenable 9300 ADD r8,r0,#28 9310 ADD r8,r8,r1,LSL#4 9320 ADD r8,r8,r1,LSL#3 9330 MVN r9,#1<<22 9340 LDR r0,[r8,#8] 9350 AND r0,r0,r9 9360 AND r2,r2,#1<<22 9370 ORR r0,r0,r2 9380 STR r0,[r8,#8] 9390 B exitswi 9400; 9410.getenable 9420 ADD r8,r0,#28 9430 ADD r8,r8,r1,LSL#4 9440 ADD r8,r8,r1,LSL#3 9450 LDR r10,[r8,#8] 9460 TST r10,#1<<22 9470 MOV r0,#0 9480 MVNNE r0,#0 9490 B exitswi 9500; 9510.attachsub 9520 TEQ r3,#0 9530 BEQ attachsub1 9540 STMFD (sp)!,{r0} 9550 MOV r0,r2 9560 BL convertname3 9570 MOV r2,r0 9580 LDMFD (sp)!,{r0} 9590.attachsub1 9600 ADD r8,r0,#28 9610 ADD r8,r8,r1,LSL#4 9620 ADD r8,r8,r1,LSL#3 9630 STR r2,[r8,#4] 9640 B exitswi 9650; 9660.loadmenus 9670 B notimplemented 9680; 9690.gettext 9700 B exitswi 9710; 9720.taskicon 9730 STMFD (sp)!,{r1,r7} 9740 MOV r7,r1 9750 ADD r1,ws,#blk 9760 STR r0,[r1,#0] 9770 MOV r0,#0 9780 STR r0,[r1,#4] 9790 STR r0,[r1,#8] 9800 MOV r0,#68 9810 STR r0,[r1,#12] 9820 STR r0,[r1,#16] 9830 ADR r8,flagdata 9840 LDR r0,[r8,r7,LSL#2] 9850 STR r0,[r1,#20] 9860 CMP r7,#0 ; is it a normal sprite? 9870 BNE taskicon1 9880 ADD r10,r1,#24 9890 MOV r9,r2 9900 MOV r11,#12 9910 BL copystring 9920 B taskicon0 9930.taskicon1 ; if not then r2 is a block with the 9940 STR r2,[r1,#24] ; sprite name in it 9950 MVN r0,#0 9960 STR r0,[r1,#28] 9970 MOV r9,r2 9980 BL countchars ; find the length of the string 9990 STR r11,[r1,#32] 10000 CMP r7,#1 10010 BNE taskicon0 ; check to see if it an 10020 ; indirected sprite 10030 STR r3,[r1,#28] ; and point to spritepool 10040.taskicon0 10050 SWI "XWimp_CreateIcon" 10060 LDMFD (sp)!,{r1,r7} 10070 B exitswi 10080.flagdata 10090 EQUD &7000301A 10100 EQUD &7000311A 10110 EQUD &7000313D 10120; 10130.setmenuoptions 10140 ADD r7,r0,#28 10150 ADD r7,r7,r1,LSL#4 10160 ADD r7,r7,r1,LSL#3 10170 LDR r0,[r7,#0] 10180 STR r2,[r7,#0] 10190 B exitswi 10200; 10210.getmenuoptions 10220 ADD r7,r0,#28 10230 ADD r7,r7,r1,LSL#4 10240 ADD r7,r7,r1,LSL#3 10250 LDR r0,[r7,#0] 10260 B exitswi 10270; 10280.iconbarmenu 10290 STMFD (sp)!,{r1-r3} 10300 MOV r8,r0 10310 ADD r1,ws,#blk 10320 SWI "XWimp_GetPointerInfo" 10330 BVS iconbarout 10340 LDR r2,[r1,#0] 10350 SUB r2,r2,#64 10360 MOV r3,#96 10370 ADD r9,r8,#28 10380.barmenu1 10390 ADD r3,r3,#44 10400 LDR r10,[r9,#0] 10410 TST r10,#1<<1 10420 ADDNE r3,r3,#24 10430 ADD r9,r9,#24 10440 TST r10,#1<<7 10450 BEQ barmenu1 10460 MOV r1,r8 10470 SWI "XWimp_CreateMenu" 10480.iconbarout 10490 LDMFD (sp)!,{r1-r3} 10500 B exitswi 10510; 10520.menuadjust 10530 STMFD (sp)!,{r1-r3} 10540 MOV r8,r0 10550 ADD r1,ws,#blk 10560 SWI "XWimp_GetPointerInfo" 10570 BVS menuadjout 10580 LDR r9,[r1,#8] 10590 TST r9,#1 10600 BEQ menuadjout 10610 MOV r1,r8 10620 MOV r2,#0 10630 MOV r3,#0 10640 SWI "XWimp_CreateMenu" 10650.menuadjout 10660 LDMFD (sp)!,{r1-r3} 10670 B exitswi 10680; 10690; the following routine reads the character before the menu entry in the 10700; string and decodes it as 10710; 10720; AND = ticked ! 10730; - = dashed line follows 10740; > = generate messages for submenu 10750; OR = dimmed 10760; ? = writeable 10770; 10780.readmenuflag 10790 LDRB r6,[r3,#0] 10800 TEQ r6,#ASC"�" 10810 ORREQ r8,r8,#1<<0 10820 ADDEQ r3,r3,#1 10830 MOVEQ pc,link 10840 TEQ r6,#ASC"-" 10850 ORREQ r8,r8,#1<<1 10860 ADDEQ r3,r3,#1 10870 MOVEQ pc,link 10880 TEQ r6,#ASC"?" 10890 ORREQ r8,r8,#1<<2 10900 ADDEQ r3,r3,#1 10910 MOVEQ pc,link 10920 TEQ r6,#ASC">" 10930 ORREQ r8,r8,#1<<3 10940 ADDEQ r3,r3,#1 10950 MOVEQ pc,link 10960 TEQ r6,#ASC"�" 10970 ORREQ r7,r7,#1<<22 10980 ADDEQ r3,r3,#1 10990 MOV pc,link 11000; 11010; r0 = menu block 11020; r1 = indirected text string block 11030; r2 = menu string 11040; 11050; returns 11060; r0 = next location after menu block 11070; r1 = next location in string block 11080; 11090.makemenu 11100 STMFD (sp)!,{r6,r7} 11110 MOV r8,#0 11120 LDRB r9,[r3,#0] 11130 TEQ r9,#ASC"#" 11140 ADDEQ r3,r3,#1 11150 STRNE r8,[r0,#0] 11160 BNE makemenu1 11170 MOV r9,r3 11180 MOV r10,#ASC(",") 11190 BL countspecial 11200 TST r11,#&100 11210 BNE badmenustring 11220 CMP r11,#11 11230 BGT badmenutitle 11240 MOV r9,r3 11250 MOV r10,r0 11260 BL copychars 11270 ADD r3,r9,#1 11280.makemenu1 11290 LDR r8,(menudata) 11300 STR r8,[r0,#12] 11310 MOV r8,#44 11320 STR r8,[r0,#20] 11330 STR r2,[r0,#16] 11340 MOV r9,#0 11350 STR r9,[r0,#24] 11360 ADD r0,r0,#28 11370.makemenuloop 11380 MOV r8,#0 11390 LDR r7,(textdata2) 11400 BL readmenuflag 11410 BL readmenuflag 11420 BL readmenuflag 11430 BL readmenuflag 11440 BL readmenuflag 11450 MVN r9,#0 11460 STR r9,[r0,#4] 11470 MOV r9,r3 11480 MOV r10,#ASC"," 11490 BL countspecial 11500 TST r11,#&100 11510 ORRNE r8,r8,#1<<7 11520 ANDNE r11,r11,#&FF 11530 STR r8,[r0] 11540 CMP r11,#11 11550 BGT makemenu2 11560 STR r7,[r0,#8] 11570 MOV r9,r3 11580 ADD r10,r0,#12 11590 BL copychars 11600 ADD r3,r9,#1 11610 ADD r0,r0,#24 11620 LDRB r9,[r3,#-1] 11630 TEQ r9,#ASC"," 11640 BEQ makemenuloop 11650 B makemenuout 11660.makemenu2 11670 ORR r7,r7,#&100 11680 STR r7,[r0,#8] 11690 STR r11,[r0,#20] 11700 STR r1,[r0,#12] 11710 MVN r9,#0 11720 STR r9,[r0,#16] 11730 MOV r9,r3 11740 MOV r10,r1 11750 BL copychars 11760 ADD r3,r9,#1 11770 ADD r1,r10,#1 11780 ADD r0,r0,#24 11790 LDRB r9,[r3,#-1] 11800 TEQ r9,#ASC"," 11810 BEQ makemenuloop 11820.makemenuout 11830 LDMFD (sp)!,{r6,r7} 11840 B exitswi 11850; 11860.badmenustring ; error message 11870 LDMFD (sp)!,{r6,r7} 11880 ADR r0,bdmenustr 11890 B makeerror 11900; 11910.bdmenustr 11920EQUD ErrorBase+4 11930EQUS "Incorrect menu desription string!" 11940EQUB 0 11950ALIGN 11960; 11970.badmenutitle ; error message 11980 LDMFD (sp)!,{r6,r7} 11990 ADR r0,bdmenutle 12000 B makeerror 12010; 12020.bdmenutle 12030EQUD ErrorBase+5 12040EQUS "Menu title too long!" 12050EQUB 0 12060ALIGN 12070; 12080; r0 = window handle 12090; r1 = icon number 12100; r2 = sprite block 12110; 12120; returns 12130; r0 = drag type ; -1 = used DragASprite ; 0 = used Wimp_DragBox 12140; 12150.startdrag 12160 STMFD (sp)!,{r3-r7} 12170 TEQ r3,#0 12180 BLNE convertname3 12190 MOV r8,r0 12200 MOV r9,r1 12210 ADD r1,ws,#blk 12220 STR r8,[r1] 12230 SWI "XWimp_GetWindowState" 12240 BVS setupdragout 12250 LDR r7,[r1,#20] 12260 LDR r10,[r1,#4] 12270 SUB r10,r10,r7 12280 LDR r7,[r1,#24] 12290 LDR r11,[r1,#16] 12300 SUB r11,r11,r7 12310 STR r9,[r1,#4] 12320 SWI "XWimp_GetIconState" 12330 BVS setupdragout 12340 MOV r7,#5 12350 STR r7,[r1,#4] 12360 LDR r7,[r1,#8] 12370 ADD r7,r10,r7 12380 STR r7,[r1,#8] 12390 LDR r7,[r1,#12] 12400 ADD r7,r11,r7 12410 STR r7,[r1,#12] 12420 LDR r7,[r1,#16] 12430 ADD r7,r10,r7 12440 STR r7,[r1,#16] 12450 LDR r7,[r1,#20] 12460 ADD r7,r11,r7 12470 STR r7,[r1,#20] 12480 MOV r7,#0 12490 STR r7,[r1,#24] 12500 STR r7,[r1,#28] 12510 MVN r7,#&80000000 12520 STR r7,[r1,#32] 12530 STR r7,[r1,#36] 12540 MOV r7,r2 12550 ADR r1,(dragasprite) 12560 SWI "XOS_SWINumberFromString" 12570 BVS wimpdrag 12580 MOV r0,#161 12590 MOV r1,#28 12600 SWI "XOS_Byte" 12610 BVS exitswi 12620 TST r2,#1<<1 12630 BEQ wimpdrag 12640 ADD r1,ws,#(blk+48) 12650 STR r8,[r1] 12660 STR r9,[r1,#4] 12670 SWI "XWimp_GetIconState" 12680 BVS setupdragout 12690 LDR r0,[r1,#24] 12700 TST r0,#2 12710 BEQ wimpdrag 12720 TST r0,#1 12730 BNE dragindirect 12740 TST r0,#&100 12750.dragdirect 12760 LDRNE r2,[r1,#28] 12770 ADDEQ r2,r1,#28 12780 MOV r1,r7 12790.dragsprite 12800 MOV r0,#%11000101 12810 ADD r3,ws,#blk 12820 ADD r3,r3,#8 12830 ADD r4,r3,#16 12840 SWI "XDragASprite_Start" 12850 MVN r0,#0 12860 B setupdragout 12870.wimpdrag 12880 ADD r1,ws,#blk 12890 SWI "XWimp_DragBox" 12900 BVS setupdragout 12910 MOV r0,#0 12920 ADDS r0,r0,r0 12930.setupdragout 12940 LDMFD (sp)!,{r3-r7} 12950 B exitswi 12960.dragindirect 12970 TST r0,#&100 12980 BEQ dragdirect 12990 LDR r0,[r1,#32] 13000 CMN r0,#1 13010 LDREQ r2,[r1,#28] 13020 MOVEQ r1,r7 13030 BEQ dragsprite 13040 LDR r2,[r1,#32] 13050.dragindirect1 13060 LDRB r0,[r2],#1 13070 CMP r0,#32 13080 BLT wimpdrag 13090 TEQ r0,#ASC";" 13100 BEQ dragindirect1 13110 ORR r0,r0,#&20 13120 TEQ r0,#ASC"s" 13130 MOVEQ r1,r7 13140 BEQ dragsprite 13150.dragindirect2 13160 LDRB r0,[r2],#1 13170 CMP r0,#32 13180 BLT wimpdrag 13190 TEQ r0,#ASC";" 13200 BEQ dragindirect1 13210 B dragindirect2 13220; 13230.dragasprite 13240EQUS "DragASprite_Start" 13250EQUB 0 13260ALIGN 13270; 13280.sendsave 13290 STMFD (sp)!,{r0-r3} 13300 MOV r9,r2 13310 SWI "XWimp_GetPointerInfo" ; get position of pointer 13320 BVS startsaveout 13330 LDR r8,[r1,#12] 13340 STR r8,[r1,#20] ; r1!20 = destination window handle 13350 LDR r8,[r1,#16] 13360 STR r8,[r1,#24] ; r1!24 = destination icon handle 13370 LDR r8,[r1] 13380 STR r8,[r1,#28] ; r1!28 = pointer x position 13390 LDR r8,[r1,#4] 13400 STR r8,[r1,#32] ; r1!32 = pointer y position 13410 STR r4,[r1,#36] ; r1!36 = r4 (size of data to save) 13420 MOV r8,#0 13430 STR r8,[r1,#12] ; set r1!12=0 originating message 13440 MOV r8,#1 13450 STR r8,[r1,#16] ; Message_DataSave (type 1) 13460 STR r9,[r1,#40] ; r9 =value of r2, r1!40=r9 (file type) 13470 MOV r9,r3 13480 ADD r10,r1,#44 ; r3 (file name of file to save) 13490 MOV r11,#255 13500 BL getleaf ; get file leaf name 13510 BL copystring ; copy it! 13520 ADD r8,r11,#47 ; put size of block = 44 + name length 13530 LDR r11,(maskto4) 13540 AND r8,r8,r11 13550 STR r8,[r1] 13560 MOV r0,#18 13570 LDR r2,[r1,#20] 13580 LDR r3,[r1,#24] 13590 SWI "XWimp_SendMessage" ; send the message 13600.startsaveout 13610 LDMFD (sp)!,{r0-r3} 13620 B exitswi 13630; 13640.maskto4 13650 EQUD &FFFFFFFC 13660; 13670.sendload 13680 STMFD (sp)!,{r0-r3} 13690 MOV r9,r0 13700 LDR r0,[r1,#8] 13710 STR r0,[r1,#12] ; put r1!12=r1!8 13720 MOV r0,#3 ; Message_DataLoad (type 3) 13730 STR r0,[r1,#16] 13740 ADD r10,r1,#44 13750 MOV r11,#255 13760 BL copystring 13770 ADD r0,r11,#47 13780 LDR r11,(maskto4) 13790 AND r0,r0,r11 13800 STR r0,[r1] 13810 MOV r0,#18 13820 LDR r2,[r1,#20] 13830 LDR r3,[r1,#24] 13840 SWI "XWimp_SendMessage" 13850 LDMFD (sp)!,{r0-r3} 13860 B exitswi 13870; 13880.sendsaveack 13890 STMFD (sp)!,{r0,r2,r3} 13900 ADD r10,r1,#44 13910 ADR r9,(wimpscrap) 13920 MOV r11,#14 13930 BL copystring ; copy <Wimp$Scrap> to file name field 13940 LDR r2,[r1,#4] 13950 LDR r8,[r1,#8] ; put r1!12=r1!8 13960 STR r8,[r1,#12] 13970 MOV r8,#2 13980 STR r8,[r1,#16] ; Message_DataSaveAck (type 2) 13990 MOV r8,#60 14000 STR r8,[r1] ; block length = 44+16 14010 MVN r8,#0 14020 STR r8,[r1,#36] ; data size =-1 (data not safe) 14030 MOV r0,#17 14040 MOV r3,#0 14050 SWI "XWimp_SendMessage" ; send the message 14060 LDMFD (sp)!,{r0,r2,r3} 14070 B exitswi 14080.wimpscrap 14090 EQUS "<Wimp$Scrap>" 14100 EQUB 0 14110 ALIGN 14120; 14130.sendloadack 14140 STMFD (sp)!,{r0-r3} 14150 LDR r0,[r1,#8] 14160 STR r0,[r1,#12] ; put r1!12=r1!8 (your ref) 14170 MOV r0,#4 ; Message_DataLoadAck (type 4) 14180 STR r0,[r1,#16] 14190 ADD r9,r1,#44 14200 BL countchars 14210 ADD r0,r11,#47 14220 LDR r11,(maskto4) 14230 AND r0,r0,r11 14240 STR r0,[r1] 14250 MOV r0,#17 14260 LDR r2,[r1,#20] 14270 LDR r3,[r1,#24] 14280 SWI "XWimp_SendMessage" 14290 LDMFD (sp)!,{r0-r3} 14300 B exitswi 14310; 14320.loadtemplates ; r1 = window transfer block 14330 STMFD (sp)!,{r4-r6} ; r2 = indirect sprite data area 14340 MOV r8,r4 ; r3 = end of above 14350 TEQ r6,#0 ; r4 = data block to store window 14360 MOVNE r4,r6 ; names and handles 14370 MVNEQ r4,#1 ; r5 = sprite block 14380 BEQ loadtemplates0 ; r6 = font handle table 14390 MOV r0,#0 14400 MOV r7,#256 14410.loadtemplates0a 14420 STRB r0,[r6],#1 ; set font handle block to zero 14430 SUB r7,r7,#1 14440 TEQ r7,#0 14450 BNE loadtemplates0a 14460.loadtemplates0 14470 MOV r9,r5 14480 MOV r6,#0 14490 MOV r7,#0 14500.loadtemplates1 14510 ADD r5,ws,#blk 14520 LDR r0,(star) 14530 STR r0,[r5] 14540 SWI "XWimp_LoadTemplate" ; r1 - r3 as above 14550 BVS loadtemplateserr ; r4 = font table or -1 14560 TEQ r6,#0 ; r5 = template name or "*" 14570 BEQ loadtemplatesout ; r6 = template number with that name 14580 ADD r7,r7,#1 14590 STMFD (sp)!,{r9} 14600 ADD r9,ws,#blk 14610 ADD r10,r8,#4 ; returns r5 = full name 14620 MOV r11,#16 ; r6 = next template or 0 if all read 14630 BL copystring 14640 LDMFD (sp)!,{r9} 14650 STR r9,[r1,#64] 14660 SWI "XWimp_CreateWindow" 14670 BVS loadtemplateserr 14680 STR r0,[r8] 14690 ADD r8,r8,#20 14700 B loadtemplates1 14710.loadtemplatesout 14720 MVN r0,#0 14730 STR r0,[r8] 14740 MOV r0,r7 ; r0 = returns number of windows 14750 LDMFD (sp)!,{r4-r6} 14760 B exitswi 14770.loadtemplateserr 14780 LDMFD (sp)!,{r4-r6} 14790 ADR r0,templateerr 14800 B makeerror 14810.templateerr 14820EQUD ErrorBase+63 14830EQUS "Error while loading templates!" 14840EQUB 0 14850ALIGN 14860.star 14870 EQUS "*" 14880 EQUB 0 14890 ALIGN 14900; 14910; window handle block format 14920; 14930; 4 bytes = window handle 14940; 16 bytes = window name from template file 14950; 14960; block ends with -1 14970; 14980; r0 = 0 convert window handle to number ( 0 to n ) 14990; r0 = 1 convert window handle to name 15000; r0 = 2 convert window number to handle 15010; r0 = 3 convert window number to name 15020; r0 = 4 convert window name to handle 15030; r0 = 5 convert window name to number 15040; 15050; r1 = handle block 15060; r2 = parameter 15070; 15080; returns 15090; 15100; r0 = result 15110; 15120.windowconvert 15130 CMP r0,#5 ; check offset number 15140 BGT dontknowconvert ; error if too big for this module 15150 MOV r8,r0,LSL#2 ; calculate offset for jump 15160 ADD r8,r8,pc ; taking into account ARM 15170 MOV pc,r8 ; pipelining by adjusting by 4 bytes 15180; 15190; branch table 15200; 15210 B whandletonum 15220 B whandletoname 15230 B wnumbertohandle 15240 B wnumbertoname 15250 B wnametohandle 15260 B wnametonumber 15270; 15280.whandletonum 15290 MOV r8,#0 15300 MOV r9,#0 15310.whandletonum1 15320 LDR r10,[r1,r8] 15330 CMN r10,#1 15340 BEQ nosuchwindhand 15350 CMP r10,r2 15360 ADDNE r8,r8,#20 15370 ADDNE r9,r9,#1 15380 BNE whandletonum1 15390 MOV r0,r9 15400 B exitswi 15410; 15420.whandletoname 15430 CMN r2,#1 15440 ADREQ r0,iconbarstr 15450 BEQ exitswi 15460 CMN r2,#2 15470 ADREQ r0,backdropstr 15480 MOV r8,#0 15490.whandletoname1 15500 LDR r10,[r1,r8] 15510 CMN r10,#1 15520 BEQ nosuchwindhand 15530 CMP r10,r2 15540 ADDNE r8,r8,#20 15550 BNE whandletoname1 15560 ADD r0,r8,#4 15570 ADD r0,r0,r1 15580 B exitswi 15590; 15600.iconbarstr 15610 EQUS "iconbar" 15620 EQUB 0 15630 ALIGN 15640; 15650.backdropstr 15660 EQUS "backdrop" 15670 EQUB 0 15680 ALIGN 15690; 15700.wnumbertohandle 15710 MOV r8,#0 15720 MOV r9,#0 15730.wnumbertohandle1 15740 LDR r10,[r1,r8] 15750 CMN r10,#1 15760 BEQ nosuchwindnum 15770 CMP r9,r2 15780 ADDNE r8,r8,#20 15790 ADDNE r9,r9,#1 15800 BNE wnumbertohandle1 15810 LDR r0,[r1,r8] 15820 B exitswi 15830; 15840.wnumbertoname 15850 CMN r2,#1 15860 ADREQ r0,iconbarstr 15870 BEQ exitswi 15880 CMN r2,#2 15890 ADREQ r0,backdropstr 15900 MOV r8,#0 15910 MOV r9,#0 15920.wnumbertoname1 15930 LDR r10,[r1,r8] 15940 CMN r10,#1 15950 BEQ nosuchwindnum 15960 CMP r9,r2 15970 ADDNE r8,r8,#20 15980 ADDNE r9,r9,#1 15990 BNE wnumbertoname1 16000 ADD r0,r8,#4 16010 ADD r0,r0,r1 16020 B exitswi 16030; 16040.wnametohandle 16050 MOV r8,r1 16060 MOV r9,r2 16070.wnametohandle1 16080 ADD r10,r8,#4 16090 BL comparestr 16100 LDR r0,[r8] 16110 CMN r11,#1 16120 BEQ exitswi 16130 CMN r0,#1 16140 BEQ nosuchwind 16150 ADD r8,r8,#20 16160 B wnametohandle1 16170; 16180.wnametonumber 16190 MOV r8,r1 16200 MOV r9,r2 16210 MOV r2,#0 16220.wnametonumber1 16230 ADD r10,r8,#4 16240 BL comparestr 16250 CMN r11,#1 16260 MOVEQ r0,r2 16270 MOVEQ r2,r9 16280 BEQ exitswi 16290 LDR r0,[r8] 16300 CMN r0,#1 16310 BNE nosuchwind 16320 ADD r2,r2,#1 16330 ADD r8,r8,#20 16340 B wnametonumber1 16350; 16360.nosuchwindhand ; error message 16370 ADR r0,nswhand 16380 B makeerror 16390; 16400.nswhand 16410EQUD ErrorBase+7 16420EQUS "No such window handle!" 16430EQUB 0 16440ALIGN 16450; 16460.nosuchwindnum ; error message 16470 ADR r0,nswnum 16480 B makeerror 16490; 16500.nswnum 16510EQUD ErrorBase+8 16520EQUS "No such window number!" 16530EQUB 0 16540ALIGN 16550; 16560.nosuchwind ; error message 16570 ADR r0,nsw 16580 B makeerror 16590; 16600.nsw 16610EQUD ErrorBase+9 16620EQUS "No such window!" 16630EQUB 0 16640ALIGN 16650; 16660.dontknowconvert ; error message 16670 ADR r0,dntknwconv 16680 B makeerror 16690; 16700.dntknwconv 16710EQUD ErrorBase+6 16720EQUS "Bad conversion routine number in R0!" 16730EQUB 0 16740ALIGN 16750; 16760; r1 = template font block 16770; 16780.losetemplatefonts 16790 STMFD (sp)!,{r2} 16800 MOV r8,#1 16810.losefonts1 16820 LDRB r2,[r1,r8] 16830 TEQ r2,#0 16840 BEQ losefonts2 16850.losefonts3 16860 SWI "XFont_LoseFont" 16870 BVS losefonts4 16880 SUB r2,r2,#1 16890 CMP r2,#0 16900 BGT losefonts3 16910.losefonts2 16920 ADD r8,r8,#1 16930 CMP r8,#256 16940 BLT losefonts1 16950.losefonts4 16960 LDMFD (sp)!,{r2} 16970 B exitswi 16980; 16990; returns 17000; r0 = task id for wimptools 17010; r1 = task info block ( in RMA ) 17020; 17030.register 17040 LDR r8,[ws] ; number of tasks registered with module 17050 CMP r8,#31 17060 BGE toomanytasks 17070 ADD r8,r8,#1 17080 STR r8,[ws] ; increase by 1 17090 LDR r8,[ws,#4] ; get flags - bit set for block being 17100 MOV r9,#1 ; used by that task 17110 MOV r10,#32 17120 MOV r0,#0 17130.register1 17140 TST r8,r9 17150 BEQ register2 17160 MOV r9,r9,LSL#1 17170 ADD r0,r0,#1 17180 TST r9,#1<<31 17190 BNE toomanytasks 17200 B register1 17210.register2 17220 ORR r8,r8,r9 17230 STR r8,[ws,#4] 17240 MOV r11,#0 17250 ADD r10,ws,r0,LSL#5 17260 ADD r10,r10,#32 17270 MOV r1,r10 17280 STR r11,[r10],#4 ; clear memory block 17290 STR r11,[r10],#4 17300 STR r11,[r10],#4 17310 STR r11,[r10],#4 17320 STR r11,[r10],#4 17330 STR r11,[r10],#4 17340 STR r11,[r10],#4 17350 STR r11,[r10],#4 17360 B exitswi 17370; 17380.toomanytasks 17390 ADR r0,toomanytasksstr 17400 B makeerror 17410; 17420.toomanytasksstr 17430EQUD ErrorBase+13 17440EQUS "Too many tasks! This module can only register 31 tasks." 17450EQUB 0 17460ALIGN 17470; 17480; r0 = task id 17490; 17500.deregister 17510 MOV r8,#1 17520 MOV r9,r8,LSL r0 17530 LDR r10,[ws,#4] 17540 TST r10,r9 ; check task bit in flag word 17550 BEQ badtaskid ; if not set bad id 17560 MVN r9,r9 17570 AND r10,r10,r9 17580 STR r10,[ws,#4] ; clear bit in word 17590 LDR r10,[ws] 17600 TEQ r10,#0 17610 SUBNE r10,r10,#1 ; reduce active tasks by 1 17620 STR r10,[ws] 17630 ADD r8,ws,r0,LSL #5 ; get address of task block 17640 ADD r8,r8,#32 17650 MOV r9,#0 17660 MOV r0,#7 17670.deregister1 17680 LDR r2,[r8,r9] 17690 TEQ r2,#0 17700 SWINE "XOS_Module" 17710 BVS deregister2 17720 ADD r9,r9,#4 17730 CMP r9,#32 17740 BLT deregister1 17750.deregister2 17760 B exitswi 17770; 17780.badtaskid 17790 ADR r0,badtaskidstr 17800 B makeerror 17810; 17820.badtaskidstr 17830EQUD ErrorBase+14 17840EQUS "Bad task id!" 17850EQUB 0 17860ALIGN 17870; 17880; r0 = task id 17890; r1 = filename 17900; returns 17910; r1 = spriteblock 17920; 17930.loadsprites 17940 STMFD (sp)!,{r2-r4} 17950 MOV r8,#1 17960 MOV r9,r8,LSL r0 17970 LDR r10,[ws,#4] 17980 TST r10,r9 17990 LDMEQFD (sp)!,{r2-r4} 18000 BEQ badtaskid 18010 ADD r8,ws,r0,LSL #5 18020 ADD r8,r8,#32 18030 LDR r0,[r8] 18040 TEQ r0,#0 18050 LDMNEFD (sp)!,{r2-r4} 18060 BNE sptspaceused 18070 MOV r0,#5 18080 SWI "XOS_File" 18090 BVS loadsprites1 18100 TEQ r0,#0 18110 BEQ nospritefile 18120 ADD r4,r4,#16 18130 MOV r3,r4 18140 MOV r0,#6 18150 SWI "XOS_Module" 18160 BVS loadsprites1 18170 STR r2,[r8] 18180 STR r4,[r2] 18190 MOV r0,#16 18200 STR r0,[r2,#8] 18210 MOV r9,r2 18220 MOV r2,r1 18230 MOV r1,r9 18240 MOV r0,#9 18250 ADD r0,r0,#&100 18260 SWI "XOS_SpriteOp" 18270 BVS loadsprites1 18280 MOV r0,#10 18290 ADD r0,r0,#&100 18300 SWI "XOS_SpriteOp" 18310.loadsprites1 18320 LDMFD (sp)!,{r2-r4} 18330 B exitswi 18340; 18350.nospritefile 18360 LDMFD (sp)!,{r2-r4} 18370 ADR r0,nosptfilestr 18380 B makeerror 18390.nosptfilestr 18400 EQUD ErrorBase+14 18410 EQUS "Sprite file not found!" 18420 EQUB 0 18430 ALIGN 18440; 18450.sptspaceused 18460 ADR r0,sptspaceusedstr 18470 B makeerror 18480.sptspaceusedstr 18490 EQUD ErrorBase+15 18500 EQUS "RMA has been already allocated for sprites for this module!" 18510 EQUB 0 18520 ALIGN 18530; 18540.gettemplateinfo 18550 B notimplemented 18560; 18570.notimplemented 18580 ADR r0,notimplementedstr 18590 B makeerror 18600; 18610.notimplementedstr 18620EQUD ErrorBase+10 18630EQUS "SWI not implemented in this version of WimpTools. Please contact Matt Lewis, Field House, Primrose Hill, Cowbridge, South Glam, CF7 7DU, for an updated version of this module." 18640EQUB 0 18650ALIGN 18660; 18670; ********************************************************************** 18680; * The following routines are string handling routines swi calls * 18690; ********************************************************************** 18700; 18710; r0 = full string 18720; 18730; returns 18740; 18750; r1 = leaf of string 18760; 18770.swigetleaf 18780 STMFD (sp)!,{r0} 18790 MOV r8,r0 18800.swigetleaf1 18810 LDRB r9,[r0],#1 18820 TEQ r9,#ASC"." 18830 MOVEQ r8,r0 18840 CMP r9,#&20 18850 BGT swigetleaf1 18860 MOV r1,r8 18870 LDMFD (sp)!,{r0} 18880 B exitswi 18890; 18900; ********************************************************************** 18910; * The following routines are general string handling routines * 18920; ********************************************************************** 18930; 18940; COMPARESTR 18950; ---------- 18960; 18970; This routine compares two strings are returns TRUE if equal or FALSE 18980; if not 18990; 19000; r9 = string 1 19010; r10 = string 2 19020; 19030; returns 19040; 19050; r11 = result 19060; 19070.comparestr 19080 STMFD (sp)!,{r0,r1,r2,r9,r10,link} 19090 MOV r2,#32 19100.comparestr1 19110 LDRB r0,[r9],#1 19120 LDRB r1,[r10],#1 19130 CMP r0,r2 19140 CMPLT r1,r2 19150 MVNLT r11,#0 19160 BLT compareout 19170 CMP r0,r1 19180 BEQ comparestr1 19190 MOV r11,#0 19200.compareout 19210 LDMFD (sp)!,{r0,r1,r2,r9,r10,pc} 19220; 19230; CHECKCHAR 19240; --------- 19250; 19260; This routine tests to see whether a certain character is contained 19270; within the string 19280; 19290; r9 = string 19300; r11 = character 19310; 19320; returns 19330; r11 = -1 if string contains character 0 if not 19340; 19350.checkchar 19360 STMFD (sp)!,{r0,r1,r9,link} 19370 MOV r1,r11 19380 MVN r11,#0 19390.checkchar1 19400 LDRB r0,[r9],#1 19410 TEQ r0,r1 19420 MOVEQ r11,#0 19430 CMP r0,#32 19440 BGE checkchar1 19450 LDMFD (sp)!,{r0,r1,r9,pc} 19460; 19470; GETLEAF 19480; ------- 19490; 19500; This routine returns r9 pointing to the leaf of the string pointed to 19510; by r9 19520; 19530; r9 = string 19540; 19550; returns 19560; r9 = leaf of string 19570; 19580.getleaf 19590 STMFD (sp)!,{r0,r1,link} 19600 MOV r1,r9 ; store start of screen in r1 19610.getleaf1 19620 LDRB r0,[r9],#1 ; get a character and r9=r9+1 19630 TEQ r0,#ASC"." ; is it a . 19640 MOVEQ r1,r9 ; put r1=r9 (character after . ) 19650 CMP r0,#32 ; end of string? 19660 BGE getleaf1 ; no - get next character 19670 MOV r9,r1 ; yes - put r9=r1 <either start of 19680 LDMFD (sp)!,{r0,r1,pc} ; string or start of leaf name> 19690; 19700; COUNTSPECIAL 19710; ------------ 19720; 19730; Counts the characters in a string up to but not including the character 19740; in r10 19750; 19760; r9 = source string 19770; r10 = character to count to 19780; r11 = number of characters counted 19790; 19800.countspecial 19810 STMFD (sp)!,{r0,link} 19820 MOV r11,#0 19830.counts1 19840 LDRB r0,[r9],#1 19850 CMP r0,#32 19860 ORRLT r11,r11,#&100 19870 BLT countsout 19880 TEQ r0,r10 19890 ADDNE r11,r11,#1 19900 BNE counts1 19910.countsout 19920 LDMFD (sp)!,{r0,pc} 19930; 19940; COPYCHARS 19950; --------- 19960; 19970; Copies r11 characters from the string pointed to by r9 to the block 19980; pointed to by r10 ending the string with a NULL character (CHR$0) 19990; 20000; r9 = source string 20010; r10 = destination string 20020; r11 = number of characters to copy 20030; 20040.copychars 20050 STMFD (sp)!,{r0,link} 20060.copychar1 20070 LDRB r0,[r9],#1 20080 STRB r0,[r10],#1 20090 SUBS r11,r11,#1 20100 BNE copychar1 20110 STRB r11,[r10,#0] 20120 LDMFD (sp)!,{r0,pc} 20130; 20140; COPYSTRING 20150; ---------- 20160; 20170; Copies the string pointed to by r9 to the block pointed to by r10. The 20180; maximum size of the string is held in r11. If the string at r9 exceeds 20190; this then only r11 characters are copied. 20200; 20210; r9 = source string ending in a character value of < 32 ie control char 20220; r10 = destination block. It ends string in a NULL (CHR$0) character 20230; r11 = maximum string length 20240; 20250; returns the following parameters 20260; r10 = byte after end of destination string 20270; r11 = length of string copied 20280; 20290.copystring 20300 STMFD (sp)!,{r0,r1,link} 20310 MOV r0,#0 20320.copystr1 20330 LDRB r1,[r9,r0] 20340 STRB r1,[r10,r0] 20350 ADD r0,r0,#1 20360 CMP r0,r11 20370 BGE copystr2 20380 CMP r1,#32 20390 BGE copystr1 20400.copystr2 20410 MOV r1,#0 20420 STRB r1,[r10,r0] 20430 ADD r11,r0,#1 20440 ADD r10,r10,r11 20450 LDMFD (sp)!,{r0,r1,pc} 20460; 20470; COUNTCHARS 20480; ---------- 20490; 20500; The routine counts the number of characters in the string at R9. It 20510; counts all characters up to but not including the first control character 20520; ie character < 32 20530; 20540; r9 = source string 20550; 20560; returns 20570; r11 = length of string 20580; 20590.countchars 20600 STMFD (sp)!,{r0,link} 20610 MOV r11,#0 20620.count1 20630 LDRB r0,[r9,r11] 20640 CMP r0,#32 20650 BLT count2 20660 ADD r11,r11,#1 20670 CMP r11,#255 20680 BLT count1 20690 LDMFD (sp)!,{r0,link} 20700 ADR r0,toolong 20710 ORR link,link,#1<<28 20720 MOVS pc,link 20730.count2 20740 LDMFD (sp)!,{r0,pc} 20750; 20760.toolong 20770EQUD ErrorBase+2 20780EQUS "Text string is too long for WimpLib" 20790EQUB 0 20800ALIGN 20810; 20820.toofar 20830 SWI "OS_WriteS" 20840EQUS "Jump's gone too far!!!!!!!!!!!!!!!!!!!!" 20850EQUB 0 20860ALIGN 20870 LDMFD (sp)!,{pc} 20880; 20890] 20900NEXT pass% 20910OSCLI "Save WimpTools "+STR$~store%+" "+STR$~O% 20920*SETTYPE WimpTools module 20930END
� >WmpLb_Code � (c) Matt Lewis � (� 2� � � � �,�$+" at line "+Þ <: F�0 Pdate$=��$,5,11) ZSwiNumber=&47C80 dErrorBase=&809B00 nblk=&400 x� store% &2000 � ws=12 � sp=13 �link=14 � pc=15 �: �tasks=0 �activetasks=4 �: �� pass%=4 � 7 � 3 � O%=store% �P%=0 �[ OPT pass% �; N; ************************************************************************ L; * �ULE HEADER CODE * N; ************************************************************************ "; , .start 64EQUD 0 ; start up code @:EQUD initmod ; initialisation code J8EQUD finishmod ; finalisation code T:EQUD 0 ; service module code ^:EQUD title ; module title string h9EQUD helpst ; module help string r=EQUD 0 ; help and command table |6EQUD SwiNumber ; swi base number �8EQUD swicode ; swi handling code �9EQUD switable ; swi decoding table �8EQUD 0 ; swi decoding code �; �N; ************************************************************************ �L; * �ULE SUPPORT CODE * �N; ************************************************************************ �; � .title �EQUS "WimpTools" � EQUB 0 � ALIGN �.helpst EQUS "Wimp Tools" EQUB 9 @EQUS "1.43 ("+date$+") by Matt Lewis � Weird Sheep Software" & EQUB 0 0 ALIGN : ALIGN D; N=.initmod ; set up module and claim X6 STMFD (sp)!,{link} ; module workspace b MOV r1,ws l LDR ws,[ws] v< CMP ws,#0 ; are we already active? � LDMNEFD (sp)!,{pc} � MOV r0,#6 �7 MOV r3,#&800 ; claim space of 2K � SWI "OS_Module" � STR r2,[r1] � MOV r0,#0 �G STR r0,[r2] ; clear number of active tasks to 0 �= STR r0,[r2,#4] ; clear active task flags � LDMFD (sp)!,{pc} �; �E.finishmod ; shut down module and relinquish �9 STMFD (sp)!,{link} ; module memory space � TEQ r10,#0 LDMEQFD (sp)!,{pc} LDR ws,[ws] G LDR r0,[ws] ; check any tasks using this module B TEQ r0,#0 ; if so relinquish their space * BEQ finishmod2 4 LDR r1,[ws,#4] > MOV r3,#1 H? ADD r4,ws,#32 ; data starts at block + 32 R MOV r0,#7 \.finishmod1 fA TST r1,r3 ; is the bit set in the flag? p BNE finishmod1a z: ADD r4,r4,#32 ; no - goto next block � MOV r3,r3,LSL#1 �N TST r3,#1<<31 ; is it bit 31 - illegal therefore no more � BEQ finishmod1 � B finishmod2 �.finishmod1a �1 MOV r5,#0 ; blocks used �.finishmodloop � LDR r2,[r4,r5] � TEQ r2,#0 �K SWINE "XOS_Module" ; any allocated - if so release memory! � ADD r5,r5,#4 � TEQ r5,#32 � BNE finishmodloop .finishmod2 MOV r0,#7 MOV r2,ws $ SWI "OS_Module" . LDMFD (sp)!,{pc} 8; BN; ************************************************************************ LN; * SWI HANDLER * VN; ************************************************************************ `; jC.switable ; table of swi names recognised t4EQUS "WSWimpTools" ; by this module ~ EQUB 0 �EQUS "Version" � EQUB 0 �EQUS "TaskIcon" � EQUB 0 �EQUS "PopOpenWindow" � EQUB 0 �EQUS "OpenPaneWindow" � EQUB 0 �EQUS "PopOpenPaneWindow" � EQUB 0 �EQUS "CloseWindow" � EQUB 0 EQUS "ToggleIcon" EQUB 0 EQUS "SetIconSelect" EQUB 0 (EQUS "GetIconSelectState" 2 EQUB 0 <EQUS "SetIconEnable" F EQUB 0 PEQUS "GetIconEnableState" Z EQUB 0 dEQUS "SetIconText" n EQUB 0 xEQUS "GetIconText" � EQUB 0 �EQUS "SetIconValidation" � EQUB 0 �EQUS "GetIconValidation" � EQUB 0 �EQUS "SetWindowTitle" � EQUB 0 �EQUS "GetWindowTitle" � EQUB 0 �EQUS "UpdateWindow" � EQUB 0 �EQUS "MakeMenuHeader" � EQUB 0 EQUS "MakeMenuItem" EQUB 0 EQUS "SetMenuItemText" " EQUB 0 ,EQUS "GetMenuItemText" 6 EQUB 0 @EQUS "MakeMenuItemLast" J EQUB 0 TEQUS "SetMenuItemTick" ^ EQUB 0 hEQUS "GetMenuItemTick" r EQUB 0 |EQUS "SetMenuItemMessage" � EQUB 0 �EQUS "GetMenuItemMessage" � EQUB 0 �EQUS "SetMenuItemEnable" � EQUB 0 �EQUS "GetMenuItemEnable" � EQUB 0 �EQUS "SetMenuItemOptions" � EQUB 0 �EQUS "GetMenuItemOptions" � EQUB 0 �EQUS "AttachSubMenu" � EQUB 0 EQUS "LoadMenus" EQUB 0 EQUS "IconBarMenu" & EQUB 0 0EQUS "MenuAdjust" : EQUB 0 DEQUS "MakeMenu" N EQUB 0 XEQUS "GetText" b EQUB 0 lEQUS "StartDrag" v EQUB 0 �EQUS "SendSave" � EQUB 0 �EQUS "SendLoad" � EQUB 0 �EQUS "SendSaveAck" � EQUB 0 �EQUS "SendLoadAck" � EQUB 0 �EQUS "LoadTemplates" � EQUB 0 �!EQUS "WindowConvertParameter" � EQUB 0 �EQUS "GetTemplateInfo" EQUB 0 EQUS "LoseTemplateFonts" EQUB 0 EQUS "Register" * EQUB 0 4EQUS "DeRegister" > EQUB 0 HEQUS "LoadSprites" R EQUB 0 \EQUS "GetLeaf" f EQUB 0 p ALIGN z EQUD 0 �; �7.swicode ; SWI start up code � STMFD (sp)!,{link} � STMFD (sp)!,{r8-r11} �I LDR ws,[ws] ; load r12 with the workspace pointer �9 CMP r11,#49 ; check offset number �F BGT dontknowswi ; error if too big for this module �? MOV r9,r11,LSL#2 ; calculate offset for jump �= ADD r9,r9,pc ; taking into account ARM �H MOV pc,r9 ; pipelining by adjusting by 4 bytes �; �; the following is the �; SWI jump table ; B version B taskicon $ B popwind . B openpanewindow 8 B popopenpanewindow B B closewind L B toggleicon V B setselect ` B geticonselect j B seticonenable t B geticonenable ~ B seticontext � B geticontext � B seticonvalidation � B geticonvalidation � B setwindowtitle � B getwindowtitle � B updatewindow � B menuheader � B makemenuitem � B setmenuitem � B getmenuitem � B setmenuitemlast � B settick B gettick B setmessage B getmessage B setenable ( B getenable 2 B setmenuoptions < B getmenuoptions F B attachsub P B loadmenus Z B iconbarmenu d B menuadjust n B makemenu x B gettext � B startdrag � B sendsave � B sendload � B sendsaveack � B sendloadack � B loadtemplates � B windowconvert � B gettemplateinfo � B losetemplatefonts � B register � B deregister � B loadsprites � B swigetleaf ; N; ************************************************************************ N; * MAIN SWI CODING * "N; ************************************************************************ ,; 6G.exitswi ; restore registers and exit module @ LDMFD (sp)!,{r8-r11} J LDMFD (sp)!,{pc} T; ^8.makeerror ; make error message hF LDMFD (sp)!,{r8-r11} ; r0 points to error message block r LDMFD (sp)!,{link} | �R link,link,#1<<28 � MOVS pc,link �; �3.strnotindirected ; error message � LDMFD (sp)!,{r1} �.strnotindirected2 � ADR r0,notindstr � B makeerror �; �.notindstr �EQUD ErrorBase+2 �.EQUS "Icon/Menu string is not indirected" �EQUB 0 � ALIGN ; 3.dontknowswi ; error message ADR r0,dontknowstr & B makeerror 0; :; D.dontknowstr NEQUD ErrorBase+1 X/EQUS "WimpLib does not recognise that SWI" bEQUB 0 l ALIGN v; �(; r0 = 0 returns r0 = version number �; r0 =-1 prints version �; �.version � CMP r0,#0 � �Q r0,#142 � BEQ exitswi � SWI "OS_WriteS" �1EQUS "Wimp Library Version 1.42 ("+date$+")" �EQUB 10 �EQUB 10 �EQUB 13 �EQUB 0 ALIGN B exitswi ; O; this subroutine checks a register and if it points to the table of window *J; names and handles checks r0. If r0 < &100 then it contains a window 4H; number. Otherwise it contains the address of a window string. It >>; converts the string or number to the window handle using H; Window Convert Parameter R; \?; convertname1 - r1 carries the address of the handle block f; p.convertname1 z STMFD (sp)!,{r1,r2,link} � MOV r2,r0 � CMP r2,#&100 � MOVLT r0,#2 � MOVGE r0,#4 �2 SWI "XWSWimpTools_WindowConvertParameter" � LDMFD (sp)!,{r1,r2,pc} �; �?; convertname3 - r3 carries the address of the handle block �; �.convertname3 � STMFD (sp)!,{r1,r2,link} � MOV r1,r3 � MOV r2,r0 CMP r2,#&100 MOVLT r0,#2 MOVGE r0,#4 $2 SWI "XWSWimpTools_WindowConvertParameter" . LDMFD (sp)!,{r1,r2,pc} 8; B; L?; convertname4 - r4 carries the address of the handle block V; `.convertname4 j STMFD (sp)!,{r1,r2,link} t MOV r1,r4 ~ MOV r2,r0 � CMP r2,#&100 � MOVLT r0,#2 � MOVGE r0,#4 �2 SWI "XWSWimpTools_WindowConvertParameter" � LDMFD (sp)!,{r1,r2,pc} �; �; r0 = window handle �; �.popwind � STMFD (sp)!,{r1} � TEQ r1,#0 � BLNE convertname1 ADD r1,ws,#blk STR r0,[r1] # SWI "XWimp_GetWindowState" SWIVC "XWimp_OpenWindow" ( LDMFD (sp)!,{r1} 2 B exitswi <; F$; r1 = block returned by Poll 2 P; r2 = icon to fit pane to Z(; r3 = window handle of pane window d; n.openpanewindow x TEQ r4,#0 � BEQ openpanewindow1 � STMFD (sp)!,{r0} � MOV r0,r3 � BL convertname4 � MOV r3,r0 � LDMFD (sp)!,{r0} �.openpanewindow1 � LDR r8,[r1] � LDR r9,[r1,#20] � LDR r10,[r1,#4] � SUB r10,r10,r9 � LDR r9,[r1,#24] � LDR r11,[r1,#16] SUB r11,r11,r9 MOV r9,r1 ADD r1,ws,#blk " ADD r1,r1,#40 , STR r8,[r1] 6 STR r2,[r1,#4] @! SWI "XWimp_GetIconState" J BVS exitswi T STMFD (sp)!,{r4-r7} ^ LDR r4,[r1,#8] h ADD r4,r4,r10 r LDR r5,[r1,#12] | ADD r5,r5,r11 � LDR r6,[r1,#16] � ADD r6,r6,r10 � LDR r7,[r1,#20] � ADD r7,r7,r11 � STR r3,[r1] �# SWI "XWimp_GetWindowState" � LDMVSFD (sp)!,{r4-r7} � BVS exitswi � STR r4,[1,#4] � STR r5,[r1,#8] � STR r6,[r1,#12] � STR r7,[r1,#16] � LDR r8,[r9,#28] STR r8,[r1,#28] LDMFD (sp)!,{r4-r7} SWI "XWimp_OpenWindow" & BVS exitswi 0 MOV r1,r9 : STR r3,[r1,#28] D SWI "XWimp_OpenWindow" N B exitswi X; b%; As above but r0 = window handle l; v.popopenpanewindow � STMFD (sp)!,{r1} � ADD r1,ws,#blk � TEQ r4,#0 � BLNE convertname4 � STR r0,[r1] �# SWI "XWimp_GetWindowState" � LDMVSFD (sp)!,{r1} � BVS exitswi � MVN r8,#0 � STR r8,[r1,#28] �* SWI "XWSWimpTools_OpenPaneWindow" � LDMFD (sp)!,{r1} � B exitswi ; ; r0 = window handle ; .closewind * STMFD (sp)!,{r1} 4 TEQ r1,#0 > BLNE convertname1 H ADD r1,ws,#blk R STR r0,[r1] \ SWI "XWimp_CloseWindow" f LDMFD (sp)!,{r1} p B exitswi z; �; �STATE �; -------- �8; this routine sets up a block to get an icons state �; � .getstate � STMFD (sp)!,{r7,link} � MOV r7,r1 � ADD r1,ws,#blk � STR r0,[r1,#0] � STR r7,[r1,#4] � LDMFD (sp)!,{r7,pc} �; �; r0 = window handle ; r1 = icon handle ; returns : 1; r0 = new icon state true or false (-1 or 0) $; ..toggleicon 8 STMFD (sp)!,{r1} B TEQ r3,#0 L BLNE convertname3 V BL getstate `! SWI "XWimp_GetIconState" j BVS toggleout t LDR r9,[r1,#24] ~ � r9,r9,#1<<21 � MOV r11,#1<<21 � � r9,r9,r11 � MOV r10,r9 � STR r9,[r1,#8] � STR r11,[r1,#12] �! SWI "XWimp_SetIconState" � BVS toggleout � MVN r0,#0 � CMP r10,#0 � �Q r0,#0 �.toggleout � LDMFD (sp)!,{r1} B exitswi ; ; r0 = window handle ; r1 = icon handle (2; r2 = true or false to set or unset (-1 or 0) 2; <.setselect F STMFD (sp)!,{r1} P TEQ r3,#0 Z BLNE convertname3 d BL getstate n! SWI "XWimp_GetIconState" x BVS setselectout � � r9,r2,#1<<21 � STR r9,[r1,#8] � MOV r9,#1<<21 � STR r9,[r1,#12] �! SWI "XWimp_SetIconState" �.setselectout � LDMFD (sp)!,{r1} � B exitswi �; �; r0 = window handle �; r1 = icon handle �; returns : �2; r2 = true or false to set or unset (-1 or 0) ; .geticonselect STMFD (sp)!,{r1} " TEQ r3,#0 , BLNE convertname3 6 BL getstate @! SWI "XWimp_GetIconState" J BVS exitswi T LDR r9,[r1,#24] ^ � r9,r9,#1<<21 h MVN r0,#0 r CMP r9,#0 | �Q r0,#0 �.getselectout � LDMFD (sp)!,{r1} � B exitswi �; �; r0 = window handle �; r1 = icon handle �2; r2 = true or false to set or unset (-1 or 0) �; �.seticonenable � STMFD (sp)!,{r1} � TEQ r3,#0 � BLNE convertname3 � BL getstate ! SWI "XWimp_GetIconState" BVS enableout � r9,r2,#1<<22 & STR r9,[r1,#8] 0 MOV r9,#1<<22 : STR r9,[r1,#12] D! SWI "XWimp_SetIconState" N.enableout X LDMFD (sp)!,{r1} b B exitswi l; v; r0 = window handle �; r1 = icon handle � ; returns �2; r2 = true or false to set or unset (-1 or 0) �; �.geticonenable � STMFD (sp)!,{r1} � TEQ r3,#0 � BLNE convertname3 � BL getstate �! SWI "XWimp_GetIconState" � BVS getenableout � LDR r9,[r1,#24] � � r9,r9,#1<<22 MVN r0,#0 CMP r9,#0 �Q r0,#0 .getenableout * LDMFD (sp)!,{r1} 4 B exitswi >; H; r0 = window handle R; r1 = icon handle \;; r2 = string ending in a control character ie �II < 33 f; p.seticontext z STMFD (sp)!,{r1} � TEQ r3,#0 � BLNE convertname3 � BL getstate �! SWI "XWimp_GetIconState" � BVS settextout � LDR r9,[r1,#24] � TST r9,#1<<8 � BEQ strnotindirected � MOV r9,#0 � STR r9,[r1,#8] � STR r9,[r1,#12] � MOV r9,r2 � LDR r10,[r1,#28] LDR r11,[r1,#36] BL copystring ! SWI "XWimp_SetIconState" $.settextout . LDMFD (sp)!,{r1} 8 B exitswi B; L; r0 = window handle V; r1 = icon handle `; returns : j; r0 = text string t; ~.geticontext � STMFD (sp)!,{r1} � TEQ r3,#0 � BLNE convertname3 � BL getstate �! SWI "XWimp_GetIconState" � BVS gettextout � LDR r9,[r1,#24] � TST r9,#1<<8 � ADDEQ r0,r1,#28 � BEQ gettextout � LDR r0,[r1,#28] �.gettextout LDMFD (sp)!,{r1} B exitswi ; ; r0 = window handle (; r1 = icon handle 2;; r2 = string ending in a control character ie �II < 33 <; F.seticonvalidation P STMFD (sp)!,{r1} Z TEQ r3,#0 d BLNE convertname3 n BL getstate x! SWI "XWimp_GetIconState" � BVS setvalidout � LDR r9,[r1,#24] � TST r9,#1<<8 � BEQ strnotindirected � MOV r9,0 � STR r9,[r1,#8] � STR r9,[r1,#12] � MOV r9,r2 � LDR r10,[r1,#32] � MOV r11,#255 � BL copystring �! SWI "XWimp_SetIconState" �.setvalidout LDMFD (sp)!,{r1} B exitswi ; "; r0 = window handle ,; r1 = icon handle 6; returns : @; r0 = text string J; T.geticonvalidation ^ STMFD (sp)!,{r1} h TEQ r3,#0 r BLNE convertname3 | BL getstate �! SWI "XWimp_GetIconState" � BVS getvalidout � LDR r9,[r1,#24] � TST r9,#1<<8 � BEQ strnotindirected � LDR r0,[r1,#32] �.getvalidout � LDMFD (sp)!,{r1} � B exitswi �; �; r0 = window handle �; r2 = text string �; .setwindowtitle STMFD (sp)!,{r1} TEQ r3,#0 & BLNE convertname3 0 ADD r1,ws,#blk : STR r0,[r1] D" SWI "XWimp_GetWindowInfo" N BVS settitleout X LDR r8,[r1,#60] b TST r8,#1<<8 l BEQ wstrnotindirected v MOV r9,r2 � LDR r10,[r1,#76] � LDR r11,[r1,#84] � BL copystring �.settitleout � LDMFD (sp)!,{r1} � B exitswi �; �4.wstrnotindirected ; error message � LDMFD (sp)!,{r1} � ADR r0,wnotindstr � B makeerror �; �.wnotindstr EQUD ErrorBase+12 1EQUS "Window title string is not indirected" EQUB 0 ALIGN *; 4; r0 = window handle >; H ; returns R; \; r2 = text string f; p.getwindowtitle z STMFD (sp)!,{r1} � TEQ r3,#0 � BLNE convertname3 � ADD r1,ws,#blk � STR r0,[r1] �" SWI "XWimp_GetWindowInfo" � BVS gettitleout � LDR r8,[r1,#60] � TST r8,#1<<8 � ADDEQ r2,r1,#76 � BEQ gettitleout � LDR r2,[r1,#76] �.gettitleout � LDMFD (sp)!,{r1} B exitswi ; ; r0 = window handle $; ..updatewindow 8 STMFD (sp)!,{r1,r2,r3,r4} B TEQ r1,#0 L BLNE convertname1 V ADD r1,ws,#blk ` STR r0,[r1] j# SWI "XWimp_GetWindowState" t BVS updatewindow1 ~ LDR r0,[r1,#32] � TST r0,#1<<16 � BEQ updatewindow1 �% SWI "XWimp_GetWindowOutline" � LDR r0,[r1,#4] � LDR r2,[r1,#8] � LDR r3,[r1,#12] � LDR r4,[r1,#16] � MOV r1,r0 � MVN r0,#0 � SWIVC "XWimp_ForceRedraw" �.updatewindow1 � LDMFD (sp)!,{r1,r2,r3,r4} B exitswi ; ; r0 = menu block ; r1 = menu string ($; r2 = width of menu in OS units 2; returns: <5; r0 = position in menu block for first menu item F; P.menuheader Z MOV r9,r1 d MOV r10,r0 n MOV r11,#11 x BL copystring � LDR r9,(menudata) � STR r9,[r0,#12] � STR r2,[r0,#16] � MOV r9,#44 � STR r9,[r0,#20] � MOV r9,#0 � STR r9,[r0,#24] � ADD r0,r0,#28 � B exitswi � .menudata �EQUD &00070207 �; �.makemenuitem TEQ r3,#0 BEQ makemenuitem2 LDR r8,(textdata) " TEQ r4,#0 , �RNE r8,r8,#&F000 6 �RNE r2,r2,#1<<2 @ STR r2,[r0] J STR r8,[r0,#8] T MOV r9,r1 ^ MOV r10,r3 h MOV r11,#255 r BL copystring | STR r3,[r0,#12] � TEQ r4,#0 � STREQ r11,[r0,#20] � STRNE r4,[r0,#20] � MVN r8,#0 � STR r8,[r0,#16] � STR r8,[r0,#4] � MOV r3,r10 � ADD r0,r0,#24 � B exitswi � .textdata �EQUD &07000121 �.textdata2 �EQUD &07000021 ; ; r0 = menu block ; r1 = text string &; r2 = options 0; returns: :F; r0 = position of next menu item ( for next make menu item call ) D; N.makemenuitem2 X STR r2,[r0,#0] b MVN r8,#0 l STR r8,[r0,#4] v LDR r8,(textdata2) � STR r8,[r0,#8] � ADD r10,r0,#12 � MOV r9,r1 � MOV r11,#11 � BL copystring � ADD r0,r0,#24 � B exitswi �; �; r0 = menu block �-; r1 = menu item number ( starting at 0 ) �; r2 = menu string �; �.setmenuitem ! ADD r8,r0,#28 ! ADD r8,r8,r1,LSL#4 ! ADD r8,r8,r1,LSL#3 ! LDR r9,[r8,#8] !* TST r9,#1<<8 !4 BEQ strnotindirected2 !> LDR r10,[r8,#12] !H MOV r9,r2 !R LDR r11,[r8,#20] !\ BL copystring !f B exitswi !p; !z; r0 = menu block !�-; r1 = menu item number ( starting at 0 ) !�; returns: !�; r0 = menu item text !�; !�.getmenuitem !� ADD r8,r0,#28 !� ADD r8,r8,r1,LSL#4 !� ADD r8,r8,r1,LSL#3 !� LDR r0,[r8,#8] !� TST r0,#1<<8 !� ADDEQ r0,r8,#12 !� BEQ exitswi !� LDR r0,[r8,#12] " B exitswi "; ".setmenuitemlast "$ ADD r8,r0,#28 ". ADD r8,r8,r1,LSL#4 "8 ADD r8,r8,r1,LSL#3 "B LDR r0,[r8,#0] "L MVN r10,#&80 "V � r2,r2,#&80 "` � r0,r0,r10 "j �R r0,r0,#&80 "t STR r0,[r8,#0] "~ B exitswi "�; "�.settick "� ADD r8,r0,#28 "� ADD r8,r8,r1,LSL#4 "� ADD r8,r8,r1,LSL#3 "� MVN r9,#1 "� LDR r0,[r8,#0] "� � r0,r0,r9 "� � r2,r2,#1 "� �R r0,r0,r2 "� STR r0,[r8,#0] "� B exitswi # ; # .gettick # ADD r8,r0,#28 # ADD r8,r8,r1,LSL#4 #( ADD r8,r8,r1,LSL#3 #2 LDR r10,[r8,#0] #< TST r10,#1 #F MOV r0,#0 #P MVNNE r0,#0 #Z B exitswi #d; #n.setmessage #x ADD r8,r0,#28 #� ADD r8,r8,r1,LSL#4 #� ADD r8,r8,r1,LSL#3 #� MVN r9,#1<<3 #� LDR r0,[r8,#0] #� � r0,r0,r9 #� � r2,r2,#1<<3 #� �R r0,r0,r2 #� STR r0,[r8,#0] #� B exitswi #�; #�.getmessage #� ADD r8,r0,#28 #� ADD r8,r8,r1,LSL#4 $ ADD r8,r8,r1,LSL#3 $ LDR r10,[r8,#0] $ TST r10,#1<<3 $" MOV r0,#0 $, MVNNE r0,#0 $6 B exitswi $@; $J.setenable $T ADD r8,r0,#28 $^ ADD r8,r8,r1,LSL#4 $h ADD r8,r8,r1,LSL#3 $r MVN r9,#1<<22 $| LDR r0,[r8,#8] $� � r0,r0,r9 $� � r2,r2,#1<<22 $� �R r0,r0,r2 $� STR r0,[r8,#8] $� B exitswi $�; $�.getenable $� ADD r8,r0,#28 $� ADD r8,r8,r1,LSL#4 $� ADD r8,r8,r1,LSL#3 $� LDR r10,[r8,#8] $� TST r10,#1<<22 $� MOV r0,#0 % MVNNE r0,#0 % B exitswi %; %&.attachsub %0 TEQ r3,#0 %: BEQ attachsub1 %D STMFD (sp)!,{r0} %N MOV r0,r2 %X BL convertname3 %b MOV r2,r0 %l LDMFD (sp)!,{r0} %v.attachsub1 %� ADD r8,r0,#28 %� ADD r8,r8,r1,LSL#4 %� ADD r8,r8,r1,LSL#3 %� STR r2,[r8,#4] %� B exitswi %�; %�.loadmenus %� B notimplemented %�; %�.gettext %� B exitswi %�; %� .taskicon & STMFD (sp)!,{r1,r7} & MOV r7,r1 & ADD r1,ws,#blk & STR r0,[r1,#0] &* MOV r0,#0 &4 STR r0,[r1,#4] &> STR r0,[r1,#8] &H MOV r0,#68 &R STR r0,[r1,#12] &\ STR r0,[r1,#16] &f ADR r8,flagdata &p LDR r0,[r8,r7,LSL#2] &z STR r0,[r1,#20] &�< CMP r7,#0 ; is it a normal sprite? &� BNE taskicon1 &� ADD r10,r1,#24 &� MOV r9,r2 &� MOV r11,#12 &� BL copystring &� B taskicon0 &�H.taskicon1 ; if not then r2 is a block with the &�7 STR r2,[r1,#24] ; sprite name in it &� MVN r0,#0 &� STR r0,[r1,#28] &� MOV r9,r2 &�C BL countchars ; find the length of the string ' STR r11,[r1,#32] ' CMP r7,#1 '; BNE taskicon0 ; check to see if it an '$7 ; indirected sprite '.= STR r3,[r1,#28] ; and point to spritepool '8.taskicon0 'B SWI "XWimp_CreateIcon" 'L LDMFD (sp)!,{r1,r7} 'V B exitswi '` .flagdata 'j EQUD &7000301A 't EQUD &7000311A '~ EQUD &7000313D '�; '�.setmenuoptions '� ADD r7,r0,#28 '� ADD r7,r7,r1,LSL#4 '� ADD r7,r7,r1,LSL#3 '� LDR r0,[r7,#0] '� STR r2,[r7,#0] '� B exitswi '�; '�.getmenuoptions '� ADD r7,r0,#28 '� ADD r7,r7,r1,LSL#4 ( ADD r7,r7,r1,LSL#3 ( LDR r0,[r7,#0] ( B exitswi (; ((.iconbarmenu (2 STMFD (sp)!,{r1-r3} (< MOV r8,r0 (F ADD r1,ws,#blk (P# SWI "XWimp_GetPointerInfo" (Z BVS iconbarout (d LDR r2,[r1,#0] (n SUB r2,r2,#64 (x MOV r3,#96 (� ADD r9,r8,#28 (� .barmenu1 (� ADD r3,r3,#44 (� LDR r10,[r9,#0] (� TST r10,#1<<1 (� ADDNE r3,r3,#24 (� ADD r9,r9,#24 (� TST r10,#1<<7 (� BEQ barmenu1 (� MOV r1,r8 (� SWI "XWimp_CreateMenu" (�.iconbarout (� LDMFD (sp)!,{r1-r3} ) B exitswi ); ).menuadjust )" STMFD (sp)!,{r1-r3} ), MOV r8,r0 )6 ADD r1,ws,#blk )@# SWI "XWimp_GetPointerInfo" )J BVS menuadjout )T LDR r9,[r1,#8] )^ TST r9,#1 )h BEQ menuadjout )r MOV r1,r8 )| MOV r2,#0 )� MOV r3,#0 )� SWI "XWimp_CreateMenu" )�.menuadjout )� LDMFD (sp)!,{r1-r3} )� B exitswi )�; )�L; the following routine reads the character before the menu entry in the )�; string and decodes it as )�; )�; � = ticked ! )�; - = dashed line follows )�'; > = generate messages for submenu )�; � = dimmed *; ? = writeable *; *.readmenuflag *& LDRB r6,[r3,#0] *0 TEQ r6,#�"�" *: �REQ r8,r8,#1<<0 *D ADDEQ r3,r3,#1 *N �Q pc,link *X TEQ r6,#�"-" *b �REQ r8,r8,#1<<1 *l ADDEQ r3,r3,#1 *v �Q pc,link *� TEQ r6,#�"?" *� �REQ r8,r8,#1<<2 *� ADDEQ r3,r3,#1 *� �Q pc,link *� TEQ r6,#�">" *� �REQ r8,r8,#1<<3 *� ADDEQ r3,r3,#1 *� �Q pc,link *� TEQ r6,#�"�" *� �REQ r7,r7,#1<<22 *� ADDEQ r3,r3,#1 *� MOV pc,link *�; +; r0 = menu block +); r1 = indirected text string block +; r2 = menu string + ; +*; returns +4+; r0 = next location after menu block +>*; r1 = next location in string block +H; +R .makemenu +\ STMFD (sp)!,{r6,r7} +f MOV r8,#0 +p LDRB r9,[r3,#0] +z TEQ r9,#�"#" +� ADDEQ r3,r3,#1 +� STRNE r8,[r0,#0] +� BNE makemenu1 +� MOV r9,r3 +� MOV r10,#�(",") +� BL countspecial +� TST r11,#&100 +� BNE badmenustring +� CMP r11,#11 +� BGT badmenutitle +� MOV r9,r3 +� MOV r10,r0 +� BL copychars , ADD r3,r9,#1 ,.makemenu1 , LDR r8,(menudata) ,$ STR r8,[r0,#12] ,. MOV r8,#44 ,8 STR r8,[r0,#20] ,B STR r2,[r0,#16] ,L MOV r9,#0 ,V STR r9,[r0,#24] ,` ADD r0,r0,#28 ,j.makemenuloop ,t MOV r8,#0 ,~ LDR r7,(textdata2) ,� BL readmenuflag ,� BL readmenuflag ,� BL readmenuflag ,� BL readmenuflag ,� BL readmenuflag ,� MVN r9,#0 ,� STR r9,[r0,#4] ,� MOV r9,r3 ,� MOV r10,#�"," ,� BL countspecial ,� TST r11,#&100 ,� �RNE r8,r8,#1<<7 - �NE r11,r11,#&FF - STR r8,[r0] - CMP r11,#11 - BGT makemenu2 -( STR r7,[r0,#8] -2 MOV r9,r3 -< ADD r10,r0,#12 -F BL copychars -P ADD r3,r9,#1 -Z ADD r0,r0,#24 -d LDRB r9,[r3,#-1] -n TEQ r9,#�"," -x BEQ makemenuloop -� B makemenuout -�.makemenu2 -� �R r7,r7,#&100 -� STR r7,[r0,#8] -� STR r11,[r0,#20] -� STR r1,[r0,#12] -� MVN r9,#0 -� STR r9,[r0,#16] -� MOV r9,r3 -� MOV r10,r1 -� BL copychars -� ADD r3,r9,#1 -� ADD r1,r10,#1 . ADD r0,r0,#24 . LDRB r9,[r3,#-1] . TEQ r9,#�"," ." BEQ makemenuloop .,.makemenuout .6 LDMFD (sp)!,{r6,r7} .@ B exitswi .J; .T2.badmenustring ; error message .^ LDMFD (sp)!,{r6,r7} .h ADR r0,bdmenustr .r B makeerror .|; .�.bdmenustr .�EQUD ErrorBase+4 .�-EQUS "Incorrect menu desription string!" .�EQUB 0 .� ALIGN .�; .�2.badmenutitle ; error message .� LDMFD (sp)!,{r6,r7} .� ADR r0,bdmenutle .� B makeerror .�; .�.bdmenutle .�EQUD ErrorBase+5 / EQUS "Menu title too long!" /EQUB 0 / ALIGN /&; /0; r0 = window handle /:; r1 = icon number /D; r2 = sprite block /N; /X; returns /bF; r0 = drag type ; -1 = used DragASprite ; 0 = used Wimp_DragBox /l; /v.startdrag /� STMFD (sp)!,{r3-r7} /� TEQ r3,#0 /� BLNE convertname3 /� MOV r8,r0 /� MOV r9,r1 /� ADD r1,ws,#blk /� STR r8,[r1] /�# SWI "XWimp_GetWindowState" /� BVS setupdragout /� LDR r7,[r1,#20] /� LDR r10,[r1,#4] /� SUB r10,r10,r7 /� LDR r7,[r1,#24] 0 LDR r11,[r1,#16] 0 SUB r11,r11,r7 0 STR r9,[r1,#4] 0 ! SWI "XWimp_GetIconState" 0* BVS setupdragout 04 MOV r7,#5 0> STR r7,[r1,#4] 0H LDR r7,[r1,#8] 0R ADD r7,r10,r7 0\ STR r7,[r1,#8] 0f LDR r7,[r1,#12] 0p ADD r7,r11,r7 0z STR r7,[r1,#12] 0� LDR r7,[r1,#16] 0� ADD r7,r10,r7 0� STR r7,[r1,#16] 0� LDR r7,[r1,#20] 0� ADD r7,r11,r7 0� STR r7,[r1,#20] 0� MOV r7,#0 0� STR r7,[r1,#24] 0� STR r7,[r1,#28] 0� MVN r7,#&80000000 0� STR r7,[r1,#32] 0� STR r7,[r1,#36] 0� MOV r7,r2 1 ADR r1,(dragasprite) 1& SWI "XOS_SWINumberFromString" 1 BVS wimpdrag 1$ MOV r0,#161 1. MOV r1,#28 18 SWI "XOS_Byte" 1B BVS exitswi 1L TST r2,#1<<1 1V BEQ wimpdrag 1` ADD r1,ws,#(blk+48) 1j STR r8,[r1] 1t STR r9,[r1,#4] 1~! SWI "XWimp_GetIconState" 1� BVS setupdragout 1� LDR r0,[r1,#24] 1� TST r0,#2 1� BEQ wimpdrag 1� TST r0,#1 1� BNE dragindirect 1� TST r0,#&100 1�.dragdirect 1� LDRNE r2,[r1,#28] 1� ADDEQ r2,r1,#28 1� MOV r1,r7 1�.dragsprite 2 MOV r0,#%11000101 2 ADD r3,ws,#blk 2 ADD r3,r3,#8 2 ADD r4,r3,#16 2(! SWI "XDragASprite_Start" 22 MVN r0,#0 2< B setupdragout 2F .wimpdrag 2P ADD r1,ws,#blk 2Z SWI "XWimp_DragBox" 2d BVS setupdragout 2n MOV r0,#0 2x ADDS r0,r0,r0 2�.setupdragout 2� LDMFD (sp)!,{r3-r7} 2� B exitswi 2�.dragindirect 2� TST r0,#&100 2� BEQ dragdirect 2� LDR r0,[r1,#32] 2� CMN r0,#1 2� LDREQ r2,[r1,#28] 2� �Q r1,r7 2� BEQ dragsprite 2� LDR r2,[r1,#32] 2�.dragindirect1 3 LDRB r0,[r2],#1 3 CMP r0,#32 3 BLT wimpdrag 3" TEQ r0,#�";" 3, BEQ dragindirect1 36 �R r0,r0,#&20 3@ TEQ r0,#�"s" 3J �Q r1,r7 3T BEQ dragsprite 3^.dragindirect2 3h LDRB r0,[r2],#1 3r CMP r0,#32 3| BLT wimpdrag 3� TEQ r0,#�";" 3� BEQ dragindirect1 3� B dragindirect2 3�; 3�.dragasprite 3�EQUS "DragASprite_Start" 3� EQUB 0 3� ALIGN 3�; 3� .sendsave 3� STMFD (sp)!,{r0-r3} 3� MOV r9,r2 3�B SWI "XWimp_GetPointerInfo" ; get position of pointer 4 BVS startsaveout 4 LDR r8,[r1,#12] 4L STR r8,[r1,#20] ; r1!20 = destination window handle 4& LDR r8,[r1,#16] 40J STR r8,[r1,#24] ; r1!24 = destination icon handle 4: LDR r8,[r1] 4DE STR r8,[r1,#28] ; r1!28 = pointer x position 4N LDR r8,[r1,#4] 4XE STR r8,[r1,#32] ; r1!32 = pointer y position 4bL STR r4,[r1,#36] ; r1!36 = r4 (size of data to save) 4l MOV r8,#0 4vJ STR r8,[r1,#12] ; set r1!12=0 originating message 4� MOV r8,#1 4�D STR r8,[r1,#16] ; Message_DataSave (type 1) 4�P STR r9,[r1,#40] ; r9 =value of r2, r1!40=r9 (file type) 4� MOV r9,r3 4�I ADD r10,r1,#44 ; r3 (file name of file to save) 4� MOV r11,#255 4�= BL getleaf ; get file leaf name 4�3 BL copystring ; copy it! 4�O ADD r8,r11,#47 ; put size of block = 44 + name length 4� LDR r11,(maskto4) 4� � r8,r8,r11 4� STR r8,[r1] 4� MOV r0,#18 5 LDR r2,[r1,#20] 5 LDR r3,[r1,#24] 5; SWI "XWimp_SendMessage" ; send the message 5 .startsaveout 5* LDMFD (sp)!,{r0-r3} 54 B exitswi 5>; 5H.maskto4 5R EQUD &FFFFFFFC 5\; 5f .sendload 5p STMFD (sp)!,{r0-r3} 5z MOV r9,r0 5� LDR r0,[r1,#8] 5�9 STR r0,[r1,#12] ; put r1!12=r1!8 5�D MOV r0,#3 ; Message_DataLoad (type 3) 5� STR r0,[r1,#16] 5� ADD r10,r1,#44 5� MOV r11,#255 5� BL copystring 5� ADD r0,r11,#47 5� LDR r11,(maskto4) 5� � r0,r0,r11 5� STR r0,[r1] 5� MOV r0,#18 5� LDR r2,[r1,#20] 6 LDR r3,[r1,#24] 6 SWI "XWimp_SendMessage" 6 LDMFD (sp)!,{r0-r3} 6$ B exitswi 6.; 68.sendsaveack 6B STMFD (sp)!,{r0,r2,r3} 6L ADD r10,r1,#44 6V ADR r9,(wimpscrap) 6` MOV r11,#14 6jO BL copystring ; copy <Wimp$Scrap> to file name field 6t LDR r2,[r1,#4] 6~9 LDR r8,[r1,#8] ; put r1!12=r1!8 6� STR r8,[r1,#12] 6� MOV r8,#2 6�G STR r8,[r1,#16] ; Message_DataSaveAck (type 2) 6� MOV r8,#60 6�? STR r8,[r1] ; block length = 44+16 6� MVN r8,#0 6�H STR r8,[r1,#36] ; data size =-1 (data not safe) 6� MOV r0,#17 6� MOV r3,#0 6�; SWI "XWimp_SendMessage" ; send the message 6� LDMFD (sp)!,{r0,r2,r3} 6� B exitswi 7 .wimpscrap 7 EQUS "<Wimp$Scrap>" 7 EQUB 0 7 ALIGN 7(; 72.sendloadack 7< STMFD (sp)!,{r0-r3} 7F LDR r0,[r1,#8] 7PD STR r0,[r1,#12] ; put r1!12=r1!8 (your ref) 7ZG MOV r0,#4 ; Message_DataLoadAck (type 4) 7d STR r0,[r1,#16] 7n ADD r9,r1,#44 7x BL countchars 7� ADD r0,r11,#47 7� LDR r11,(maskto4) 7� � r0,r0,r11 7� STR r0,[r1] 7� MOV r0,#17 7� LDR r2,[r1,#20] 7� LDR r3,[r1,#24] 7� SWI "XWimp_SendMessage" 7� LDMFD (sp)!,{r0-r3} 7� B exitswi 7�; 7�F.loadtemplates ; r1 = window transfer block 7�J STMFD (sp)!,{r4-r6} ; r2 = indirect sprite data area 8= MOV r8,r4 ; r3 = end of above 8K TEQ r6,#0 ; r4 = data block to store window 8B MOVNE r4,r6 ; names and handles 8"= MVNEQ r4,#1 ; r5 = sprite block 8,B BEQ loadtemplates0 ; r6 = font handle table 86 MOV r0,#0 8@ MOV r7,#256 8J.loadtemplates0a 8TH STRB r0,[r6],#1 ; set font handle block to zero 8^ SUB r7,r7,#1 8h TEQ r7,#0 8r BNE loadtemplates0a 8|.loadtemplates0 8� MOV r9,r5 8� MOV r6,#0 8� MOV r7,#0 8�.loadtemplates1 8� ADD r5,ws,#blk 8� LDR r0,(star) 8� STR r0,[r5] 8�; SWI "XWimp_LoadTemplate" ; r1 - r3 as above 8�@ BVS loadtemplateserr ; r4 = font table or -1 8�D TEQ r6,#0 ; r5 = template name or "*" 8�N BEQ loadtemplatesout ; r6 = template number with that name 8� ADD r7,r7,#1 8� STMFD (sp)!,{r9} 9 ADD r9,ws,#blk 9A ADD r10,r8,#4 ; returns r5 = full name 9N MOV r11,#16 ; r6 = next template or 0 if all read 9& BL copystring 90 LDMFD (sp)!,{r9} 9: STR r9,[r1,#64] 9D! SWI "XWimp_CreateWindow" 9N BVS loadtemplateserr 9X STR r0,[r8] 9b ADD r8,r8,#20 9l B loadtemplates1 9v.loadtemplatesout 9� MVN r0,#0 9� STR r0,[r8] 9�I MOV r0,r7 ; r0 = returns number of windows 9� LDMFD (sp)!,{r4-r6} 9� B exitswi 9�.loadtemplateserr 9� LDMFD (sp)!,{r4-r6} 9� ADR r0,templateerr 9� B makeerror 9�.templateerr 9�EQUD ErrorBase+63 9�)EQUS "Error while loading templates!" 9� EQUB 0 : ALIGN : .star : EQUS "*" : EQUB 0 :* ALIGN :4; :> ; window handle block format :H; :R; 4 bytes = window handle :\0; 16 bytes = window name from template file :f; :p; block ends with -1 :z; :�@; r0 = 0 convert window handle to number ( 0 to n ) :�3; r0 = 1 convert window handle to name :�5; r0 = 2 convert window number to handle :�3; r0 = 3 convert window number to name :�5; r0 = 4 convert window name to handle :�5; r0 = 5 convert window name to number :�; :�; r1 = handle block :�; r2 = parameter :�; :� ; returns :�; :�; r0 = result ;; ;.windowconvert ;9 CMP r0,#5 ; check offset number ;$F BGT dontknowconvert ; error if too big for this module ;.? MOV r8,r0,LSL#2 ; calculate offset for jump ;8= ADD r8,r8,pc ; taking into account ARM ;BH MOV pc,r8 ; pipelining by adjusting by 4 bytes ;L; ;V; branch table ;`; ;j B whandletonum ;t B whandletoname ;~ B wnumbertohandle ;� B wnumbertoname ;� B wnametohandle ;� B wnametonumber ;�; ;�.whandletonum ;� MOV r8,#0 ;� MOV r9,#0 ;�.whandletonum1 ;� LDR r10,[r1,r8] ;� CMN r10,#1 ;� BEQ nosuchwindhand ;� CMP r10,r2 <