home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 5
/
DATAFILE_PDCD5.iso
/
utilities
/
a
/
appsswi
/
ZSource
/
ErrorSrc
(
.txt
)
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
RISC OS BBC BASIC V Source
|
1995-04-23
|
39.2 KB
|
1,226 lines
ErrorWindow 0.04 - give nice error windows, on RISC OS 3.1 and above
by AjC of DoggySoft
Requires BAX 1.00 or later to compile. Source best viewed in a big mode, 114 column formatting
trappedswi=&400DF-&400C0
scratchsize=256
minimumbuttonwidth=166
numberofbuttons=6
buttonthatdeletessprites=5
twospriteseparation=8
buttondelay=15
wimpinitver=200
icon_colourbox=0
icon_innerframe=2
icon_message=3
icon_title=4
icon_titlejoin=6
icon_typeicon=7
icon_application=8
icon_firstbutton=9
OS_WriteI=256
Wimp_TextOp=&400F9
XOS_WriteI=&20000+OS_WriteI
#XWimp_TextOp=&20000+Wimp_TextOp
service_reporterror=&57
service_errorstarting=&400C0
%service_errorbuttonpressed=&400C1
service_errorending=&400C2
os_byte_flush=21
os_byte_ptrshape=106
os_byte_scankeys=121
$!os_byte_acknowledgeescape=126
os_byte_readkeys=129
os_byte_readcmos=161
os_word_mouse=21
os_word_mouse_bbox=1
os_module_quit=4
os_module_claim=6
os_module_release=7
os_file_load=16
os_file_info=17
os_spriteop_select=24
os_spriteop_setpointer=36
0 os_spriteop_switchcontext=60
wimp_readsysinfo_task=5
wimp_readsysinfo_wimpver=7
wimp_textop_stringwidth=1
buffer_keyboard=0
buffer_mouse=9
cmos_wimpflags=197
iconflag_selected=21
iconflag_deleted=23
modevar_xpix=11
modevar_ypix=12
modevar_xeig=4
modevar_yeig=5
fbit=26
ibit=27
vbit=28
cbit=29
zbit=30
nbit=31
colour_blue=8
colour_red=11
colour_green=13
w=0 :wk_messagesblock=w
w+=4:wk_windowblock=w
w+=4:wk_indirblock=w
w+=4:wk_scratchblock=w
w+=4:wk_windowhandle=w
w+=4:wk_threaded=w
w+=4:wk_numberofbuttons=w
w+=4:wk_buttonwidth=w
w+=4:wk_firstuserbutton=w
w+=4:wk_describebutton=w
w+=4:wk_oldptrshape=w
w+=4:wk_temptaskhandle=w
V!w+=4:wk_baderrorcanceladded=w
code 100000
0,"Error in compilation, pass "+
pass+": "+
$+", at line "+
pass=4
O%=code:P%=0
[OPT pass
Equd 0
Equd mod_init
Equd mod_quit
Equd mod_service
Equd mod_title
Equd mod_help
Equd 0
Equd 0
Equd 0
Equd 0
Equd 0
.serv_errorstarting
m# Equd service_errorstarting
.serv_errorbuttonpressed
p( Equd service_errorbuttonpressed
.serv_errorending
s! Equd service_errorending
.specialfilter
Equs "WSWI"
.wimptask
Equs "TASK"
.mod_title
Equz "3DErrorWindow"
Align
.mod_help
" Equs "3D Error Window"+
" Equz "0.04 (27 Apr 1995)"
.messagesfile
& Equz "3DErrorWindow:Messages"
.templatesfile
' Equz "3DErrorWindow:Templates"
.templatename
Equz "Error"
.t_oldtitleprefix
Equs "TitleO="
.t_newtitleprefix0
Equs "Title0="
.t_newtitleprefix1
Equs "Title1="
.t_newtitleprefix2
Equs "Title2="
.t_newtitleprefix3
Equs "Title3="
.t_newtitleprefix4
Equs "Title4="
.t_newtitleprefix5
Equs "Title5="
.t_titlefrom
Equs "TitleFrom="
.t_oldok
Equs "OldOK="
.t_newok
Equs "NewOK="
.t_cancel
Equs "Cancel="
.t_quit
Equs "Quit="
.t_describe
Equs "Describe="
.t_baderror
Equs "BadError="
.t_unknowntask
Equs "UnknownTask="
.spritetype0
Equz "error"
.spritetype1
Equz "information"
.spritetype2
Equz "warning"
.spritetype3
Equz "program"
.spritetype4
Equz "question"
.spritetype5
Equz "watchdog"
.ptr_default
Equz "ptr_default"
Align
.error_badmessages
Equd 0
3 Equz "3DErrorWindow Messages file missing"
Align
.error_nowindow
Equd 0
4 Equz "3DErrorWindow Error template missing"
Align
.mod_init
StmFd R13!,{R0-R4,R14}
! Mov R0,#os_module_claim
Mov R3,#w
Add R3,R3,#scratchsize
Swi "XOS_Module"
AddVs R13,R13,#4
V LdmVsFd R13!,{R1-R4,Pc} ; claim some workspace
Str R2,[R12]
Mov R12,R2
Add R0,R12,#w
' Str R0,[R12,#wk_scratchblock]
Mov R0,#0
# Str R0,[R12,#wk_threaded]
& Str R0,[R12,#wk_windowblock]
[ Str R0,[R12,#wk_indirblock] ; initialise some workspace
Mov R0,#os_file_info
AdrL R1,messagesfile
Swi "XOS_File"
BVs badinit
Teq R0,#1
" AdrNe R0,error_badmessages
BNe badinit
! Mov R0,#os_module_claim
Add R3,R4,#1
Swi "XOS_Module"
BVs badinit
( Str R2,[R12,#wk_messagesblock]
Mov R0,#os_file_load
AdrL R1,messagesfile
Mov R3,#0
Swi "XOS_File"
BVs badinit
( Ldr R2,[R12,#wk_messagesblock]
Mov R0,#0
] StrB R0,[R2,R4] ; load module's Messages file
AdrL R1,templatesfile
" Swi "XWimp_OpenTemplate"
BVs badinit
Mov R1,#0
Mov R2,#0
Mov R3,#0
Mvn R4,#0
AdrL R5,templatename
Mov R6,#0
" Swi "XWimp_LoadTemplate"
$ BVs badinit_closetemplates
Teq R0,#0
AdrEq R0,error_nowindow
$ BEq badinit_closetemplates
Add R4,R2,#4
! Mov R0,#os_module_claim
Add R3,R1,#4
Swi "XOS_Module"
$ BVs badinit_closetemplates
& Str R2,[R12,#wk_windowblock]
! Mov R0,#os_module_claim
Mov R3,R4
Swi "XOS_Module"
$ BVs badinit_closetemplates
% Str R2,[R12,#wk_indirblock]
& Ldr R1,[R12,#wk_windowblock]
Add R3,R2,R4
Mvn R4,#0
AdrL R5,templatename
Mov R6,#0
" Swi "XWimp_LoadTemplate"
$ BVs badinit_closetemplates
\ Swi "XWimp_CloseTemplate" ; load window into workspace
Ldr R0,specialfilter
Mov R1,#trappedswi
Orr R1,R1,#1<<31
Mov R2,R12
Adr R3,reporterror
Mov R4,#0
%$ Swi "XWimp_RegisterFilter"
&\ BVs badinit ; claim SWI Wimp_ReportError
LdmFd R13!,{R0-R4,Pc}^
.badinit_closetemplates
Mov R4,R0
+# Swi "XWimp_CloseTemplate"
Mov R0,R4
.badinit
Mov R4,R0
/& Ldr R2,[R12,#wk_windowblock]
Teq R2,#0
1# MovNe R0,#os_module_release
SwiNe "XOS_Module"
3% Ldr R2,[R12,#wk_indirblock]
Teq R2,#0
5# MovNe R0,#os_module_release
SwiNe "XOS_Module"
7# Mov R0,#os_module_release
Mov R2,R12
9\ Swi "XOS_Module" ; free any workspace claimed
Mov R0,R4
Add R13,R13,#4
LdmFd R13!,{R1-R4,R14}
=R OrrS Pc,R14,#1<<vbit ; and report error
.mod_quit
StmFd R13!,{R0-R3,R14}
Ldr R12,[R12]
Ldr R0,specialfilter
Mov R1,#trappedswi
Mov R2,R12
Adr R3,reporterror
Mov R4,#0
G^ Swi "XWimp_RegisterFilter" ; release SWI Wimp_ReportError
H# Mov R0,#os_module_release
Mov R2,R12
JS Swi "XOS_Module" ; release workspace
LdmFd R13!,{R0-R3,Pc}^
.mod_service
Teq R1,#&27
MovNeS Pc,R14
StmFd R13!,{R0-R2,R14}
Adr R0,callback
Adr R12,mod_title
So LdmFd R13!,{R0-R2,Pc}^ ; for various reasons, we can't survive a reset
.callback
StmFd R13!,{R0,R1,R14}
W Mov R0,#os_module_quit
Mov R1,R12
Swi "XOS_Module"
LdmFd R13!,{R0,R1,Pc}^
.reporterror
StmFd R13!,{R0-R7,R14}
^$ Ldr R14,[R12,#wk_threaded]
Teq R14,#0
LdmNeFd R13!,{R0-R7,Pc}^
Mov R14,#1
b$ Str R14,[R12,#wk_threaded]
Tst R1,#(1<<5)+(1<<6)
TstEq R1,#1<<31
eg BNe reporterror_passon ; we can't deal with these funny events
LdmFd R13!,{R2-R7}
g# AdrL R1,serv_errorstarting
Ldr R1,[R1]
Swi "XOS_ServiceCall"
jq StmFd R13!,{R2-R7} ; allow Service_ErrorStarting to change registers
.anothererror_jumpin
Ldr R1,[R13,#4]
Tst R1,#(1<<5)+(1<<6)
TstEq R1,#1<<31
og BNe reporterror_passon ; we can't deal with these funny events
Ldr R0,[R13]
Ldr R0,[R0]
Tst R0,#1<<31
sp BEq doerrorystuff ; skip this next rubbish unless a fatalish error
Tst R1,#1<<4
LdrNe R0,[R13,#8]
BNe taskname_string
w' Mov R0,#wimp_readsysinfo_task
x! Swi "XWimp_ReadSysInfo"
BVs doerrorystuff
Teq R0,#0
{/ SwiNe "XTaskManager_TaskNameFromHandle"
TeqVs R0,R0
LdrEq R0,[R13,#8]
Cmn R0,#1
BEq taskname_unknown
.taskname_string
Cmn R0,#1
BEq taskname_unknown
' Ldr R1,[R12,#wk_scratchblock]
Mov R14,#0
Str R14,[R1],#4
.loop
LdrB R2,[R0],#1
Cmp R2,#32
StrPlB R2,[R1],#1
BPl loop
Mov R0,R1
B taskname_got
.taskname_unknown
' Ldr R0,[R12,#wk_scratchblock]
Mov R14,#0
Str R14,[R0],#4
( Ldr R1,[R12,#wk_messagesblock]
AdrL R2,t_unknowntask
Bl translate
BVs doerrorystuff
t Sub R0,R2,#1 ; get app name (title or task or unknown) into block
.taskname_got
( Ldr R1,[R12,#wk_messagesblock]
AdrL R2,t_baderror
Bl translate
k BVs doerrorystuff ; copy the rest of the error message across
' Ldr R0,[R12,#wk_scratchblock]
Ldr R1,[R13,#4]
Tst R1,#1<<1
MovEq R14,#1
MovNe R14,#0
/ Str R14,[R12,#wk_baderrorcanceladded]
Orr R1,R1,#1<<1
Bic R1,R1,#1<<2
Tst R1,#1<<8
Orr R1,R1,#1<<8
Bic R1,R1,#7<<9
Orr R1,R1,#3<<9
Orr R1,R1,#1<<31
Ldr R2,[R13,#8]
Ldr R3,[R13,#12]
Ldr R4,[R13,#16]
MovEq R3,#0
MovEq R4,#1
) Adr R14,backafterfirstrequester
Mov R5,Pc
And R5,R5,#&FC000003
Orr R14,R14,R5
Ldr R5,[R13,#20]
MovEq R5,#0
StmFd R13!,{R9}
StmFd R13!,{R0-R7,R14}
r B doerrorystuff ; do a preliminary requester with 'Describe' on it
.backafterfirstrequester
Mov R0,#1
# Str R0,[R12,#wk_threaded]
Cmn R9,#1
LdmFd R13!,{R9}
BNe reporterror_passon
. Ldr R0,[R12,#wk_baderrorcanceladded]
Teq R0,#1
MovEq R14,#0
$ StrEq R14,[R12,#wk_threaded]
TeqEq R1,#2
n SwiEq "OS_Exit" ; if 'cancel' clicked and we added it, we quit
Cmn R1,#1
MovNe R14,#0
$ StrNe R14,[R12,#wk_threaded]
MvnNe R9,#0
AddNe R13,R13,#8
q LdmNeFd R13!,{R2-R7,Pc}^ ; if 'describe', now show real error, else return
.doerrorystuff
Ldr R0,[R13]
Add R0,R0,#4
s Mov R1,#icon_message ; copy error message to message icon - ignore error
` Bl seticonstring ; from Wimp_TextOp as irrelevent
' Mov R0,#wimp_readsysinfo_task
! Swi "XWimp_ReadSysInfo"
BVs reporterror_passon
Teq R0,#0
MvnNe R0,#0
) StrNe R0,[R12,#wk_temptaskhandle]
BNe gotatask
Mov R0,#wimpinitver
AdrL R1,wimptask
Ldr R1,[R1]
AdrL R2,mod_title
Swi "XWimp_Initialise"
BVs reporterror_passon
s Str R0,[R12,#wk_temptaskhandle] ; if we're outside the WIMP, start a temporary task
.gotatask
Ldr R1,[R13,#4]
Tst R1,#1<<4
LdrNe R0,[R13,#8]
r BNe copytotitle ; if bit 4 is set, we don't have to use do this...
Tst R1,#1<<8
! AdrEqL R0,t_oldtitleprefix
BEq gotprefix
And R1,R1,#7<<9
Mov R1,R1,Lsr#9
AndS R1,R1,#7
" AdrEqL R0,t_newtitleprefix0
Teq R1,#1
" AdrEqL R0,t_newtitleprefix1
Teq R1,#2
" AdrEqL R0,t_newtitleprefix2
Teq R1,#3
" AdrEqL R0,t_newtitleprefix3
Teq R1,#4
" AdrEqL R0,t_newtitleprefix4
Cmp R1,#5
" AdrEqL R0,t_newtitleprefix5
! AdrGtL R0,t_oldtitleprefix
s.gotprefix ; find which title prefix to use according to flags
Mov R2,R0
( Ldr R1,[R12,#wk_messagesblock]
' Ldr R0,[R12,#wk_scratchblock]
Bl translate
% BVs reporterror_passon_quit
Ldr R1,[R13,#8]
Cmn R1,#1
' LdrEq R0,[R12,#wk_scratchblock]
BEq copytotitle
Sub R0,R2,#1
( Ldr R1,[R12,#wk_messagesblock]
AdrL R2,t_titlefrom
Bl translate
% BVs reporterror_passon_quit
Sub R1,R2,#1
Ldr R0,[R13,#8]
.loop
LdrB R14,[R0],#1
Cmp R14,#32
MovMi R14,#0
StrB R14,[R1],#1
BPl loop
r Ldr R0,[R12,#wk_scratchblock] ; copy prefix and appname (if supplied) to a block
.copytotitle
Mov R1,#icon_title
Bl seticonstring
T BVs reporterror_passon_quit ; copy title to icon
Add R1,R0,#48
! Mov R0,#icon_innerframe
Bl geticonwidth
SubS R0,R0,#22
Cmp R0,R1
MovMi R1,R0
Mov R0,#icon_title
Z Bl seticonwidth ; make text fit icon width
& Ldr R0,[R12,#wk_windowblock]
Add R0,R0,#88
" Add R1,R0,#32*icon_title
Ldr R1,[R1,#8]
& Add R2,R0,#32*icon_titlejoin
Ldr R3,[R2]
Ldr R4,[R2,#8]
Sub R3,R4,R3
Str R1,[R2,#8]
Sub R3,R1,R3
u Str R3,[R2] ; right-align the title join to the edge of the title
Ldr R1,[R13,#4]
Tst R1,#1<<8
MovEq R1,#0
AndNe R1,R1,#7<<9
MovNe R1,R1,Lsr#9
Mov R0,#colour_red
Teq R1,#1
MovEq R0,#colour_green
Teq R1,#2
MovEq R0,#colour_red
Teq R1,#3
MovEq R0,#colour_red
Teq R1,#4
MovEq R0,#colour_blue
Teq R1,#5
0] MovEq R0,#colour_red ; get colour to use on window
1& Ldr R1,[R12,#wk_windowblock]
Add R1,R1,#88
3& Add R1,R1,#32*icon_colourbox
Ldr R2,[R1,#16]
Bic R2,R2,#&FF000000
Orr R2,R2,R0,Lsl#24
Orr R2,R2,R0,Lsl#28
8X Str R2,[R1,#16] ; set the coloured frame
Ldr R1,[R13,#4]
Tst R1,#1<<8
MovEq R1,#0
AndNe R1,R1,#7<<9
MovNe R1,R1,Lsr#9
AdrL R0,spritetype0
Teq R1,#1
AdrEqL R0,spritetype1
Teq R1,#2
AdrEqL R0,spritetype2
Teq R1,#3
AdrEqL R0,spritetype3
Teq R1,#4
AdrEqL R0,spritetype4
Teq R1,#5
HQ AdrEqL R0,spritetype5 ; get sprite type
Mov R1,#icon_typeicon
Bl seticonstring
KU BVs reporterror_passon_quit ; set the type sprite
L& Ldr R0,[R12,#wk_windowblock]
Add R0,R0,#88
N( Add R0,R0,#32*icon_firstbutton
O! Mov R1,#numberofbuttons
P .loop
Ldr R2,[R0,#16]!
R( Orr R2,R2,#1<<iconflag_deleted
Str R2,[R0],#16
SubS R1,R1,#1
BNe loop
Mov R0,#0
W* Str R0,[R12,#wk_numberofbuttons]
Mvn R0,#0
Y* Str R0,[R12,#wk_firstuserbutton]
Z) Str R0,[R12,#wk_describebutton]
[$ Mov R0,#minimumbuttonwidth
\j Str R0,[R12,#wk_buttonwidth] ; initialise window with no buttons at all
Ldr R0,[R13,#4]
And R1,R0,#7
Tst R1,#4
TeqNe R1,#7
au BicNe R1,R1,#4 ; flags bit 2 is irrelevant unless both OK and Cancel
Tst R0,#1<<8
LdrNe R14,[R13,#20]
TeqNe R14,#0
eo TeqEq R1,#0 ; on an old system, or where there are no extra
fu MovEq R1,#1 ; buttons, we must ensure we have at least one button
Teq R1,#7
BlEq addcancelbutton
BlEq addokbutton
jp BEq addedsystembuttons ; if flags bit 2, then Cancel is default, not OK
Tst R1,#1
BlNe addokbutton
Tst R1,#2
BlNe addcancelbutton
.addedsystembuttons
p* Ldr R0,[R12,#wk_numberofbuttons]
qp Str R0,[R12,#wk_firstuserbutton] ; we've now added all system buttons (OK/Cancel)
Ldr R1,[R13,#4]
Tst R1,#1<<8
BEq addedextrabuttons
Ldr R6,[R13,#20]
Teq R6,#0
wn BEq addedextrabuttons ; only add extra buttons when they're supplied
.buttonloop
y' Ldr R1,[R12,#wk_scratchblock]
z .loop
LdrB R0,[R6],#1
Cmp R0,#32
MovMi R0,#0
Teq R0,#
(",")
MovEq R0,#0
StrB R0,[R1],#1
Teq R0,#0
BNe loop
' Ldr R0,[R12,#wk_scratchblock]
Bl addabutton
% BVs reporterror_passon_quit
LdrB R0,[R6,#-1]
Cmp R0,#32
i BPl buttonloop ; add all buttons in comma separated list
.addedextrabuttons
Ldr R0,[R13,#4]
Tst R0,#1<<31
BEq addedallbuttons
* Ldr R0,[R12,#wk_numberofbuttons]
) Str R0,[R12,#wk_describebutton]
' Ldr R0,[R12,#wk_scratchblock]
( Ldr R1,[R12,#wk_messagesblock]
AdrL R2,t_describe
Bl translate
% BVs reporterror_passon_quit
Bl addabutton
m BVs reporterror_passon_quit ; add a Describe button if entirely necessary
.addedallbuttons
* Ldr R2,[R12,#wk_numberofbuttons]
" Mov R0,#icon_firstbutton
& Ldr R1,[R12,#wk_buttonwidth]
Add R1,R1,#24
.loop
Bl seticonwidth
Add R0,R0,#1
& Ldr R1,[R12,#wk_buttonwidth]
Add R1,R1,#8
SubS R2,R2,#1
e BNe loop ; make all the buttons the right size
& Ldr R1,[R12,#wk_windowblock]
Add R1,R1,#88
( Add R2,R1,#32*icon_firstbutton
Ldr R0,[R2,#8]
Add R0,R0,#10
& Add R2,R1,#32*icon_colourbox
Str R0,[R2,#8]
Add R0,R0,#4
& Ldr R1,[R12,#wk_windowblock]
q Str R0,[R1,#48] ; make containing box and window size fit buttons
& Ldr R0,[R12,#wk_windowblock]
Add R0,R0,#88
% Add R1,R0,#32*icon_typeicon
Ldr R2,[R1,#16]
( Orr R2,R2,#1<<iconflag_deleted
Str R2,[R1,#16]
( Add R1,R0,#32*icon_application
Ldr R2,[R1,#16]
( Orr R2,R2,#1<<iconflag_deleted
c Str R2,[R1,#16] ; delete both sprites to initialise
* Ldr R0,[R12,#wk_numberofbuttons]
* Cmp R0,#buttonthatdeletessprites
u BPl donesprites ; if we have lots of buttons, there's no sprite space
& Ldr R0,[R12,#wk_windowblock]
Add R0,R0,#88
% Add R1,R0,#32*icon_typeicon
Ldr R2,[R1,#16]
( Bic R2,R2,#1<<iconflag_deleted
[ Str R2,[R1,#16] ; ok, so undelete type icon
Ldr R1,[R13,#4]
Ldr R2,[R13,#8]
Ldr R3,[R13,#12]
Ldr R4,[R13,#16]
Tst R1,#1<<8
TeqNe R3,#0
CmnNe R3,#1
TeqNe R4,#0
CmnNe R4,#1
t BNe gotappsprite ; if a sprite is specified, we don't need to find it
Cmn R2,#1
# BEq definitelynoappsprite
' Ldr R1,[R12,#wk_scratchblock]
Mov R0,#
("!")
StrB R0,[R1],#1
.loop
LdrB R0,[R2],#1
Cmp R0,#32
MovMi R0,#0
StrB R0,[R1],#1
BPl loop
$ Mov R0,#os_spriteop_select
' Ldr R2,[R12,#wk_scratchblock]
Swi "XWimp_SpriteOp"
' LdrVc R3,[R12,#wk_scratchblock]
MovVc R4,#1
p BVc gotappsprite ; none specified? Try !<errortitle> in WIMP pool
Ldr R0,[R13,#4]
" And R0,R0,#(1<<8)+(7<<9)
Teq R0,#(1<<8)+(5<<9)
v BEq definitelynoappsprite ; if watchdog, the current task can't be used, else...
' Mov R0,#wimp_readsysinfo_task
! Swi "XWimp_ReadSysInfo"
# BVs definitelynoappsprite
Teq R0,#0
# BEq definitelynoappsprite
/ Swi "XTaskManager_TaskNameFromHandle"
# BVs definitelynoappsprite
Mov R2,R0
' Ldr R1,[R12,#wk_scratchblock]
Mov R0,#
("!")
StrB R0,[R1],#1
.loop
LdrB R0,[R2],#1
Cmp R0,#32
BEq loop
MovMi R0,#0
StrB R0,[R1],#1
BPl loop
$ Mov R0,#os_spriteop_select
' Ldr R2,[R12,#wk_scratchblock]
Swi "XWimp_SpriteOp"
' LdrVc R3,[R12,#wk_scratchblock]
MovVc R4,#1
p BVc gotappsprite ; ...try !<taskname without spaces> in WIMP pool
.definitelynoappsprite
& Ldr R0,[R12,#wk_windowblock]
Add R0,R0,#88
( Add R1,R0,#32*icon_firstbutton
Ldr R2,[R1]
Ldr R3,[R1,#8]
Sub R3,R3,R2
Add R2,R2,R3,Lsr#1
Bic R2,R2,#1
% Add R1,R0,#32*icon_typeicon
Ldr R3,[R1]
Ldr R4,[R1,#8]
Sub R3,R4,R3
Sub R2,R2,R3,Lsr#1
Str R2,[R1]
Add R2,R2,R3
Str R2,[R1,#8]
u B donesprites ; can't get any spritename? Then centre the type icon
.gotappsprite
Mov R0,R3
" Mov R1,#icon_application
Bl seticonstring
& Ldr R0,[R12,#wk_windowblock]
Add R0,R0,#88
% Add R1,R0,#32*icon_typeicon
( Add R2,R0,#32*icon_application
Ldr R14,[R2,#16]
* Bic R14,R14,#1<<iconflag_deleted
Str R14,[R2,#16]
t Str R4,[R2,#24] ; copy sprite name/pointer to app icon, and undelete
( Add R0,R0,#32*icon_firstbutton
Ldr R3,[R0]
Ldr R4,[R0,#8]
Sub R4,R4,R3
Add R3,R3,R4,Lsr#1
Bic R0,R3,#1
Ldr R3,[R1]
Ldr R4,[R1,#8]
Sub R3,R4,R3
- Sub R14,R0,#twospriteseparation
Str R14,[R1,#8]
Sub R14,R14,R3
Str R14,[R1]
Ldr R3,[R2]
Ldr R4,[R2,#8]
Sub R4,R4,R3
$- Add R14,R0,#twospriteseparation
Str R14,[R2]
Add R14,R14,R4
'` Str R14,[R2,#8] ; if two icons, centre them both
.donesprites
)& Ldr R1,[R12,#wk_windowblock]
Ldr R3,[R1,#40]
Ldr R4,[R1,#44]
Ldr R5,[R1,#48]
Ldr R6,[R1,#52]
Sub R5,R5,R3
Sub R6,R6,R4
Mvn R0,#0
Mov R1,#modevar_xpix
2$ Swi "XOS_ReadModeVariable"
Add R3,R2,#1
Mvn R0,#0
Mov R1,#modevar_ypix
6$ Swi "XOS_ReadModeVariable"
Add R4,R2,#1
Mvn R0,#0
Mov R1,#modevar_xeig
:$ Swi "XOS_ReadModeVariable"
Mov R3,R3,LslR2
Mvn R0,#0
Mov R1,#modevar_yeig
>$ Swi "XOS_ReadModeVariable"
Mov R4,R4,LslR2
@& Ldr R1,[R12,#wk_windowblock]
SubS R0,R3,R5
Mov R0,R0,Asr#1
Str R0,[R1,#0]
Add R0,R0,R5
Str R0,[R1,#8]
SubS R0,R4,R6
Mov R0,R0,Asr#1
Str R0,[R1,#4]
Add R0,R0,R6
J_ Str R0,[R1,#12] ; centre error window to screen
K" Swi "XWimp_CreateWindow"
L% BVs reporterror_passon_quit
MY Str R0,[R12,#wk_windowhandle] ; create our error window
Mov R0,#1
O% Mov R1,#service_reporterror
P_ Swi "XOS_ServiceCall" ; send out another service call
Mvn R0,#0
Rl Swi "XWimp_CommandWindow" ; in case, for example a filer rename errors
S+ Mov R0,#os_spriteop_switchcontext
Mov R1,#0
Mov R2,#0
Mov R3,#1
Wq Swi "XOS_SpriteOp" ; switch output to screen if in a sprite ATM, 004
X" Mov R0,#os_byte_readcmos
Y Mov R1,#cmos_wimpflags
Swi "XOS_Byte"
Ldr R1,[R13,#4]
Tst R1,#1<<7
TstEq R2,#1<<4
^r SwiEq XOS_WriteI+7 ; beep, unless CMOS or application tells us not to
_T Swi "XHourglass_Smash" ; turn hourglass off
`' Ldr R1,[R12,#wk_scratchblock]
a' Ldr R0,[R12,#wk_windowhandle]
Str R0,[R1]
c$ Swi "XWimp_GetWindowState"
d- BVs reporterror_passon_deletewindow
Mvn R0,#0
Str R0,[R1,#28]
g Swi "XWimp_OpenWindow"
hT BVs reporterror_passon_deletewindow ; open it at the top
i" Swi "XWimp_RedrawWindow"
j .loop
Teq R0,#0
l" SwiNe "XWimp_GetRectangle"
mg BNe loop ; make the Wimp redraw it straight away
n' Ldr R1,[R12,#wk_scratchblock]
o' Ldr R0,[R12,#wk_windowhandle]
Str R0,[R1]
q% Swi "Wimp_GetWindowOutline"
Ldr R2,[R1,#4]
Ldr R3,[R1,#8]
Ldr R4,[R1,#12]
Ldr R5,[R1,#16]
Sub R5,R5,#1
Sub R4,R4,#1
Mov R6,#255
y$ Mov R0,#os_word_mouse_bbox
StrB R0,[R1,#0]
And R0,R6,R2
StrB R0,[R1,#1]
And R0,R6,R2,Lsr#8
StrB R0,[R1,#2]
And R0,R6,R3
StrB R0,[R1,#3]
And R0,R6,R3,Lsr#8
StrB R0,[R1,#4]
And R0,R6,R4
StrB R0,[R1,#5]
And R0,R6,R4,Lsr#8
StrB R0,[R1,#6]
And R0,R6,R5
StrB R0,[R1,#7]
And R0,R6,R5,Lsr#8
StrB R0,[R1,#8]
Mov R0,#os_word_mouse
\ Swi "XOS_Word" ; confine mouse to error box
" Mov R0,#os_byte_ptrshape
Mov R1,#1
Swi "XOS_Byte"
k Str R1,[R12,#wk_oldptrshape] ; make sure pointer's displayed and shape 1
( Mov R0,#os_spriteop_setpointer
AdrL R2,ptr_default
Mov R3,#1
Mov R4,#0
Mov R5,#0
Mov R6,#0
Mov R7,#0
l Swi "XWimp_SpriteOp" ; make sure we have the normal pointer shape
.loop
" Mov R0,#os_byte_scankeys
Mov R1,#9
Swi "XOS_Byte"
Teq R1,#&FF
BNe loop
+ Mov R0,#os_byte_acknowledgeescape
Swi "XOS_Byte"
Mov R0,#os_byte_flush
! Mov R1,#buffer_keyboard
Swi "XOS_Byte"
Mov R0,#os_byte_flush
Mov R1,#buffer_mouse
[ Swi "XOS_Byte" ; clear out any old rubbish
.interactionloop
" Mov R0,#os_byte_readkeys
Mov R1,#0
Mov R2,#0
Swi "XOS_Byte"
Teq R2,#0
TeqEq R1,#13
BEq pressedreturn
Teq R2,#0
TeqEq R1,#27
TeqNe R2,#27
f BEq pressedescape ; make Return and Escape press buttons
Swi "XOS_Mouse"
BicS R2,R2,#2
BEq interactionloop
Mov R2,R0
Mov R3,R1
' Ldr R1,[R12,#wk_scratchblock]
' Ldr R0,[R12,#wk_windowhandle]
Str R0,[R1]
$ Swi "XWimp_GetWindowState"
Ldr R4,[R1,#4]
Ldr R5,[R1,#20]
Sub R4,R4,R5
Sub R2,R2,R4
Ldr R4,[R1,#16]
Ldr R5,[R1,#24]
Sub R4,R4,R5
p Sub R3,R3,R4 ; get mouse co-ords relative to work area origin
" Mov R4,#icon_firstbutton
* Ldr R5,[R12,#wk_numberofbuttons]
.loop
Str R4,[R1,#4]
" Swi "XWimp_GetIconState"
Ldr R6,[R1,#8]
Cmp R2,R6
LdrPl R6,[R1,#16]
CmpPl R6,R2
LdrPl R6,[R1,#12]
CmpPl R3,R6
LdrPl R6,[R1,#20]
CmpPl R6,R3
MovPl R0,R4
BPl clickedsummat
Add R4,R4,#1
SubS R5,R5,#1
g BNe loop ; check to see if a click hits a button
B interactionloop
.pressedreturn
" Mov R0,#icon_firstbutton
B clickedsummat
.pressedescape
+ Mov R0,#os_byte_acknowledgeescape
Swi "XOS_Byte"
* Ldr R0,[R12,#wk_numberofbuttons]
Cmp R0,#2
$ MovPl R0,#icon_firstbutton+1
" MovMi R0,#icon_firstbutton
B clickedsummat
.clickedsummat
Mov R7,R0
' Ldr R1,[R12,#wk_scratchblock]
' Ldr R0,[R12,#wk_windowhandle]
Str R0,[R1]
Str R7,[R1,#4]
& Mov R0,#1<<iconflag_selected
Str R0,[R1,#8]
Str R0,[R1,#12]
_ Swi "XWimp_SetIconState" ; pop the clicked icon in a bit
Mvn R0,#0
Mov R1,#modevar_xpix
$ Swi "XOS_ReadModeVariable"
Add R3,R2,#1
Mov R1,#modevar_ypix
$ Swi "XOS_ReadModeVariable"
Add R4,R2,#1
Mov R1,#modevar_xeig
$ Swi "XOS_ReadModeVariable"
Mov R3,R3,LslR2
Mov R1,#modevar_yeig
$ Swi "XOS_ReadModeVariable"
Mov R4,R4,LslR2
Mov R6,#255
' Ldr R1,[R12,#wk_scratchblock]
Add R1,R1,#128
$ Mov R0,#os_word_mouse_bbox
StrB R0,[R1]
Mov R0,#0
StrB R0,[R1,#1]
StrB R0,[R1,#2]
StrB R0,[R1,#3]
StrB R0,[R1,#4]
And R0,R6,R3
StrB R0,[R1,#5]
And R0,R6,R3,Lsr#8
StrB R0,[R1,#6]
And R0,R6,R4
StrB R0,[R1,#7]
And R0,R6,R4,Lsr#8
StrB R0,[R1,#8]
Mov R0,#os_word_mouse
V Swi "XOS_Word" ; stop mouse confining
" Mov R0,#os_byte_ptrshape
& Ldr R1,[R12,#wk_oldptrshape]
a Swi "XOS_Byte" ; restore old mouse linkage/shape
Mov R3,Pc
Bic R14,R3,#1<<ibit
O TeqP R14,#0 ; interrupts on
% Swi "XOS_ReadMonotonicTime"
Add R2,R0,#buttondelay
.loop
% Swi "XOS_ReadMonotonicTime"
Cmp R0,R2
t BMi loop ; pause a bit to let the user see the popped-in icon
c TeqP R3,#0 ; interrupts back to what they were
Mov R0,#0
% Mov R1,#service_reporterror
h Swi "XOS_ServiceCall" ; send out another blummin' service call
' Ldr R0,[R12,#wk_windowhandle]
!' Ldr R1,[R12,#wk_scratchblock]
Str R0,[R1]
#Z Swi "XWimp_DeleteWindow" ; don't need that any more
$) Ldr R0,[R12,#wk_temptaskhandle]
Cmn R0,#1
AdrNeL R1,wimptask
LdrNe R1,[R1]
(_ SwiNe "XWimp_CloseDown" ; forget any task we started up
)% Sub R7,R7,#icon_firstbutton
*) Ldr R0,[R12,#wk_describebutton]
Teq R7,R0
MvnEq R1,#0
BEq gotbuttonnumber
.* Ldr R0,[R12,#wk_firstuserbutton]
Cmn R0,#1
AddNe R1,R7,#1
BEq gotokorcancel
SubS R1,R7,R0
AddPl R1,R1,#3
AddMi R1,R7,#1
BPl gotbuttonnumber
.gotokorcancel
Ldr R0,[R13,#4]
And R0,R0,#7
Teq R0,#7
RsbEq R1,R1,#3
;r.gotbuttonnumber ; translate clicked icon number to returned button
Ldr R0,[R13,#4]
Tst R0,#1<<31
BNe notarealend
Mov R0,#0
Mov R2,R1
A( AdrL R1,serv_errorbuttonpressed
Ldr R1,[R1]
Ldr R3,[R13,#20]
Swi "XOS_ServiceCall"
Teq R0,#1
MovNe R1,R2
BNe realend
LdmIa R2,{R0-R5}
Add R13,R13,#24
StmFd R13!,{R0-R5}
Kp B anothererror_jumpin ; allow Service_ErrorButtonPressed to muck about
.realend
Mov R2,R1
N! AdrL R1,serv_errorending
Ldr R1,[R1]
Swi "XOS_ServiceCall"
Qi Mov R1,R2 ; another completely bizarre service call
.notarealend
Add R13,R13,#8
Mvn R9,#0
Mov R14,#0
V$ Str R14,[R12,#wk_threaded]
Wt LdmFd R13!,{R2-R7,Pc}^ ; tell WimpSWIVe to intercept, supplying result regs
Ys.reporterror_passon_deletewindow ; we pass on to the standard wimp error window if a
Zt Ldr R0,[R12,#wk_windowhandle] ; situation we can't handle arises - >6 buttons, too
[u Ldr R1,[R12,#wk_scratchblock] ; long buttons, title that won't fit in its box, etc.
Str R0,[R1]
]" Swi "XWimp_DeleteWindow"
.reporterror_passon_quit
_) Ldr R0,[R12,#wk_temptaskhandle]
Cmn R0,#1
AdrNeL R1,wimptask
LdrNe R1,[R1]
c_ SwiNe "XWimp_CloseDown" ; forget any task we started up
.reporterror_passon
Mov R14,#0
f$ Str R14,[R12,#wk_threaded]
LdmFd R13!,{R0-R7,Pc}^
iq.addokbutton ; add button marked 'OK' on old error systems, or
j] StmFd R13!,{R0-R2,R14} ; 'Continue' on Risc PC ones.
Sub R13,R13,#16
Tst R0,#1<<8
AdrEqL R2,t_oldok
AdrNeL R2,t_newok
o( Ldr R1,[R12,#wk_messagesblock]
Mov R0,R13
Bl translate
AddVs R13,R13,#16
LdmVsFd R13!,{R0-R2,Pc}
Bl addabutton
Add R13,R13,#16
LdmVsFd R13!,{R0-R2,Pc}
LdmFd R13!,{R0-R2,Pc}^
yt.addcancelbutton ; add button marked 'Cancel', or 'Quit' if in a dead
zQ StmFd R13!,{R0-R2,R14} ; nasty situation
Sub R13,R13,#16
Tst R0,#1<<31
AdrEqL R2,t_cancel
AdrNeL R2,t_quit
( Ldr R1,[R12,#wk_messagesblock]
Mov R0,R13
Bl translate
AddVs R13,R13,#16
LdmVsFd R13!,{R0-R2,Pc}
Bl addabutton
Add R13,R13,#16
LdmVsFd R13!,{R0-R2,Pc}
LdmFd R13!,{R0-R2,Pc}^
^.addabutton ; add button with text from R0
StmFd R13!,{R0-R2,R14}
* Ldr R1,[R12,#wk_numberofbuttons]
! Cmp R1,#numberofbuttons
LdmPlFd R13!,{R0-R2,R14}
OrrPlS Pc,R14,#1<<vbit
% Add R1,R1,#icon_firstbutton
Bl seticonstring
LdmVsFd R13!,{R0-R2,Pc}
Add R0,R0,#24
& Ldr R2,[R12,#wk_buttonwidth]
Cmp R0,R2
p StrGt R0,[R12,#wk_buttonwidth] ; copy string to icon and update width of button
& Ldr R0,[R12,#wk_windowblock]
Add R0,R0,#88
Add R0,R0,R1,Lsl#5
Ldr R1,[R0,#16]
( Bic R1,R1,#1<<iconflag_deleted
f Str R1,[R0,#16] ; undelete icon so this button appears
* Ldr R1,[R12,#wk_numberofbuttons]
Add R1,R1,#1
* Str R1,[R12,#wk_numberofbuttons]
LdmFd R13!,{R0-R2,Pc}^
u.translate ; translate is a general-purpose routine to translate
t StmFd R13!,{R0-R1,R3-R6,R14} ; a token in R2 in a message block in R1 to a buffer
q.findloop ; in R0; on exit, R2 points to the byte after the
R Mov R3,R1 ; zero terminator.
Mov R4,R2
.compareloop
LdrB R5,[R1],#1
Teq R5,#0
$ LdmEqFd R13!,{R0-R1,R3-R6,R14}
OrrEqS Pc,R14,#1<<vbit
Teq R5,#10
BEq findloop
LdrB R6,[R4],#1
Teq R5,R6
BNe lineloop
Teq R5,#
("=")
BNe compareloop
.copyloop
LdrB R2,[R1],#1
Teq R2,#10
TeqNe R2,#0
MovEq R2,#0
StrB R2,[R0],#1
BNe copyloop
Mov R2,R0
$ LdmFd R13!,{R0-R1,R3-R6,Pc}^
.lineloop
LdrB R5,[R1],#1
Teq R5,#0
$ LdmEqFd R13!,{R0-R1,R3-R6,R14}
OrrEqS Pc,R14,#1<<vbit
Teq R5,#10
BNe lineloop
B findloop
s.seticonstring ; copies string R0 to icon R1, and returns width of
r Bic R14,R14,#1<<vbit ; string in OS units (using Wimp_TextOp on OS 3.5)
r StmFd R13!,{R1-R4,R14} ; returns V set if string won't fit indir space or
\ Ldr R2,[R12,#wk_windowblock] ; on an unexpected SWI error
Add R2,R2,#88
Add R2,R2,R1,Lsl#5
Ldr R1,[R2,#20]
Ldr R3,[R2,#28]
Mov R4,#0
Mov R2,R0
.loop
SubS R3,R3,#1
LdmMiFd R13!,{R1-R4,R14}
LdrB R14,[R2],#1
Teq R14,#0
AddNe R4,R4,#16
t BNe loop ; find length of new string and moan if it won't fit
Mov R2,R0
.loop
LdrB R14,[R2],#1
StrB R14,[R1],#1
Teq R14,#0
Y BNe loop ; copy new string to icon
Mov R3,R0
* Mov R0,#wimp_readsysinfo_wimpver
! Swi "XWimp_ReadSysInfo"
LdmVsFd R13!,{R1-R4,Pc}
Mov R14,#350
$ Orr R14,R14,#320
&FF)
Cmp R0,R14
MovMi R0,R4
v LdmMiFd R13!,{R1-R4,Pc}^ ; on OS <3.5 WIMP, return width as that in system font
) Mov R0,#wimp_textop_stringwidth
Mov R1,R3
Mov R2,#0
Swi XWimp_TextOp
LdmVsFd R13!,{R1-R4,Pc}
n LdmFd R13!,{R1-R4,Pc}^ ; on OS 3.5 WIMP, ask it how big the string is
_.geticonwidth ; return width of icon R0 in R0
StmFd R13!,{R1,R14}
& Ldr R1,[R12,#wk_windowblock]
Add R1,R1,#88
Add R1,R1,R0,Lsl#5
Ldr R0,[R1]
Ldr R1,[R1,#8]
Sub R0,R1,R0
LdmFd R13!,{R1,Pc}^
\.seticonwidth ; set width of icon R0 to R1
StmFd R13!,{R0-R2,R14}
& Ldr R2,[R12,#wk_windowblock]
Add R2,R2,#88
Add R2,R2,R0,Lsl#5
Ldr R0,[R2]
Add R0,R0,R1
Str R0,[R2,#8]
LdmFd R13!,{R0-R2,Pc}^
_ Equs
10+"You think you're strong. We'll see. Du mu
t Ambo
oder Hammer sein."+
? Equs "And... anything below here is probably a virus."
"OS_File",10,"<Program$Path>ErrorWind",&FFA,,code,O%