home *** CD-ROM | disk | FTP | other *** search
- 10REM ><ClockMem$Dir>.Resources.Source
- 20REM clock application
- 30DIMcode%16384
- 40
- 50REM various parameters here
- 60_AppDir$ ="<ClockMem$Dir>"
- 70_AppResDir$ =_AppDir$+".Resources"
- 80_SpritePath$ =_AppResDir$+".Sprites"
- 90_TemplPath$ =_AppResDir$+".Templates"
- 100_AlmPath$ ="<ClockMemAlarm$Dir>.CMAlarm"
- 110SYS "OS_File",17,_SpritePath$ TO ,,,,_SpriteSize
- 120_ibb_left =0: REM icon bounding box
- 130_ibb_bot =-12
- 140_ibb_right =92
- 150_ibb_top =92
- 160_NWindows =3
- 170DIM _WName$(_NWindows),_ISize(_NWindows),_NIcons(_NWindows),_TSize(_NWindows),t_buff(_NWindows),i_buff(_NWindows)
- 180DIM block(_NWindows),w_name(_NWindows)
- 190RESTORE +0
- 200_TSize=0:_ISize=0
- 210FORI%=1TO_NWindows
- 220READ _WName$(I%),_ISize(I%),_NIcons(I%)
- 230_ISize(I%)=(_ISize(I%)+3)AND-4
- 240_TSize(I%)=88+32*_NIcons(I%)+_ISize(I%)
- 250_ISize+=_ISize(I%)
- 260IF_TSize(I%)>_TSize _TSize=_TSize(I%)
- 270NEXT
- 280DATA Info,100,8
- 290DATA SetClock,0,6
- 300DATA SetAlarm,68,16
- 310_MenuWidth_1 =166
- 320
- 330REM a few points:
- 340REM - sprite for icon must be *first* in sprite file
- 350
- 360FORopt=4TO6STEP2
- 370O%=code%:P%=&8000
- 380[OPTopt
- 390
- 400 MOV 10,#0
- 410 B Init ; sorry!
- 420
- 430; ---------------------------------------------------------
- 440; ------------------- the real work -----------------------
- 450; ---------------------------------------------------------
- 460
- 470.ordinal_block
- 480 EQUD 0: EQUD 0: EQUD 0: EQUD 0: EQUD 0: EQUD 0: EQUD 0: EQUD 0
- 490.acornbug EQUD 0 ; Territory_ConvertTimeToOrdinals stomps
- 500
- 510.old_hours EQUD -1
- 520.old_mins EQUD -1
- 530
- 540.time_format EQUS "%24 %mi"+CHR$0
- 550.time_string EQUS "23 59"+CHR$0
- 560
- 570ALIGN
- 580.sprite_name EQUS "clock"+CHR$0
- 590ALIGN
- 600.sa EQUD sprite_area ; naughty!
- 610
- 620.setisblock EQUD -1: EQUD 0: EQUD 0: EQUD 0
- 630
- 640.wimp_block FNspace(256)
- 650
- 660; get_time puts hours in r4, minutes in r5
- 670.get_time
- 680 MOV 0,#14: ADR 1,utc_block: MOV 2,#3: STR 2,[1]: SWI "OS_Word"
- 690 MVN 0,#0: ADR 2,ordinal_block: SWI "Territory_ConvertTimeToOrdinals"
- 700 LDR 4,[2,#12]: LDR 5,[2,#8]
- 710 MOVS 15,14
- 720
- 730.state_save EQUD 0: EQUD 0: EQUD 0
- 740
- 750.free_amount EQUD 0
- 760.cvtbuf EQUS "XXXXXX": ALIGN
- 770
- 780.errtitle
- 790 EQUS "ClockMem says:"+CHR$0
- 800ALIGN
- 810
- 820; following zogs r0,r1, puts adr of msg in r2
- 830.get_msg_adr
- 840 MOV 0,#13: ADR 1,alm_icn: STR 0,[1,#4]
- 850 SWI "Wimp_GetIconState": MOV 0,#15: STR 0,[1,#4]
- 860 LDR 2,[1,#28]
- 870 MOV 15,14
- 880
- 890; zogs r1,r3; copies 24 bytes from r2 to r0
- 900.copy24
- 910 MOV 1,#23: .lll LDRB 3,[2,1]: STRB 3,[0,1]: SUBS 1,1,#1: BGE lll
- 920 MOV 15,14
- 930
- 940.update_sprite
- 950 LDR 0,alm_unsetP: CMP 0,#0: BNE no_alm
- 960 LDR 0,utc_block: LDR 1,alm_utc: SUBS 2,1,0
- 970 LDR 0,utc_block+4: LDR 1,alm_utc+4: SBCS 2,1,0
- 980 BPL no_alm
- 990 BL get_msg_adr: ADR 0,alm_err_block+4: BL copy24: SUB 0,0,#4
- 1000 ADR 2,errtitle: MOV 1,#17
- 1010 SWI 256+7
- 1020 SWI "Wimp_ReportError"
- 1030 MOV 0,#1: STR 0,alm_unsetP: MOV 10,#1
- 1040.no_alm
- 1050 BL get_time
- 1060 LDR 6,old_hours: LDR 7,old_mins
- 1070 CMP 4,6: CMPEQ 5,7: BEQ skip_time ; not changed
- 1080 STR 4,old_hours: STR 5,old_mins
- 1090 MOV 0,#256+60: LDR 1,sa: ADR 2,sprite_name
- 1100 MOV 3,#0: SWI "OS_SpriteOp": SWI 256+5
- 1110 ADR 9,state_save: STMIA 9,{1,2,3}
- 1120 MOV 0,#4: MOV 1,#6: MOV 2,#40: SWI "OS_Plot"
- 1130 MOV 0,#16: MOV 1,#2: SWI "OS_SetColour"
- 1140 MOV 0,#0: MOV 1,#2: SWI "OS_SetColour"
- 1150 ADR 0,time_string: SWI "OS_Write0"
- 1160 MOV 0,#0: MOV 1,#7: SWI "OS_SetColour"
- 1170 MOV 0,#4: MOV 1,#6: MOV 2,#40: SWI "OS_Plot"
- 1180 MVN 0,#0: ADR 1,utc_block: ADR 2,time_string: MOV 3,#8
- 1190 ADR 4,time_format: SWI "Territory_ConvertDateAndTime"
- 1200 SWI "OS_Write0"
- 1210 MOV 0,#256+60: LDMIA 9,{1,2,3}: SWI "OS_SpriteOp"
- 1220 ADR 1,setisblock: SWI "Wimp_SetIconState"
- 1230
- 1240.skip_time
- 1250 MVN 0,#0: MVN 1,#0: SWI "Wimp_SlotSize": MOV 11,2,LSR#10
- 1260 LDR 12,free_amount: CMP 11,12: BEQ mainloop0
- 1270 STR 11,free_amount
- 1280 MOV 0,#256+60: LDR 1,sa: ADR 2,sprite_name
- 1290 MOV 3,#0: SWI "OS_SpriteOp": SWI 256+5
- 1300 ADR 9,state_save: STMIA 9,{1,2,3}
- 1310 MOV 0,#4: MVN 1,#8: MOV 2,#84: SWI "OS_Plot"
- 1320 MOV 0,#16: MOV 1,#2: SWI "OS_SetColour"
- 1330 MOV 0,#0: MOV 1,#2: SWI "OS_SetColour"
- 1340 MOV 0,12: ADR 1,cvtbuf: MOV 2,#6: SWI "OS_ConvertCardinal4"
- 1350 CMP 2,#0: SWIGT 256+32: SUBGT 2,2,#1: BGT P%-12
- 1360 SWI "OS_Write0"
- 1370 MOV 0,#4: MVN 1,#8: MOV 2,#84: SWI "OS_Plot"
- 1380 MOV 0,#0: MOV 1,#7: SWI "OS_SetColour"
- 1390 MOV 0,11: ADR 1,cvtbuf: MOV 2,#6: SWI "OS_ConvertCardinal4"
- 1400 CMP 2,#0: SWIGT 256+32: SUBGT 2,2,#1: BGT P%-12
- 1410 SWI "OS_Write0"
- 1420 MOV 0,#256+60: LDMIA 9,{1,2,3}: SWI "OS_SpriteOp"
- 1430 ADR 1,setisblock: SWI "Wimp_SetIconState"
- 1440
- 1450.mainloop0
- 1460 MOVS 10,10,LSR#1: BCS fix_alarm_string
- 1470
- 1480; ---------------------------------------------------------
- 1490; ------------------ main Wimp_Poll loop ------------------
- 1500; ---------------------------------------------------------
- 1510
- 1520.mainloop
- 1530 SWI "OS_ReadMonotonicTime": ADD 2,0,#100 ; 1 second
- 1540 MOV 0,#0 ; no events masked out
- 1550 ADR 1,wimp_block
- 1560 SWI "Wimp_PollIdle"
- 1570 ; 0 null
- 1580 ; 1 redraw [r1]=window handle
- 1590 ; 2 open window window block at r1
- 1600 CMP 0,#2: SWIEQ "Wimp_OpenWindow": BEQ mainloop
- 1610 ; 3 close window [r1]=window handle
- 1620 CMP 0,#3: SWIEQ "Wimp_CloseWindow": BEQ mainloop
- 1630 ; 4 ptr leaving [r1]=window handle
- 1640 ; 5 ptr entering [r1]=window handle
- 1650 ; 6 mouse click x, y, buttons, whandle, ihandle
- 1660 CMP 0,#6: BEQ MouseClick
- 1670 ; 7 userdragbox xmin,ymin,xmax,ymax
- 1680 ; 8 key pressed whand, ihand, xofs, yofs, caret-flags,
- 1690 ; idx-into-string, key
- 1700 CMP 0,#8: SWIEQ "Wimp_ProcessKey": BEQ mainloop
- 1710 ; 9 menu seln item0, item1, item2, ...
- 1720 CMP 0,#9: BEQ MenuSelect
- 1730 ; 10 scroll req window block, xdirn, ydirn
- 1740 ; 11 lose caret caret block at r1
- 1750 ; 12 gain caret caret block at r1
- 1760 ; 13 pollwordnon0 addr, contents
- 1770 ; 14-16 not used
- 1780 ; 17 user msg blocksize, sender-handle, my_ref,
- 1790 ; your_ref, action code, data
- 1800 ; 18 user msg rec <ditto>
- 1810 CMP 0,#17: CMPNE 0,#18: BEQ Message
- 1820 ; 19 user msg ack <ditto>
- 1830 B update_sprite
- 1840
- 1850; ---------------------------------------------------------
- 1860; ----------------- boring Wimp-ish routines --------------
- 1870; ---------------------------------------------------------
- 1880
- 1890.MouseClick
- 1900 ; certainly need to check for Menu on icon
- 1910 LDR 0,[1,#12]: CMN 0,#2: BNE not_iconbar
- 1920 LDR 0,[1,#16]: LDR 2,icon_handle: CMP 0,2: BNE not_our_icon
- 1930 LDR 0,[1,#8]: CMP 0,#2: BNE not_menu
- 1940 LDR 0,[1]
- 1950 SUB 2,0,#64 ; x coordinate of top left
- 1960 MOV 3,#272 ; y coordinate of top left
- 1970 ADR 1,menu_block
- 1980 SWI "Wimp_CreateMenu"
- 1990.not_our_icon
- 2000.not_menu
- 2010.not_set_alarm
- 2020 B mainloop
- 2030
- 2040.utc_block EQUD 0: EQUD 0
- 2050
- 2060.onehour EQUD 360000
- 2070.onemin EQUD 6000
- 2080.crap_format EQUS "%w3,%dy %m3 %ce%yr.%24:%mi:%se"+CHR$0
- 2090.crap_block EQUB 24
- 2100.crap_time EQUS "Mon,17 Feb 1992.17:35:04"+CHR$0
- 2110ALIGN
- 2120
- 2130.not_iconbar
- 2140 LDR 2,block(FNw("SetClock")): CMP 0,2: BNE not_set_clock
- 2150 LDR 8,[1,#16] ; icon number
- 2160 CMP 8,#4: BGE mainloop ; not an interesting icon
- 2170 ADR 1,utc_block: MOV 0,#3: STRB 0,[1]: MOV 0,#14: SWI "OS_Word"
- 2180 LDR 3,utc_block
- 2190 CMP 8,#2: LDRLT 4,onehour: LDRGE 4,onemin
- 2200 TST 8,#1: BEQ subnotadd
- 2210 ADDS 3,3,4: STR 3,utc_block
- 2220 BCC changed: LDR 3,utc_block+4: ADD 3,3,#1: STR 3,utc_block+4
- 2230 B changed
- 2240.subnotadd
- 2250 SUBS 3,3,4: STR 3,utc_block
- 2260 BCS changed: LDR 3,utc_block+4: SUB 3,3,#1: STR 3,utc_block+4
- 2270.changed
- 2280 MVN 0,#0: ADR 1,utc_block: ADR 2,crap_time: MOV 3,#25
- 2290 ADR 4,crap_format: SWI "Territory_ConvertDateAndTime"
- 2300 MOV 0,#15: ADR 1,crap_block: SWI "OS_Word"
- 2310 B update_sprite
- 2320
- 2330.alm_unsetP
- 2340 EQUD 1
- 2350.alm_utc
- 2360 EQUD 0: EQUD 0
- 2370.alm_err_block
- 2380 EQUD 0: EQUS "A L A R M !!": EQUD 0: EQUD 0: EQUD 0
- 2390
- 2400.alm_icn EQUD 0: EQUD 15
- 2410 EQUD 0: EQUD 0: EQUD 0: EQUD 0
- 2420 EQUD 0: EQUD 0: EQUD 0: EQUD 0
- 2430.ord_adr EQUD ordinal_block
- 2440.alm_fmt EQUS "%24:%mi %dy %m3 %ce%yr"+CHR$0
- 2450ALIGN
- 2460
- 2470.not_set_clock
- 2480 LDR 2,block(FNw("SetAlarm")): CMP 0,2: BNE not_set_alarm
- 2490 LDR 8,[1,#16] ; icon number
- 2500 CMP 8,#10: BNE not_now
- 2510 LDR 0,utc_block: STR 0,alm_utc
- 2520 LDR 0,utc_block+4: STR 0,alm_utc+4
- 2530 MVN 8,#3: STR 8,alm_unsetP ; turn off & don't change time much
- 2540.not_now
- 2550 CMP 8,#13: BGE mainloop ; not an interesting icon
- 2560 CMP 8,#11: BGE setorunset
- 2570 MVN 0,#0: ADR 1,alm_utc: LDR 2,ord_adr
- 2580 SWI "Territory_ConvertTimeToOrdinals"
- 2590 TST 8,#1: MVNEQ 5,#0: MOVNE 5,#1 ; how much to change?
- 2600 MOV 8,8,LSR#1: MOV 8,8,LSL#2: ADD 8,8,#8 ; ordinal number
- 2610 LDR 2,ord_adr: LDR 1,[2,8]: ADD 1,1,5: STR 1,[2,8] ; update
- 2620 ; need to fix some things
- 2630 LDR 0,[2,#16]: CMP 0,#0: BNE day_plus
- 2640 LDR 0,[2,#20]: CMP 0,#1: BNE month_plus
- 2650 MOV 0,#31: STR 0,[2,#16]: B make_december
- 2660.day_plus
- 2670 LDR 0,[2,#20]: CMP 0,#0: BNE month_plus
- 2680.make_december
- 2690 MOV 0,#12: STR 0,[2,#20]
- 2700 LDR 3,[2,#24]: SUB 3,3,#1: STR 3,[2,#24]
- 2710.month_plus
- 2720 CMP 0,#13: BNE month_ok
- 2730 MOV 0,#1: STR 0,[2,#20]
- 2740 LDR 0,[2,#24]: ADD 0,0,#1: STR 0,[2,#24]
- 2750.month_ok
- 2760 MOV 3,#2000: SUB 3,3,#100
- 2770 LDR 0,[2,#24]: CMP 0,3: STRLT 3,[2,#24]
- 2780.year_ok
- 2790 MOV 0,#0: STR 0,[2]: STR 0,[2,#4]
- 2800 MVN 0,#0: ADR 1,alm_utc: SWI "Territory_ConvertOrdinalsToTime"
- 2810.fix_alarm_string
- 2820 ADR 1,alm_icn: SWI "Wimp_GetIconState": LDR 2,[1,#28]
- 2830 MVN 0,#0: ADR 1,alm_utc: MOV 3,#18: ADR 4,alm_fmt
- 2840 SWI "Territory_ConvertDateAndTime"
- 2850 LDR 5,alm_unsetP: CMP 5,#0
- 2860 MOVEQ 0,#(7<<24): MOVNE 0,#(3<<24): STR 0,alm_icn+8
- 2870 MOV 0,#(15<<24): STR 0,alm_icn+12
- 2880 ADR 1,alm_icn: SWI "Wimp_SetIconState"
- 2890 B update_sprite
- 2900.setorunset
- 2910 RSB 0,8,#12: STR 0,alm_unsetP
- 2920 B fix_alarm_string
- 2930
- 2940.MenuSelect
- 2950 LDR 0,[1]
- 2960 CMP 0,#3 ; change this if quit not #3
- 2970 BNE mainloop
- 2980
- 2990.Quit
- 3000 BL get_msg_adr: ADR 0,alm_err_block+4: BL copy24
- 3010 MOV 0,#10: ADR 1,alm_fname: MVN 2,#2: ADR 4,alm_unsetP
- 3020 ADD 5,4,#40: SWI "XOS_File" ; save CMAlarm file
- 3030 MOV 2,#0: MOV 3,#0
- 3040.finish
- 3050 LDR 0,task_handle
- 3060 LDR 1,wTASK
- 3070 SWI "Wimp_CloseDown"
- 3080 MOV 1,3: SWI "OS_Exit"
- 3090
- 3100.Message
- 3110 LDR 0,[1,#16]
- 3120 CMP 0,#0: BEQ Quit
- 3130 SUB 0,0,#&40000: CMP 0,#&C0: BNE mainloop
- 3140 ADD 0,1,#20: LDMIA 0,{1,2,3}: SWI "Wimp_CreateSubMenu"
- 3150 B fix_alarm_string
- 3160
- 3170; ---------------------------------------------------------
- 3180; ------------------ some Wimp-ish data -------------------
- 3190; ---------------------------------------------------------
- 3200
- 3210.task_handle EQUD 0
- 3220
- 3230.icon_block EQUD -8 ; right of icon bar, scan from rt
- 3240 EQUD _ibb_left ; icon bounding box
- 3250 EQUD _ibb_bot
- 3260 EQUD _ibb_right
- 3270 EQUD _ibb_top
- 3280 EQUD &7000011A ; icon flags. See 4-182
- 3290 EQUD 0: EQUD 0: EQUD 0 ; 12bytes icon data
- 3300
- 3310.icon_handle EQUD 0
- 3320
- 3330.menu_block FNtwelve("ClockMem")
- 3340 EQUB 7 ; title foreground
- 3350 EQUB 2 ; title background
- 3360 EQUB 7 ; work area foreground
- 3370 EQUB 0 ; work area background
- 3380 EQUD _MenuWidth_1
- 3390 EQUD 44 ; single char height
- 3400 EQUD 0 ; gap between items
- 3410 FNmenu(0,0,&07009021,"Info")
- 3420 FNmenu(0,0,&07009021,"Set clock")
- 3430 FNmenu(8,0,&07009021,"Set alarm")
- 3440 FNmenu(128,-1,&07009021,"Quit")
- 3450
- 3460.block(FNw("SetClock"))
- 3470 EQUD 0
- 3480
- 3490.block(FNw("SetAlarm"))
- 3500 EQUD 0
- 3510
- 3520; ---------------------------------------------------------
- 3530; ------------------------ strings ------------------------
- 3540; ---------------------------------------------------------
- 3550
- 3560.wTASK EQUS "TASK"
- 3570.short_desc EQUS "ClockMem"+CHR$0
- 3580.template_path EQUS _TemplPath$+CHR$0
- 3590.alm_fname EQUS _AlmPath$+CHR$0
- 3600ALIGN
- 3610
- 3620; ---------------------------------------------------------
- 3630; ------------------- initialise things -------------------
- 3640; ---------------------------------------------------------
- 3650
- 3660; the following is naughty
- 3670.tb EQUD t_buff
- 3680.ib EQUD i_buff
- 3690
- 3700]:FORI%=1TO_NWindows:[OPTopt
- 3710.w_name(I%) FNtwelve(_WName$(I%))
- 3720]:NEXT:[OPTopt
- 3730
- 3740.Init
- 3750
- 3760 MOV 8,#256: ADD 8,8,#54 ; version "310"
- 3770 MOV 0,8
- 3780 LDR 1,wTASK ; &4B534154
- 3790 ADR 2,short_desc ; for Task Manager display
- 3800 ADR 3,menu_block+24 ; don't ignore any msgs
- 3810 SWI "Wimp_Initialise"
- 3820 STR 1,task_handle
- 3830 CMP 0,8 ; check for RO3
- 3840 BLT die_old_OS
- 3850
- 3860 ADR 1,template_path
- 3870 SWI "Wimp_OpenTemplate"
- 3880 LDR 1,tb: LDR 2,ib: ADD 3,2,#_ISize: MVN 4,#0
- 3890]
- 3900FORI%=1TO_NWindows:[OPTopt
- 3910 ADR 5,w_name(I%) ; name of template
- 3920 MOV 6,#0 ; first call
- 3930 SWI "Wimp_LoadTemplate"
- 3940 SWI "Wimp_CreateWindow"
- 3950 STR 0,menu_block+8+24*I% ; this is ghastly. One menu entry ea.
- 3960]:IFI%>1 THEN
- 3970[OPTopt
- 3980 STR 0,block(I%) ; plug in window handle if not Info
- 3990]
- 4000ENDIF
- 4010NEXT
- 4020[OPTopt
- 4030 STR 0,alm_icn ; r0 contains handle of SetAlm window
- 4040 SWI "Wimp_CloseTemplate"
- 4050
- 4060 MOV 0,#256: ADD 0,0,#9 ; initialise sprite area
- 4070 ADR 1,sprite_area
- 4080 SWI "OS_SpriteOp"
- 4090 ADD 0,0,#1 ; load sprite file
- 4100 ADR 2,sprite_path
- 4110 SWI "OS_SpriteOp"
- 4120
- 4130 ADR 0,icon_block
- 4140 STR 1,[0,#28] ; sprite area control block
- 4150 ADD 2,1,#16: STR 2,[0,#24]; pointer to sprite itself
- 4160 MOV 2,#0: STR 2,[0,#32] ; indicate ptr to sprite, not name
- 4170
- 4180 ADR 1,icon_block
- 4190 MOV 0,#&01000000 ; priority for icon
- 4200 SWI "Wimp_CreateIcon"
- 4210 STR 0,icon_block
- 4220 STR 0,icon_handle
- 4230 STR 0,setisblock+4
- 4240
- 4250 ; load CMAlarm file
- 4260 MOV 0,#16: ADR 3,filestuff: LDMIA 3,{1,2,8}: MOV 3,#0
- 4270 SWI "XOS_File"
- 4280 BL get_msg_adr: MOV 0,2: MOV 2,8: BL copy24
- 4290
- 4300 B fix_alarm_string
- 4310
- 4320.filestuff EQUD alm_fname: EQUD alm_unsetP: EQUD alm_err_block+4
- 4330.sprite_path EQUS _SpritePath$+CHR$0
- 4340ALIGN
- 4350
- 4360; ---------------------------------------------------------
- 4370; -------------------- error handling ---------------------
- 4380; ---------------------------------------------------------
- 4390
- 4400.die_old_OS
- 4410 ADR 0,err_old_OS
- 4420 SWI "XOS_GenerateError"
- 4430 MOV 2,#8: LDR 3,wABEX
- 4440 B finish
- 4450
- 4460.wABEX EQUS "ABEX"
- 4470.err_old_OS
- 4480 EQUD &00330000: EQUS "ClockMem requires RISC OS 3"+CHR$0
- 4490
- 4500; ---------------------------------------------------------
- 4510; ------------------ large lumps of data ------------------
- 4520; ---------------------------------------------------------
- 4530
- 4540.sprite_area EQUD 16+_SpriteSize:EQUD 0
- 4550 EQUD 16:EQUD 0
- 4560.t_buff ; NB all this relies on sprite area being bigger than
- 4570 ; biggest template
- 4580 FNspace(_SpriteSize)
- 4590
- 4600.i_buff FNspace(_ISize)
- 4610
- 4620]:NEXT
- 4630REM PRINT"Total size ";O%-code%;" bytes"
- 4640OSCLI "Save "+_AppDir$+".!RunImage "+STR$~code%+" "+STR$~O%
- 4650OSCLI "SetType "+_AppDir$+".!RunImage Absolute"
- 4660END
- 4670
- 4680DEFFNspace(N%)
- 4690P%+=N%:O%+=N%:=opt
- 4700
- 4710DEFFNtwelve(A$)
- 4720$O%=LEFT$(A$+STRING$(12,CHR$0),12)
- 4730P%+=12:O%+=12:=opt
- 4740
- 4750DEFFNmenu(mflg%,submenu%,iflg%,idata$)
- 4760!O%=mflg%
- 4770O%!4=submenu%
- 4780O%!8=iflg%
- 4790$(O%+12)=LEFT$(idata$+STRING$(12,CHR$0),12)
- 4800O%+=24:P%+=24:=opt
- 4810
- 4820DEFFNw(W$)LOCALI%
- 4830FORI%=1TO_NWindows
- 4840IF_WName$(I%)=W$:=I%
- 4850NEXT
- 4860PRINT"Unknown window name ";W$:END
-