home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ARM Club 3
/
TheARMClub_PDCD3.iso
/
hensa
/
diskmanager
/
dismounter_1
/
Source
(
.txt
)
< prev
Wrap
RISC OS BBC BASIC V Source
|
1994-12-17
|
13KB
|
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%