home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / desktop / newbar / Source / s / module < prev   
Text File  |  1998-08-08  |  8KB  |  341 lines

  1.  
  2.  AREA    |!!!Module$$Header|, CODE, READONLY
  3.  GET    OS:hdr.OSModule
  4.  GET    OS:hdr.OSFind
  5.  GET    OS:hdr.OSFile
  6.  GET    OS:hdr.Wimp
  7.  GET    OS:hdr.WimpReadSysInfo
  8.  GET    hdr.ibpatch
  9.  GET    hdr.debug
  10.  
  11.  
  12.  IMPORT    pre_wimp_createicon
  13.  IMPORT    pre_wimp_deleteicon
  14.  IMPORT    pre_wimp_createmenu
  15.  IMPORT    pre_wimp_getwindowstate
  16.  IMPORT    pre_wimp_getwindowinfo
  17.  IMPORT    pre_wimp_seticonstate
  18.  IMPORT pre_wimp_geticonstate
  19.  IMPORT    pre_wimp_forceredraw
  20.  IMPORT    pre_wimp_whichicon
  21.  IMPORT    pre_wimp_dragbox
  22.  IMPORT    pre_wimp_getwindowoutline
  23.  IMPORT    pre_wimp_sendmessage
  24.  IMPORT    post_wimp_getpointerinfo
  25.  IMPORT pre_wimp_resizeicon
  26.  
  27.  
  28. ; Module header
  29.  ENTRY
  30. module_base
  31.  DCD    rm_start    - module_base
  32.  DCD    rm_init        - module_base
  33.  DCD    rm_final    - module_base
  34.  DCD    rm_service    - module_base
  35.  DCD    rm_title    - module_base
  36.  DCD    rm_help        - module_base
  37.  DCD    rm_hc_table    - module_base
  38. ; Zero the SWI-related offsets just in case
  39.  DCD    0, 0, 0, 0
  40.  
  41. ; Essential module information
  42. rm_title
  43.  = "IconbarPatch", 0
  44.  
  45. rm_help
  46.  = "IconbarPatch", 9
  47.  = "1.10 (08 Aug 1998), "
  48.  [ :DEF:DEBUG
  49.  = "debug build"
  50.  |
  51.  = "normal build"
  52.  ]
  53.  = ", by Mark Seaborn", 0
  54.  ALIGN
  55.  
  56. ; Unused module entry points
  57. rm_start    * module_base
  58. rm_hc_table    * module_base
  59.  
  60.  
  61. ; Module initialisation point
  62.  [ :DEF:DEBUG
  63. debug_file
  64.  = "$.Public.IbPDebug", 0
  65.  ALIGN
  66.  ]
  67.  
  68. rm_init_code
  69.  DCD    wimp_swive_code
  70.  
  71. rm_init
  72.  stmfd    sp!, {r0-r4, lr}
  73.  
  74. ; allocate block
  75.  mov    r0, #OSModule_Alloc
  76.  mov    r3, #block_size
  77.  swi    XOS_Module
  78.  bvs    rm_init_error
  79.  str    r2, [r12]
  80.  mov    r12, r2
  81.  
  82.  [ :DEF:DEBUG
  83. ; open our debug file
  84.  mov    r0, #&80
  85.  adr    r1, debug_file
  86.  swi    XOS_Find
  87.  bvs    rm_init_error
  88.  str    r0, [r12, #block_debug_file]
  89. ; now set its filetype to text
  90.  mov    r0, #18
  91.  adr    r1, debug_file
  92.  mov    r2, #&1000
  93.  sub    r2, r2, #1
  94.  swi    XOS_File
  95.  bvs    rm_init_error
  96. ; open initial message to check that it's working
  97.  DEBUG_MSG    "IconbarPatch starting up", 10
  98.  ]
  99.  
  100. ; init block
  101. ; Zero some values
  102.  mov    r0, #0
  103.  str    r0, [r12, #block_usage_count]
  104.  str    r0, [r12, #block_start_flag]
  105.  str    r0, [r12, #block_x_offset]
  106.  str    r0, [r12, #block_y_offset]
  107.  str    r0, [r12, #block_flags]
  108.  str    r0, [r12, #block_icon_count]
  109. ; Initialise lists (beginning entries and entry count)
  110.  str    r0, [r12, #block_list_begin]
  111.  str    r0, [r12, #block_list_keep_begin]
  112.  str    r0, [r12, #block_list_count]
  113.  str    r0, [r12, #block_list_keep_count]
  114. ; Set event list end
  115.  add    r0, r12, #block_list_begin
  116.  str    r0, [r12, #block_list_end]
  117. ; Set keep list end
  118.  add    r0, r12, #block_list_keep_begin
  119.  str    r0, [r12, #block_list_keep_end]
  120.  
  121. ; some sensible defaults
  122.  mov    r0, #-2
  123.  str    r0, [r12, #block_window]
  124.  mov    r0, #-1
  125.  str    r0, [r12, #block_pointer_icon]
  126.  mov    r0, #0
  127.  str    r0, [r12, #block_pointer_task]
  128. ; value of r0 is carried through
  129.  
  130. ; zero the iconbar window state block, just in case
  131. ; yes, I know this is a lazy way to do it :-)
  132.  str    r0, [r12, #block_iconbar_state + 0]
  133.  str    r0, [r12, #block_iconbar_state + 4]
  134.  str    r0, [r12, #block_iconbar_state + 8]
  135.  str    r0, [r12, #block_iconbar_state + 12]
  136.  str    r0, [r12, #block_iconbar_state + 16]
  137.  str    r0, [r12, #block_iconbar_state + 20]
  138.  str    r0, [r12, #block_iconbar_state + 24]
  139.  str    r0, [r12, #block_iconbar_state + 28]
  140.  str    r0, [r12, #block_iconbar_state + 32]
  141.  
  142. ; constant across all SWI claims
  143.  ldr    r0, rm_init_code
  144.  mov    r2, r12
  145.  
  146.  MACRO
  147.  claim_pre    $swi_name, $routine
  148.  mov    r1, #($swi_name - Wimp_ChunkNo) :OR: wimp_swive_claim
  149.  adrl    r3, $routine
  150.  mov    r4, #0
  151.  swi    XWimp_RegisterFilter
  152.  bvs    rm_init_error
  153.  MEND
  154.  
  155.  MACRO
  156.  claim_post    $swi_name, $routine
  157.  mov    r1, #($swi_name - Wimp_ChunkNo) :OR: wimp_swive_claim
  158.  mov    r3, #0
  159.  adrl    r4, $routine
  160.  swi    XWimp_RegisterFilter
  161.  bvs    rm_init_error
  162.  MEND
  163.  
  164.  claim_pre    Wimp_CreateIcon, pre_wimp_createicon
  165.  claim_pre    Wimp_DeleteIcon, pre_wimp_deleteicon
  166.  claim_pre    Wimp_CreateMenu, pre_wimp_createmenu
  167.  claim_pre    Wimp_GetWindowState, pre_wimp_getwindowstate
  168.  claim_pre    Wimp_GetWindowInfo, pre_wimp_getwindowinfo
  169.  claim_pre    Wimp_SetIconState, pre_wimp_seticonstate
  170.  claim_pre    Wimp_GetIconState, pre_wimp_geticonstate
  171.  claim_pre    Wimp_ForceRedraw, pre_wimp_forceredraw
  172.  claim_pre    Wimp_WhichIcon, pre_wimp_whichicon
  173.  claim_pre    Wimp_DragBox, pre_wimp_dragbox
  174.  claim_pre    Wimp_SendMessage, pre_wimp_sendmessage
  175.  claim_pre    Wimp_GetWindowOutline, pre_wimp_getwindowoutline
  176.  claim_post    Wimp_GetPointerInfo, post_wimp_getpointerinfo
  177.  claim_pre    Wimp_ResizeIcon, pre_wimp_resizeicon
  178.  
  179.  ldmfds    sp!, {r0-r4, pc}
  180. rm_init_error
  181.  mov    r12, r0
  182.  ldmfd    sp!, {r0-r4, lr}
  183.  mov    r0, r12
  184.  mov    pc, lr
  185.  
  186.  
  187. ; Module finalisation point
  188. rm_final
  189.  stmfd    sp!, {r0-r4, lr}
  190.  ldr    r12, [r12]
  191.  
  192. ; constant across all SWI releases
  193.  ldr    r0, rm_init_code
  194.  mov    r2, r12
  195.  
  196.  MACRO
  197.  release_pre    $swi_name, $routine
  198.  mov    r1, #($swi_name - Wimp_ChunkNo) :OR: wimp_swive_release
  199.  adrl    r3, $routine
  200.  mov    r4, #0
  201.  swi    XWimp_RegisterFilter
  202.  bvs    rm_final_error
  203.  MEND
  204.  
  205.  MACRO
  206.  release_post    $swi_name, $routine
  207.  mov    r1, #($swi_name - Wimp_ChunkNo) :OR: wimp_swive_release
  208.  mov    r3, #0
  209.  adrl    r4, $routine
  210.  swi     XWimp_RegisterFilter
  211.  bvs    rm_final_error
  212.  MEND
  213.  
  214.  release_pre    Wimp_CreateIcon, pre_wimp_createicon
  215.  release_pre    Wimp_DeleteIcon, pre_wimp_deleteicon
  216.  release_pre    Wimp_CreateMenu, pre_wimp_createmenu
  217.  release_pre    Wimp_GetWindowState, pre_wimp_getwindowstate
  218.  release_pre    Wimp_GetWindowInfo, pre_wimp_getwindowinfo
  219.  release_pre    Wimp_SetIconState, pre_wimp_seticonstate
  220.  release_pre    Wimp_GetIconState, pre_wimp_geticonstate
  221.  release_pre    Wimp_ForceRedraw, pre_wimp_forceredraw
  222.  release_pre    Wimp_WhichIcon, pre_wimp_whichicon
  223.  release_pre    Wimp_DragBox, pre_wimp_dragbox
  224.  release_pre    Wimp_SendMessage, pre_wimp_sendmessage
  225.  release_pre    Wimp_GetWindowOutline, pre_wimp_getwindowoutline
  226.  release_post    Wimp_GetPointerInfo, post_wimp_getpointerinfo
  227.  release_pre    Wimp_ResizeIcon, pre_wimp_resizeicon
  228.  
  229. ; free both event lists
  230.  mov    r0, #block_list
  231.  bl    free_event_list
  232.  movvc    r0, #block_list_keep
  233.  blvc    free_event_list
  234.  bvs    rm_final_error
  235.  
  236.  [ :DEF:DEBUG
  237. ; output a closing message
  238.  DEBUG_MSG    "IconbarPatch finishing", 10
  239. ; close our debug file
  240.  mov    r0, #0
  241.  ldr    r1, [r12, #block_debug_file]
  242.  swi    XOS_Find
  243.  bvs    rm_final_error
  244.  ]
  245.  
  246. ; free block
  247.  mov    r0, #OSModule_Free
  248.  mov    r2, r12
  249.  swi    XOS_Module
  250.  bvs    rm_final_error
  251.  
  252.  ldmfd    sp!, {r0-r4, pc}
  253. rm_final_error
  254.  mov    r12, r0
  255.  ldmfd    sp!, {r0-r4, lr}
  256.  mov    r0, r12
  257.  mov    pc, lr
  258.  
  259.  
  260. ; Free one of the module's lists of events
  261. ; r12 is workspace pointer as usual; r0 has offset of list info
  262. free_event_list
  263.  stmfd    sp!, {r4-r5, lr}
  264.  stmfd    sp!, {r0-r2}
  265. ; r4 contains address of current block
  266.  ldr    r4, [r12, r0]
  267.  
  268. free_event_list_loop
  269.  cmp    r4, #0
  270.  beq    free_event_list_end
  271. ; r4 contains next block; r2 contains block to free
  272.  mov    r2, r4
  273.  ldr    r4, [r4, #element_next]
  274. ; Free the block (r2 already filled in)
  275.  mov    r0, #OSModule_Free
  276.  swi    XOS_Module
  277.  bvs    free_event_list_end
  278.  b    free_event_list_loop
  279.  
  280. free_event_list_end
  281.  ldmfd    sp!, {r0-r2}
  282. ; Tidy up by zeroing the fields (r4 zero from before, r5 write address)
  283.  add    r5, r12, r0
  284.  str    r4, [r5], #4
  285.  str    r4, [r5], #4
  286.  str    r4, [r5], #4
  287.  ldmfd    sp!, {r4-r5, pc}
  288.  
  289.  
  290. ; Service call handler
  291. ; We are interested in three service calls:
  292. ;  Service_StartWimp
  293. ;  Service_StartedWimp
  294. ;  Service_Reset
  295.  
  296. rm_service
  297. ; Return quickly if we don't care about this one
  298.  teq    r1, #Service_StartWimp
  299.  teqne    r1, #Service_StartedWimp
  300.  teqne    r1, #Service_Reset
  301.  movnes    pc, lr
  302.  
  303.  ldr    r12, [r12]
  304.  
  305. ; Which service call?
  306.  cmp    r1, #Service_StartWimp
  307.  beq    rm_service_start_iconbar
  308. ; Otherwise drop through
  309.  
  310. ; Service_StartedWimp or Service_Reset
  311. ; Reset the flag to zero so that iconbar can be started
  312. rm_service_desktop_starting
  313.  stmfd    sp!, {lr}
  314.  mov    lr, #0
  315.  str    lr, [r12, #block_start_flag]
  316.  ldmfds    sp!, {pc}
  317.  
  318. ; Service_StartWimp
  319. ; If task not running, return command to start the iconbar task
  320. rm_service_start_iconbar
  321.  stmfd    sp!, {lr}
  322. ; Return if the flag is set
  323.  ldr    lr, [r12, #block_start_flag]
  324.  cmp    lr, #0
  325.  ldmnefds sp!, {pc}
  326. ; Otherwise set the flag to -1
  327.  mov    lr, #-1
  328.  str    lr, [r12, #block_start_flag]
  329. ; And return with the command
  330.  adr    r0, iconbar_start_command
  331.  mov    r1, #0
  332.  ldmfds    sp!, {pc}
  333.  
  334. ; Iconbar will be started via an alias:
  335. iconbar_start_command
  336.  = "Desktop_StartIconbar", 0
  337.  ALIGN
  338.  
  339.  
  340.  END
  341.