home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / utilities / utilsd / dismounter / Source (.txt) < prev   
RISC OS BBC BASIC V Source  |  1994-12-17  |  13KB  |  317 lines

  1.  Dismounter v0.05 By Andrew Sellors 17 December 1994
  2.  Allows a click with Adjust on the ADFS Filer icon to dismount disc.
  3.  See !Help file for status.
  4. $;" at line ";
  5.  code &10000
  6. name$="Dismounter"
  7. date$=
  8. $,5,11)
  9. version$="0.05"
  10. XOS_WriteI = &20100
  11. OS_WriteI = &100
  12. Mouse_Click = 6
  13.  Mouse_Click event contents
  14. mouse_x       = 0
  15. mouse_y       = 4
  16. mouse_buttons = 8
  17. mouse_window  = 12
  18. mouse_icon    = 16
  19.  Wimp_GetIconState contents
  20. icon_window   = 0
  21. icon_icon     = 4
  22. icon_minx     = 8
  23. icon_miny     = 12
  24. icon_maxx     = 16
  25. icon_maxy     = 20
  26. icon_flags    = 24
  27. icon_data     = 28
  28. "(Service_FilterManagerInstalled = &87
  29. #$Service_FilterManagerDying = &88
  30. Select = 4
  31. Menu   = 2
  32. Adjust = 1
  33. )JADFShandle = 256 : 
  34.  position of taskhandle of ADFS Filer in workspace
  35. *Itaskhandle = 260 : 
  36.  position of taskhandle of Dismouter in workspace
  37. ,'filter_mask = -1 
  38.  (1<<Mouse_Click)
  39.  pass=4 
  40.  2:P%=0:O%=code
  41. [OPT pass
  42. 1H    EQUD     &00000000               ; application start code (none)
  43.     EQUD     initialise
  44.     EQUD     closedown
  45. 4%    EQUD     handler_service_call
  46.     EQUD     module_title
  47.     EQUD     module_help
  48. 7#    EQUD     help_command_table
  49. 9T;*******************************************************************************
  50. .filter_name
  51. .module_title
  52.         EQUS    name$
  53.         EQUB    0
  54.         
  55. .module_help
  56.         EQUS    name$
  57.         EQUB    9
  58. CC        EQUS    version$ + " (" + date$ + ") By Andrew Sellors"
  59.         EQUB    0
  60.         ALIGN
  61. GT;*******************************************************************************
  62. .help_command_table
  63.         EQUS    name$
  64.         EQUB    0
  65.         ALIGN
  66. M:        EQUD    &00000000            ; no command code
  67. N;        EQUD    &00000000            ; information word
  68. OM        EQUD    &00000000            ; use default invalid syntax message
  69. P#        EQUD    help_dismounter
  70. R7        EQUB    0                    ; end of table
  71.         ALIGN
  72. .help_dismounter
  73. VT        EQUS    "This module allows ADFS floppies to be dismounted by clicking "
  74. W5        EQUS    "over the drive icon with Adjust"
  75.         EQUB    13
  76.         EQUB    0
  77.         ALIGN
  78. \T;*******************************************************************************
  79. .handler_service_call
  80. `6        TEQ     r1,#Service_FilterManagerInstalled
  81. a2        TEQNE   r1,#Service_FilterManagerDying
  82.         MOVNES  pc,r14
  83. d<        LDR     r12,[r12]            ; workspace pointer
  84. f6        TEQ     r1,#Service_FilterManagerInstalled
  85. g2        BEQ     service_FilterManagerInstalled
  86. i2        TEQ     r1,#Service_FilterManagerDying
  87. j.        BEQ     service_FilterManagerDying
  88. lT;*******************************************************************************
  89. .initialise
  90. p)        STMFD   r13 !,{r0-r6,r12,r14}
  91.         MOV     r0,#129
  92.         MOV     r1,#0
  93.         MOV     r2,#&ff
  94. uG        SWI     "XOS_Byte"           ; read RISC OS version into r1
  95. wB        CMP     r1,#&a3              ; RISC OS 3.00 or later ?
  96. x9        BLT     init_oldriscos       ; die if too old
  97. zH        MOV     r0,#6                ; 6 = allocate module workspace
  98. {:        MOV     r3,#296              ; number of bytes
  99. |D        SWI     "XOS_Module"         ; allocate module workspace
  100. }B        STR     r2,[r12]             ; store workspace pointer
  101. ~<        MOV     r12,r2               ; workspace pointer
  102.         MOV     r3,#0
  103. L        STR     r3,[r12,#ADFShandle] ; set taskhandle of ADFS Filer to 0
  104. B        STR     r3,[r12,#taskhandle] ; set our taskhandle to 0
  105. T        BL      find_adfsfiler       ; search through all tasks for "ADFS Filer"
  106. ;                                     ; taskhandle in r3
  107. A        CMP     r3,#0                ; has a task been found?
  108. H        BEQ     init_noadfsfiler     ; die if no task has been found
  109. C        BL      add_filter           ; add filter to task in r3
  110.          
  111. )        LDMFD   r13 !,{r0-r6,r12,pc}^
  112.         
  113. .init_oldriscos
  114. )        LDMFD   r13 !,{r0-r6,r12,r14}
  115. )        ADR     r0,err_init_oldriscos
  116. 7        
  117. RS    pc,r14,#(1<<28)      ; overflow flag
  118. .init_noadfsfiler
  119. )        LDMFD   r13 !,{r0-r6,r12,r14}
  120. +        ADR     r0,err_init_noadfsfiler
  121. 7        
  122. RS    pc,r14,#(1<<28)      ; overflow flag
  123. .err_init_noadfsfiler
  124.         EQUD    0
  125. D        EQUS    "Dismouter failed to load, ADFS Filer not found"
  126.         EQUB    0
  127.         ALIGN
  128. .err_init_oldriscos
  129.         EQUD    0
  130. Q        EQUS    "Dismouter failed to load, RISC OS too old, time to upgrade?"
  131.         EQUB    0
  132.         ALIGN
  133. T;*******************************************************************************
  134. .closedown
  135. %        STMFD   r13!,{r0-r12,r14}
  136. @        LDR     r12,[r12]            ; get workspace pointer
  137. B        BL      remove_filter        ; remove filter from task
  138. D        MOV     r0,#7                ; 7 = free module workspace
  139. <        MOV     r2,r12               ; workspace pointer
  140. @        SWI     "XOS_Module"         ; free module workspace
  141. %        LDMFD   r13!,{r0-r12,pc}^
  142. T;*******************************************************************************
  143. #.service_FilterManagerInstalled
  144. ; r12 workspace pointer
  145. !        STMFD   r13!,{r3,r14}
  146. T        BL      find_adfsfiler       ; search through all tasks for "ADFS Filer"
  147. ;                                     ; taskhandle in r3
  148. A        CMP     r3,#0                ; has a task been found?
  149. 8        LDMEQFD r13!,{r3,pc}^        ; return if not
  150. M        BL      add_filter           ; add filter to task in r3 otherwise
  151. !        LDMFD   r13!,{r3,pc}^
  152. T;*******************************************************************************
  153. .service_FilterManagerDying
  154. ; r12 workspace pointer
  155. !        STMFD   r13!,{r0,r14}
  156. K        MOV     r0,#0                ; set taskhandle to 0 as no filter
  157. I        STR     r0,[r12,#ADFShandle] ; store taskhandle of ADFS Filer
  158. !        LDMFD   r13!,{r0,pc}^
  159. T;*******************************************************************************
  160. .add_filter
  161. ;; r3 taskhandle of ADFS Filer     r12 workspace pointer
  162. $        STMFD   r13!,{r0-r4,r14}
  163. I        STR     r3,[r12,#ADFShandle] ; store taskhandle of ADFS Filer
  164. "        ADR     r0,filter_name
  165. "        ADR     r1,filter_code
  166. <        MOV     r2,r12               ; workspace pointer
  167. I                                     ; taskhandle of ADFS Filer in r3
  168. &        MVN     r4,#
  169. (filter_mask)
  170. 0        SWI     "XFilter_RegisterPostFilter"
  171. #        LDMFD   r13!,{r0-r4,pc}
  172. T;*******************************************************************************
  173. .remove_filter
  174. ; r12 workspace pointer
  175. $        STMFD   r13!,{r0-r4,r14}
  176. G        LDR     r3,[r12,#ADFShandle] ; get taskhandle of ADFS Filer
  177. E        CMP     r3,#0                ; is there a filter present?
  178. @        LDMEQFD r13!,{r0-r4,pc}      ; if not then just exit
  179. "        ADR     r0,filter_name
  180. "        ADR     r1,filter_code
  181.         MOV     r2,r12
  182. I                                     ; taskhandle of ADFS Filer in r3
  183. &        MVN     r4,#
  184. (filter_mask)
  185. 2        SWI     "XFilter_DeRegisterPostFilter"
  186.         MOV     r3,#0
  187. L        STR     r3,[r12,#ADFShandle] ; set taskhandle of ADFS Filer to 0
  188. #        LDMFD   r13!,{r0-r4,pc}
  189. T;*******************************************************************************
  190. .find_adfsfiler
  191. ; r12 workspace pointer
  192. 1; r3 on exit is taskhandle or #0 if not found
  193. *        STMFD   r13!,{r0-r2,r4-r6,r14}
  194. <        MOV     r0,#0                ; #0 for first call
  195.     .enum
  196. <        MOV     r1,r12               ; pointer to buffer
  197. 8        MOV     r2,#256              ; buffer length
  198.     1        SWI     "XTaskManager_EnumerateTasks"
  199. T        MOVVS   r3,#0                ; no task handle if taskmanager not running
  200. C        LDMVSFD r13!,{r0-r2,r4-r6,pc}; return if no taskmanager
  201. ?        MOV     r6,r12               ; addr of first record
  202. .traverse_loop
  203. ?        LDR     r3,[r6,#4]           ; pointer to task name
  204. B        ADR     r4,ADFSFiler         ; pointer to "ADFS Filer"
  205. =        BL      string_compare       ; compare r3 with r4
  206. 9        CMP     r4,#1                ; test for equal
  207. E        LDREQ   r3,[r6]              ; task handle in r3 if found
  208. ?        LDMEQFD r13!,{r0-r2,r4-r6,pc}; return if task found
  209. A        ADD     r6,r6,#16            ; advance to next record
  210.         CMP     r6,r1
  211. !