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
<