home *** CD-ROM | disk | FTP | other *** search
RISC OS BBC BASIC V Source | 1994-12-17 | 12.7 KB | 317 lines |
- Dismounter v0.05 By Andrew Sellors 17 December 1994
- Allows a click with Adjust on the ADFS Filer icon to dismount disc.
- See !Help file for status.
- $;" at line ";
- code &10000
- name$="Dismounter"
- date$=
- $,5,11)
- version$="0.05"
- XOS_WriteI = &20100
- OS_WriteI = &100
- Mouse_Click = 6
- Mouse_Click event contents
- mouse_x = 0
- mouse_y = 4
- mouse_buttons = 8
- mouse_window = 12
- mouse_icon = 16
- Wimp_GetIconState contents
- icon_window = 0
- icon_icon = 4
- icon_minx = 8
- icon_miny = 12
- icon_maxx = 16
- icon_maxy = 20
- icon_flags = 24
- icon_data = 28
- "(Service_FilterManagerInstalled = &87
- #$Service_FilterManagerDying = &88
- Select = 4
- Menu = 2
- Adjust = 1
- )JADFShandle = 256 :
- position of taskhandle of ADFS Filer in workspace
- *Itaskhandle = 260 :
- position of taskhandle of Dismouter in workspace
- ,'filter_mask = -1
- (1<<Mouse_Click)
- pass=4
- 2:P%=0:O%=code
- [OPT pass
- 1H EQUD &00000000 ; application start code (none)
- EQUD initialise
- EQUD closedown
- 4% EQUD handler_service_call
- EQUD module_title
- EQUD module_help
- 7# EQUD help_command_table
- 9T;*******************************************************************************
- .filter_name
- .module_title
- EQUS name$
- EQUB 0
-
- .module_help
- EQUS name$
- EQUB 9
- CC EQUS version$ + " (" + date$ + ") By Andrew Sellors"
- EQUB 0
- ALIGN
- GT;*******************************************************************************
- .help_command_table
- EQUS name$
- EQUB 0
- ALIGN
- M: EQUD &00000000 ; no command code
- N; EQUD &00000000 ; information word
- OM EQUD &00000000 ; use default invalid syntax message
- P# EQUD help_dismounter
- R7 EQUB 0 ; end of table
- ALIGN
- .help_dismounter
- VT EQUS "This module allows ADFS floppies to be dismounted by clicking "
- W5 EQUS "over the drive icon with Adjust"
- EQUB 13
- EQUB 0
- ALIGN
- \T;*******************************************************************************
- .handler_service_call
- `6 TEQ r1,#Service_FilterManagerInstalled
- a2 TEQNE r1,#Service_FilterManagerDying
- MOVNES pc,r14
- d< LDR r12,[r12] ; workspace pointer
- f6 TEQ r1,#Service_FilterManagerInstalled
- g2 BEQ service_FilterManagerInstalled
- i2 TEQ r1,#Service_FilterManagerDying
- j. BEQ service_FilterManagerDying
- lT;*******************************************************************************
- .initialise
- p) STMFD r13 !,{r0-r6,r12,r14}
- MOV r0,#129
- MOV r1,#0
- MOV r2,#&ff
- uG SWI "XOS_Byte" ; read RISC OS version into r1
- wB CMP r1,#&a3 ; RISC OS 3.00 or later ?
- x9 BLT init_oldriscos ; die if too old
- zH MOV r0,#6 ; 6 = allocate module workspace
- {: MOV r3,#296 ; number of bytes
- |D SWI "XOS_Module" ; allocate module workspace
- }B STR r2,[r12] ; store workspace pointer
- ~< MOV r12,r2 ; workspace pointer
- MOV r3,#0
- L STR r3,[r12,#ADFShandle] ; set taskhandle of ADFS Filer to 0
- B STR r3,[r12,#taskhandle] ; set our taskhandle to 0
- T BL find_adfsfiler ; search through all tasks for "ADFS Filer"
- ; ; taskhandle in r3
- A CMP r3,#0 ; has a task been found?
- H BEQ init_noadfsfiler ; die if no task has been found
- C BL add_filter ; add filter to task in r3
-
- ) LDMFD r13 !,{r0-r6,r12,pc}^
-
- .init_oldriscos
- ) LDMFD r13 !,{r0-r6,r12,r14}
- ) ADR r0,err_init_oldriscos
- 7
- RS pc,r14,#(1<<28) ; overflow flag
- .init_noadfsfiler
- ) LDMFD r13 !,{r0-r6,r12,r14}
- + ADR r0,err_init_noadfsfiler
- 7
- RS pc,r14,#(1<<28) ; overflow flag
- .err_init_noadfsfiler
- EQUD 0
- D EQUS "Dismouter failed to load, ADFS Filer not found"
- EQUB 0
- ALIGN
- .err_init_oldriscos
- EQUD 0
- Q EQUS "Dismouter failed to load, RISC OS too old, time to upgrade?"
- EQUB 0
- ALIGN
- T;*******************************************************************************
- .closedown
- % STMFD r13!,{r0-r12,r14}
- @ LDR r12,[r12] ; get workspace pointer
- B BL remove_filter ; remove filter from task
- D MOV r0,#7 ; 7 = free module workspace
- < MOV r2,r12 ; workspace pointer
- @ SWI "XOS_Module" ; free module workspace
- % LDMFD r13!,{r0-r12,pc}^
- T;*******************************************************************************
- #.service_FilterManagerInstalled
- ; r12 workspace pointer
- ! STMFD r13!,{r3,r14}
- T BL find_adfsfiler ; search through all tasks for "ADFS Filer"
- ; ; taskhandle in r3
- A CMP r3,#0 ; has a task been found?
- 8 LDMEQFD r13!,{r3,pc}^ ; return if not
- M BL add_filter ; add filter to task in r3 otherwise
- ! LDMFD r13!,{r3,pc}^
- T;*******************************************************************************
- .service_FilterManagerDying
- ; r12 workspace pointer
- ! STMFD r13!,{r0,r14}
- K MOV r0,#0 ; set taskhandle to 0 as no filter
- I STR r0,[r12,#ADFShandle] ; store taskhandle of ADFS Filer
- ! LDMFD r13!,{r0,pc}^
- T;*******************************************************************************
- .add_filter
- ;; r3 taskhandle of ADFS Filer r12 workspace pointer
- $ STMFD r13!,{r0-r4,r14}
- I STR r3,[r12,#ADFShandle] ; store taskhandle of ADFS Filer
- " ADR r0,filter_name
- " ADR r1,filter_code
- < MOV r2,r12 ; workspace pointer
- I ; taskhandle of ADFS Filer in r3
- & MVN r4,#
- (filter_mask)
- 0 SWI "XFilter_RegisterPostFilter"
- # LDMFD r13!,{r0-r4,pc}
- T;*******************************************************************************
- .remove_filter
- ; r12 workspace pointer
- $ STMFD r13!,{r0-r4,r14}
- G LDR r3,[r12,#ADFShandle] ; get taskhandle of ADFS Filer
- E CMP r3,#0 ; is there a filter present?
- @ LDMEQFD r13!,{r0-r4,pc} ; if not then just exit
- " ADR r0,filter_name
- " ADR r1,filter_code
- MOV r2,r12
- I ; taskhandle of ADFS Filer in r3
- & MVN r4,#
- (filter_mask)
- 2 SWI "XFilter_DeRegisterPostFilter"
- MOV r3,#0
- L STR r3,[r12,#ADFShandle] ; set taskhandle of ADFS Filer to 0
- # LDMFD r13!,{r0-r4,pc}
- T;*******************************************************************************
- .find_adfsfiler
- ; r12 workspace pointer
- 1; r3 on exit is taskhandle or #0 if not found
- * STMFD r13!,{r0-r2,r4-r6,r14}
- < MOV r0,#0 ; #0 for first call
- .enum
- < MOV r1,r12 ; pointer to buffer
- 8 MOV r2,#256 ; buffer length
- 1 SWI "XTaskManager_EnumerateTasks"
- T MOVVS r3,#0 ; no task handle if taskmanager not running
- C LDMVSFD r13!,{r0-r2,r4-r6,pc}; return if no taskmanager
- ? MOV r6,r12 ; addr of first record
- .traverse_loop
- ? LDR r3,[r6,#4] ; pointer to task name
- B ADR r4,ADFSFiler ; pointer to "ADFS Filer"
- = BL string_compare ; compare r3 with r4
- 9 CMP r4,#1 ; test for equal
- E LDREQ r3,[r6] ; task handle in r3 if found
- ? LDMEQFD r13!,{r0-r2,r4-r6,pc}; return if task found
- A ADD r6,r6,#16 ; advance to next record
- CMP r6,r1
- ! BLT traverse_loop
- = CMP r0,#0 ; find if more to do
- B BGE enum ; loop back if r0 not < 0
- > MOV r3,#0 ; ADFSFiler not found
- ) LDMFD r13!,{r0-r2,r4-r6,pc}
- .ADFSFiler
- # EQUS "ADFS Filer"
- EQUB 0
- ALIGN
- 'T;*******************************************************************************
- .filter_code
- *<; r0 = event reason code r1 = pointer to event block
- +7; r2 = handle of task r12 = workspace pointer
- -$ STMFD r13!,{r1-r2,r14}
- /* LDR r2,[r1,#mouse_buttons]
- CMP r2,#Adjust
- 1O BEQ check_text ; claim event if Adjust button pressed
- 3$ LDMFD r13!,{r1-r2,pc}^
- .check_text
- 64; checks icon text to see if it is a floppy icon
- 8 STMFD r13!,{r3,r4}
- :) LDR r2,[r1,#mouse_window]
- ;) STR r2,[r12,#icon_window]
- <' LDR r2,[r1,#mouse_icon]
- =' STR r2,[r12,#icon_icon]
- MOV r1,r12
- STMFD r13!,{r0}
- @B SWI "XWimp_GetIconState" ; r0 is corrupted!!!!!!!
- LDMFD r13!,{r0}
- C> LDR r3,[r12,#icon_data] ; get pointer to text
- ADR r4,floppy0
- FA BL string_compare ; compare text from icon
- G9 CMP r4,#1 ; test for equal
- H ADREQ r0,dismount0
- SWIEQ "XOS_CLI"
- J6 MVNEQ r0,#1 ; claim event
- ADR r4,floppy1
- MA BL string_compare ; compare text from icon
- N9 CMP r4,#1 ; test for equal
- O ADREQ r0,dismount0
- SWIEQ "XOS_CLI"
- Q6 MVNEQ r0,#1 ; claim event
- ADR r4,floppy2
- TA BL string_compare ; compare text from icon
- U9 CMP r4,#1 ; test for equal
- V ADREQ r0,dismount0
- SWIEQ "XOS_CLI"
- X6 MVNEQ r0,#1 ; claim event
- ADR r4,floppy3
- [A BL string_compare ; compare text from icon
- \9 CMP r4,#1 ; test for equal
- ] ADREQ r0,dismount0
- SWIEQ "XOS_CLI"
- _6 MVNEQ r0,#1 ; claim event
- a LDMFD r13!,{r3,r4}
- c$ LDMFD r13!,{r1-r2,pc}^
- .floppy0
- EQUS ":0"
- EQUB 0
- ALIGN
- .dismount0
- l% EQUS "ADFS:Dismount 0"
- EQUB 0
- ALIGN
- .floppy1
- EQUS ":1"
- EQUB 0
- ALIGN
- .dismount1
- v% EQUS "ADFS:Dismount 1"
- EQUB 0
- ALIGN
- .floppy2
- EQUS ":2"
- EQUB 0
- ALIGN
- .dismount2
- % EQUS "ADFS:Dismount 2"
- EQUB 0
- ALIGN
- .floppy3
- EQUS ":3"
- EQUB 0
- ALIGN
- .dismount3
- % EQUS "ADFS:Dismount 3"
- EQUB 0
- ALIGN
- T;*******************************************************************************
- .string_compare
- A; compare strings at r3 and r4 return 1 if same and 0 if not
- &; r0 char from r3 r1 char from r4
- ' STMFD r13!,{r0,r1,r3,r14}
- .string_compare_loop
- LDRB r0,[r3],#1
- LDRB r1,[r4],#1
- CMP r0,r1
- F MOVNE r4,#0 ; return r4=0 if not the same
- & LDMNEFD r13!,{r0,r1,r3,pc}
- CMP r1,#&20
- B BGE string_compare_loop ; loop back if more chars
- K MOV r4,#1 ; return r4=1 if they are the same
- & LDMFD r13!,{r0,r1,r3,pc}
-
- T;*******************************************************************************
- "OS_File",10,"<" + name$ + "$Dir>." + name$ ,&FFA ,, code, O%
-