home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / diskmanager / dismounter_1 / 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. !        BLT     traverse_loop
  212. =        CMP     r0,#0                ; find if more to do
  213. B        BGE     enum                 ; loop back if r0 not < 0
  214. >        MOV     r3,#0                ; ADFSFiler not found
  215.  )        LDMFD   r13!,{r0-r2,r4-r6,pc}
  216. .ADFSFiler
  217. #         EQUS    "ADFS Filer"
  218.         EQUB    0
  219.         ALIGN
  220. 'T;*******************************************************************************
  221. .filter_code
  222. *<; r0 = event reason code    r1  = pointer to event block
  223. +7; r2 = handle of task       r12 = workspace pointer
  224. -$        STMFD   r13!,{r1-r2,r14}
  225. /*        LDR     r2,[r1,#mouse_buttons]
  226.         CMP     r2,#Adjust
  227. 1O        BEQ     check_text           ; claim event if Adjust button pressed
  228. 3$        LDMFD   r13!,{r1-r2,pc}^
  229. .check_text
  230. 64; checks icon text to see if it is a floppy icon
  231. 8         STMFD   r13!,{r3,r4}
  232. :)        LDR     r2,[r1,#mouse_window]
  233. ;)        STR     r2,[r12,#icon_window]
  234. <'        LDR     r2,[r1,#mouse_icon]
  235. ='        STR     r2,[r12,#icon_icon]
  236.         MOV     r1,r12
  237.         STMFD   r13!,{r0}
  238. @B        SWI     "XWimp_GetIconState"  ; r0 is corrupted!!!!!!!
  239.         LDMFD   r13!,{r0}
  240. C>        LDR     r3,[r12,#icon_data]  ; get pointer to text
  241.         ADR     r4,floppy0
  242. FA        BL      string_compare       ; compare text from icon
  243. G9        CMP     r4,#1                ; test for equal
  244. H         ADREQ   r0,dismount0
  245.         SWIEQ   "XOS_CLI"
  246. J6        MVNEQ   r0,#1                ; claim event
  247.         ADR     r4,floppy1
  248. MA        BL      string_compare       ; compare text from icon
  249. N9        CMP     r4,#1                ; test for equal
  250. O         ADREQ   r0,dismount0
  251.         SWIEQ   "XOS_CLI"
  252. Q6        MVNEQ   r0,#1                ; claim event
  253.         ADR     r4,floppy2
  254. TA        BL      string_compare       ; compare text from icon
  255. U9        CMP     r4,#1                ; test for equal
  256. V         ADREQ   r0,dismount0
  257.         SWIEQ   "XOS_CLI"
  258. X6        MVNEQ   r0,#1                ; claim event
  259.         ADR     r4,floppy3
  260. [A        BL      string_compare       ; compare text from icon
  261. \9        CMP     r4,#1                ; test for equal
  262. ]         ADREQ   r0,dismount0
  263.         SWIEQ   "XOS_CLI"
  264. _6        MVNEQ   r0,#1                ; claim event
  265. a         LDMFD   r13!,{r3,r4}
  266. c$        LDMFD   r13!,{r1-r2,pc}^
  267. .floppy0
  268.         EQUS    ":0"
  269.         EQUB    0
  270.         ALIGN
  271. .dismount0
  272. l%        EQUS    "ADFS:Dismount 0"
  273.         EQUB    0
  274.         ALIGN
  275. .floppy1
  276.         EQUS    ":1"
  277.         EQUB    0
  278.         ALIGN
  279. .dismount1
  280. v%        EQUS    "ADFS:Dismount 1"
  281.         EQUB    0
  282.         ALIGN
  283. .floppy2
  284.         EQUS    ":2"
  285.         EQUB    0
  286.         ALIGN
  287. .dismount2
  288. %        EQUS    "ADFS:Dismount 2"
  289.         EQUB    0
  290.         ALIGN
  291. .floppy3
  292.         EQUS    ":3"
  293.         EQUB    0
  294.         ALIGN
  295. .dismount3
  296. %        EQUS    "ADFS:Dismount 3"
  297.         EQUB    0
  298.         ALIGN
  299. T;*******************************************************************************
  300. .string_compare
  301. A; compare strings at r3 and r4 return 1 if same and 0 if not 
  302. &; r0 char from r3  r1 char from r4
  303. '        STMFD   r13!,{r0,r1,r3,r14}
  304. .string_compare_loop
  305.         LDRB    r0,[r3],#1
  306.         LDRB    r1,[r4],#1
  307.         CMP     r0,r1
  308. F        MOVNE   r4,#0                ; return r4=0 if not the same
  309. &        LDMNEFD r13!,{r0,r1,r3,pc}
  310.         CMP     r1,#&20
  311. B        BGE     string_compare_loop  ; loop back if more chars
  312. K        MOV     r4,#1                ; return r4=1 if they are the same
  313. &        LDMFD   r13!,{r0,r1,r3,pc}
  314.         
  315. T;*******************************************************************************
  316.  "OS_File",10,"<" + name$ + "$Dir>." + name$ ,&FFA ,, code, O%
  317.