home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / time / progs / clockmem / !ClockMem_Resources_ts1 < prev    next >
Encoding:
Text File  |  1994-06-24  |  16.4 KB  |  487 lines

  1.    10REM ><ClockMem$Dir>.Resources.Source
  2.    20REM clock application
  3.    30DIMcode%16384
  4.    40
  5.    50REM various parameters here
  6.    60_AppDir$      ="<ClockMem$Dir>"
  7.    70_AppResDir$   =_AppDir$+".Resources"
  8.    80_SpritePath$  =_AppResDir$+".Sprites"
  9.    90_TemplPath$   =_AppResDir$+".Templates"
  10.   100_AlmPath$     ="<ClockMemAlarm$Dir>.CMAlarm"
  11.   110SYS "OS_File",17,_SpritePath$ TO ,,,,_SpriteSize
  12.   120_ibb_left     =0: REM icon bounding box
  13.   130_ibb_bot      =-12
  14.   140_ibb_right    =92
  15.   150_ibb_top      =92
  16.   160_NWindows     =3
  17.   170DIM _WName$(_NWindows),_ISize(_NWindows),_NIcons(_NWindows),_TSize(_NWindows),t_buff(_NWindows),i_buff(_NWindows)
  18.   180DIM block(_NWindows),w_name(_NWindows)
  19.   190RESTORE +0
  20.   200_TSize=0:_ISize=0
  21.   210FORI%=1TO_NWindows
  22.   220READ _WName$(I%),_ISize(I%),_NIcons(I%)
  23.   230_ISize(I%)=(_ISize(I%)+3)AND-4
  24.   240_TSize(I%)=88+32*_NIcons(I%)+_ISize(I%)
  25.   250_ISize+=_ISize(I%)
  26.   260IF_TSize(I%)>_TSize _TSize=_TSize(I%)
  27.   270NEXT
  28.   280DATA Info,100,8
  29.   290DATA SetClock,0,6
  30.   300DATA SetAlarm,68,16
  31.   310_MenuWidth_1  =166
  32.   320
  33.   330REM a few points:
  34.   340REM  - sprite for icon must be *first* in sprite file
  35.   350
  36.   360FORopt=4TO6STEP2
  37.   370O%=code%:P%=&8000
  38.   380[OPTopt
  39.   390
  40.   400  MOV 10,#0
  41.   410  B Init ; sorry!
  42.   420
  43.   430; ---------------------------------------------------------
  44.   440; ------------------- the real work -----------------------
  45.   450; ---------------------------------------------------------
  46.   460
  47.   470.ordinal_block
  48.   480  EQUD 0: EQUD 0: EQUD 0: EQUD 0: EQUD 0: EQUD 0: EQUD 0: EQUD 0
  49.   490.acornbug EQUD 0 ; Territory_ConvertTimeToOrdinals stomps
  50.   500
  51.   510.old_hours   EQUD -1
  52.   520.old_mins    EQUD -1
  53.   530
  54.   540.time_format EQUS "%24 %mi"+CHR$0
  55.   550.time_string EQUS "23 59"+CHR$0
  56.   560
  57.   570ALIGN
  58.   580.sprite_name EQUS "clock"+CHR$0
  59.   590ALIGN
  60.   600.sa          EQUD sprite_area ; naughty!
  61.   610
  62.   620.setisblock  EQUD -1: EQUD 0: EQUD 0: EQUD 0
  63.   630
  64.   640.wimp_block  FNspace(256)
  65.   650
  66.   660; get_time puts hours in r4, minutes in r5
  67.   670.get_time
  68.   680  MOV 0,#14: ADR 1,utc_block: MOV 2,#3: STR 2,[1]: SWI "OS_Word"
  69.   690  MVN 0,#0: ADR 2,ordinal_block: SWI "Territory_ConvertTimeToOrdinals"
  70.   700  LDR 4,[2,#12]: LDR 5,[2,#8]
  71.   710  MOVS 15,14
  72.   720
  73.   730.state_save  EQUD 0: EQUD 0: EQUD 0
  74.   740
  75.   750.free_amount EQUD 0
  76.   760.cvtbuf      EQUS "XXXXXX": ALIGN
  77.   770
  78.   780.errtitle
  79.   790  EQUS "ClockMem says:"+CHR$0
  80.   800ALIGN
  81.   810
  82.   820; following zogs r0,r1, puts adr of msg in r2
  83.   830.get_msg_adr
  84.   840  MOV 0,#13: ADR 1,alm_icn: STR 0,[1,#4]
  85.   850  SWI "Wimp_GetIconState": MOV 0,#15: STR 0,[1,#4]
  86.   860  LDR 2,[1,#28]
  87.   870  MOV 15,14
  88.   880
  89.   890; zogs r1,r3; copies 24 bytes from r2 to r0
  90.   900.copy24
  91.   910  MOV 1,#23: .lll LDRB 3,[2,1]: STRB 3,[0,1]: SUBS 1,1,#1: BGE lll
  92.   920  MOV 15,14
  93.   930
  94.   940.update_sprite
  95.   950  LDR 0,alm_unsetP: CMP 0,#0: BNE no_alm
  96.   960  LDR 0,utc_block: LDR 1,alm_utc: SUBS 2,1,0
  97.   970  LDR 0,utc_block+4: LDR 1,alm_utc+4: SBCS 2,1,0
  98.   980  BPL no_alm
  99.   990  BL get_msg_adr: ADR 0,alm_err_block+4: BL copy24: SUB 0,0,#4
  100.  1000  ADR 2,errtitle: MOV 1,#17
  101.  1010  SWI 256+7
  102.  1020  SWI "Wimp_ReportError"
  103.  1030  MOV 0,#1: STR 0,alm_unsetP: MOV 10,#1
  104.  1040.no_alm
  105.  1050  BL get_time
  106.  1060  LDR 6,old_hours: LDR 7,old_mins
  107.  1070  CMP 4,6: CMPEQ 5,7: BEQ skip_time ; not changed
  108.  1080  STR 4,old_hours: STR 5,old_mins
  109.  1090  MOV 0,#256+60: LDR 1,sa: ADR 2,sprite_name
  110.  1100  MOV 3,#0: SWI "OS_SpriteOp": SWI 256+5
  111.  1110  ADR 9,state_save: STMIA 9,{1,2,3}
  112.  1120  MOV 0,#4: MOV 1,#6: MOV 2,#40: SWI "OS_Plot"
  113.  1130  MOV 0,#16: MOV 1,#2: SWI "OS_SetColour"
  114.  1140  MOV 0,#0: MOV 1,#2: SWI "OS_SetColour"
  115.  1150  ADR 0,time_string: SWI "OS_Write0"
  116.  1160  MOV 0,#0: MOV 1,#7: SWI "OS_SetColour"
  117.  1170  MOV 0,#4: MOV 1,#6: MOV 2,#40: SWI "OS_Plot"
  118.  1180  MVN 0,#0: ADR 1,utc_block: ADR 2,time_string: MOV 3,#8
  119.  1190  ADR 4,time_format: SWI "Territory_ConvertDateAndTime"
  120.  1200  SWI "OS_Write0"
  121.  1210  MOV 0,#256+60: LDMIA 9,{1,2,3}: SWI "OS_SpriteOp"
  122.  1220  ADR 1,setisblock: SWI "Wimp_SetIconState"
  123.  1230
  124.  1240.skip_time
  125.  1250  MVN 0,#0: MVN 1,#0: SWI "Wimp_SlotSize": MOV 11,2,LSR#10
  126.  1260  LDR 12,free_amount: CMP 11,12: BEQ mainloop0
  127.  1270  STR 11,free_amount
  128.  1280  MOV 0,#256+60: LDR 1,sa: ADR 2,sprite_name
  129.  1290  MOV 3,#0: SWI "OS_SpriteOp": SWI 256+5
  130.  1300  ADR 9,state_save: STMIA 9,{1,2,3}
  131.  1310  MOV 0,#4: MVN 1,#8: MOV 2,#84: SWI "OS_Plot"
  132.  1320  MOV 0,#16: MOV 1,#2: SWI "OS_SetColour"
  133.  1330  MOV 0,#0: MOV 1,#2: SWI "OS_SetColour"
  134.  1340  MOV 0,12: ADR 1,cvtbuf: MOV 2,#6: SWI "OS_ConvertCardinal4"
  135.  1350  CMP 2,#0: SWIGT 256+32: SUBGT 2,2,#1: BGT P%-12
  136.  1360  SWI "OS_Write0"
  137.  1370  MOV 0,#4: MVN 1,#8: MOV 2,#84: SWI "OS_Plot"
  138.  1380  MOV 0,#0: MOV 1,#7: SWI "OS_SetColour"
  139.  1390  MOV 0,11: ADR 1,cvtbuf: MOV 2,#6: SWI "OS_ConvertCardinal4"
  140.  1400  CMP 2,#0: SWIGT 256+32: SUBGT 2,2,#1: BGT P%-12
  141.  1410  SWI "OS_Write0"
  142.  1420  MOV 0,#256+60: LDMIA 9,{1,2,3}: SWI "OS_SpriteOp"
  143.  1430  ADR 1,setisblock: SWI "Wimp_SetIconState"
  144.  1440
  145.  1450.mainloop0
  146.  1460  MOVS 10,10,LSR#1: BCS fix_alarm_string
  147.  1470
  148.  1480; ---------------------------------------------------------
  149.  1490; ------------------ main Wimp_Poll loop ------------------
  150.  1500; ---------------------------------------------------------
  151.  1510
  152.  1520.mainloop
  153.  1530  SWI "OS_ReadMonotonicTime": ADD 2,0,#100 ; 1 second
  154.  1540  MOV 0,#0 ; no events masked out
  155.  1550  ADR 1,wimp_block
  156.  1560  SWI "Wimp_PollIdle"
  157.  1570  ;  0 null
  158.  1580  ;  1 redraw        [r1]=window handle
  159.  1590  ;  2 open window   window block at r1
  160.  1600  CMP 0,#2: SWIEQ "Wimp_OpenWindow": BEQ mainloop
  161.  1610  ;  3 close window  [r1]=window handle
  162.  1620  CMP 0,#3: SWIEQ "Wimp_CloseWindow": BEQ mainloop
  163.  1630  ;  4 ptr leaving   [r1]=window handle
  164.  1640  ;  5 ptr entering  [r1]=window handle
  165.  1650  ;  6 mouse click   x, y, buttons, whandle, ihandle
  166.  1660  CMP 0,#6: BEQ MouseClick
  167.  1670  ;  7 userdragbox   xmin,ymin,xmax,ymax
  168.  1680  ;  8 key pressed   whand, ihand, xofs, yofs, caret-flags,
  169.  1690  ;                  idx-into-string, key
  170.  1700  CMP 0,#8: SWIEQ "Wimp_ProcessKey": BEQ mainloop
  171.  1710  ;  9 menu seln     item0, item1, item2, ...
  172.  1720  CMP 0,#9: BEQ MenuSelect
  173.  1730  ; 10 scroll req    window block, xdirn, ydirn
  174.  1740  ; 11 lose caret    caret block at r1
  175.  1750  ; 12 gain caret    caret block at r1
  176.  1760  ; 13 pollwordnon0  addr, contents
  177.  1770  ; 14-16 not used
  178.  1780  ; 17 user msg      blocksize, sender-handle, my_ref,
  179.  1790  ;                  your_ref, action code, data
  180.  1800  ; 18 user msg rec  <ditto>
  181.  1810  CMP 0,#17: CMPNE 0,#18: BEQ Message
  182.  1820  ; 19 user msg ack  <ditto>
  183.  1830  B update_sprite
  184.  1840
  185.  1850; ---------------------------------------------------------
  186.  1860; ----------------- boring Wimp-ish routines --------------
  187.  1870; ---------------------------------------------------------
  188.  1880
  189.  1890.MouseClick
  190.  1900  ; certainly need to check for Menu on icon
  191.  1910  LDR 0,[1,#12]: CMN 0,#2: BNE not_iconbar
  192.  1920  LDR 0,[1,#16]: LDR 2,icon_handle: CMP 0,2: BNE not_our_icon
  193.  1930  LDR 0,[1,#8]: CMP 0,#2: BNE not_menu
  194.  1940  LDR 0,[1]
  195.  1950  SUB 2,0,#64               ; x coordinate of top left
  196.  1960  MOV 3,#272                ; y coordinate of top left
  197.  1970  ADR 1,menu_block
  198.  1980  SWI "Wimp_CreateMenu"
  199.  1990.not_our_icon
  200.  2000.not_menu
  201.  2010.not_set_alarm
  202.  2020  B mainloop
  203.  2030
  204.  2040.utc_block   EQUD 0: EQUD 0
  205.  2050
  206.  2060.onehour EQUD 360000
  207.  2070.onemin  EQUD   6000
  208.  2080.crap_format EQUS "%w3,%dy %m3 %ce%yr.%24:%mi:%se"+CHR$0
  209.  2090.crap_block EQUB 24
  210.  2100.crap_time EQUS "Mon,17 Feb 1992.17:35:04"+CHR$0
  211.  2110ALIGN
  212.  2120
  213.  2130.not_iconbar
  214.  2140  LDR 2,block(FNw("SetClock")): CMP 0,2: BNE not_set_clock
  215.  2150  LDR 8,[1,#16] ; icon number
  216.  2160  CMP 8,#4: BGE mainloop ; not an interesting icon
  217.  2170  ADR 1,utc_block: MOV 0,#3: STRB 0,[1]: MOV 0,#14: SWI "OS_Word"
  218.  2180  LDR 3,utc_block
  219.  2190  CMP 8,#2: LDRLT 4,onehour: LDRGE 4,onemin
  220.  2200  TST 8,#1: BEQ subnotadd
  221.  2210  ADDS 3,3,4: STR 3,utc_block
  222.  2220  BCC changed: LDR 3,utc_block+4: ADD 3,3,#1: STR 3,utc_block+4
  223.  2230  B changed
  224.  2240.subnotadd
  225.  2250  SUBS 3,3,4: STR 3,utc_block
  226.  2260  BCS changed: LDR 3,utc_block+4: SUB 3,3,#1: STR 3,utc_block+4
  227.  2270.changed
  228.  2280  MVN 0,#0: ADR 1,utc_block: ADR 2,crap_time: MOV 3,#25
  229.  2290  ADR 4,crap_format: SWI "Territory_ConvertDateAndTime"
  230.  2300  MOV 0,#15: ADR 1,crap_block: SWI "OS_Word"
  231.  2310  B update_sprite
  232.  2320
  233.  2330.alm_unsetP
  234.  2340  EQUD 1
  235.  2350.alm_utc
  236.  2360  EQUD 0: EQUD 0
  237.  2370.alm_err_block
  238.  2380  EQUD 0: EQUS "A L A R M !!": EQUD 0: EQUD 0: EQUD 0
  239.  2390
  240.  2400.alm_icn EQUD 0: EQUD 15
  241.  2410         EQUD 0: EQUD 0: EQUD 0: EQUD 0
  242.  2420         EQUD 0: EQUD 0: EQUD 0: EQUD 0
  243.  2430.ord_adr EQUD ordinal_block
  244.  2440.alm_fmt EQUS "%24:%mi %dy %m3 %ce%yr"+CHR$0
  245.  2450ALIGN
  246.  2460
  247.  2470.not_set_clock
  248.  2480  LDR 2,block(FNw("SetAlarm")): CMP 0,2: BNE not_set_alarm
  249.  2490  LDR 8,[1,#16] ; icon number
  250.  2500  CMP 8,#10: BNE not_now
  251.  2510  LDR 0,utc_block: STR 0,alm_utc
  252.  2520  LDR 0,utc_block+4: STR 0,alm_utc+4
  253.  2530  MVN 8,#3: STR 8,alm_unsetP ; turn off & don't change time much
  254.  2540.not_now
  255.  2550  CMP 8,#13: BGE mainloop ; not an interesting icon
  256.  2560  CMP 8,#11: BGE setorunset
  257.  2570  MVN 0,#0: ADR 1,alm_utc: LDR 2,ord_adr
  258.  2580  SWI "Territory_ConvertTimeToOrdinals"
  259.  2590  TST 8,#1: MVNEQ 5,#0: MOVNE 5,#1 ; how much to change?
  260.  2600  MOV 8,8,LSR#1: MOV 8,8,LSL#2: ADD 8,8,#8 ; ordinal number
  261.  2610  LDR 2,ord_adr: LDR 1,[2,8]: ADD 1,1,5: STR 1,[2,8] ; update
  262.  2620  ; need to fix some things
  263.  2630  LDR 0,[2,#16]: CMP 0,#0: BNE day_plus
  264.  2640  LDR 0,[2,#20]: CMP 0,#1: BNE month_plus
  265.  2650  MOV 0,#31: STR 0,[2,#16]: B make_december
  266.  2660.day_plus
  267.  2670  LDR 0,[2,#20]: CMP 0,#0: BNE month_plus
  268.  2680.make_december
  269.  2690  MOV 0,#12: STR 0,[2,#20]
  270.  2700  LDR 3,[2,#24]: SUB 3,3,#1: STR 3,[2,#24]
  271.  2710.month_plus
  272.  2720  CMP 0,#13: BNE month_ok
  273.  2730  MOV 0,#1: STR 0,[2,#20]
  274.  2740  LDR 0,[2,#24]: ADD 0,0,#1: STR 0,[2,#24]
  275.  2750.month_ok
  276.  2760  MOV 3,#2000: SUB 3,3,#100
  277.  2770  LDR 0,[2,#24]: CMP 0,3: STRLT 3,[2,#24]
  278.  2780.year_ok
  279.  2790  MOV 0,#0: STR 0,[2]: STR 0,[2,#4]
  280.  2800  MVN 0,#0: ADR 1,alm_utc: SWI "Territory_ConvertOrdinalsToTime"
  281.  2810.fix_alarm_string
  282.  2820  ADR 1,alm_icn: SWI "Wimp_GetIconState": LDR 2,[1,#28]
  283.  2830  MVN 0,#0: ADR 1,alm_utc: MOV 3,#18: ADR 4,alm_fmt
  284.  2840  SWI "Territory_ConvertDateAndTime"
  285.  2850  LDR 5,alm_unsetP: CMP 5,#0
  286.  2860  MOVEQ 0,#(7<<24): MOVNE 0,#(3<<24): STR 0,alm_icn+8
  287.  2870  MOV 0,#(15<<24): STR 0,alm_icn+12
  288.  2880  ADR 1,alm_icn: SWI "Wimp_SetIconState"
  289.  2890  B update_sprite
  290.  2900.setorunset
  291.  2910  RSB 0,8,#12: STR 0,alm_unsetP
  292.  2920  B fix_alarm_string
  293.  2930
  294.  2940.MenuSelect
  295.  2950  LDR 0,[1]
  296.  2960  CMP 0,#3 ; change this if quit not #3
  297.  2970  BNE mainloop
  298.  2980
  299.  2990.Quit
  300.  3000  BL get_msg_adr: ADR 0,alm_err_block+4: BL copy24
  301.  3010  MOV 0,#10: ADR 1,alm_fname: MVN 2,#2: ADR 4,alm_unsetP
  302.  3020  ADD 5,4,#40: SWI "XOS_File" ; save CMAlarm file
  303.  3030  MOV 2,#0: MOV 3,#0
  304.  3040.finish
  305.  3050  LDR 0,task_handle
  306.  3060  LDR 1,wTASK
  307.  3070  SWI "Wimp_CloseDown"
  308.  3080  MOV 1,3: SWI "OS_Exit"
  309.  3090
  310.  3100.Message
  311.  3110  LDR 0,[1,#16]
  312.  3120  CMP 0,#0: BEQ Quit
  313.  3130  SUB 0,0,#&40000: CMP 0,#&C0: BNE mainloop
  314.  3140  ADD 0,1,#20: LDMIA 0,{1,2,3}: SWI "Wimp_CreateSubMenu"
  315.  3150  B fix_alarm_string
  316.  3160
  317.  3170; ---------------------------------------------------------
  318.  3180; ------------------ some Wimp-ish data -------------------
  319.  3190; ---------------------------------------------------------
  320.  3200
  321.  3210.task_handle  EQUD 0
  322.  3220
  323.  3230.icon_block   EQUD -8          ; right of icon bar, scan from rt
  324.  3240              EQUD _ibb_left   ; icon bounding box
  325.  3250              EQUD _ibb_bot
  326.  3260              EQUD _ibb_right
  327.  3270              EQUD _ibb_top
  328.  3280              EQUD &7000011A   ; icon flags. See 4-182
  329.  3290              EQUD 0: EQUD 0: EQUD 0   ; 12bytes icon data
  330.  3300
  331.  3310.icon_handle  EQUD 0
  332.  3320
  333.  3330.menu_block   FNtwelve("ClockMem")
  334.  3340              EQUB 7     ; title foreground
  335.  3350              EQUB 2     ; title background
  336.  3360              EQUB 7     ; work area foreground
  337.  3370              EQUB 0     ; work area background
  338.  3380              EQUD _MenuWidth_1
  339.  3390              EQUD 44    ; single char height
  340.  3400              EQUD 0     ; gap between items
  341.  3410              FNmenu(0,0,&07009021,"Info")
  342.  3420              FNmenu(0,0,&07009021,"Set clock")
  343.  3430              FNmenu(8,0,&07009021,"Set alarm")
  344.  3440              FNmenu(128,-1,&07009021,"Quit")
  345.  3450
  346.  3460.block(FNw("SetClock"))
  347.  3470              EQUD 0
  348.  3480
  349.  3490.block(FNw("SetAlarm"))
  350.  3500              EQUD 0
  351.  3510
  352.  3520; ---------------------------------------------------------
  353.  3530; ------------------------ strings ------------------------
  354.  3540; ---------------------------------------------------------
  355.  3550
  356.  3560.wTASK          EQUS "TASK"
  357.  3570.short_desc     EQUS "ClockMem"+CHR$0
  358.  3580.template_path  EQUS _TemplPath$+CHR$0
  359.  3590.alm_fname      EQUS _AlmPath$+CHR$0
  360.  3600ALIGN
  361.  3610
  362.  3620; ---------------------------------------------------------
  363.  3630; ------------------- initialise things -------------------
  364.  3640; ---------------------------------------------------------
  365.  3650
  366.  3660; the following is naughty
  367.  3670.tb EQUD t_buff
  368.  3680.ib EQUD i_buff
  369.  3690
  370.  3700]:FORI%=1TO_NWindows:[OPTopt
  371.  3710.w_name(I%)  FNtwelve(_WName$(I%))
  372.  3720]:NEXT:[OPTopt
  373.  3730
  374.  3740.Init
  375.  3750
  376.  3760  MOV 8,#256: ADD 8,8,#54   ; version "310"
  377.  3770  MOV 0,8
  378.  3780  LDR 1,wTASK               ; &4B534154
  379.  3790  ADR 2,short_desc          ; for Task Manager display
  380.  3800  ADR 3,menu_block+24                  ; don't ignore any msgs
  381.  3810  SWI "Wimp_Initialise"
  382.  3820  STR 1,task_handle
  383.  3830  CMP 0,8                   ; check for RO3
  384.  3840  BLT die_old_OS
  385.  3850
  386.  3860  ADR 1,template_path
  387.  3870  SWI "Wimp_OpenTemplate"
  388.  3880  LDR 1,tb: LDR 2,ib: ADD 3,2,#_ISize: MVN 4,#0
  389.  3890]
  390.  3900FORI%=1TO_NWindows:[OPTopt
  391.  3910  ADR 5,w_name(I%)          ; name of template
  392.  3920  MOV 6,#0                  ; first call
  393.  3930  SWI "Wimp_LoadTemplate"
  394.  3940  SWI "Wimp_CreateWindow"
  395.  3950  STR 0,menu_block+8+24*I%  ; this is ghastly. One menu entry ea.
  396.  3960]:IFI%>1 THEN
  397.  3970[OPTopt
  398.  3980  STR 0,block(I%)           ; plug in window handle if not Info
  399.  3990]
  400.  4000ENDIF
  401.  4010NEXT
  402.  4020[OPTopt
  403.  4030  STR 0,alm_icn             ; r0 contains handle of SetAlm window
  404.  4040  SWI "Wimp_CloseTemplate"
  405.  4050
  406.  4060  MOV 0,#256: ADD 0,0,#9    ; initialise sprite area
  407.  4070  ADR 1,sprite_area
  408.  4080  SWI "OS_SpriteOp"
  409.  4090  ADD 0,0,#1                ; load sprite file
  410.  4100  ADR 2,sprite_path
  411.  4110  SWI "OS_SpriteOp"
  412.  4120
  413.  4130  ADR 0,icon_block
  414.  4140  STR 1,[0,#28]             ; sprite area control block
  415.  4150  ADD 2,1,#16: STR 2,[0,#24]; pointer to sprite itself
  416.  4160  MOV 2,#0: STR 2,[0,#32]   ; indicate ptr to sprite, not name
  417.  4170
  418.  4180  ADR 1,icon_block
  419.  4190  MOV 0,#&01000000          ; priority for icon
  420.  4200  SWI "Wimp_CreateIcon"
  421.  4210  STR 0,icon_block
  422.  4220  STR 0,icon_handle
  423.  4230  STR 0,setisblock+4
  424.  4240
  425.  4250  ; load CMAlarm file
  426.  4260  MOV 0,#16: ADR 3,filestuff: LDMIA 3,{1,2,8}: MOV 3,#0
  427.  4270  SWI "XOS_File"
  428.  4280  BL get_msg_adr: MOV 0,2: MOV 2,8: BL copy24
  429.  4290
  430.  4300  B fix_alarm_string
  431.  4310
  432.  4320.filestuff EQUD alm_fname: EQUD alm_unsetP: EQUD alm_err_block+4
  433.  4330.sprite_path    EQUS _SpritePath$+CHR$0
  434.  4340ALIGN
  435.  4350
  436.  4360; ---------------------------------------------------------
  437.  4370; -------------------- error handling ---------------------
  438.  4380; ---------------------------------------------------------
  439.  4390
  440.  4400.die_old_OS
  441.  4410  ADR 0,err_old_OS
  442.  4420  SWI "XOS_GenerateError"
  443.  4430  MOV 2,#8: LDR 3,wABEX
  444.  4440  B finish
  445.  4450
  446.  4460.wABEX EQUS "ABEX"
  447.  4470.err_old_OS
  448.  4480  EQUD &00330000: EQUS "ClockMem requires RISC OS 3"+CHR$0
  449.  4490
  450.  4500; ---------------------------------------------------------
  451.  4510; ------------------ large lumps of data ------------------
  452.  4520; ---------------------------------------------------------
  453.  4530
  454.  4540.sprite_area EQUD 16+_SpriteSize:EQUD 0
  455.  4550             EQUD 16:EQUD 0
  456.  4560.t_buff ; NB all this relies on sprite area being bigger than
  457.  4570        ;    biggest template
  458.  4580             FNspace(_SpriteSize)
  459.  4590
  460.  4600.i_buff      FNspace(_ISize)
  461.  4610
  462.  4620]:NEXT
  463.  4630REM PRINT"Total size ";O%-code%;" bytes"
  464.  4640OSCLI "Save "+_AppDir$+".!RunImage "+STR$~code%+" "+STR$~O%
  465.  4650OSCLI "SetType "+_AppDir$+".!RunImage Absolute"
  466.  4660END
  467.  4670
  468.  4680DEFFNspace(N%)
  469.  4690P%+=N%:O%+=N%:=opt
  470.  4700
  471.  4710DEFFNtwelve(A$)
  472.  4720$O%=LEFT$(A$+STRING$(12,CHR$0),12)
  473.  4730P%+=12:O%+=12:=opt
  474.  4740
  475.  4750DEFFNmenu(mflg%,submenu%,iflg%,idata$)
  476.  4760!O%=mflg%
  477.  4770O%!4=submenu%
  478.  4780O%!8=iflg%
  479.  4790$(O%+12)=LEFT$(idata$+STRING$(12,CHR$0),12)
  480.  4800O%+=24:P%+=24:=opt
  481.  4810
  482.  4820DEFFNw(W$)LOCALI%
  483.  4830FORI%=1TO_NWindows
  484.  4840IF_WName$(I%)=W$:=I%
  485.  4850NEXT
  486.  4860PRINT"Unknown window name ";W$:END
  487.