Home » Archimedes archive » Archimedes World » AW-1991-05.adf » May91 » !AWMay91/Goodies/PD/!VKiller/!RunImage

!AWMay91/Goodies/PD/!VKiller/!RunImage

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Archimedes World » AW-1991-05.adf » May91
Filename: !AWMay91/Goodies/PD/!VKiller/!RunImage
Read OK:
File size: 40B2 bytes
Load address: 0000
Exec address: 0000
File contents
   10REM >$.!VKiller.!RunImage
   20REM Virus Killer V1.10 (C) Richard K. Lloyd 1990
   30REM Currently kills the "Extend Virus" (see documentation)
   40REM
   50REM Recommended CD:
   60REM B-52's "Cosmic Thing". Weird at first, but it grows on you !
   70
   80REM General error trapper
   90ON ERROR PROCsystemerror
  100
  110quit%=FALSE:REM Nothing happened yet
  120PROCinit
  130REPEAT
  140   PROCwimp_poll
  150UNTIL quit%
  160
  170SYS "XWimp_CloseDown",task%,!taskconst%
  180SYS "OS_Exit"
  190
  200DEFPROCinit
  210size%=77*32:REM Max of 77 files per dir and 32 bytes per file info
  220maxboot%=&1400:REM 5K is largest allowed size for !Boot
  230maxlevel%=8:REM Allow for 8 levels of directory
  240DIM info% size%*maxlevel%,buff% maxboot%,fbuff% 12
  250icon$="IconSprites <Obey$Dir>.!Sprites"+CHR$(&A)
  260iconlen%=LEN(icon$)
  270protect$="| This file has been innoculated against the Extend Virus"+CHR$(&A)+"||"+CHR$(&FF)
  280protlen%=LEN(protect$)
  290extendhelp$="Extend"+CHR$(9)+CHR$(9)+"1.56 (08 Jul 1989)"
  300deffs$="adfs":REM Default filing system
  310infect%=FALSE:still%=FALSE:REM No virus checks yet
  320nummem%=0:numdisk%=0:numinnoc%=0:numscans%=0:REM Reset counters
  330fsysnum%=0:fsys$="":REM Not checked filing system yet
  340innoc%=FALSE:REM Not innoculating by default
  350
  360REM Application Constants
  370prog$="VKiller":REM English text name of program
  380REM Change next line to date$=MID$(TIME$,5,11) to get the current date
  390date$="05 Dec 1990":REM Current date as a fixed string
  400vkillvar$="<VKiller$Dir>":REM VKiller environmental variable
  410iconbartype%=-1:REM -1 = Utility (RHS of bar), -2 = Service (LHS of bar)
  420windman%=200:REM Expect at LEAST V2.00 of the Window Manager
  430bl$=CHR$(0):REM NULL char used to terminate strings
  440dirscan%=16:REM Directory spec goes in this icon
  450status%=17:REM Status messages go in this icon
  460
  470REM Workspace for application
  480DIM vkillwind% &E00,infowind% &E00:REM Template workspace
  490DIM poll% 256:REM Wimp_Poll workspace
  500DIM icon% 48:REM Icon bar icon workspace
  510DIM menu% &100:REM Menu structure workspace
  520DIM taskconst% 8:$taskconst%="TASK":REM Store Task constant here
  530DIM icondata% 256:REM Temp workspace to get/put icon data
  540
  550REM Initialise WIMP
  560SYS "XWimp_Initialise",windman%,!taskconst%,prog$+bl$ TO windvers%,task%
  570IF windvers%<windman% THEN PROCfatal(prog$+" requires Window Manager V"+FNfraction(windman%)+" or later")
  580
  590PROCmakemenu:REM Construct menu (should be BEFORE template loading)
  600PROCgettemplates:REM Get window templates from file
  610PROCmakeicon:REM Create icon bar icon
  620PROCnextfs
  630PROCfinishscan
  640PROCputdata(status%,"Idle")
  650PROCscanmodules(FNgettaskhand(""))
  660ENDPROC
  670
  680DEFFNgettaskhand(taskname$)
  690REM This routine is unintentionally blank :-(
  700REM Although it is possible to get the name of a task given its handle,
  710REM there appears to be no way to get the reverse (Task Manager cheats -
  720REM it runs first of all and picks up Wimp_Initialise handles/names).
  730REM Can anyone out there complete this routine to return a task handle
  740REM given its name ? Pretty please ?
  750=0
  760
  770DEFPROCcheck(dir$,leafdir$,level%)
  780LOCAL off%,base%,num%,loop%,addr%,name$,fullname$,len%,gotboot%,type%
  790PROCwimp_poll
  800IF quit%=TRUE OR scanning%=FALSE:ENDPROC
  810IF level%=maxlevel% THEN
  820   PROCputdata(status%,"Dir level "+STR$(maxlevel%)+" - skipping deeper")
  830   ENDPROC
  840ENDIF
  850dir$=dir$+"."+leafdir$
  860PROCputdata(dirscan%,dir$)
  870off%=0:gotboot%=FALSE:base%=info%+level%*size%
  880REPEAT
  890   addr%=base%
  900   SYS "XOS_GBPB",10,dir$+CHR$(0),addr%,77,off%,size%,"*"+CHR$(0) TO ,,,num%,off%
  910   IF num% THEN
  920      FOR loop%=0 TO num%-1
  930         obj%=addr%!16
  940         len%=addr%!8:type%=(!addr%>>>8) AND &FFF
  950         addr%+=20:name$=FNgetstring(addr%)
  960         addr%=(addr%+4) DIV 4*4:REM Align to next word
  970         IF obj%=2 THEN
  980            PROCcheck(dir$,name$,level%+1)
  990         ELSE
 1000            fullname$=dir$+"."+name$
 1010            CASE FNlower(name$) OF
 1020            WHEN "!boot":gotboot%=TRUE
 1030                         IF type%=&FEB THEN
 1040                            PROCcheckboot(fullname$,len%)
 1050                         ENDIF
 1060            WHEN "monitorrm","checkmod","extendrm","osextend","colourrm","fastmod","coderm","memrm":
 1070                 IF len%=940 AND type%=&FFA THEN
 1080                    IF FNoscli("Load",fullname$,STR$~buff%)=FALSE THEN
 1090                       buff%!&34=0:REM Zero count due to bad load
 1100                    ENDIF
 1110                    PROCextendvirus("module",buff%)
 1120                    PROCdelmodule(fullname$)
 1130                 ENDIF
 1140            ENDCASE
 1150         ENDIF
 1160      NEXT
 1170   ENDIF
 1180UNTIL off%=-1 OR quit%=TRUE OR scanning%=FALSE
 1190IF gotboot%=FALSE AND ASC(leafdir$)=33 AND innoc%=TRUE AND quit%=FALSE AND scanning%=TRUE THEN
 1200   IF FNinnocboot(dir$+".!Boot",base%,0,FNexists(dir$+".!Sprites",&FF9)) THEN
 1210      PROCputdata(status%,"New innoculated !Boot created")
 1220   ENDIF
 1230ENDIF
 1240ENDPROC
 1250
 1260DEFPROCcheckboot(name$,l%)
 1270LOCAL doinnoc%
 1280IF l%>=maxboot% THEN
 1290   still%=TRUE:infect%=TRUE
 1300   PROCputdata(status%,"!Boot too big - not scanned")
 1310   ENDPROC
 1320ENDIF
 1330doinnoc%=innoc%
 1340SYS "XOS_CLI","Load "+name$+" "+STR$~buff%
 1350CASE buff%?(l%-1) OF
 1360WHEN &FF:CASE buff%?(l%-4) OF
 1370         WHEN 13:PROCextendvirus("in !Boot",0)
 1380                 PROCdiskinfect
 1390                 l%=l%-4:doinnoc%=TRUE
 1400                 WHILE l%>0 AND buff%?(l%-1)<>&D
 1410                    l%=l%-1
 1420                 ENDWHILE
 1430                 buff%?(l%-1)=&A
 1440         WHEN 10:doinnoc%=FALSE
 1450                 PROCputdata(status%,"!Boot already innoculated")
 1460         OTHERWISE doinnoc%=FALSE
 1470         ENDCASE
 1480WHEN &0A:REM Normal terminator
 1490OTHERWISE buff%?l%=&A:l%+=1:REM Add LF on end
 1500ENDCASE
 1510IF doinnoc% THEN
 1520   IF l%+protlen%+1>maxboot% THEN
 1530      still%=TRUE:infect%=TRUE
 1540      PROCputdata(status%,"!Boot too big - not innoculated")
 1550      ENDPROC
 1560   ENDIF
 1570   IF FNinnocboot(name$,buff%,l%,FALSE) THEN
 1580      PROCputdata(status%,"!Boot has now been innoculated")
 1590   ENDIF
 1600ENDIF
 1610ENDPROC
 1620
 1630DEFFNinnocboot(n$,a%,len%,addicon%)
 1640LOCAL good%:good%=FALSE
 1650IF addicon% THEN
 1660  $(a%+len%)=icon$
 1670  len%+=iconlen%
 1680ENDIF
 1690$(a%+len%)=protect$
 1700IF FNoscli("Save",n$,STR$~a%+" "+STR$~(a%+len%+protlen%)) THEN
 1710   IF FNoscli("SetType",n$,"Obey") THEN
 1720      numinnoc%+=1:good%=TRUE:PROCputdata(21,STR$(numinnoc%))
 1730   ENDIF
 1740ENDIF
 1750=good%
 1760
 1770DEFPROCextendvirus(mess$,addr%)
 1780LOCAL t%
 1790IF addr%:PROCputdata(dirscan%,"Execution Count: "+STR$(addr%!&34))
 1800PROCputdata(status%,"Extend Virus "+mess$+" found !")
 1810infect%=TRUE:PROCopenwindow
 1820t%=TIME+200:REM Delay to see message
 1830REPEAT
 1840   PROCwimp_poll
 1850UNTIL TIME>t% OR quit%
 1860ENDPROC
 1870
 1880DEFPROCdelmodule(m$)
 1890PROCdiskinfect
 1900IF FNoscli("Delete",m$,"") THEN
 1910   PROCputdata(status%,"Extend Virus module deleted")
 1920ENDIF
 1930ENDPROC
 1940
 1950DEFPROCdiskinfect
 1960numdisk%+=1:PROCputdata(20,STR$(numdisk%))
 1970ENDPROC
 1980
 1990DEFFNoscli(l$,m$,r$)
 2000LOCAL flags%,again%,errblk%
 2010REPEAT
 2020   IF l$="RMKill" THEN
 2030      SYS "XWimp_StartTask",l$+" "+m$+" "+r$+" { > null: }" TO errblk%;flags%
 2040   ELSE
 2050      SYS "XOS_CLI",l$+" "+m$+" "+r$+" { > null: }" TO errblk%;flags%
 2060   ENDIF
 2070   again%=FALSE
 2080   IF flags% AND 1 THEN
 2090      CASE !errblk% OF
 2100      WHEN &108C9:
 2110         again%=FNyesno("    Write-protected disk !     Retry disk write ?")
 2120      WHEN &108C3:again%=FNoscli("Access",m$,"WR")
 2130      OTHERWISE
 2140         IF !errblk%>&10000 THEN
 2150            PROCputdata(status%,"Couldn't perform disk write")
 2160         ELSE
 2170            PROCputdata(status%,"Couldn't delete Extend module")
 2180         ENDIF
 2190      ENDCASE
 2200      IF again%=FALSE:still%=TRUE
 2210   ENDIF
 2220UNTIL again%=FALSE
 2230=((flags% AND 1)=0)
 2240
 2250DEFFNwimperror(mess$,mask%)
 2260LOCAL click%
 2270SYS "XWimp_ReportError",STRING$(4,bl$)+mess$+bl$,mask%,"VKiller Warning"+bl$ TO ,click%
 2280=click%
 2290
 2300DEFFNyesno(mess$)=(FNwimperror(mess$,%10011)=1)
 2310
 2320DEFPROCwarn(mess$)
 2330LOCAL click%
 2340click%=FNwimperror(mess$,%10001)
 2350ENDPROC
 2360
 2370DEFPROCscanmodules(hand%)
 2380LOCAL module%,sub%,start%,flags%,help%
 2390REPEAT
 2400   SYS "XOS_Module",12,module%,sub% TO ,module%,sub%,start%;flags%
 2410   IF (flags% AND 1)=0 THEN
 2420      help%=start%+start%!&14
 2430      IF FNgetstring(help%)=extendhelp$ THEN
 2440         nummem%+=1:infect%=TRUE
 2450         PROCputdata(19,STR$(nummem%))
 2460         IF hand% THEN
 2470            REM This is a bug-fix :-) It allows the virus task
 2480            REM to shutdown properly without crashing the Task Manager
 2490            start%!&40=hand%:REM Save task handle
 2500            P%=start%+&70
 2510            [OPT 0
 2520            LDR R2,start%+&64:CMP R2,#1:SWIGT "XOS_Module"
 2530            LDR R0,start%+&40:LDR R1,start%+&54
 2540            ]
 2550         ELSE
 2560            PROCwarn("Task Manager is unstable !     Do not use it")
 2570         ENDIF
 2580         PROCextendvirus("in RMA",start%)
 2590         IF FNoscli("RMKill","Extend","") THEN
 2600             PROCputdata(status%,"Extend Virus killed from RMA")
 2610         ELSE
 2620             still%=TRUE
 2630         ENDIF
 2640      ENDIF
 2650   ENDIF
 2660UNTIL flags% AND 1
 2670ENDPROC
 2680
 2690DEFFNexists(file$,type%)
 2700LOCAL found%,ftype%
 2710SYS "XOS_File",5,file$ TO found%,,ftype%
 2720ftype%=(ftype%>>>8) AND &FFF
 2730=(found%=1 AND type%=ftype%)
 2740
 2750DEFFNlower(s$)
 2760LOCAL loop%,n$,c$:n$=""
 2770FOR loop%=1 TO LEN(s$)
 2780   c$=MID$(s$,loop%,1)
 2790   IF c$>="A" AND c$<="Z" THEN
 2800      n$=n$+CHR$(ASC(c$)+32)
 2810   ELSE
 2820      n$=n$+c$
 2830   ENDIF
 2840NEXT
 2850=n$
 2860
 2870DEFFNgetstring(RETURN addr%)
 2880LOCAL s$:s$=""
 2890WHILE ?addr%<>0:s$=s$+CHR$(?addr%):addr%+=1:ENDWHILE
 2900=s$
 2910
 2920DEFPROCwimp_poll
 2930LOCAL reason%
 2940SYS "XWimp_Poll",0,poll% TO reason%
 2950CASE reason% OF
 2960WHEN 2:SYS "XWimp_OpenWindow",,poll%:REM Info window drag
 2970WHEN 3:PROCclosewindow
 2980WHEN 6:PROCmouseclick
 2990WHEN 9:PROCmenuselect
 3000WHEN 17,18:PROCwimpmessage
 3010ENDCASE
 3020ENDPROC
 3030
 3040DEFPROCclosewindow
 3050SYS "XWimp_CloseWindow",,vkillwind%:REM Eval close box
 3060ENDPROC
 3070
 3080DEFPROCmouseclick
 3090CASE poll%!8 OF
 3100   WHEN 1,4:PROCstartup
 3110   WHEN   2:PROCshownewmenu
 3120ENDCASE
 3130ENDPROC
 3140
 3150DEFPROCshownewmenu
 3160LOCAL y%
 3170IF poll%!12=-2:y%=96+!spacing*numitems% ELSE y%=poll%!4+16
 3180oldx%=!poll%-64:oldy%=y%
 3190PROCshowoldmenu
 3200ENDPROC
 3210
 3220DEFPROCshowoldmenu
 3230SYS "XWimp_CreateMenu",,menu%,oldx%,oldy%
 3240ENDPROC
 3250
 3260DEFPROCopenwindow
 3270vkillwind%!28=-1:REM Open on top of everyone else
 3280SYS "XWimp_OpenWindow",,vkillwind%
 3290ENDPROC
 3300
 3310DEFPROCstartup
 3320CASE poll%!12 OF
 3330   WHEN -2:PROCopenwindow
 3340   WHEN vkillhand%:
 3350      CASE poll%!16 OF
 3360      WHEN 7:IF scanning%=FALSE:PROCnextfs:REM Filing system change
 3370      WHEN 8,9,10,11,12,13,14,15:IF scanning%=FALSE:drive%=poll%!16-8:REM Drive change
 3380      WHEN 23:IF scanning%:PROCfinishscan ELSE PROCstartscan
 3390      WHEN 24:innoc%=NOT innoc%
 3400      ENDCASE
 3410ENDCASE
 3420ENDPROC
 3430
 3450DEFPROCmenuselect
 3460LOCAL mouse%,item%:item%=!poll%+1
 3470SYS "XWimp_GetPointerInfo",,poll%:mouse%=poll%!8
 3480CASE item% OF
 3490   WHEN numitems%:quit%=TRUE:REM Last Item = Quit
 3500ENDCASE
 3510IF mouse%=1:PROCshowoldmenu
 3520ENDPROC
 3580
 3590DEFPROCwimpmessage
 3600CASE poll%!16 OF
 3610   WHEN      0:quit%=TRUE:REM Shut down (Desktop Exit, Task Manager Quit)
 3620   WHEN &400C2:PROCappstart
 3630ENDCASE
 3640ENDPROC
 3650
 3660DEFPROCappstart
 3670REM Unlike, ahem, certain Acorn applications we could mention, it really
 3680REM is nice to make sure only one invocation of the program has been
 3690REM activated - this is done by checking a new task's name/handle
 3700LOCAL A%,B%,same%
 3710IF poll%!4<>task% THEN
 3720   A%=poll%+28:B%=-1
 3730   IF ?A% THEN
 3740      REPEAT
 3750         B%+=1:same%=(A%?B%=ASC(MID$(prog$+bl$,B%+1)))
 3760      UNTIL A%?B%=0 OR NOT same%
 3770      IF same%:quit%=TRUE
 3780   ELSE
 3790      PROCscanmodules(poll%!4)
 3800   ENDIF
 3810ENDIF
 3820ENDPROC
 3830
 3840DEFPROCputdata(icon%,mess$)
 3850REM Change icon 'icon%' to the string mess$
 3860REM Note that this assumes an indirected icon of course !
 3870!icondata%=vkillhand%:icondata%!4=icon%
 3880SYS "XWimp_GetIconState",,icondata%
 3890$(icondata%!28)=mess$
 3900SYS "XWimp_ForceRedraw",vkillhand%,icondata%!8,icondata%!12,icondata%!16,icondata%!20
 3910ENDPROC
 3920
 3930DEFFNgetdata(wind%,icon%)
 3940REM Read the value of icon 'icon%' in window 'wind%'
 3950REM Note that this assumes an indirected icon of course !
 3960!icondata%=wind%:icondata%!4=icon%
 3970SYS "XWimp_GetIconState",,icondata%
 3980=$(icondata%!28)
 3990
 4000DEFPROCmakeicon
 4010P%=icon%:REM Use built in assembler - easier to see structure
 4020[OPT 0
 4030                EQUD    iconbartype%    ; Icon bar 'utility' flag
 4040                EQUD    0               ; Bottom left X
 4050                EQUD    0               ; Bottom left Y
 4060                EQUD    69              ; Top right X
 4070                EQUD    68              ; Top right Y
 4080                EQUB    %00000010       ; Icon is a sprite
 4090                EQUB    %00110001       ; Click notifies/Indirected
 4100                EQUB    %00000000       ; Nothing special about icon
 4110                EQUB    %00000001       ; Forecol = 1, Backcol = 0
 4120.pokespname     EQUD    pokespname+12   ; Pointer to sprite name
 4130                EQUD    1               ; Pointer to WIMP sprites
 4140                EQUD    12              ; Length of sprite name
 4150.spritename     EQUS    "!vkiller"+STRING$(4,bl$) ; Sprite name
 4160]
 4170SYS "XWimp_CreateIcon",,icon% TO iconhand%
 4180ENDPROC
 4190
 4200DEFPROCmakemenu
 4210numitems%=2:REM Change if you add more
 4220P%=menu%:REM Use assembler
 4230[OPT 0
 4240                EQUS    prog$+STRING$(12-LEN(prog$),bl$) ; Menu title
 4250                EQUB    7       ; Foreground colour
 4260                EQUB    2       ; Background colour
 4270                EQUB    7       ; Work foregrd colour
 4280                EQUB    0       ; Work backgrd colour
 4290                EQUD    148     ; Total width
 4300.spacing        EQUD    44      ; Total height
 4310                EQUD    0       ; Line spacing
 4320; Item #1
 4330                EQUD    0       ; Nothing special
 4340.submenupoke    EQUD    0       ; Sub-menu addr poked in here
 4350                EQUD    (7<<24) OR 1 ; Item is text & black
 4360                EQUS    "Info       "+bl$
 4370; Item #2
 4380                EQUD    &80     ; Last menu item
 4390                EQUD    -1      ; No sub-menu
 4400                EQUD    (7<<24) OR 1 ; Item is text & black
 4410                EQUS    "Quit       "+bl$
 4420]
 4430ENDPROC
 4440
 4450DEFPROCgettemplates
 4460LOCAL flags%,dummy%
 4470SYS "XWimp_OpenTemplate",,vkillvar$+".Templates" TO ;flags%
 4480IF flags% AND 1:PROCfatal("Missing Templates file for "+prog$)
 4490vkillhand%=FNloadtemplate(vkillwind%,"VKillWindow")
 4500!submenupoke=FNloadtemplate(infowind%,"Info")
 4510SYS "XWimp_CloseTemplate"
 4520ENDPROC
 4530
 4540DEFFNloadtemplate(addr%,wind$)
 4550REM Note the +4 on the address - this allows the poking of the handle
 4560LOCAL windhand%,windptr%
 4570SYS "XWimp_LoadTemplate",,addr%+4,addr%+&700,addr%+&E00,-1,wind$,0 TO ,,,,,,windptr%
 4580IF windptr%=0:PROCfatal("Missing "+wind$+" window from "+prog$+"'s Templates file")
 4590SYS "XWimp_CreateWindow",,addr%+4 TO windhand%
 4600!addr%=windhand%:REM Store window handle because needed by later calls
 4610=windhand%
 4620
 4630DEFPROCsystemerror
 4640REM Why do I need this proc ? Well, the Wimp doesn't report the
 4650REM offending line number of an error !
 4660LOCAL err$
 4670IF ERR:err$=" at line "+STR$(ERL) ELSE err$=""
 4680ON ERROR OFF
 4690PROCfatal(REPORT$+err$)
 4700ENDPROC
 4710
 4720DEFPROCfatal(error$)
 4730OSCLI"Error 0 "+error$
 4740ENDPROC
 4750
 4760DEFPROCnextfs
 4770LOCAL fsname%,oldfsys$,swi$,swiname$,numflop%,numhard%,loop%
 4780oldfsys$=fsys$:fsys$=""
 4790REPEAT
 4800   fsysnum%+=1:IF fsysnum%>255:fsysnum%=1
 4810   SYS "XOS_FSControl",33,fsysnum%,fbuff%,12 TO ,,fsname%
 4820   IF ?fsname% THEN
 4830      fsys$=FNgetstring(fsname%)
 4840      CASE fsys$ OF
 4850      WHEN "null","printer","serial","vdu","rawvdu","kbd","rawkbd","deskfs","msdos":fsys$="":REM Not infectable
 4860      ENDCASE
 4870   ENDIF
 4880UNTIL fsys$<>""
 4890IF oldfsys$<>fsys$ THEN
 4900   CASE fsys$ OF
 4910   WHEN "adfs":swiname$="ADFS"
 4920   WHEN "net":swiname$="NetFS":REM Is this right ?
 4930   OTHERWISE swiname$=fsys$
 4940   ENDCASE
 4950   swi$="X"+swiname$+"_Drives"
 4960   IF FNcheckswi(swi$) THEN
 4970      SYS swi$ TO drive%,numflop%,numhard%
 4980      IF drive%>=numflop% AND numhard%=0 OR drive%>=numhard%+4:drive%=0
 4990   ELSE
 5000      numflop%=1:numhard%=0:drive%=0
 5010   ENDIF
 5020   PROCputdata(7,fsys$)
 5030   FOR loop%=0 TO 7
 5040      PROCallowdrive(loop%,(loop%<4 AND numflop%>loop%) OR (loop%>3 AND numhard%+4>loop%),(loop%=drive%))
 5050   NEXT
 5060ENDIF
 5070ENDPROC
 5080
 5090DEFFNcheckswi(swi$)
 5100LOCAL swi%,flags%
 5110SYS "XOS_SWINumberFromString",,swi$ TO swi%;flags%
 5120=((flags% AND 1)=0)
 5130
 5140DEFPROChackflags(icon%,eor%,clear%)
 5150!icondata%=vkillhand%
 5160icondata%!4=icon%
 5170icondata%!8=eor%
 5180icondata%!12=clear%
 5190SYS "XWimp_SetIconState",,icondata%
 5200ENDPROC
 5210
 5220DEFPROChilite(icon%,bool%)
 5230PROChackflags(icon%,((-bool%)<<21),&00200000)
 5240ENDPROC
 5250
 5260DEFPROCallowdrive(drv%,bool%,hilite%)
 5270bool%=-bool%
 5280PROChackflags(drv%+8,(bool%<<16)+11*(bool%<<12)+((15-bool%*6)<<28),&F01FF000)
 5290PROChilite(drv%+8,hilite%)
 5300ENDPROC
 5310
 5320DEFPROCfinishscan
 5330PROCputdata(23,"Start Drive Scan")
 5340PROCputdata(dirscan%,"Idle")
 5350scanning%=FALSE
 5360ENDPROC
 5370
 5380DEFPROCstartscan
 5390LOCAL prefix$
 5400PROCputdata(23,"Stop Drive Scan")
 5410scanning%=TRUE:infect%=FALSE:still%=FALSE
 5420prefix$=fsys$+"::"+STR$(drive%)
 5430PROCputdata(status%,"Drive Scan started")
 5440PROCcheck(prefix$,"$",0)
 5450IF scanning% THEN
 5460   numscans%+=1:PROCputdata(22,STR$(numscans%))
 5470   PROChilite(23,FALSE)
 5480   IF infect% THEN
 5490      IF still% THEN
 5500         PROCputdata(status%,prefix$+" may still be infected !")
 5510      ELSE
 5520         PROCputdata(status%,prefix$+" was infected, but now clean")
 5530      ENDIF
 5540   ELSE
 5550      PROCputdata(status%,prefix$+" is clean - no infections")
 5560   ENDIF
 5570   PROCopenwindow
 5580ELSE
 5590   PROCputdata(status%,"Drive Scan manually aborted")
 5600ENDIF
 5610PROCfinishscan
 5620ENDPROC

� >$.!VKiller.!RunImage
2� Virus Killer V1.10 (C) Richard K. Lloyd 1990
<� Currently kills the "Extend Virus" (see documentation)
(�
2� Recommended CD:
<B� B-52's "Cosmic Thing". Weird at first, but it grows on you !
F
P� General error trapper
Z� � �systemerror
d
n"quit%=�:� Nothing happened yet
x	�init
��
�   �wimp_poll
�� quit%
�
�*ș "XWimp_CloseDown",task%,!taskconst%
�ș "OS_Exit"
�
�
��init
�Dsize%=77*32:� Max of 77 files per dir and 32 bytes per file info
�9maxboot%=&1400:� 5K is largest allowed size for !Boot
�1maxlevel%=8:� Allow for 8 levels of directory
�4� info% size%*maxlevel%,buff% maxboot%,fbuff% 12
�1icon$="IconSprites <Obey$Dir>.!Sprites"+�(&A)
iconlen%=�(icon$)
Zprotect$="| This file has been innoculated against the Extend Virus"+�(&A)+"||"+�(&FF)
protlen%=�(protect$)
"7extendhelp$="Extend"+�(9)+�(9)+"1.56 (08 Jul 1989)"
,)deffs$="adfs":� Default filing system
6,infect%=�:still%=�:� No virus checks yet
@Anummem%=0:numdisk%=0:numinnoc%=0:numscans%=0:� Reset counters
J7fsysnum%=0:fsys$="":� Not checked filing system yet
T*innoc%=�:� Not innoculating by default
^
h� Application Constants
r2prog$="VKiller":� English text name of program
|H� Change next line to date$=MID$(TIME$,5,11) to get the current date
�8date$="05 Dec 1990":� Current date as a fixed string
�>vkillvar$="<VKiller$Dir>":� VKiller environmental variable
�Jiconbartype%=-1:� -1 = Utility (RHS of bar), -2 = Service (LHS of bar)
�>windman%=200:� Expect at LEAST V2.00 of the Window Manager
�2bl$=�(0):� NULL char used to terminate strings
�2dirscan%=16:� Directory spec goes in this icon
�0status%=17:� Status messages go in this icon
�
�� Workspace for application
�9� vkillwind% &E00,infowind% &E00:� Template workspace
�%� poll% 256:� Wimp_Poll workspace
�(� icon% 48:� Icon bar icon workspace
�+� menu% &100:� Menu structure workspace
@� taskconst% 8:$taskconst%="TASK":� Store Task constant here
9� icondata% 256:� Temp workspace to get/put icon data

&� Initialise WIMP
0Jș "XWimp_Initialise",windman%,!taskconst%,prog$+bl$ � windvers%,task%
:e� windvers%<windman% � �fatal(prog$+" requires Window Manager V"+�fraction(windman%)+" or later")
D
NB�makemenu:� Construct menu (should be BEFORE template loading)
X2�gettemplates:� Get window templates from file
b$�makeicon:� Create icon bar icon
l�nextfs
v�finishscan
��putdata(status%,"Idle")
�"�scanmodules(�gettaskhand(""))
��
�
�ݤgettaskhand(taskname$)
�/� This routine is unintentionally blank :-(
�I� Although it is possible to get the name of a task given its handle,
�J� there appears to be no way to get the reverse (Task Manager cheats -
�G� it runs first of all and picks up Wimp_Initialise handles/names).
�H� Can anyone out there complete this routine to return a task handle
�&� given its name ? Pretty please ?
�=0
�
!��check(dir$,leafdir$,level%)
E� off%,base%,num%,loop%,addr%,name$,fullname$,len%,gotboot%,type%
�wimp_poll
 � quit%=� � scanning%=�:�
*� level%=maxlevel% �
4G   �putdata(status%,"Dir level "+�(maxlevel%)+" - skipping deeper")
>   �
H�
Rdir$=dir$+"."+leafdir$
\�putdata(dirscan%,dir$)
f.off%=0:gotboot%=�:base%=info%+level%*size%
p�
z   addr%=base%
�M   ș "XOS_GBPB",10,dir$+�(0),addr%,77,off%,size%,"*"+�(0) � ,,,num%,off%
�   � num% �
�      � loop%=0 � num%-1
�         obj%=addr%!16
�3         len%=addr%!8:type%=(!addr%>>>8) � &FFF
�.         addr%+=20:name$=�getstring(addr%)
�7         addr%=(addr%+4) � 4*4:� Align to next word
�         � obj%=2 �
�+            �check(dir$,name$,level%+1)
�         �
�(            fullname$=dir$+"."+name$
�"            Ȏ �lower(name$) �
�$            � "!boot":gotboot%=�
+                         � type%=&FEB �
:                            �checkboot(fullname$,len%)
                         �
$e            � "monitorrm","checkmod","extendrm","osextend","colourrm","fastmod","coderm","memrm":
..                 � len%=940 � type%=&FFA �
8>                    � �oscli("Load",fullname$,�~buff%)=� �
BC                       buff%!&34=0:� Zero count due to bad load
L                    �
V4                    �extendvirus("module",buff%)
`-                    �delmodule(fullname$)
j                 �
t            �
~         �
�      �
�   �
�%� off%=-1 � quit%=� � scanning%=�
�F� gotboot%=� � �(leafdir$)=33 � innoc%=� � quit%=� � scanning%=� �
�K   � �innocboot(dir$+".!Boot",base%,0,�exists(dir$+".!Sprites",&FF9)) �
�;      �putdata(status%,"New innoculated !Boot created")
�   �
��
��
�
���checkboot(name$,l%)
�� doinnoc%
� l%>=maxboot% �

   still%=�:infect%=�
6   �putdata(status%,"!Boot too big - not scanned")
   �
(�
2doinnoc%=innoc%
<*ș "XOS_CLI","Load "+name$+" "+�~buff%
FȎ buff%?(l%-1) �
P� &FF:Ȏ buff%?(l%-4) �
Z,         � 13:�extendvirus("in !Boot",0)
d                  �diskinfect
n'                 l%=l%-4:doinnoc%=�
x/                 ȕ l%>0 � buff%?(l%-1)<>&D
�                    l%=l%-1
�                 �
�$                 buff%?(l%-1)=&A
�         � 10:doinnoc%=�
�B                 �putdata(status%,"!Boot already innoculated")
�          doinnoc%=�
�         �
�� &0A:� Normal terminator
�' buff%?l%=&A:l%+=1:� Add LF on end
��
�� doinnoc% �
�!   � l%+protlen%+1>maxboot% �
�      still%=�:infect%=�
=      �putdata(status%,"!Boot too big - not innoculated")
      �
   �
"'   � �innocboot(name$,buff%,l%,�) �
,<      �putdata(status%,"!Boot has now been innoculated")
6   �
@�
J�
T
^$ݤinnocboot(n$,a%,len%,addicon%)
h� good%:good%=�
r� addicon% �
|  $(a%+len%)=icon$
�  len%+=iconlen%
��
�$(a%+len%)=protect$
�7� �oscli("Save",n$,�~a%+" "+�~(a%+len%+protlen%)) �
�&   � �oscli("SetType",n$,"Obey") �
�8      numinnoc%+=1:good%=�:�putdata(21,�(numinnoc%))
�   �
��
�
=good%
�
���extendvirus(mess$,addr%)
�� t%
�?� addr%:�putdata(dirscan%,"Execution Count: "+�(addr%!&34))
6�putdata(status%,"Extend Virus "+mess$+" found !")
infect%=�:�openwindow
#t%=�+200:� Delay to see message
&�
0   �wimp_poll
:� �>t% � quit%
D�
N
X��delmodule(m$)
b�diskinfect
l� �oscli("Delete",m$,"") �
v6   �putdata(status%,"Extend Virus module deleted")
��
��
�
���diskinfect
�(numdisk%+=1:�putdata(20,�(numdisk%))
��
�
�ݤoscli(l$,m$,r$)
�� flags%,again%,errblk%
��
�   � l$="RMKill" �
�O      ș "XWimp_StartTask",l$+" "+m$+" "+r$+" { > null: }" � errblk%;flags%
�   �
G      ș "XOS_CLI",l$+" "+m$+" "+r$+" { > null: }" � errblk%;flags%
   �
   again%=�
    � flags% � 1 �
*      Ȏ !errblk% �
4      � &108C9:
>O         again%=�yesno("    Write-protected disk !     Retry disk write ?")
H2      � &108C3:again%=�oscli("Access",m$,"WR")
R      
\          � !errblk%>&10000 �
f?            �putdata(status%,"Couldn't perform disk write")
p         �
zA            �putdata(status%,"Couldn't delete Extend module")
�         �
�      �
�      � again%=�:still%=�
�   �
�� again%=�
�=((flags% � 1)=0)
�
�ݤwimperror(mess$,mask%)
�� click%
�Rș "XWimp_ReportError",�4,bl$)+mess$+bl$,mask%,"VKiller Warning"+bl$ � ,click%
�=click%
�
�/ݤyesno(mess$)=(�wimperror(mess$,%10011)=1)
	
	��warn(mess$)
	� click%
	$#click%=�wimperror(mess$,%10001)
	.�
	8
	B��scanmodules(hand%)
	L&� module%,sub%,start%,flags%,help%
	V�
	`D   ș "XOS_Module",12,module%,sub% � ,module%,sub%,start%;flags%
	j   � (flags% � 1)=0 �
	t!      help%=start%+start%!&14
	~+      � �getstring(help%)=extendhelp$ �
	�!         nummem%+=1:infect%=�
	�$         �putdata(19,�(nummem%))
	�         � hand% �
	�@            � This is a bug-fix :-) It allows the virus task
	�H            � to shutdown properly without crashing the Task Manager
	�3            start%!&40=hand%:� Save task handle
	�            P%=start%+&70
	�            [OPT 0
	�>            LDR R2,start%+&64:CMP R2,#1:SWIGT "XOS_Module"
	�3            LDR R0,start%+&40:LDR R1,start%+&54
	�            ]
	�         �
E            �warn("Task Manager is unstable !     Do not use it")

         �
*         �extendvirus("in RMA",start%)
-         � �oscli("RMKill","Extend","") �
(A             �putdata(status%,"Extend Virus killed from RMA")
2         �
<             still%=�
F         �
P      �
Z   �
d� flags% � 1
n�
x
�ݤexists(file$,type%)
�� found%,ftype%
�*ș "XOS_File",5,file$ � found%,,ftype%
�ftype%=(ftype%>>>8) � &FFF
�=(found%=1 � type%=ftype%)
�
�ݤlower(s$)
�� loop%,n$,c$:n$=""
�� loop%=1 � �(s$)
�   c$=�s$,loop%,1)
�   � c$>="A" � c$<="Z" �
�      n$=n$+�(�(c$)+32)
�   �
      n$=n$+c$
   �
�
"=n$
,
6ݤgetstring(� addr%)
@� s$:s$=""
J+ȕ ?addr%<>0:s$=s$+�(?addr%):addr%+=1:�
T=s$
^
h��wimp_poll
r
� reason%
|%ș "XWimp_Poll",0,poll% � reason%
�Ȏ reason% �
�7� 2:ș "XWimp_OpenWindow",,poll%:� Info window drag
�� 3:�closewindow
�� 6:�mouseclick
�� 9:�menuselect
�� 17,18:�wimpmessage
��
��
�
���closewindow
�7ș "XWimp_CloseWindow",,vkillwind%:� Eval close box
��
�
��mouseclick
Ȏ poll%!8 �
   � 1,4:�startup
&   �   2:�shownewmenu
0�
:�
D
N��shownewmenu
X� y%
b:� poll%!12=-2:y%=96+!spacing*numitems% � y%=poll%!4+16
loldx%=!poll%-64:oldy%=y%
v�showoldmenu
��
�
���showoldmenu
�,ș "XWimp_CreateMenu",,menu%,oldx%,oldy%
��
�
���openwindow
�3vkillwind%!28=-1:� Open on top of everyone else
�%ș "XWimp_OpenWindow",,vkillwind%
��
�
�
��startup
�Ȏ poll%!12 �

   � -2:�openwindow

   � vkillhand%:

      Ȏ poll%!16 �

 :      � 7:� scanning%=�:�nextfs:� Filing system change

*P      � 8,9,10,11,12,13,14,15:� scanning%=�:drive%=poll%!16-8:� Drive change

43      � 23:� scanning%:�finishscan � �startscan

>      � 24:innoc%=� innoc%

H      �

R�

\�

f

z��menuselect

�!� mouse%,item%:item%=!poll%+1

�3ș "XWimp_GetPointerInfo",,poll%:mouse%=poll%!8

�Ȏ item% �

�-   � numitems%:quit%=�:� Last Item = Quit

��

�� mouse%=1:�showoldmenu

��

�
��wimpmessage
Ȏ poll%!16 �
E   �      0:quit%=�:� Shut down (Desktop Exit, Task Manager Quit)
$   � &400C2:�appstart
.�
8�
B
L��appstart
VJ� Unlike, ahem, certain Acorn applications we could mention, it really
`F� is nice to make sure only one invocation of the program has been
jC� activated - this is done by checking a new task's name/handle
t� A%,B%,same%
~� poll%!4<>task% �
�   A%=poll%+28:B%=-1
�   � ?A% �
�      �
�4         B%+=1:same%=(A%?B%=�(�prog$+bl$,B%+1)))
�      � A%?B%=0 � � same%
�      � same%:quit%=�
�   �
�      �scanmodules(poll%!4)
�   �
��
��
�
��putdata(icon%,mess$)

-� Change icon 'icon%' to the string mess$
;� Note that this assumes an indirected icon of course !
+!icondata%=vkillhand%:icondata%!4=icon%
(&ș "XWimp_GetIconState",,icondata%
2$(icondata%!28)=mess$
<Xș "XWimp_ForceRedraw",vkillhand%,icondata%!8,icondata%!12,icondata%!16,icondata%!20
F�
P
Zݤgetdata(wind%,icon%)
d6� Read the value of icon 'icon%' in window 'wind%'
n;� Note that this assumes an indirected icon of course !
x&!icondata%=wind%:icondata%!4=icon%
�&ș "XWimp_GetIconState",,icondata%
�=$(icondata%!28)
�
���makeicon
�?P%=icon%:� Use built in assembler - easier to see structure
�
[OPT 0
�E                EQUD    iconbartype%    ; Icon bar 'utility' flag
�;                EQUD    0               ; Bottom left X
�;                EQUD    0               ; Bottom left Y
�9                EQUD    69              ; Top right X
�9                EQUD    68              ; Top right Y
�>                EQUB    %00000010       ; Icon is a sprite
�G                EQUB    %00110001       ; Click notifies/Indirected
H                EQUB    %00000000       ; Nothing special about icon
F                EQUB    %00000001       ; Forecol = 1, Backcol = 0
D.pokespname     EQUD    pokespname+12   ; Pointer to sprite name
"E                EQUD    1               ; Pointer to WIMP sprites
,C                EQUD    12              ; Length of sprite name
6<.spritename     EQUS    "!vkiller"+�4,bl$) ; Sprite name
@]
J,ș "XWimp_CreateIcon",,icon% � iconhand%
T�
^
h��makemenu
r(numitems%=2:� Change if you add more
|P%=menu%:� Use assembler
�
[OPT 0
�@                EQUS    prog$+�12-�(prog$),bl$) ; Menu title
�7                EQUB    7       ; Foreground colour
�7                EQUB    2       ; Background colour
�9                EQUB    7       ; Work foregrd colour
�9                EQUB    0       ; Work backgrd colour
�1                EQUD    148     ; Total width
�2.spacing        EQUD    44      ; Total height
�2                EQUD    0       ; Line spacing
�
; Item #1
�5                EQUD    0       ; Nothing special
�A.submenupoke    EQUD    0       ; Sub-menu addr poked in here
�>                EQUD    (7<<24) � 1 ; Item is text & black
-                EQUS    "Info       "+bl$

; Item #2
4                EQUD    &80     ; Last menu item
&1                EQUD    -1      ; No sub-menu
0>                EQUD    (7<<24) � 1 ; Item is text & black
:-                EQUS    "Quit       "+bl$
D]
N�
X
b��gettemplates
l� flags%,dummy%
v=ș "XWimp_OpenTemplate",,vkillvar$+".Templates" � ;flags%
�<� flags% � 1:�fatal("Missing Templates file for "+prog$)
�6vkillhand%=�loadtemplate(vkillwind%,"VKillWindow")
�0!submenupoke=�loadtemplate(infowind%,"Info")
�ș "XWimp_CloseTemplate"
��
�
�ݤloadtemplate(addr%,wind$)
�G� Note the +4 on the address - this allows the poking of the handle
�� windhand%,windptr%
�Vș "XWimp_LoadTemplate",,addr%+4,addr%+&700,addr%+&E00,-1,wind$,0 � ,,,,,,windptr%
�S� windptr%=0:�fatal("Missing "+wind$+" window from "+prog$+"'s Templates file")
�0ș "XWimp_CreateWindow",,addr%+4 � windhand%
�H!addr%=windhand%:� Store window handle because needed by later calls
=windhand%

��systemerror
 A� Why do I need this proc ? Well, the Wimp doesn't report the
*)� offending line number of an error !
4
� err$
>'� �:err$=" at line "+�(�) � err$=""
H	� � �
R�fatal(�$+err$)
\�
f
p��fatal(error$)
z�"Error 0 "+error$
��
�
���nextfs
�<� fsname%,oldfsys$,swi$,swiname$,numflop%,numhard%,loop%
�oldfsys$=fsys$:fsys$=""
��
�,   fsysnum%+=1:� fsysnum%>255:fsysnum%=1
�;   ș "XOS_FSControl",33,fsysnum%,fbuff%,12 � ,,fsname%
�   � ?fsname% �
�#      fsys$=�getstring(fsname%)
�      Ȏ fsys$ �
�n      � "null","printer","serial","vdu","rawvdu","kbd","rawkbd","deskfs","msdos":fsys$="":� Not infectable
�      �
   �
� fsys$<>""
� oldfsys$<>fsys$ �
$   Ȏ fsys$ �
.   � "adfs":swiname$="ADFS"
81   � "net":swiname$="NetFS":� Is this right ?
B    swiname$=fsys$
L   �
V"   swi$="X"+swiname$+"_Drives"
`   � �checkswi(swi$) �
j,      ș swi$ � drive%,numflop%,numhard%
tG      � drive%>=numflop% � numhard%=0 � drive%>=numhard%+4:drive%=0
~   �
�(      numflop%=1:numhard%=0:drive%=0
�   �
�   �putdata(7,fsys$)
�   � loop%=0 � 7
�e      �allowdrive(loop%,(loop%<4 � numflop%>loop%) � (loop%>3 � numhard%+4>loop%),(loop%=drive%))
�   �
��
��
�
�ݤcheckswi(swi$)
�� swi%,flags%
�4ș "XOS_SWINumberFromString",,swi$ � swi%;flags%
=((flags% � 1)=0)


"��hackflags(icon%,eor%,clear%)
!icondata%=vkillhand%
(icondata%!4=icon%
2icondata%!8=eor%
<icondata%!12=clear%
F&ș "XWimp_SetIconState",,icondata%
P�
Z
d��hilite(icon%,bool%)
n.�hackflags(icon%,((-bool%)<<21),&00200000)
x�
�
�$��allowdrive(drv%,bool%,hilite%)
�bool%=-bool%
�N�hackflags(drv%+8,(bool%<<16)+11*(bool%<<12)+((15-bool%*6)<<28),&F01FF000)
��hilite(drv%+8,hilite%)
��
�
���finishscan
�#�putdata(23,"Start Drive Scan")
��putdata(dirscan%,"Idle")
�scanning%=�
��
�
��startscan

� prefix$
"�putdata(23,"Stop Drive Scan")
""scanning%=�:infect%=�:still%=�
, prefix$=fsys$+"::"+�(drive%)
6*�putdata(status%,"Drive Scan started")
@�check(prefix$,"$",0)
J� scanning% �
T-   numscans%+=1:�putdata(22,�(numscans%))
^   �hilite(23,�)
h   � infect% �
r      � still% �
|A         �putdata(status%,prefix$+" may still be infected !")
�      �
�E         �putdata(status%,prefix$+" was infected, but now clean")
�      �
�   �
�?      �putdata(status%,prefix$+" is clean - no infections")
�   �
�   �openwindow
��
�6   �putdata(status%,"Drive Scan manually aborted")
��
��finishscan
��
�
00000000  0d 00 0a 1b f4 20 3e 24  2e 21 56 4b 69 6c 6c 65  |..... >$.!VKille|
00000010  72 2e 21 52 75 6e 49 6d  61 67 65 0d 00 14 32 f4  |r.!RunImage...2.|
00000020  20 56 69 72 75 73 20 4b  69 6c 6c 65 72 20 56 31  | Virus Killer V1|
00000030  2e 31 30 20 28 43 29 20  52 69 63 68 61 72 64 20  |.10 (C) Richard |
00000040  4b 2e 20 4c 6c 6f 79 64  20 31 39 39 30 0d 00 1e  |K. Lloyd 1990...|
00000050  3c f4 20 43 75 72 72 65  6e 74 6c 79 20 6b 69 6c  |<. Currently kil|
00000060  6c 73 20 74 68 65 20 22  45 78 74 65 6e 64 20 56  |ls the "Extend V|
00000070  69 72 75 73 22 20 28 73  65 65 20 64 6f 63 75 6d  |irus" (see docum|
00000080  65 6e 74 61 74 69 6f 6e  29 0d 00 28 05 f4 0d 00  |entation)..(....|
00000090  32 15 f4 20 52 65 63 6f  6d 6d 65 6e 64 65 64 20  |2.. Recommended |
000000a0  43 44 3a 0d 00 3c 42 f4  20 42 2d 35 32 27 73 20  |CD:..<B. B-52's |
000000b0  22 43 6f 73 6d 69 63 20  54 68 69 6e 67 22 2e 20  |"Cosmic Thing". |
000000c0  57 65 69 72 64 20 61 74  20 66 69 72 73 74 2c 20  |Weird at first, |
000000d0  62 75 74 20 69 74 20 67  72 6f 77 73 20 6f 6e 20  |but it grows on |
000000e0  79 6f 75 20 21 0d 00 46  04 0d 00 50 1b f4 20 47  |you !..F...P.. G|
000000f0  65 6e 65 72 61 6c 20 65  72 72 6f 72 20 74 72 61  |eneral error tra|
00000100  70 70 65 72 0d 00 5a 14  ee 20 85 20 f2 73 79 73  |pper..Z.. . .sys|
00000110  74 65 6d 65 72 72 6f 72  0d 00 64 04 0d 00 6e 22  |temerror..d...n"|
00000120  71 75 69 74 25 3d a3 3a  f4 20 4e 6f 74 68 69 6e  |quit%=.:. Nothin|
00000130  67 20 68 61 70 70 65 6e  65 64 20 79 65 74 0d 00  |g happened yet..|
00000140  78 09 f2 69 6e 69 74 0d  00 82 05 f5 0d 00 8c 11  |x..init.........|
00000150  20 20 20 f2 77 69 6d 70  5f 70 6f 6c 6c 0d 00 96  |   .wimp_poll...|
00000160  0b fd 20 71 75 69 74 25  0d 00 a0 04 0d 00 aa 2a  |.. quit%.......*|
00000170  c8 99 20 22 58 57 69 6d  70 5f 43 6c 6f 73 65 44  |.. "XWimp_CloseD|
00000180  6f 77 6e 22 2c 74 61 73  6b 25 2c 21 74 61 73 6b  |own",task%,!task|
00000190  63 6f 6e 73 74 25 0d 00  b4 10 c8 99 20 22 4f 53  |const%...... "OS|
000001a0  5f 45 78 69 74 22 0d 00  be 04 0d 00 c8 0a dd f2  |_Exit"..........|
000001b0  69 6e 69 74 0d 00 d2 44  73 69 7a 65 25 3d 37 37  |init...Dsize%=77|
000001c0  2a 33 32 3a f4 20 4d 61  78 20 6f 66 20 37 37 20  |*32:. Max of 77 |
000001d0  66 69 6c 65 73 20 70 65  72 20 64 69 72 20 61 6e  |files per dir an|
000001e0  64 20 33 32 20 62 79 74  65 73 20 70 65 72 20 66  |d 32 bytes per f|
000001f0  69 6c 65 20 69 6e 66 6f  0d 00 dc 39 6d 61 78 62  |ile info...9maxb|
00000200  6f 6f 74 25 3d 26 31 34  30 30 3a f4 20 35 4b 20  |oot%=&1400:. 5K |
00000210  69 73 20 6c 61 72 67 65  73 74 20 61 6c 6c 6f 77  |is largest allow|
00000220  65 64 20 73 69 7a 65 20  66 6f 72 20 21 42 6f 6f  |ed size for !Boo|
00000230  74 0d 00 e6 31 6d 61 78  6c 65 76 65 6c 25 3d 38  |t...1maxlevel%=8|
00000240  3a f4 20 41 6c 6c 6f 77  20 66 6f 72 20 38 20 6c  |:. Allow for 8 l|
00000250  65 76 65 6c 73 20 6f 66  20 64 69 72 65 63 74 6f  |evels of directo|
00000260  72 79 0d 00 f0 34 de 20  69 6e 66 6f 25 20 73 69  |ry...4. info% si|
00000270  7a 65 25 2a 6d 61 78 6c  65 76 65 6c 25 2c 62 75  |ze%*maxlevel%,bu|
00000280  66 66 25 20 6d 61 78 62  6f 6f 74 25 2c 66 62 75  |ff% maxboot%,fbu|
00000290  66 66 25 20 31 32 0d 00  fa 31 69 63 6f 6e 24 3d  |ff% 12...1icon$=|
000002a0  22 49 63 6f 6e 53 70 72  69 74 65 73 20 3c 4f 62  |"IconSprites <Ob|
000002b0  65 79 24 44 69 72 3e 2e  21 53 70 72 69 74 65 73  |ey$Dir>.!Sprites|
000002c0  22 2b bd 28 26 41 29 0d  01 04 15 69 63 6f 6e 6c  |"+.(&A)....iconl|
000002d0  65 6e 25 3d a9 28 69 63  6f 6e 24 29 0d 01 0e 5a  |en%=.(icon$)...Z|
000002e0  70 72 6f 74 65 63 74 24  3d 22 7c 20 54 68 69 73  |protect$="| This|
000002f0  20 66 69 6c 65 20 68 61  73 20 62 65 65 6e 20 69  | file has been i|
00000300  6e 6e 6f 63 75 6c 61 74  65 64 20 61 67 61 69 6e  |nnoculated again|
00000310  73 74 20 74 68 65 20 45  78 74 65 6e 64 20 56 69  |st the Extend Vi|
00000320  72 75 73 22 2b bd 28 26  41 29 2b 22 7c 7c 22 2b  |rus"+.(&A)+"||"+|
00000330  bd 28 26 46 46 29 0d 01  18 18 70 72 6f 74 6c 65  |.(&FF)....protle|
00000340  6e 25 3d a9 28 70 72 6f  74 65 63 74 24 29 0d 01  |n%=.(protect$)..|
00000350  22 37 65 78 74 65 6e 64  68 65 6c 70 24 3d 22 45  |"7extendhelp$="E|
00000360  78 74 65 6e 64 22 2b bd  28 39 29 2b bd 28 39 29  |xtend"+.(9)+.(9)|
00000370  2b 22 31 2e 35 36 20 28  30 38 20 4a 75 6c 20 31  |+"1.56 (08 Jul 1|
00000380  39 38 39 29 22 0d 01 2c  29 64 65 66 66 73 24 3d  |989)"..,)deffs$=|
00000390  22 61 64 66 73 22 3a f4  20 44 65 66 61 75 6c 74  |"adfs":. Default|
000003a0  20 66 69 6c 69 6e 67 20  73 79 73 74 65 6d 0d 01  | filing system..|
000003b0  36 2c 69 6e 66 65 63 74  25 3d a3 3a 73 74 69 6c  |6,infect%=.:stil|
000003c0  6c 25 3d a3 3a f4 20 4e  6f 20 76 69 72 75 73 20  |l%=.:. No virus |
000003d0  63 68 65 63 6b 73 20 79  65 74 0d 01 40 41 6e 75  |checks yet..@Anu|
000003e0  6d 6d 65 6d 25 3d 30 3a  6e 75 6d 64 69 73 6b 25  |mmem%=0:numdisk%|
000003f0  3d 30 3a 6e 75 6d 69 6e  6e 6f 63 25 3d 30 3a 6e  |=0:numinnoc%=0:n|
00000400  75 6d 73 63 61 6e 73 25  3d 30 3a f4 20 52 65 73  |umscans%=0:. Res|
00000410  65 74 20 63 6f 75 6e 74  65 72 73 0d 01 4a 37 66  |et counters..J7f|
00000420  73 79 73 6e 75 6d 25 3d  30 3a 66 73 79 73 24 3d  |sysnum%=0:fsys$=|
00000430  22 22 3a f4 20 4e 6f 74  20 63 68 65 63 6b 65 64  |"":. Not checked|
00000440  20 66 69 6c 69 6e 67 20  73 79 73 74 65 6d 20 79  | filing system y|
00000450  65 74 0d 01 54 2a 69 6e  6e 6f 63 25 3d a3 3a f4  |et..T*innoc%=.:.|
00000460  20 4e 6f 74 20 69 6e 6e  6f 63 75 6c 61 74 69 6e  | Not innoculatin|
00000470  67 20 62 79 20 64 65 66  61 75 6c 74 0d 01 5e 04  |g by default..^.|
00000480  0d 01 68 1b f4 20 41 70  70 6c 69 63 61 74 69 6f  |..h.. Applicatio|
00000490  6e 20 43 6f 6e 73 74 61  6e 74 73 0d 01 72 32 70  |n Constants..r2p|
000004a0  72 6f 67 24 3d 22 56 4b  69 6c 6c 65 72 22 3a f4  |rog$="VKiller":.|
000004b0  20 45 6e 67 6c 69 73 68  20 74 65 78 74 20 6e 61  | English text na|
000004c0  6d 65 20 6f 66 20 70 72  6f 67 72 61 6d 0d 01 7c  |me of program..||
000004d0  48 f4 20 43 68 61 6e 67  65 20 6e 65 78 74 20 6c  |H. Change next l|
000004e0  69 6e 65 20 74 6f 20 64  61 74 65 24 3d 4d 49 44  |ine to date$=MID|
000004f0  24 28 54 49 4d 45 24 2c  35 2c 31 31 29 20 74 6f  |$(TIME$,5,11) to|
00000500  20 67 65 74 20 74 68 65  20 63 75 72 72 65 6e 74  | get the current|
00000510  20 64 61 74 65 0d 01 86  38 64 61 74 65 24 3d 22  | date...8date$="|
00000520  30 35 20 44 65 63 20 31  39 39 30 22 3a f4 20 43  |05 Dec 1990":. C|
00000530  75 72 72 65 6e 74 20 64  61 74 65 20 61 73 20 61  |urrent date as a|
00000540  20 66 69 78 65 64 20 73  74 72 69 6e 67 0d 01 90  | fixed string...|
00000550  3e 76 6b 69 6c 6c 76 61  72 24 3d 22 3c 56 4b 69  |>vkillvar$="<VKi|
00000560  6c 6c 65 72 24 44 69 72  3e 22 3a f4 20 56 4b 69  |ller$Dir>":. VKi|
00000570  6c 6c 65 72 20 65 6e 76  69 72 6f 6e 6d 65 6e 74  |ller environment|
00000580  61 6c 20 76 61 72 69 61  62 6c 65 0d 01 9a 4a 69  |al variable...Ji|
00000590  63 6f 6e 62 61 72 74 79  70 65 25 3d 2d 31 3a f4  |conbartype%=-1:.|
000005a0  20 2d 31 20 3d 20 55 74  69 6c 69 74 79 20 28 52  | -1 = Utility (R|
000005b0  48 53 20 6f 66 20 62 61  72 29 2c 20 2d 32 20 3d  |HS of bar), -2 =|
000005c0  20 53 65 72 76 69 63 65  20 28 4c 48 53 20 6f 66  | Service (LHS of|
000005d0  20 62 61 72 29 0d 01 a4  3e 77 69 6e 64 6d 61 6e  | bar)...>windman|
000005e0  25 3d 32 30 30 3a f4 20  45 78 70 65 63 74 20 61  |%=200:. Expect a|
000005f0  74 20 4c 45 41 53 54 20  56 32 2e 30 30 20 6f 66  |t LEAST V2.00 of|
00000600  20 74 68 65 20 57 69 6e  64 6f 77 20 4d 61 6e 61  | the Window Mana|
00000610  67 65 72 0d 01 ae 32 62  6c 24 3d bd 28 30 29 3a  |ger...2bl$=.(0):|
00000620  f4 20 4e 55 4c 4c 20 63  68 61 72 20 75 73 65 64  |. NULL char used|
00000630  20 74 6f 20 74 65 72 6d  69 6e 61 74 65 20 73 74  | to terminate st|
00000640  72 69 6e 67 73 0d 01 b8  32 64 69 72 73 63 61 6e  |rings...2dirscan|
00000650  25 3d 31 36 3a f4 20 44  69 72 65 63 74 6f 72 79  |%=16:. Directory|
00000660  20 73 70 65 63 20 67 6f  65 73 20 69 6e 20 74 68  | spec goes in th|
00000670  69 73 20 69 63 6f 6e 0d  01 c2 30 73 74 61 74 75  |is icon...0statu|
00000680  73 25 3d 31 37 3a f4 20  53 74 61 74 75 73 20 6d  |s%=17:. Status m|
00000690  65 73 73 61 67 65 73 20  67 6f 20 69 6e 20 74 68  |essages go in th|
000006a0  69 73 20 69 63 6f 6e 0d  01 cc 04 0d 01 d6 1f f4  |is icon.........|
000006b0  20 57 6f 72 6b 73 70 61  63 65 20 66 6f 72 20 61  | Workspace for a|
000006c0  70 70 6c 69 63 61 74 69  6f 6e 0d 01 e0 39 de 20  |pplication...9. |
000006d0  76 6b 69 6c 6c 77 69 6e  64 25 20 26 45 30 30 2c  |vkillwind% &E00,|
000006e0  69 6e 66 6f 77 69 6e 64  25 20 26 45 30 30 3a f4  |infowind% &E00:.|
000006f0  20 54 65 6d 70 6c 61 74  65 20 77 6f 72 6b 73 70  | Template worksp|
00000700  61 63 65 0d 01 ea 25 de  20 70 6f 6c 6c 25 20 32  |ace...%. poll% 2|
00000710  35 36 3a f4 20 57 69 6d  70 5f 50 6f 6c 6c 20 77  |56:. Wimp_Poll w|
00000720  6f 72 6b 73 70 61 63 65  0d 01 f4 28 de 20 69 63  |orkspace...(. ic|
00000730  6f 6e 25 20 34 38 3a f4  20 49 63 6f 6e 20 62 61  |on% 48:. Icon ba|
00000740  72 20 69 63 6f 6e 20 77  6f 72 6b 73 70 61 63 65  |r icon workspace|
00000750  0d 01 fe 2b de 20 6d 65  6e 75 25 20 26 31 30 30  |...+. menu% &100|
00000760  3a f4 20 4d 65 6e 75 20  73 74 72 75 63 74 75 72  |:. Menu structur|
00000770  65 20 77 6f 72 6b 73 70  61 63 65 0d 02 08 40 de  |e workspace...@.|
00000780  20 74 61 73 6b 63 6f 6e  73 74 25 20 38 3a 24 74  | taskconst% 8:$t|
00000790  61 73 6b 63 6f 6e 73 74  25 3d 22 54 41 53 4b 22  |askconst%="TASK"|
000007a0  3a f4 20 53 74 6f 72 65  20 54 61 73 6b 20 63 6f  |:. Store Task co|
000007b0  6e 73 74 61 6e 74 20 68  65 72 65 0d 02 12 39 de  |nstant here...9.|
000007c0  20 69 63 6f 6e 64 61 74  61 25 20 32 35 36 3a f4  | icondata% 256:.|
000007d0  20 54 65 6d 70 20 77 6f  72 6b 73 70 61 63 65 20  | Temp workspace |
000007e0  74 6f 20 67 65 74 2f 70  75 74 20 69 63 6f 6e 20  |to get/put icon |
000007f0  64 61 74 61 0d 02 1c 04  0d 02 26 15 f4 20 49 6e  |data......&.. In|
00000800  69 74 69 61 6c 69 73 65  20 57 49 4d 50 0d 02 30  |itialise WIMP..0|
00000810  4a c8 99 20 22 58 57 69  6d 70 5f 49 6e 69 74 69  |J.. "XWimp_Initi|
00000820  61 6c 69 73 65 22 2c 77  69 6e 64 6d 61 6e 25 2c  |alise",windman%,|
00000830  21 74 61 73 6b 63 6f 6e  73 74 25 2c 70 72 6f 67  |!taskconst%,prog|
00000840  24 2b 62 6c 24 20 b8 20  77 69 6e 64 76 65 72 73  |$+bl$ . windvers|
00000850  25 2c 74 61 73 6b 25 0d  02 3a 65 e7 20 77 69 6e  |%,task%..:e. win|
00000860  64 76 65 72 73 25 3c 77  69 6e 64 6d 61 6e 25 20  |dvers%<windman% |
00000870  8c 20 f2 66 61 74 61 6c  28 70 72 6f 67 24 2b 22  |. .fatal(prog$+"|
00000880  20 72 65 71 75 69 72 65  73 20 57 69 6e 64 6f 77  | requires Window|
00000890  20 4d 61 6e 61 67 65 72  20 56 22 2b a4 66 72 61  | Manager V"+.fra|
000008a0  63 74 69 6f 6e 28 77 69  6e 64 6d 61 6e 25 29 2b  |ction(windman%)+|
000008b0  22 20 6f 72 20 6c 61 74  65 72 22 29 0d 02 44 04  |" or later")..D.|
000008c0  0d 02 4e 42 f2 6d 61 6b  65 6d 65 6e 75 3a f4 20  |..NB.makemenu:. |
000008d0  43 6f 6e 73 74 72 75 63  74 20 6d 65 6e 75 20 28  |Construct menu (|
000008e0  73 68 6f 75 6c 64 20 62  65 20 42 45 46 4f 52 45  |should be BEFORE|
000008f0  20 74 65 6d 70 6c 61 74  65 20 6c 6f 61 64 69 6e  | template loadin|
00000900  67 29 0d 02 58 32 f2 67  65 74 74 65 6d 70 6c 61  |g)..X2.gettempla|
00000910  74 65 73 3a f4 20 47 65  74 20 77 69 6e 64 6f 77  |tes:. Get window|
00000920  20 74 65 6d 70 6c 61 74  65 73 20 66 72 6f 6d 20  | templates from |
00000930  66 69 6c 65 0d 02 62 24  f2 6d 61 6b 65 69 63 6f  |file..b$.makeico|
00000940  6e 3a f4 20 43 72 65 61  74 65 20 69 63 6f 6e 20  |n:. Create icon |
00000950  62 61 72 20 69 63 6f 6e  0d 02 6c 0b f2 6e 65 78  |bar icon..l..nex|
00000960  74 66 73 0d 02 76 0f f2  66 69 6e 69 73 68 73 63  |tfs..v..finishsc|
00000970  61 6e 0d 02 80 1c f2 70  75 74 64 61 74 61 28 73  |an.....putdata(s|
00000980  74 61 74 75 73 25 2c 22  49 64 6c 65 22 29 0d 02  |tatus%,"Idle")..|
00000990  8a 22 f2 73 63 61 6e 6d  6f 64 75 6c 65 73 28 a4  |.".scanmodules(.|
000009a0  67 65 74 74 61 73 6b 68  61 6e 64 28 22 22 29 29  |gettaskhand(""))|
000009b0  0d 02 94 05 e1 0d 02 9e  04 0d 02 a8 1c dd a4 67  |...............g|
000009c0  65 74 74 61 73 6b 68 61  6e 64 28 74 61 73 6b 6e  |ettaskhand(taskn|
000009d0  61 6d 65 24 29 0d 02 b2  2f f4 20 54 68 69 73 20  |ame$).../. This |
000009e0  72 6f 75 74 69 6e 65 20  69 73 20 75 6e 69 6e 74  |routine is unint|
000009f0  65 6e 74 69 6f 6e 61 6c  6c 79 20 62 6c 61 6e 6b  |entionally blank|
00000a00  20 3a 2d 28 0d 02 bc 49  f4 20 41 6c 74 68 6f 75  | :-(...I. Althou|
00000a10  67 68 20 69 74 20 69 73  20 70 6f 73 73 69 62 6c  |gh it is possibl|
00000a20  65 20 74 6f 20 67 65 74  20 74 68 65 20 6e 61 6d  |e to get the nam|
00000a30  65 20 6f 66 20 61 20 74  61 73 6b 20 67 69 76 65  |e of a task give|
00000a40  6e 20 69 74 73 20 68 61  6e 64 6c 65 2c 0d 02 c6  |n its handle,...|
00000a50  4a f4 20 74 68 65 72 65  20 61 70 70 65 61 72 73  |J. there appears|
00000a60  20 74 6f 20 62 65 20 6e  6f 20 77 61 79 20 74 6f  | to be no way to|
00000a70  20 67 65 74 20 74 68 65  20 72 65 76 65 72 73 65  | get the reverse|
00000a80  20 28 54 61 73 6b 20 4d  61 6e 61 67 65 72 20 63  | (Task Manager c|
00000a90  68 65 61 74 73 20 2d 0d  02 d0 47 f4 20 69 74 20  |heats -...G. it |
00000aa0  72 75 6e 73 20 66 69 72  73 74 20 6f 66 20 61 6c  |runs first of al|
00000ab0  6c 20 61 6e 64 20 70 69  63 6b 73 20 75 70 20 57  |l and picks up W|
00000ac0  69 6d 70 5f 49 6e 69 74  69 61 6c 69 73 65 20 68  |imp_Initialise h|
00000ad0  61 6e 64 6c 65 73 2f 6e  61 6d 65 73 29 2e 0d 02  |andles/names)...|
00000ae0  da 48 f4 20 43 61 6e 20  61 6e 79 6f 6e 65 20 6f  |.H. Can anyone o|
00000af0  75 74 20 74 68 65 72 65  20 63 6f 6d 70 6c 65 74  |ut there complet|
00000b00  65 20 74 68 69 73 20 72  6f 75 74 69 6e 65 20 74  |e this routine t|
00000b10  6f 20 72 65 74 75 72 6e  20 61 20 74 61 73 6b 20  |o return a task |
00000b20  68 61 6e 64 6c 65 0d 02  e4 26 f4 20 67 69 76 65  |handle...&. give|
00000b30  6e 20 69 74 73 20 6e 61  6d 65 20 3f 20 50 72 65  |n its name ? Pre|
00000b40  74 74 79 20 70 6c 65 61  73 65 20 3f 0d 02 ee 06  |tty please ?....|
00000b50  3d 30 0d 02 f8 04 0d 03  02 21 dd f2 63 68 65 63  |=0.......!..chec|
00000b60  6b 28 64 69 72 24 2c 6c  65 61 66 64 69 72 24 2c  |k(dir$,leafdir$,|
00000b70  6c 65 76 65 6c 25 29 0d  03 0c 45 ea 20 6f 66 66  |level%)...E. off|
00000b80  25 2c 62 61 73 65 25 2c  6e 75 6d 25 2c 6c 6f 6f  |%,base%,num%,loo|
00000b90  70 25 2c 61 64 64 72 25  2c 6e 61 6d 65 24 2c 66  |p%,addr%,name$,f|
00000ba0  75 6c 6c 6e 61 6d 65 24  2c 6c 65 6e 25 2c 67 6f  |ullname$,len%,go|
00000bb0  74 62 6f 6f 74 25 2c 74  79 70 65 25 0d 03 16 0e  |tboot%,type%....|
00000bc0  f2 77 69 6d 70 5f 70 6f  6c 6c 0d 03 20 1d e7 20  |.wimp_poll.. .. |
00000bd0  71 75 69 74 25 3d b9 20  84 20 73 63 61 6e 6e 69  |quit%=. . scanni|
00000be0  6e 67 25 3d a3 3a e1 0d  03 2a 18 e7 20 6c 65 76  |ng%=.:...*.. lev|
00000bf0  65 6c 25 3d 6d 61 78 6c  65 76 65 6c 25 20 8c 0d  |el%=maxlevel% ..|
00000c00  03 34 47 20 20 20 f2 70  75 74 64 61 74 61 28 73  |.4G   .putdata(s|
00000c10  74 61 74 75 73 25 2c 22  44 69 72 20 6c 65 76 65  |tatus%,"Dir leve|
00000c20  6c 20 22 2b c3 28 6d 61  78 6c 65 76 65 6c 25 29  |l "+.(maxlevel%)|
00000c30  2b 22 20 2d 20 73 6b 69  70 70 69 6e 67 20 64 65  |+" - skipping de|
00000c40  65 70 65 72 22 29 0d 03  3e 08 20 20 20 e1 0d 03  |eper")..>.   ...|
00000c50  48 05 cd 0d 03 52 1a 64  69 72 24 3d 64 69 72 24  |H....R.dir$=dir$|
00000c60  2b 22 2e 22 2b 6c 65 61  66 64 69 72 24 0d 03 5c  |+"."+leafdir$..\|
00000c70  1b f2 70 75 74 64 61 74  61 28 64 69 72 73 63 61  |..putdata(dirsca|
00000c80  6e 25 2c 64 69 72 24 29  0d 03 66 2e 6f 66 66 25  |n%,dir$)..f.off%|
00000c90  3d 30 3a 67 6f 74 62 6f  6f 74 25 3d a3 3a 62 61  |=0:gotboot%=.:ba|
00000ca0  73 65 25 3d 69 6e 66 6f  25 2b 6c 65 76 65 6c 25  |se%=info%+level%|
00000cb0  2a 73 69 7a 65 25 0d 03  70 05 f5 0d 03 7a 12 20  |*size%..p....z. |
00000cc0  20 20 61 64 64 72 25 3d  62 61 73 65 25 0d 03 84  |  addr%=base%...|
00000cd0  4d 20 20 20 c8 99 20 22  58 4f 53 5f 47 42 50 42  |M   .. "XOS_GBPB|
00000ce0  22 2c 31 30 2c 64 69 72  24 2b bd 28 30 29 2c 61  |",10,dir$+.(0),a|
00000cf0  64 64 72 25 2c 37 37 2c  6f 66 66 25 2c 73 69 7a  |ddr%,77,off%,siz|
00000d00  65 25 2c 22 2a 22 2b bd  28 30 29 20 b8 20 2c 2c  |e%,"*"+.(0) . ,,|
00000d10  2c 6e 75 6d 25 2c 6f 66  66 25 0d 03 8e 0f 20 20  |,num%,off%....  |
00000d20  20 e7 20 6e 75 6d 25 20  8c 0d 03 98 1c 20 20 20  | . num% .....   |
00000d30  20 20 20 e3 20 6c 6f 6f  70 25 3d 30 20 b8 20 6e  |   . loop%=0 . n|
00000d40  75 6d 25 2d 31 0d 03 a2  1a 20 20 20 20 20 20 20  |um%-1....       |
00000d50  20 20 6f 62 6a 25 3d 61  64 64 72 25 21 31 36 0d  |  obj%=addr%!16.|
00000d60  03 ac 33 20 20 20 20 20  20 20 20 20 6c 65 6e 25  |..3         len%|
00000d70  3d 61 64 64 72 25 21 38  3a 74 79 70 65 25 3d 28  |=addr%!8:type%=(|
00000d80  21 61 64 64 72 25 3e 3e  3e 38 29 20 80 20 26 46  |!addr%>>>8) . &F|
00000d90  46 46 0d 03 b6 2e 20 20  20 20 20 20 20 20 20 61  |FF....         a|
00000da0  64 64 72 25 2b 3d 32 30  3a 6e 61 6d 65 24 3d a4  |ddr%+=20:name$=.|
00000db0  67 65 74 73 74 72 69 6e  67 28 61 64 64 72 25 29  |getstring(addr%)|
00000dc0  0d 03 c0 37 20 20 20 20  20 20 20 20 20 61 64 64  |...7         add|
00000dd0  72 25 3d 28 61 64 64 72  25 2b 34 29 20 81 20 34  |r%=(addr%+4) . 4|
00000de0  2a 34 3a f4 20 41 6c 69  67 6e 20 74 6f 20 6e 65  |*4:. Align to ne|
00000df0  78 74 20 77 6f 72 64 0d  03 ca 17 20 20 20 20 20  |xt word....     |
00000e00  20 20 20 20 e7 20 6f 62  6a 25 3d 32 20 8c 0d 03  |    . obj%=2 ...|
00000e10  d4 2b 20 20 20 20 20 20  20 20 20 20 20 20 f2 63  |.+            .c|
00000e20  68 65 63 6b 28 64 69 72  24 2c 6e 61 6d 65 24 2c  |heck(dir$,name$,|
00000e30  6c 65 76 65 6c 25 2b 31  29 0d 03 de 0e 20 20 20  |level%+1)....   |
00000e40  20 20 20 20 20 20 cc 0d  03 e8 28 20 20 20 20 20  |      ....(     |
00000e50  20 20 20 20 20 20 20 66  75 6c 6c 6e 61 6d 65 24  |       fullname$|
00000e60  3d 64 69 72 24 2b 22 2e  22 2b 6e 61 6d 65 24 0d  |=dir$+"."+name$.|
00000e70  03 f2 22 20 20 20 20 20  20 20 20 20 20 20 20 c8  |.."            .|
00000e80  8e 20 a4 6c 6f 77 65 72  28 6e 61 6d 65 24 29 20  |. .lower(name$) |
00000e90  ca 0d 03 fc 24 20 20 20  20 20 20 20 20 20 20 20  |....$           |
00000ea0  20 c9 20 22 21 62 6f 6f  74 22 3a 67 6f 74 62 6f  | . "!boot":gotbo|
00000eb0  6f 74 25 3d b9 0d 04 06  2b 20 20 20 20 20 20 20  |ot%=....+       |
00000ec0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000ed0  20 20 e7 20 74 79 70 65  25 3d 26 46 45 42 20 8c  |  . type%=&FEB .|
00000ee0  0d 04 10 3a 20 20 20 20  20 20 20 20 20 20 20 20  |...:            |
00000ef0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000f00  f2 63 68 65 63 6b 62 6f  6f 74 28 66 75 6c 6c 6e  |.checkboot(fulln|
00000f10  61 6d 65 24 2c 6c 65 6e  25 29 0d 04 1a 1e 20 20  |ame$,len%)....  |
00000f20  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000f30  20 20 20 20 20 20 20 cd  0d 04 24 65 20 20 20 20  |       ...$e    |
00000f40  20 20 20 20 20 20 20 20  c9 20 22 6d 6f 6e 69 74  |        . "monit|
00000f50  6f 72 72 6d 22 2c 22 63  68 65 63 6b 6d 6f 64 22  |orrm","checkmod"|
00000f60  2c 22 65 78 74 65 6e 64  72 6d 22 2c 22 6f 73 65  |,"extendrm","ose|
00000f70  78 74 65 6e 64 22 2c 22  63 6f 6c 6f 75 72 72 6d  |xtend","colourrm|
00000f80  22 2c 22 66 61 73 74 6d  6f 64 22 2c 22 63 6f 64  |","fastmod","cod|
00000f90  65 72 6d 22 2c 22 6d 65  6d 72 6d 22 3a 0d 04 2e  |erm","memrm":...|
00000fa0  2e 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |.               |
00000fb0  20 20 e7 20 6c 65 6e 25  3d 39 34 30 20 80 20 74  |  . len%=940 . t|
00000fc0  79 70 65 25 3d 26 46 46  41 20 8c 0d 04 38 3e 20  |ype%=&FFA ...8> |
00000fd0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000fe0  20 20 20 e7 20 a4 6f 73  63 6c 69 28 22 4c 6f 61  |   . .oscli("Loa|
00000ff0  64 22 2c 66 75 6c 6c 6e  61 6d 65 24 2c c3 7e 62  |d",fullname$,.~b|
00001000  75 66 66 25 29 3d a3 20  8c 0d 04 42 43 20 20 20  |uff%)=. ...BC   |
00001010  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001020  20 20 20 20 62 75 66 66  25 21 26 33 34 3d 30 3a  |    buff%!&34=0:|
00001030  f4 20 5a 65 72 6f 20 63  6f 75 6e 74 20 64 75 65  |. Zero count due|
00001040  20 74 6f 20 62 61 64 20  6c 6f 61 64 0d 04 4c 19  | to bad load..L.|
00001050  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001060  20 20 20 20 cd 0d 04 56  34 20 20 20 20 20 20 20  |    ...V4       |
00001070  20 20 20 20 20 20 20 20  20 20 20 20 20 f2 65 78  |             .ex|
00001080  74 65 6e 64 76 69 72 75  73 28 22 6d 6f 64 75 6c  |tendvirus("modul|
00001090  65 22 2c 62 75 66 66 25  29 0d 04 60 2d 20 20 20  |e",buff%)..`-   |
000010a0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000010b0  20 f2 64 65 6c 6d 6f 64  75 6c 65 28 66 75 6c 6c  | .delmodule(full|
000010c0  6e 61 6d 65 24 29 0d 04  6a 16 20 20 20 20 20 20  |name$)..j.      |
000010d0  20 20 20 20 20 20 20 20  20 20 20 cd 0d 04 74 11  |           ...t.|
000010e0  20 20 20 20 20 20 20 20  20 20 20 20 cb 0d 04 7e  |            ...~|
000010f0  0e 20 20 20 20 20 20 20  20 20 cd 0d 04 88 0b 20  |.         ..... |
00001100  20 20 20 20 20 ed 0d 04  92 08 20 20 20 cd 0d 04  |     .....   ...|
00001110  9c 25 fd 20 6f 66 66 25  3d 2d 31 20 84 20 71 75  |.%. off%=-1 . qu|
00001120  69 74 25 3d b9 20 84 20  73 63 61 6e 6e 69 6e 67  |it%=. . scanning|
00001130  25 3d a3 0d 04 a6 46 e7  20 67 6f 74 62 6f 6f 74  |%=....F. gotboot|
00001140  25 3d a3 20 80 20 97 28  6c 65 61 66 64 69 72 24  |%=. . .(leafdir$|
00001150  29 3d 33 33 20 80 20 69  6e 6e 6f 63 25 3d b9 20  |)=33 . innoc%=. |
00001160  80 20 71 75 69 74 25 3d  a3 20 80 20 73 63 61 6e  |. quit%=. . scan|
00001170  6e 69 6e 67 25 3d b9 20  8c 0d 04 b0 4b 20 20 20  |ning%=. ....K   |
00001180  e7 20 a4 69 6e 6e 6f 63  62 6f 6f 74 28 64 69 72  |. .innocboot(dir|
00001190  24 2b 22 2e 21 42 6f 6f  74 22 2c 62 61 73 65 25  |$+".!Boot",base%|
000011a0  2c 30 2c a4 65 78 69 73  74 73 28 64 69 72 24 2b  |,0,.exists(dir$+|
000011b0  22 2e 21 53 70 72 69 74  65 73 22 2c 26 46 46 39  |".!Sprites",&FF9|
000011c0  29 29 20 8c 0d 04 ba 3b  20 20 20 20 20 20 f2 70  |)) ....;      .p|
000011d0  75 74 64 61 74 61 28 73  74 61 74 75 73 25 2c 22  |utdata(status%,"|
000011e0  4e 65 77 20 69 6e 6e 6f  63 75 6c 61 74 65 64 20  |New innoculated |
000011f0  21 42 6f 6f 74 20 63 72  65 61 74 65 64 22 29 0d  |!Boot created").|
00001200  04 c4 08 20 20 20 cd 0d  04 ce 05 cd 0d 04 d8 05  |...   ..........|
00001210  e1 0d 04 e2 04 0d 04 ec  19 dd f2 63 68 65 63 6b  |...........check|
00001220  62 6f 6f 74 28 6e 61 6d  65 24 2c 6c 25 29 0d 04  |boot(name$,l%)..|
00001230  f6 0e ea 20 64 6f 69 6e  6e 6f 63 25 0d 05 00 14  |... doinnoc%....|
00001240  e7 20 6c 25 3e 3d 6d 61  78 62 6f 6f 74 25 20 8c  |. l%>=maxboot% .|
00001250  0d 05 0a 19 20 20 20 73  74 69 6c 6c 25 3d b9 3a  |....   still%=.:|
00001260  69 6e 66 65 63 74 25 3d  b9 0d 05 14 36 20 20 20  |infect%=....6   |
00001270  f2 70 75 74 64 61 74 61  28 73 74 61 74 75 73 25  |.putdata(status%|
00001280  2c 22 21 42 6f 6f 74 20  74 6f 6f 20 62 69 67 20  |,"!Boot too big |
00001290  2d 20 6e 6f 74 20 73 63  61 6e 6e 65 64 22 29 0d  |- not scanned").|
000012a0  05 1e 08 20 20 20 e1 0d  05 28 05 cd 0d 05 32 13  |...   ...(....2.|
000012b0  64 6f 69 6e 6e 6f 63 25  3d 69 6e 6e 6f 63 25 0d  |doinnoc%=innoc%.|
000012c0  05 3c 2a c8 99 20 22 58  4f 53 5f 43 4c 49 22 2c  |.<*.. "XOS_CLI",|
000012d0  22 4c 6f 61 64 20 22 2b  6e 61 6d 65 24 2b 22 20  |"Load "+name$+" |
000012e0  22 2b c3 7e 62 75 66 66  25 0d 05 46 15 c8 8e 20  |"+.~buff%..F... |
000012f0  62 75 66 66 25 3f 28 6c  25 2d 31 29 20 ca 0d 05  |buff%?(l%-1) ...|
00001300  50 1b c9 20 26 46 46 3a  c8 8e 20 62 75 66 66 25  |P.. &FF:.. buff%|
00001310  3f 28 6c 25 2d 34 29 20  ca 0d 05 5a 2c 20 20 20  |?(l%-4) ...Z,   |
00001320  20 20 20 20 20 20 c9 20  31 33 3a f2 65 78 74 65  |      . 13:.exte|
00001330  6e 64 76 69 72 75 73 28  22 69 6e 20 21 42 6f 6f  |ndvirus("in !Boo|
00001340  74 22 2c 30 29 0d 05 64  20 20 20 20 20 20 20 20  |t",0)..d        |
00001350  20 20 20 20 20 20 20 20  20 20 f2 64 69 73 6b 69  |          .diski|
00001360  6e 66 65 63 74 0d 05 6e  27 20 20 20 20 20 20 20  |nfect..n'       |
00001370  20 20 20 20 20 20 20 20  20 20 6c 25 3d 6c 25 2d  |          l%=l%-|
00001380  34 3a 64 6f 69 6e 6e 6f  63 25 3d b9 0d 05 78 2f  |4:doinnoc%=...x/|
00001390  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000013a0  20 c8 95 20 6c 25 3e 30  20 80 20 62 75 66 66 25  | .. l%>0 . buff%|
000013b0  3f 28 6c 25 2d 31 29 3c  3e 26 44 0d 05 82 1f 20  |?(l%-1)<>&D.... |
000013c0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000013d0  20 20 20 6c 25 3d 6c 25  2d 31 0d 05 8c 16 20 20  |   l%=l%-1....  |
000013e0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 ce  |               .|
000013f0  0d 05 96 24 20 20 20 20  20 20 20 20 20 20 20 20  |...$            |
00001400  20 20 20 20 20 62 75 66  66 25 3f 28 6c 25 2d 31  |     buff%?(l%-1|
00001410  29 3d 26 41 0d 05 a0 1c  20 20 20 20 20 20 20 20  |)=&A....        |
00001420  20 c9 20 31 30 3a 64 6f  69 6e 6e 6f 63 25 3d a3  | . 10:doinnoc%=.|
00001430  0d 05 aa 42 20 20 20 20  20 20 20 20 20 20 20 20  |...B            |
00001440  20 20 20 20 20 f2 70 75  74 64 61 74 61 28 73 74  |     .putdata(st|
00001450  61 74 75 73 25 2c 22 21  42 6f 6f 74 20 61 6c 72  |atus%,"!Boot alr|
00001460  65 61 64 79 20 69 6e 6e  6f 63 75 6c 61 74 65 64  |eady innoculated|
00001470  22 29 0d 05 b4 19 20 20  20 20 20 20 20 20 20 7f  |")....         .|
00001480  20 64 6f 69 6e 6e 6f 63  25 3d a3 0d 05 be 0e 20  | doinnoc%=..... |
00001490  20 20 20 20 20 20 20 20  cb 0d 05 c8 1d c9 20 26  |        ...... &|
000014a0  30 41 3a f4 20 4e 6f 72  6d 61 6c 20 74 65 72 6d  |0A:. Normal term|
000014b0  69 6e 61 74 6f 72 0d 05  d2 27 7f 20 62 75 66 66  |inator...'. buff|
000014c0  25 3f 6c 25 3d 26 41 3a  6c 25 2b 3d 31 3a f4 20  |%?l%=&A:l%+=1:. |
000014d0  41 64 64 20 4c 46 20 6f  6e 20 65 6e 64 0d 05 dc  |Add LF on end...|
000014e0  05 cb 0d 05 e6 10 e7 20  64 6f 69 6e 6e 6f 63 25  |....... doinnoc%|
000014f0  20 8c 0d 05 f0 21 20 20  20 e7 20 6c 25 2b 70 72  | ....!   . l%+pr|
00001500  6f 74 6c 65 6e 25 2b 31  3e 6d 61 78 62 6f 6f 74  |otlen%+1>maxboot|
00001510  25 20 8c 0d 05 fa 1c 20  20 20 20 20 20 73 74 69  |% .....      sti|
00001520  6c 6c 25 3d b9 3a 69 6e  66 65 63 74 25 3d b9 0d  |ll%=.:infect%=..|
00001530  06 04 3d 20 20 20 20 20  20 f2 70 75 74 64 61 74  |..=      .putdat|
00001540  61 28 73 74 61 74 75 73  25 2c 22 21 42 6f 6f 74  |a(status%,"!Boot|
00001550  20 74 6f 6f 20 62 69 67  20 2d 20 6e 6f 74 20 69  | too big - not i|
00001560  6e 6e 6f 63 75 6c 61 74  65 64 22 29 0d 06 0e 0b  |nnoculated")....|
00001570  20 20 20 20 20 20 e1 0d  06 18 08 20 20 20 cd 0d  |      .....   ..|
00001580  06 22 27 20 20 20 e7 20  a4 69 6e 6e 6f 63 62 6f  |."'   . .innocbo|
00001590  6f 74 28 6e 61 6d 65 24  2c 62 75 66 66 25 2c 6c  |ot(name$,buff%,l|
000015a0  25 2c a3 29 20 8c 0d 06  2c 3c 20 20 20 20 20 20  |%,.) ...,<      |
000015b0  f2 70 75 74 64 61 74 61  28 73 74 61 74 75 73 25  |.putdata(status%|
000015c0  2c 22 21 42 6f 6f 74 20  68 61 73 20 6e 6f 77 20  |,"!Boot has now |
000015d0  62 65 65 6e 20 69 6e 6e  6f 63 75 6c 61 74 65 64  |been innoculated|
000015e0  22 29 0d 06 36 08 20 20  20 cd 0d 06 40 05 cd 0d  |")..6.   ...@...|
000015f0  06 4a 05 e1 0d 06 54 04  0d 06 5e 24 dd a4 69 6e  |.J....T...^$..in|
00001600  6e 6f 63 62 6f 6f 74 28  6e 24 2c 61 25 2c 6c 65  |nocboot(n$,a%,le|
00001610  6e 25 2c 61 64 64 69 63  6f 6e 25 29 0d 06 68 13  |n%,addicon%)..h.|
00001620  ea 20 67 6f 6f 64 25 3a  67 6f 6f 64 25 3d a3 0d  |. good%:good%=..|
00001630  06 72 10 e7 20 61 64 64  69 63 6f 6e 25 20 8c 0d  |.r.. addicon% ..|
00001640  06 7c 16 20 20 24 28 61  25 2b 6c 65 6e 25 29 3d  |.|.  $(a%+len%)=|
00001650  69 63 6f 6e 24 0d 06 86  14 20 20 6c 65 6e 25 2b  |icon$....  len%+|
00001660  3d 69 63 6f 6e 6c 65 6e  25 0d 06 90 05 cd 0d 06  |=iconlen%.......|
00001670  9a 17 24 28 61 25 2b 6c  65 6e 25 29 3d 70 72 6f  |..$(a%+len%)=pro|
00001680  74 65 63 74 24 0d 06 a4  37 e7 20 a4 6f 73 63 6c  |tect$...7. .oscl|
00001690  69 28 22 53 61 76 65 22  2c 6e 24 2c c3 7e 61 25  |i("Save",n$,.~a%|
000016a0  2b 22 20 22 2b c3 7e 28  61 25 2b 6c 65 6e 25 2b  |+" "+.~(a%+len%+|
000016b0  70 72 6f 74 6c 65 6e 25  29 29 20 8c 0d 06 ae 26  |protlen%)) ....&|
000016c0  20 20 20 e7 20 a4 6f 73  63 6c 69 28 22 53 65 74  |   . .oscli("Set|
000016d0  54 79 70 65 22 2c 6e 24  2c 22 4f 62 65 79 22 29  |Type",n$,"Obey")|
000016e0  20 8c 0d 06 b8 38 20 20  20 20 20 20 6e 75 6d 69  | ....8      numi|
000016f0  6e 6e 6f 63 25 2b 3d 31  3a 67 6f 6f 64 25 3d b9  |nnoc%+=1:good%=.|
00001700  3a f2 70 75 74 64 61 74  61 28 32 31 2c c3 28 6e  |:.putdata(21,.(n|
00001710  75 6d 69 6e 6e 6f 63 25  29 29 0d 06 c2 08 20 20  |uminnoc%))....  |
00001720  20 cd 0d 06 cc 05 cd 0d  06 d6 0a 3d 67 6f 6f 64  | ..........=good|
00001730  25 0d 06 e0 04 0d 06 ea  1e dd f2 65 78 74 65 6e  |%..........exten|
00001740  64 76 69 72 75 73 28 6d  65 73 73 24 2c 61 64 64  |dvirus(mess$,add|
00001750  72 25 29 0d 06 f4 08 ea  20 74 25 0d 06 fe 3f e7  |r%)..... t%...?.|
00001760  20 61 64 64 72 25 3a f2  70 75 74 64 61 74 61 28  | addr%:.putdata(|
00001770  64 69 72 73 63 61 6e 25  2c 22 45 78 65 63 75 74  |dirscan%,"Execut|
00001780  69 6f 6e 20 43 6f 75 6e  74 3a 20 22 2b c3 28 61  |ion Count: "+.(a|
00001790  64 64 72 25 21 26 33 34  29 29 0d 07 08 36 f2 70  |ddr%!&34))...6.p|
000017a0  75 74 64 61 74 61 28 73  74 61 74 75 73 25 2c 22  |utdata(status%,"|
000017b0  45 78 74 65 6e 64 20 56  69 72 75 73 20 22 2b 6d  |Extend Virus "+m|
000017c0  65 73 73 24 2b 22 20 66  6f 75 6e 64 20 21 22 29  |ess$+" found !")|
000017d0  0d 07 12 19 69 6e 66 65  63 74 25 3d b9 3a f2 6f  |....infect%=.:.o|
000017e0  70 65 6e 77 69 6e 64 6f  77 0d 07 1c 23 74 25 3d  |penwindow...#t%=|
000017f0  91 2b 32 30 30 3a f4 20  44 65 6c 61 79 20 74 6f  |.+200:. Delay to|
00001800  20 73 65 65 20 6d 65 73  73 61 67 65 0d 07 26 05  | see message..&.|
00001810  f5 0d 07 30 11 20 20 20  f2 77 69 6d 70 5f 70 6f  |...0.   .wimp_po|
00001820  6c 6c 0d 07 3a 12 fd 20  91 3e 74 25 20 84 20 71  |ll..:.. .>t% . q|
00001830  75 69 74 25 0d 07 44 05  e1 0d 07 4e 04 0d 07 58  |uit%..D....N...X|
00001840  13 dd f2 64 65 6c 6d 6f  64 75 6c 65 28 6d 24 29  |...delmodule(m$)|
00001850  0d 07 62 0f f2 64 69 73  6b 69 6e 66 65 63 74 0d  |..b..diskinfect.|
00001860  07 6c 1e e7 20 a4 6f 73  63 6c 69 28 22 44 65 6c  |.l.. .oscli("Del|
00001870  65 74 65 22 2c 6d 24 2c  22 22 29 20 8c 0d 07 76  |ete",m$,"") ...v|
00001880  36 20 20 20 f2 70 75 74  64 61 74 61 28 73 74 61  |6   .putdata(sta|
00001890  74 75 73 25 2c 22 45 78  74 65 6e 64 20 56 69 72  |tus%,"Extend Vir|
000018a0  75 73 20 6d 6f 64 75 6c  65 20 64 65 6c 65 74 65  |us module delete|
000018b0  64 22 29 0d 07 80 05 cd  0d 07 8a 05 e1 0d 07 94  |d").............|
000018c0  04 0d 07 9e 10 dd f2 64  69 73 6b 69 6e 66 65 63  |.......diskinfec|
000018d0  74 0d 07 a8 28 6e 75 6d  64 69 73 6b 25 2b 3d 31  |t...(numdisk%+=1|
000018e0  3a f2 70 75 74 64 61 74  61 28 32 30 2c c3 28 6e  |:.putdata(20,.(n|
000018f0  75 6d 64 69 73 6b 25 29  29 0d 07 b2 05 e1 0d 07  |umdisk%)).......|
00001900  bc 04 0d 07 c6 15 dd a4  6f 73 63 6c 69 28 6c 24  |........oscli(l$|
00001910  2c 6d 24 2c 72 24 29 0d  07 d0 1b ea 20 66 6c 61  |,m$,r$)..... fla|
00001920  67 73 25 2c 61 67 61 69  6e 25 2c 65 72 72 62 6c  |gs%,again%,errbl|
00001930  6b 25 0d 07 da 05 f5 0d  07 e4 16 20 20 20 e7 20  |k%.........   . |
00001940  6c 24 3d 22 52 4d 4b 69  6c 6c 22 20 8c 0d 07 ee  |l$="RMKill" ....|
00001950  4f 20 20 20 20 20 20 c8  99 20 22 58 57 69 6d 70  |O      .. "XWimp|
00001960  5f 53 74 61 72 74 54 61  73 6b 22 2c 6c 24 2b 22  |_StartTask",l$+"|
00001970  20 22 2b 6d 24 2b 22 20  22 2b 72 24 2b 22 20 7b  | "+m$+" "+r$+" {|
00001980  20 3e 20 6e 75 6c 6c 3a  20 7d 22 20 b8 20 65 72  | > null: }" . er|
00001990  72 62 6c 6b 25 3b 66 6c  61 67 73 25 0d 07 f8 08  |rblk%;flags%....|
000019a0  20 20 20 cc 0d 08 02 47  20 20 20 20 20 20 c8 99  |   ....G      ..|
000019b0  20 22 58 4f 53 5f 43 4c  49 22 2c 6c 24 2b 22 20  | "XOS_CLI",l$+" |
000019c0  22 2b 6d 24 2b 22 20 22  2b 72 24 2b 22 20 7b 20  |"+m$+" "+r$+" { |
000019d0  3e 20 6e 75 6c 6c 3a 20  7d 22 20 b8 20 65 72 72  |> null: }" . err|
000019e0  62 6c 6b 25 3b 66 6c 61  67 73 25 0d 08 0c 08 20  |blk%;flags%.... |
000019f0  20 20 cd 0d 08 16 0f 20  20 20 61 67 61 69 6e 25  |  .....   again%|
00001a00  3d a3 0d 08 20 15 20 20  20 e7 20 66 6c 61 67 73  |=... .   . flags|
00001a10  25 20 80 20 31 20 8c 0d  08 2a 17 20 20 20 20 20  |% . 1 ...*.     |
00001a20  20 c8 8e 20 21 65 72 72  62 6c 6b 25 20 ca 0d 08  | .. !errblk% ...|
00001a30  34 13 20 20 20 20 20 20  c9 20 26 31 30 38 43 39  |4.      . &108C9|
00001a40  3a 0d 08 3e 4f 20 20 20  20 20 20 20 20 20 61 67  |:..>O         ag|
00001a50  61 69 6e 25 3d a4 79 65  73 6e 6f 28 22 20 20 20  |ain%=.yesno("   |
00001a60  20 57 72 69 74 65 2d 70  72 6f 74 65 63 74 65 64  | Write-protected|
00001a70  20 64 69 73 6b 20 21 20  20 20 20 20 52 65 74 72  | disk !     Retr|
00001a80  79 20 64 69 73 6b 20 77  72 69 74 65 20 3f 22 29  |y disk write ?")|
00001a90  0d 08 48 32 20 20 20 20  20 20 c9 20 26 31 30 38  |..H2      . &108|
00001aa0  43 33 3a 61 67 61 69 6e  25 3d a4 6f 73 63 6c 69  |C3:again%=.oscli|
00001ab0  28 22 41 63 63 65 73 73  22 2c 6d 24 2c 22 57 52  |("Access",m$,"WR|
00001ac0  22 29 0d 08 52 0b 20 20  20 20 20 20 7f 0d 08 5c  |")..R.      ...\|
00001ad0  20 20 20 20 20 20 20 20  20 20 e7 20 21 65 72 72  |          . !err|
00001ae0  62 6c 6b 25 3e 26 31 30  30 30 30 20 8c 0d 08 66  |blk%>&10000 ...f|
00001af0  3f 20 20 20 20 20 20 20  20 20 20 20 20 f2 70 75  |?            .pu|
00001b00  74 64 61 74 61 28 73 74  61 74 75 73 25 2c 22 43  |tdata(status%,"C|
00001b10  6f 75 6c 64 6e 27 74 20  70 65 72 66 6f 72 6d 20  |ouldn't perform |
00001b20  64 69 73 6b 20 77 72 69  74 65 22 29 0d 08 70 0e  |disk write")..p.|
00001b30  20 20 20 20 20 20 20 20  20 cc 0d 08 7a 41 20 20  |         ...zA  |
00001b40  20 20 20 20 20 20 20 20  20 20 f2 70 75 74 64 61  |          .putda|
00001b50  74 61 28 73 74 61 74 75  73 25 2c 22 43 6f 75 6c  |ta(status%,"Coul|
00001b60  64 6e 27 74 20 64 65 6c  65 74 65 20 45 78 74 65  |dn't delete Exte|
00001b70  6e 64 20 6d 6f 64 75 6c  65 22 29 0d 08 84 0e 20  |nd module").... |
00001b80  20 20 20 20 20 20 20 20  cd 0d 08 8e 0b 20 20 20  |        .....   |
00001b90  20 20 20 cb 0d 08 98 1d  20 20 20 20 20 20 e7 20  |   .....      . |
00001ba0  61 67 61 69 6e 25 3d a3  3a 73 74 69 6c 6c 25 3d  |again%=.:still%=|
00001bb0  b9 0d 08 a2 08 20 20 20  cd 0d 08 ac 0e fd 20 61  |.....   ...... a|
00001bc0  67 61 69 6e 25 3d a3 0d  08 b6 15 3d 28 28 66 6c  |gain%=.....=((fl|
00001bd0  61 67 73 25 20 80 20 31  29 3d 30 29 0d 08 c0 04  |ags% . 1)=0)....|
00001be0  0d 08 ca 1c dd a4 77 69  6d 70 65 72 72 6f 72 28  |......wimperror(|
00001bf0  6d 65 73 73 24 2c 6d 61  73 6b 25 29 0d 08 d4 0c  |mess$,mask%)....|
00001c00  ea 20 63 6c 69 63 6b 25  0d 08 de 52 c8 99 20 22  |. click%...R.. "|
00001c10  58 57 69 6d 70 5f 52 65  70 6f 72 74 45 72 72 6f  |XWimp_ReportErro|
00001c20  72 22 2c c4 34 2c 62 6c  24 29 2b 6d 65 73 73 24  |r",.4,bl$)+mess$|
00001c30  2b 62 6c 24 2c 6d 61 73  6b 25 2c 22 56 4b 69 6c  |+bl$,mask%,"VKil|
00001c40  6c 65 72 20 57 61 72 6e  69 6e 67 22 2b 62 6c 24  |ler Warning"+bl$|
00001c50  20 b8 20 2c 63 6c 69 63  6b 25 0d 08 e8 0b 3d 63  | . ,click%....=c|
00001c60  6c 69 63 6b 25 0d 08 f2  04 0d 08 fc 2f dd a4 79  |lick%......./..y|
00001c70  65 73 6e 6f 28 6d 65 73  73 24 29 3d 28 a4 77 69  |esno(mess$)=(.wi|
00001c80  6d 70 65 72 72 6f 72 28  6d 65 73 73 24 2c 25 31  |mperror(mess$,%1|
00001c90  30 30 31 31 29 3d 31 29  0d 09 06 04 0d 09 10 11  |0011)=1)........|
00001ca0  dd f2 77 61 72 6e 28 6d  65 73 73 24 29 0d 09 1a  |..warn(mess$)...|
00001cb0  0c ea 20 63 6c 69 63 6b  25 0d 09 24 23 63 6c 69  |.. click%..$#cli|
00001cc0  63 6b 25 3d a4 77 69 6d  70 65 72 72 6f 72 28 6d  |ck%=.wimperror(m|
00001cd0  65 73 73 24 2c 25 31 30  30 30 31 29 0d 09 2e 05  |ess$,%10001)....|
00001ce0  e1 0d 09 38 04 0d 09 42  18 dd f2 73 63 61 6e 6d  |...8...B...scanm|
00001cf0  6f 64 75 6c 65 73 28 68  61 6e 64 25 29 0d 09 4c  |odules(hand%)..L|
00001d00  26 ea 20 6d 6f 64 75 6c  65 25 2c 73 75 62 25 2c  |&. module%,sub%,|
00001d10  73 74 61 72 74 25 2c 66  6c 61 67 73 25 2c 68 65  |start%,flags%,he|
00001d20  6c 70 25 0d 09 56 05 f5  0d 09 60 44 20 20 20 c8  |lp%..V....`D   .|
00001d30  99 20 22 58 4f 53 5f 4d  6f 64 75 6c 65 22 2c 31  |. "XOS_Module",1|
00001d40  32 2c 6d 6f 64 75 6c 65  25 2c 73 75 62 25 20 b8  |2,module%,sub% .|
00001d50  20 2c 6d 6f 64 75 6c 65  25 2c 73 75 62 25 2c 73  | ,module%,sub%,s|
00001d60  74 61 72 74 25 3b 66 6c  61 67 73 25 0d 09 6a 19  |tart%;flags%..j.|
00001d70  20 20 20 e7 20 28 66 6c  61 67 73 25 20 80 20 31  |   . (flags% . 1|
00001d80  29 3d 30 20 8c 0d 09 74  21 20 20 20 20 20 20 68  |)=0 ...t!      h|
00001d90  65 6c 70 25 3d 73 74 61  72 74 25 2b 73 74 61 72  |elp%=start%+star|
00001da0  74 25 21 26 31 34 0d 09  7e 2b 20 20 20 20 20 20  |t%!&14..~+      |
00001db0  e7 20 a4 67 65 74 73 74  72 69 6e 67 28 68 65 6c  |. .getstring(hel|
00001dc0  70 25 29 3d 65 78 74 65  6e 64 68 65 6c 70 24 20  |p%)=extendhelp$ |
00001dd0  8c 0d 09 88 21 20 20 20  20 20 20 20 20 20 6e 75  |....!         nu|
00001de0  6d 6d 65 6d 25 2b 3d 31  3a 69 6e 66 65 63 74 25  |mmem%+=1:infect%|
00001df0  3d b9 0d 09 92 24 20 20  20 20 20 20 20 20 20 f2  |=....$         .|
00001e00  70 75 74 64 61 74 61 28  31 39 2c c3 28 6e 75 6d  |putdata(19,.(num|
00001e10  6d 65 6d 25 29 29 0d 09  9c 16 20 20 20 20 20 20  |mem%))....      |
00001e20  20 20 20 e7 20 68 61 6e  64 25 20 8c 0d 09 a6 40  |   . hand% ....@|
00001e30  20 20 20 20 20 20 20 20  20 20 20 20 f4 20 54 68  |            . Th|
00001e40  69 73 20 69 73 20 61 20  62 75 67 2d 66 69 78 20  |is is a bug-fix |
00001e50  3a 2d 29 20 49 74 20 61  6c 6c 6f 77 73 20 74 68  |:-) It allows th|
00001e60  65 20 76 69 72 75 73 20  74 61 73 6b 0d 09 b0 48  |e virus task...H|
00001e70  20 20 20 20 20 20 20 20  20 20 20 20 f4 20 74 6f  |            . to|
00001e80  20 73 68 75 74 64 6f 77  6e 20 70 72 6f 70 65 72  | shutdown proper|
00001e90  6c 79 20 77 69 74 68 6f  75 74 20 63 72 61 73 68  |ly without crash|
00001ea0  69 6e 67 20 74 68 65 20  54 61 73 6b 20 4d 61 6e  |ing the Task Man|
00001eb0  61 67 65 72 0d 09 ba 33  20 20 20 20 20 20 20 20  |ager...3        |
00001ec0  20 20 20 20 73 74 61 72  74 25 21 26 34 30 3d 68  |    start%!&40=h|
00001ed0  61 6e 64 25 3a f4 20 53  61 76 65 20 74 61 73 6b  |and%:. Save task|
00001ee0  20 68 61 6e 64 6c 65 0d  09 c4 1d 20 20 20 20 20  | handle....     |
00001ef0  20 20 20 20 20 20 20 50  25 3d 73 74 61 72 74 25  |       P%=start%|
00001f00  2b 26 37 30 0d 09 ce 16  20 20 20 20 20 20 20 20  |+&70....        |
00001f10  20 20 20 20 5b 4f 50 54  20 30 0d 09 d8 3e 20 20  |    [OPT 0...>  |
00001f20  20 20 20 20 20 20 20 20  20 20 4c 44 52 20 52 32  |          LDR R2|
00001f30  2c 73 74 61 72 74 25 2b  26 36 34 3a 43 4d 50 20  |,start%+&64:CMP |
00001f40  52 32 2c 23 31 3a 53 57  49 47 54 20 22 58 4f 53  |R2,#1:SWIGT "XOS|
00001f50  5f 4d 6f 64 75 6c 65 22  0d 09 e2 33 20 20 20 20  |_Module"...3    |
00001f60  20 20 20 20 20 20 20 20  4c 44 52 20 52 30 2c 73  |        LDR R0,s|
00001f70  74 61 72 74 25 2b 26 34  30 3a 4c 44 52 20 52 31  |tart%+&40:LDR R1|
00001f80  2c 73 74 61 72 74 25 2b  26 35 34 0d 09 ec 11 20  |,start%+&54.... |
00001f90  20 20 20 20 20 20 20 20  20 20 20 5d 0d 09 f6 0e  |           ]....|
00001fa0  20 20 20 20 20 20 20 20  20 cc 0d 0a 00 45 20 20  |         ....E  |
00001fb0  20 20 20 20 20 20 20 20  20 20 f2 77 61 72 6e 28  |          .warn(|
00001fc0  22 54 61 73 6b 20 4d 61  6e 61 67 65 72 20 69 73  |"Task Manager is|
00001fd0  20 75 6e 73 74 61 62 6c  65 20 21 20 20 20 20 20  | unstable !     |
00001fe0  44 6f 20 6e 6f 74 20 75  73 65 20 69 74 22 29 0d  |Do not use it").|
00001ff0  0a 0a 0e 20 20 20 20 20  20 20 20 20 cd 0d 0a 14  |...         ....|
00002000  2a 20 20 20 20 20 20 20  20 20 f2 65 78 74 65 6e  |*         .exten|
00002010  64 76 69 72 75 73 28 22  69 6e 20 52 4d 41 22 2c  |dvirus("in RMA",|
00002020  73 74 61 72 74 25 29 0d  0a 1e 2d 20 20 20 20 20  |start%)...-     |
00002030  20 20 20 20 e7 20 a4 6f  73 63 6c 69 28 22 52 4d  |    . .oscli("RM|
00002040  4b 69 6c 6c 22 2c 22 45  78 74 65 6e 64 22 2c 22  |Kill","Extend","|
00002050  22 29 20 8c 0d 0a 28 41  20 20 20 20 20 20 20 20  |") ...(A        |
00002060  20 20 20 20 20 f2 70 75  74 64 61 74 61 28 73 74  |     .putdata(st|
00002070  61 74 75 73 25 2c 22 45  78 74 65 6e 64 20 56 69  |atus%,"Extend Vi|
00002080  72 75 73 20 6b 69 6c 6c  65 64 20 66 72 6f 6d 20  |rus killed from |
00002090  52 4d 41 22 29 0d 0a 32  0e 20 20 20 20 20 20 20  |RMA")..2.       |
000020a0  20 20 cc 0d 0a 3c 19 20  20 20 20 20 20 20 20 20  |  ...<.         |
000020b0  20 20 20 20 73 74 69 6c  6c 25 3d b9 0d 0a 46 0e  |    still%=...F.|
000020c0  20 20 20 20 20 20 20 20  20 cd 0d 0a 50 0b 20 20  |         ...P.  |
000020d0  20 20 20 20 cd 0d 0a 5a  08 20 20 20 cd 0d 0a 64  |    ...Z.   ...d|
000020e0  10 fd 20 66 6c 61 67 73  25 20 80 20 31 0d 0a 6e  |.. flags% . 1..n|
000020f0  05 e1 0d 0a 78 04 0d 0a  82 19 dd a4 65 78 69 73  |....x.......exis|
00002100  74 73 28 66 69 6c 65 24  2c 74 79 70 65 25 29 0d  |ts(file$,type%).|
00002110  0a 8c 13 ea 20 66 6f 75  6e 64 25 2c 66 74 79 70  |.... found%,ftyp|
00002120  65 25 0d 0a 96 2a c8 99  20 22 58 4f 53 5f 46 69  |e%...*.. "XOS_Fi|
00002130  6c 65 22 2c 35 2c 66 69  6c 65 24 20 b8 20 66 6f  |le",5,file$ . fo|
00002140  75 6e 64 25 2c 2c 66 74  79 70 65 25 0d 0a a0 1e  |und%,,ftype%....|
00002150  66 74 79 70 65 25 3d 28  66 74 79 70 65 25 3e 3e  |ftype%=(ftype%>>|
00002160  3e 38 29 20 80 20 26 46  46 46 0d 0a aa 1e 3d 28  |>8) . &FFF....=(|
00002170  66 6f 75 6e 64 25 3d 31  20 80 20 74 79 70 65 25  |found%=1 . type%|
00002180  3d 66 74 79 70 65 25 29  0d 0a b4 04 0d 0a be 0f  |=ftype%)........|
00002190  dd a4 6c 6f 77 65 72 28  73 24 29 0d 0a c8 17 ea  |..lower(s$).....|
000021a0  20 6c 6f 6f 70 25 2c 6e  24 2c 63 24 3a 6e 24 3d  | loop%,n$,c$:n$=|
000021b0  22 22 0d 0a d2 15 e3 20  6c 6f 6f 70 25 3d 31 20  |""..... loop%=1 |
000021c0  b8 20 a9 28 73 24 29 0d  0a dc 16 20 20 20 63 24  |. .(s$)....   c$|
000021d0  3d c1 73 24 2c 6c 6f 6f  70 25 2c 31 29 0d 0a e6  |=.s$,loop%,1)...|
000021e0  1c 20 20 20 e7 20 63 24  3e 3d 22 41 22 20 80 20  |.   . c$>="A" . |
000021f0  63 24 3c 3d 22 5a 22 20  8c 0d 0a f0 1b 20 20 20  |c$<="Z" .....   |
00002200  20 20 20 6e 24 3d 6e 24  2b bd 28 97 28 63 24 29  |   n$=n$+.(.(c$)|
00002210  2b 33 32 29 0d 0a fa 08  20 20 20 cc 0d 0b 04 12  |+32)....   .....|
00002220  20 20 20 20 20 20 6e 24  3d 6e 24 2b 63 24 0d 0b  |      n$=n$+c$..|
00002230  0e 08 20 20 20 cd 0d 0b  18 05 ed 0d 0b 22 07 3d  |..   ........".=|
00002240  6e 24 0d 0b 2c 04 0d 0b  36 18 dd a4 67 65 74 73  |n$..,...6...gets|
00002250  74 72 69 6e 67 28 f8 20  61 64 64 72 25 29 0d 0b  |tring(. addr%)..|
00002260  40 0e ea 20 73 24 3a 73  24 3d 22 22 0d 0b 4a 2b  |@.. s$:s$=""..J+|
00002270  c8 95 20 3f 61 64 64 72  25 3c 3e 30 3a 73 24 3d  |.. ?addr%<>0:s$=|
00002280  73 24 2b bd 28 3f 61 64  64 72 25 29 3a 61 64 64  |s$+.(?addr%):add|
00002290  72 25 2b 3d 31 3a ce 0d  0b 54 07 3d 73 24 0d 0b  |r%+=1:...T.=s$..|
000022a0  5e 04 0d 0b 68 0f dd f2  77 69 6d 70 5f 70 6f 6c  |^...h...wimp_pol|
000022b0  6c 0d 0b 72 0d ea 20 72  65 61 73 6f 6e 25 0d 0b  |l..r.. reason%..|
000022c0  7c 25 c8 99 20 22 58 57  69 6d 70 5f 50 6f 6c 6c  ||%.. "XWimp_Poll|
000022d0  22 2c 30 2c 70 6f 6c 6c  25 20 b8 20 72 65 61 73  |",0,poll% . reas|
000022e0  6f 6e 25 0d 0b 86 10 c8  8e 20 72 65 61 73 6f 6e  |on%...... reason|
000022f0  25 20 ca 0d 0b 90 37 c9  20 32 3a c8 99 20 22 58  |% ....7. 2:.. "X|
00002300  57 69 6d 70 5f 4f 70 65  6e 57 69 6e 64 6f 77 22  |Wimp_OpenWindow"|
00002310  2c 2c 70 6f 6c 6c 25 3a  f4 20 49 6e 66 6f 20 77  |,,poll%:. Info w|
00002320  69 6e 64 6f 77 20 64 72  61 67 0d 0b 9a 14 c9 20  |indow drag..... |
00002330  33 3a f2 63 6c 6f 73 65  77 69 6e 64 6f 77 0d 0b  |3:.closewindow..|
00002340  a4 13 c9 20 36 3a f2 6d  6f 75 73 65 63 6c 69 63  |... 6:.mouseclic|
00002350  6b 0d 0b ae 13 c9 20 39  3a f2 6d 65 6e 75 73 65  |k..... 9:.menuse|
00002360  6c 65 63 74 0d 0b b8 18  c9 20 31 37 2c 31 38 3a  |lect..... 17,18:|
00002370  f2 77 69 6d 70 6d 65 73  73 61 67 65 0d 0b c2 05  |.wimpmessage....|
00002380  cb 0d 0b cc 05 e1 0d 0b  d6 04 0d 0b e0 11 dd f2  |................|
00002390  63 6c 6f 73 65 77 69 6e  64 6f 77 0d 0b ea 37 c8  |closewindow...7.|
000023a0  99 20 22 58 57 69 6d 70  5f 43 6c 6f 73 65 57 69  |. "XWimp_CloseWi|
000023b0  6e 64 6f 77 22 2c 2c 76  6b 69 6c 6c 77 69 6e 64  |ndow",,vkillwind|
000023c0  25 3a f4 20 45 76 61 6c  20 63 6c 6f 73 65 20 62  |%:. Eval close b|
000023d0  6f 78 0d 0b f4 05 e1 0d  0b fe 04 0d 0c 08 10 dd  |ox..............|
000023e0  f2 6d 6f 75 73 65 63 6c  69 63 6b 0d 0c 12 10 c8  |.mouseclick.....|
000023f0  8e 20 70 6f 6c 6c 25 21  38 20 ca 0d 0c 1c 15 20  |. poll%!8 ..... |
00002400  20 20 c9 20 31 2c 34 3a  f2 73 74 61 72 74 75 70  |  . 1,4:.startup|
00002410  0d 0c 26 19 20 20 20 c9  20 20 20 32 3a f2 73 68  |..&.   .   2:.sh|
00002420  6f 77 6e 65 77 6d 65 6e  75 0d 0c 30 05 cb 0d 0c  |ownewmenu..0....|
00002430  3a 05 e1 0d 0c 44 04 0d  0c 4e 11 dd f2 73 68 6f  |:....D...N...sho|
00002440  77 6e 65 77 6d 65 6e 75  0d 0c 58 08 ea 20 79 25  |wnewmenu..X.. y%|
00002450  0d 0c 62 3a e7 20 70 6f  6c 6c 25 21 31 32 3d 2d  |..b:. poll%!12=-|
00002460  32 3a 79 25 3d 39 36 2b  21 73 70 61 63 69 6e 67  |2:y%=96+!spacing|
00002470  2a 6e 75 6d 69 74 65 6d  73 25 20 8b 20 79 25 3d  |*numitems% . y%=|
00002480  70 6f 6c 6c 25 21 34 2b  31 36 0d 0c 6c 1c 6f 6c  |poll%!4+16..l.ol|
00002490  64 78 25 3d 21 70 6f 6c  6c 25 2d 36 34 3a 6f 6c  |dx%=!poll%-64:ol|
000024a0  64 79 25 3d 79 25 0d 0c  76 10 f2 73 68 6f 77 6f  |dy%=y%..v..showo|
000024b0  6c 64 6d 65 6e 75 0d 0c  80 05 e1 0d 0c 8a 04 0d  |ldmenu..........|
000024c0  0c 94 11 dd f2 73 68 6f  77 6f 6c 64 6d 65 6e 75  |.....showoldmenu|
000024d0  0d 0c 9e 2c c8 99 20 22  58 57 69 6d 70 5f 43 72  |...,.. "XWimp_Cr|
000024e0  65 61 74 65 4d 65 6e 75  22 2c 2c 6d 65 6e 75 25  |eateMenu",,menu%|
000024f0  2c 6f 6c 64 78 25 2c 6f  6c 64 79 25 0d 0c a8 05  |,oldx%,oldy%....|
00002500  e1 0d 0c b2 04 0d 0c bc  10 dd f2 6f 70 65 6e 77  |...........openw|
00002510  69 6e 64 6f 77 0d 0c c6  33 76 6b 69 6c 6c 77 69  |indow...3vkillwi|
00002520  6e 64 25 21 32 38 3d 2d  31 3a f4 20 4f 70 65 6e  |nd%!28=-1:. Open|
00002530  20 6f 6e 20 74 6f 70 20  6f 66 20 65 76 65 72 79  | on top of every|
00002540  6f 6e 65 20 65 6c 73 65  0d 0c d0 25 c8 99 20 22  |one else...%.. "|
00002550  58 57 69 6d 70 5f 4f 70  65 6e 57 69 6e 64 6f 77  |XWimp_OpenWindow|
00002560  22 2c 2c 76 6b 69 6c 6c  77 69 6e 64 25 0d 0c da  |",,vkillwind%...|
00002570  05 e1 0d 0c e4 04 0d 0c  ee 0d dd f2 73 74 61 72  |............star|
00002580  74 75 70 0d 0c f8 11 c8  8e 20 70 6f 6c 6c 25 21  |tup...... poll%!|
00002590  31 32 20 ca 0d 0d 02 17  20 20 20 c9 20 2d 32 3a  |12 .....   . -2:|
000025a0  f2 6f 70 65 6e 77 69 6e  64 6f 77 0d 0d 0c 14 20  |.openwindow.... |
000025b0  20 20 c9 20 76 6b 69 6c  6c 68 61 6e 64 25 3a 0d  |  . vkillhand%:.|
000025c0  0d 16 17 20 20 20 20 20  20 c8 8e 20 70 6f 6c 6c  |...      .. poll|
000025d0  25 21 31 36 20 ca 0d 0d  20 3a 20 20 20 20 20 20  |%!16 ... :      |
000025e0  c9 20 37 3a e7 20 73 63  61 6e 6e 69 6e 67 25 3d  |. 7:. scanning%=|
000025f0  a3 3a f2 6e 65 78 74 66  73 3a f4 20 46 69 6c 69  |.:.nextfs:. Fili|
00002600  6e 67 20 73 79 73 74 65  6d 20 63 68 61 6e 67 65  |ng system change|
00002610  0d 0d 2a 50 20 20 20 20  20 20 c9 20 38 2c 39 2c  |..*P      . 8,9,|
00002620  31 30 2c 31 31 2c 31 32  2c 31 33 2c 31 34 2c 31  |10,11,12,13,14,1|
00002630  35 3a e7 20 73 63 61 6e  6e 69 6e 67 25 3d a3 3a  |5:. scanning%=.:|
00002640  64 72 69 76 65 25 3d 70  6f 6c 6c 25 21 31 36 2d  |drive%=poll%!16-|
00002650  38 3a f4 20 44 72 69 76  65 20 63 68 61 6e 67 65  |8:. Drive change|
00002660  0d 0d 34 33 20 20 20 20  20 20 c9 20 32 33 3a e7  |..43      . 23:.|
00002670  20 73 63 61 6e 6e 69 6e  67 25 3a f2 66 69 6e 69  | scanning%:.fini|
00002680  73 68 73 63 61 6e 20 8b  20 f2 73 74 61 72 74 73  |shscan . .starts|
00002690  63 61 6e 0d 0d 3e 1e 20  20 20 20 20 20 c9 20 32  |can..>.      . 2|
000026a0  34 3a 69 6e 6e 6f 63 25  3d ac 20 69 6e 6e 6f 63  |4:innoc%=. innoc|
000026b0  25 0d 0d 48 0b 20 20 20  20 20 20 cb 0d 0d 52 05  |%..H.      ...R.|
000026c0  cb 0d 0d 5c 05 e1 0d 0d  66 04 0d 0d 7a 10 dd f2  |...\....f...z...|
000026d0  6d 65 6e 75 73 65 6c 65  63 74 0d 0d 84 21 ea 20  |menuselect...!. |
000026e0  6d 6f 75 73 65 25 2c 69  74 65 6d 25 3a 69 74 65  |mouse%,item%:ite|
000026f0  6d 25 3d 21 70 6f 6c 6c  25 2b 31 0d 0d 8e 33 c8  |m%=!poll%+1...3.|
00002700  99 20 22 58 57 69 6d 70  5f 47 65 74 50 6f 69 6e  |. "XWimp_GetPoin|
00002710  74 65 72 49 6e 66 6f 22  2c 2c 70 6f 6c 6c 25 3a  |terInfo",,poll%:|
00002720  6d 6f 75 73 65 25 3d 70  6f 6c 6c 25 21 38 0d 0d  |mouse%=poll%!8..|
00002730  98 0e c8 8e 20 69 74 65  6d 25 20 ca 0d 0d a2 2d  |.... item% ....-|
00002740  20 20 20 c9 20 6e 75 6d  69 74 65 6d 73 25 3a 71  |   . numitems%:q|
00002750  75 69 74 25 3d b9 3a f4  20 4c 61 73 74 20 49 74  |uit%=.:. Last It|
00002760  65 6d 20 3d 20 51 75 69  74 0d 0d ac 05 cb 0d 0d  |em = Quit.......|
00002770  b6 1b e7 20 6d 6f 75 73  65 25 3d 31 3a f2 73 68  |... mouse%=1:.sh|
00002780  6f 77 6f 6c 64 6d 65 6e  75 0d 0d c0 05 e1 0d 0d  |owoldmenu.......|
00002790  fc 04 0d 0e 06 11 dd f2  77 69 6d 70 6d 65 73 73  |........wimpmess|
000027a0  61 67 65 0d 0e 10 11 c8  8e 20 70 6f 6c 6c 25 21  |age...... poll%!|
000027b0  31 36 20 ca 0d 0e 1a 45  20 20 20 c9 20 20 20 20  |16 ....E   .    |
000027c0  20 20 30 3a 71 75 69 74  25 3d b9 3a f4 20 53 68  |  0:quit%=.:. Sh|
000027d0  75 74 20 64 6f 77 6e 20  28 44 65 73 6b 74 6f 70  |ut down (Desktop|
000027e0  20 45 78 69 74 2c 20 54  61 73 6b 20 4d 61 6e 61  | Exit, Task Mana|
000027f0  67 65 72 20 51 75 69 74  29 0d 0e 24 19 20 20 20  |ger Quit)..$.   |
00002800  c9 20 26 34 30 30 43 32  3a f2 61 70 70 73 74 61  |. &400C2:.appsta|
00002810  72 74 0d 0e 2e 05 cb 0d  0e 38 05 e1 0d 0e 42 04  |rt.......8....B.|
00002820  0d 0e 4c 0e dd f2 61 70  70 73 74 61 72 74 0d 0e  |..L...appstart..|
00002830  56 4a f4 20 55 6e 6c 69  6b 65 2c 20 61 68 65 6d  |VJ. Unlike, ahem|
00002840  2c 20 63 65 72 74 61 69  6e 20 41 63 6f 72 6e 20  |, certain Acorn |
00002850  61 70 70 6c 69 63 61 74  69 6f 6e 73 20 77 65 20  |applications we |
00002860  63 6f 75 6c 64 20 6d 65  6e 74 69 6f 6e 2c 20 69  |could mention, i|
00002870  74 20 72 65 61 6c 6c 79  0d 0e 60 46 f4 20 69 73  |t really..`F. is|
00002880  20 6e 69 63 65 20 74 6f  20 6d 61 6b 65 20 73 75  | nice to make su|
00002890  72 65 20 6f 6e 6c 79 20  6f 6e 65 20 69 6e 76 6f  |re only one invo|
000028a0  63 61 74 69 6f 6e 20 6f  66 20 74 68 65 20 70 72  |cation of the pr|
000028b0  6f 67 72 61 6d 20 68 61  73 20 62 65 65 6e 0d 0e  |ogram has been..|
000028c0  6a 43 f4 20 61 63 74 69  76 61 74 65 64 20 2d 20  |jC. activated - |
000028d0  74 68 69 73 20 69 73 20  64 6f 6e 65 20 62 79 20  |this is done by |
000028e0  63 68 65 63 6b 69 6e 67  20 61 20 6e 65 77 20 74  |checking a new t|
000028f0  61 73 6b 27 73 20 6e 61  6d 65 2f 68 61 6e 64 6c  |ask's name/handl|
00002900  65 0d 0e 74 11 ea 20 41  25 2c 42 25 2c 73 61 6d  |e..t.. A%,B%,sam|
00002910  65 25 0d 0e 7e 16 e7 20  70 6f 6c 6c 25 21 34 3c  |e%..~.. poll%!4<|
00002920  3e 74 61 73 6b 25 20 8c  0d 0e 88 18 20 20 20 41  |>task% .....   A|
00002930  25 3d 70 6f 6c 6c 25 2b  32 38 3a 42 25 3d 2d 31  |%=poll%+28:B%=-1|
00002940  0d 0e 92 0e 20 20 20 e7  20 3f 41 25 20 8c 0d 0e  |....   . ?A% ...|
00002950  9c 0b 20 20 20 20 20 20  f5 0d 0e a6 34 20 20 20  |..      ....4   |
00002960  20 20 20 20 20 20 42 25  2b 3d 31 3a 73 61 6d 65  |      B%+=1:same|
00002970  25 3d 28 41 25 3f 42 25  3d 97 28 c1 70 72 6f 67  |%=(A%?B%=.(.prog|
00002980  24 2b 62 6c 24 2c 42 25  2b 31 29 29 29 0d 0e b0  |$+bl$,B%+1)))...|
00002990  1d 20 20 20 20 20 20 fd  20 41 25 3f 42 25 3d 30  |.      . A%?B%=0|
000029a0  20 84 20 ac 20 73 61 6d  65 25 0d 0e ba 19 20 20  | . . same%....  |
000029b0  20 20 20 20 e7 20 73 61  6d 65 25 3a 71 75 69 74  |    . same%:quit|
000029c0  25 3d b9 0d 0e c4 08 20  20 20 cc 0d 0e ce 1f 20  |%=.....   ..... |
000029d0  20 20 20 20 20 f2 73 63  61 6e 6d 6f 64 75 6c 65  |     .scanmodule|
000029e0  73 28 70 6f 6c 6c 25 21  34 29 0d 0e d8 08 20 20  |s(poll%!4)....  |
000029f0  20 cd 0d 0e e2 05 cd 0d  0e ec 05 e1 0d 0e f6 04  | ...............|
00002a00  0d 0f 00 1a dd f2 70 75  74 64 61 74 61 28 69 63  |......putdata(ic|
00002a10  6f 6e 25 2c 6d 65 73 73  24 29 0d 0f 0a 2d f4 20  |on%,mess$)...-. |
00002a20  43 68 61 6e 67 65 20 69  63 6f 6e 20 27 69 63 6f  |Change icon 'ico|
00002a30  6e 25 27 20 74 6f 20 74  68 65 20 73 74 72 69 6e  |n%' to the strin|
00002a40  67 20 6d 65 73 73 24 0d  0f 14 3b f4 20 4e 6f 74  |g mess$...;. Not|
00002a50  65 20 74 68 61 74 20 74  68 69 73 20 61 73 73 75  |e that this assu|
00002a60  6d 65 73 20 61 6e 20 69  6e 64 69 72 65 63 74 65  |mes an indirecte|
00002a70  64 20 69 63 6f 6e 20 6f  66 20 63 6f 75 72 73 65  |d icon of course|
00002a80  20 21 0d 0f 1e 2b 21 69  63 6f 6e 64 61 74 61 25  | !...+!icondata%|
00002a90  3d 76 6b 69 6c 6c 68 61  6e 64 25 3a 69 63 6f 6e  |=vkillhand%:icon|
00002aa0  64 61 74 61 25 21 34 3d  69 63 6f 6e 25 0d 0f 28  |data%!4=icon%..(|
00002ab0  26 c8 99 20 22 58 57 69  6d 70 5f 47 65 74 49 63  |&.. "XWimp_GetIc|
00002ac0  6f 6e 53 74 61 74 65 22  2c 2c 69 63 6f 6e 64 61  |onState",,iconda|
00002ad0  74 61 25 0d 0f 32 19 24  28 69 63 6f 6e 64 61 74  |ta%..2.$(icondat|
00002ae0  61 25 21 32 38 29 3d 6d  65 73 73 24 0d 0f 3c 58  |a%!28)=mess$..<X|
00002af0  c8 99 20 22 58 57 69 6d  70 5f 46 6f 72 63 65 52  |.. "XWimp_ForceR|
00002b00  65 64 72 61 77 22 2c 76  6b 69 6c 6c 68 61 6e 64  |edraw",vkillhand|
00002b10  25 2c 69 63 6f 6e 64 61  74 61 25 21 38 2c 69 63  |%,icondata%!8,ic|
00002b20  6f 6e 64 61 74 61 25 21  31 32 2c 69 63 6f 6e 64  |ondata%!12,icond|
00002b30  61 74 61 25 21 31 36 2c  69 63 6f 6e 64 61 74 61  |ata%!16,icondata|
00002b40  25 21 32 30 0d 0f 46 05  e1 0d 0f 50 04 0d 0f 5a  |%!20..F....P...Z|
00002b50  1a dd a4 67 65 74 64 61  74 61 28 77 69 6e 64 25  |...getdata(wind%|
00002b60  2c 69 63 6f 6e 25 29 0d  0f 64 36 f4 20 52 65 61  |,icon%)..d6. Rea|
00002b70  64 20 74 68 65 20 76 61  6c 75 65 20 6f 66 20 69  |d the value of i|
00002b80  63 6f 6e 20 27 69 63 6f  6e 25 27 20 69 6e 20 77  |con 'icon%' in w|
00002b90  69 6e 64 6f 77 20 27 77  69 6e 64 25 27 0d 0f 6e  |indow 'wind%'..n|
00002ba0  3b f4 20 4e 6f 74 65 20  74 68 61 74 20 74 68 69  |;. Note that thi|
00002bb0  73 20 61 73 73 75 6d 65  73 20 61 6e 20 69 6e 64  |s assumes an ind|
00002bc0  69 72 65 63 74 65 64 20  69 63 6f 6e 20 6f 66 20  |irected icon of |
00002bd0  63 6f 75 72 73 65 20 21  0d 0f 78 26 21 69 63 6f  |course !..x&!ico|
00002be0  6e 64 61 74 61 25 3d 77  69 6e 64 25 3a 69 63 6f  |ndata%=wind%:ico|
00002bf0  6e 64 61 74 61 25 21 34  3d 69 63 6f 6e 25 0d 0f  |ndata%!4=icon%..|
00002c00  82 26 c8 99 20 22 58 57  69 6d 70 5f 47 65 74 49  |.&.. "XWimp_GetI|
00002c10  63 6f 6e 53 74 61 74 65  22 2c 2c 69 63 6f 6e 64  |conState",,icond|
00002c20  61 74 61 25 0d 0f 8c 14  3d 24 28 69 63 6f 6e 64  |ata%....=$(icond|
00002c30  61 74 61 25 21 32 38 29  0d 0f 96 04 0d 0f a0 0e  |ata%!28)........|
00002c40  dd f2 6d 61 6b 65 69 63  6f 6e 0d 0f aa 3f 50 25  |..makeicon...?P%|
00002c50  3d 69 63 6f 6e 25 3a f4  20 55 73 65 20 62 75 69  |=icon%:. Use bui|
00002c60  6c 74 20 69 6e 20 61 73  73 65 6d 62 6c 65 72 20  |lt in assembler |
00002c70  2d 20 65 61 73 69 65 72  20 74 6f 20 73 65 65 20  |- easier to see |
00002c80  73 74 72 75 63 74 75 72  65 0d 0f b4 0a 5b 4f 50  |structure....[OP|
00002c90  54 20 30 0d 0f be 45 20  20 20 20 20 20 20 20 20  |T 0...E         |
00002ca0  20 20 20 20 20 20 20 45  51 55 44 20 20 20 20 69  |       EQUD    i|
00002cb0  63 6f 6e 62 61 72 74 79  70 65 25 20 20 20 20 3b  |conbartype%    ;|
00002cc0  20 49 63 6f 6e 20 62 61  72 20 27 75 74 69 6c 69  | Icon bar 'utili|
00002cd0  74 79 27 20 66 6c 61 67  0d 0f c8 3b 20 20 20 20  |ty' flag...;    |
00002ce0  20 20 20 20 20 20 20 20  20 20 20 20 45 51 55 44  |            EQUD|
00002cf0  20 20 20 20 30 20 20 20  20 20 20 20 20 20 20 20  |    0           |
00002d00  20 20 20 20 3b 20 42 6f  74 74 6f 6d 20 6c 65 66  |    ; Bottom lef|
00002d10  74 20 58 0d 0f d2 3b 20  20 20 20 20 20 20 20 20  |t X...;         |
00002d20  20 20 20 20 20 20 20 45  51 55 44 20 20 20 20 30  |       EQUD    0|
00002d30  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00002d40  20 42 6f 74 74 6f 6d 20  6c 65 66 74 20 59 0d 0f  | Bottom left Y..|
00002d50  dc 39 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |.9              |
00002d60  20 20 45 51 55 44 20 20  20 20 36 39 20 20 20 20  |  EQUD    69    |
00002d70  20 20 20 20 20 20 20 20  20 20 3b 20 54 6f 70 20  |          ; Top |
00002d80  72 69 67 68 74 20 58 0d  0f e6 39 20 20 20 20 20  |right X...9     |
00002d90  20 20 20 20 20 20 20 20  20 20 20 45 51 55 44 20  |           EQUD |
00002da0  20 20 20 36 38 20 20 20  20 20 20 20 20 20 20 20  |   68           |
00002db0  20 20 20 3b 20 54 6f 70  20 72 69 67 68 74 20 59  |   ; Top right Y|
00002dc0  0d 0f f0 3e 20 20 20 20  20 20 20 20 20 20 20 20  |...>            |
00002dd0  20 20 20 20 45 51 55 42  20 20 20 20 25 30 30 30  |    EQUB    %000|
00002de0  30 30 30 31 30 20 20 20  20 20 20 20 3b 20 49 63  |00010       ; Ic|
00002df0  6f 6e 20 69 73 20 61 20  73 70 72 69 74 65 0d 0f  |on is a sprite..|
00002e00  fa 47 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |.G              |
00002e10  20 20 45 51 55 42 20 20  20 20 25 30 30 31 31 30  |  EQUB    %00110|
00002e20  30 30 31 20 20 20 20 20  20 20 3b 20 43 6c 69 63  |001       ; Clic|
00002e30  6b 20 6e 6f 74 69 66 69  65 73 2f 49 6e 64 69 72  |k notifies/Indir|
00002e40  65 63 74 65 64 0d 10 04  48 20 20 20 20 20 20 20  |ected...H       |
00002e50  20 20 20 20 20 20 20 20  20 45 51 55 42 20 20 20  |         EQUB   |
00002e60  20 25 30 30 30 30 30 30  30 30 20 20 20 20 20 20  | %00000000      |
00002e70  20 3b 20 4e 6f 74 68 69  6e 67 20 73 70 65 63 69  | ; Nothing speci|
00002e80  61 6c 20 61 62 6f 75 74  20 69 63 6f 6e 0d 10 0e  |al about icon...|
00002e90  46 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |F               |
00002ea0  20 45 51 55 42 20 20 20  20 25 30 30 30 30 30 30  | EQUB    %000000|
00002eb0  30 31 20 20 20 20 20 20  20 3b 20 46 6f 72 65 63  |01       ; Forec|
00002ec0  6f 6c 20 3d 20 31 2c 20  42 61 63 6b 63 6f 6c 20  |ol = 1, Backcol |
00002ed0  3d 20 30 0d 10 18 44 2e  70 6f 6b 65 73 70 6e 61  |= 0...D.pokespna|
00002ee0  6d 65 20 20 20 20 20 45  51 55 44 20 20 20 20 70  |me     EQUD    p|
00002ef0  6f 6b 65 73 70 6e 61 6d  65 2b 31 32 20 20 20 3b  |okespname+12   ;|
00002f00  20 50 6f 69 6e 74 65 72  20 74 6f 20 73 70 72 69  | Pointer to spri|
00002f10  74 65 20 6e 61 6d 65 0d  10 22 45 20 20 20 20 20  |te name.."E     |
00002f20  20 20 20 20 20 20 20 20  20 20 20 45 51 55 44 20  |           EQUD |
00002f30  20 20 20 31 20 20 20 20  20 20 20 20 20 20 20 20  |   1            |
00002f40  20 20 20 3b 20 50 6f 69  6e 74 65 72 20 74 6f 20  |   ; Pointer to |
00002f50  57 49 4d 50 20 73 70 72  69 74 65 73 0d 10 2c 43  |WIMP sprites..,C|
00002f60  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002f70  45 51 55 44 20 20 20 20  31 32 20 20 20 20 20 20  |EQUD    12      |
00002f80  20 20 20 20 20 20 20 20  3b 20 4c 65 6e 67 74 68  |        ; Length|
00002f90  20 6f 66 20 73 70 72 69  74 65 20 6e 61 6d 65 0d  | of sprite name.|
00002fa0  10 36 3c 2e 73 70 72 69  74 65 6e 61 6d 65 20 20  |.6<.spritename  |
00002fb0  20 20 20 45 51 55 53 20  20 20 20 22 21 76 6b 69  |   EQUS    "!vki|
00002fc0  6c 6c 65 72 22 2b c4 34  2c 62 6c 24 29 20 3b 20  |ller"+.4,bl$) ; |
00002fd0  53 70 72 69 74 65 20 6e  61 6d 65 0d 10 40 05 5d  |Sprite name..@.]|
00002fe0  0d 10 4a 2c c8 99 20 22  58 57 69 6d 70 5f 43 72  |..J,.. "XWimp_Cr|
00002ff0  65 61 74 65 49 63 6f 6e  22 2c 2c 69 63 6f 6e 25  |eateIcon",,icon%|
00003000  20 b8 20 69 63 6f 6e 68  61 6e 64 25 0d 10 54 05  | . iconhand%..T.|
00003010  e1 0d 10 5e 04 0d 10 68  0e dd f2 6d 61 6b 65 6d  |...^...h...makem|
00003020  65 6e 75 0d 10 72 28 6e  75 6d 69 74 65 6d 73 25  |enu..r(numitems%|
00003030  3d 32 3a f4 20 43 68 61  6e 67 65 20 69 66 20 79  |=2:. Change if y|
00003040  6f 75 20 61 64 64 20 6d  6f 72 65 0d 10 7c 1c 50  |ou add more..|.P|
00003050  25 3d 6d 65 6e 75 25 3a  f4 20 55 73 65 20 61 73  |%=menu%:. Use as|
00003060  73 65 6d 62 6c 65 72 0d  10 86 0a 5b 4f 50 54 20  |sembler....[OPT |
00003070  30 0d 10 90 40 20 20 20  20 20 20 20 20 20 20 20  |0...@           |
00003080  20 20 20 20 20 45 51 55  53 20 20 20 20 70 72 6f  |     EQUS    pro|
00003090  67 24 2b c4 31 32 2d a9  28 70 72 6f 67 24 29 2c  |g$+.12-.(prog$),|
000030a0  62 6c 24 29 20 3b 20 4d  65 6e 75 20 74 69 74 6c  |bl$) ; Menu titl|
000030b0  65 0d 10 9a 37 20 20 20  20 20 20 20 20 20 20 20  |e...7           |
000030c0  20 20 20 20 20 45 51 55  42 20 20 20 20 37 20 20  |     EQUB    7  |
000030d0  20 20 20 20 20 3b 20 46  6f 72 65 67 72 6f 75 6e  |     ; Foregroun|
000030e0  64 20 63 6f 6c 6f 75 72  0d 10 a4 37 20 20 20 20  |d colour...7    |
000030f0  20 20 20 20 20 20 20 20  20 20 20 20 45 51 55 42  |            EQUB|
00003100  20 20 20 20 32 20 20 20  20 20 20 20 3b 20 42 61  |    2       ; Ba|
00003110  63 6b 67 72 6f 75 6e 64  20 63 6f 6c 6f 75 72 0d  |ckground colour.|
00003120  10 ae 39 20 20 20 20 20  20 20 20 20 20 20 20 20  |..9             |
00003130  20 20 20 45 51 55 42 20  20 20 20 37 20 20 20 20  |   EQUB    7    |
00003140  20 20 20 3b 20 57 6f 72  6b 20 66 6f 72 65 67 72  |   ; Work foregr|
00003150  64 20 63 6f 6c 6f 75 72  0d 10 b8 39 20 20 20 20  |d colour...9    |
00003160  20 20 20 20 20 20 20 20  20 20 20 20 45 51 55 42  |            EQUB|
00003170  20 20 20 20 30 20 20 20  20 20 20 20 3b 20 57 6f  |    0       ; Wo|
00003180  72 6b 20 62 61 63 6b 67  72 64 20 63 6f 6c 6f 75  |rk backgrd colou|
00003190  72 0d 10 c2 31 20 20 20  20 20 20 20 20 20 20 20  |r...1           |
000031a0  20 20 20 20 20 45 51 55  44 20 20 20 20 31 34 38  |     EQUD    148|
000031b0  20 20 20 20 20 3b 20 54  6f 74 61 6c 20 77 69 64  |     ; Total wid|
000031c0  74 68 0d 10 cc 32 2e 73  70 61 63 69 6e 67 20 20  |th...2.spacing  |
000031d0  20 20 20 20 20 20 45 51  55 44 20 20 20 20 34 34  |      EQUD    44|
000031e0  20 20 20 20 20 20 3b 20  54 6f 74 61 6c 20 68 65  |      ; Total he|
000031f0  69 67 68 74 0d 10 d6 32  20 20 20 20 20 20 20 20  |ight...2        |
00003200  20 20 20 20 20 20 20 20  45 51 55 44 20 20 20 20  |        EQUD    |
00003210  30 20 20 20 20 20 20 20  3b 20 4c 69 6e 65 20 73  |0       ; Line s|
00003220  70 61 63 69 6e 67 0d 10  e0 0d 3b 20 49 74 65 6d  |pacing....; Item|
00003230  20 23 31 0d 10 ea 35 20  20 20 20 20 20 20 20 20  | #1...5         |
00003240  20 20 20 20 20 20 20 45  51 55 44 20 20 20 20 30  |       EQUD    0|
00003250  20 20 20 20 20 20 20 3b  20 4e 6f 74 68 69 6e 67  |       ; Nothing|
00003260  20 73 70 65 63 69 61 6c  0d 10 f4 41 2e 73 75 62  | special...A.sub|
00003270  6d 65 6e 75 70 6f 6b 65  20 20 20 20 45 51 55 44  |menupoke    EQUD|
00003280  20 20 20 20 30 20 20 20  20 20 20 20 3b 20 53 75  |    0       ; Su|
00003290  62 2d 6d 65 6e 75 20 61  64 64 72 20 70 6f 6b 65  |b-menu addr poke|
000032a0  64 20 69 6e 20 68 65 72  65 0d 10 fe 3e 20 20 20  |d in here...>   |
000032b0  20 20 20 20 20 20 20 20  20 20 20 20 20 45 51 55  |             EQU|
000032c0  44 20 20 20 20 28 37 3c  3c 32 34 29 20 84 20 31  |D    (7<<24) . 1|
000032d0  20 3b 20 49 74 65 6d 20  69 73 20 74 65 78 74 20  | ; Item is text |
000032e0  26 20 62 6c 61 63 6b 0d  11 08 2d 20 20 20 20 20  |& black...-     |
000032f0  20 20 20 20 20 20 20 20  20 20 20 45 51 55 53 20  |           EQUS |
00003300  20 20 20 22 49 6e 66 6f  20 20 20 20 20 20 20 22  |   "Info       "|
00003310  2b 62 6c 24 0d 11 12 0d  3b 20 49 74 65 6d 20 23  |+bl$....; Item #|
00003320  32 0d 11 1c 34 20 20 20  20 20 20 20 20 20 20 20  |2...4           |
00003330  20 20 20 20 20 45 51 55  44 20 20 20 20 26 38 30  |     EQUD    &80|
00003340  20 20 20 20 20 3b 20 4c  61 73 74 20 6d 65 6e 75  |     ; Last menu|
00003350  20 69 74 65 6d 0d 11 26  31 20 20 20 20 20 20 20  | item..&1       |
00003360  20 20 20 20 20 20 20 20  20 45 51 55 44 20 20 20  |         EQUD   |
00003370  20 2d 31 20 20 20 20 20  20 3b 20 4e 6f 20 73 75  | -1      ; No su|
00003380  62 2d 6d 65 6e 75 0d 11  30 3e 20 20 20 20 20 20  |b-menu..0>      |
00003390  20 20 20 20 20 20 20 20  20 20 45 51 55 44 20 20  |          EQUD  |
000033a0  20 20 28 37 3c 3c 32 34  29 20 84 20 31 20 3b 20  |  (7<<24) . 1 ; |
000033b0  49 74 65 6d 20 69 73 20  74 65 78 74 20 26 20 62  |Item is text & b|
000033c0  6c 61 63 6b 0d 11 3a 2d  20 20 20 20 20 20 20 20  |lack..:-        |
000033d0  20 20 20 20 20 20 20 20  45 51 55 53 20 20 20 20  |        EQUS    |
000033e0  22 51 75 69 74 20 20 20  20 20 20 20 22 2b 62 6c  |"Quit       "+bl|
000033f0  24 0d 11 44 05 5d 0d 11  4e 05 e1 0d 11 58 04 0d  |$..D.]..N....X..|
00003400  11 62 12 dd f2 67 65 74  74 65 6d 70 6c 61 74 65  |.b...gettemplate|
00003410  73 0d 11 6c 13 ea 20 66  6c 61 67 73 25 2c 64 75  |s..l.. flags%,du|
00003420  6d 6d 79 25 0d 11 76 3d  c8 99 20 22 58 57 69 6d  |mmy%..v=.. "XWim|
00003430  70 5f 4f 70 65 6e 54 65  6d 70 6c 61 74 65 22 2c  |p_OpenTemplate",|
00003440  2c 76 6b 69 6c 6c 76 61  72 24 2b 22 2e 54 65 6d  |,vkillvar$+".Tem|
00003450  70 6c 61 74 65 73 22 20  b8 20 3b 66 6c 61 67 73  |plates" . ;flags|
00003460  25 0d 11 80 3c e7 20 66  6c 61 67 73 25 20 80 20  |%...<. flags% . |
00003470  31 3a f2 66 61 74 61 6c  28 22 4d 69 73 73 69 6e  |1:.fatal("Missin|
00003480  67 20 54 65 6d 70 6c 61  74 65 73 20 66 69 6c 65  |g Templates file|
00003490  20 66 6f 72 20 22 2b 70  72 6f 67 24 29 0d 11 8a  | for "+prog$)...|
000034a0  36 76 6b 69 6c 6c 68 61  6e 64 25 3d a4 6c 6f 61  |6vkillhand%=.loa|
000034b0  64 74 65 6d 70 6c 61 74  65 28 76 6b 69 6c 6c 77  |dtemplate(vkillw|
000034c0  69 6e 64 25 2c 22 56 4b  69 6c 6c 57 69 6e 64 6f  |ind%,"VKillWindo|
000034d0  77 22 29 0d 11 94 30 21  73 75 62 6d 65 6e 75 70  |w")...0!submenup|
000034e0  6f 6b 65 3d a4 6c 6f 61  64 74 65 6d 70 6c 61 74  |oke=.loadtemplat|
000034f0  65 28 69 6e 66 6f 77 69  6e 64 25 2c 22 49 6e 66  |e(infowind%,"Inf|
00003500  6f 22 29 0d 11 9e 1c c8  99 20 22 58 57 69 6d 70  |o")...... "XWimp|
00003510  5f 43 6c 6f 73 65 54 65  6d 70 6c 61 74 65 22 0d  |_CloseTemplate".|
00003520  11 a8 05 e1 0d 11 b2 04  0d 11 bc 1f dd a4 6c 6f  |..............lo|
00003530  61 64 74 65 6d 70 6c 61  74 65 28 61 64 64 72 25  |adtemplate(addr%|
00003540  2c 77 69 6e 64 24 29 0d  11 c6 47 f4 20 4e 6f 74  |,wind$)...G. Not|
00003550  65 20 74 68 65 20 2b 34  20 6f 6e 20 74 68 65 20  |e the +4 on the |
00003560  61 64 64 72 65 73 73 20  2d 20 74 68 69 73 20 61  |address - this a|
00003570  6c 6c 6f 77 73 20 74 68  65 20 70 6f 6b 69 6e 67  |llows the poking|
00003580  20 6f 66 20 74 68 65 20  68 61 6e 64 6c 65 0d 11  | of the handle..|
00003590  d0 18 ea 20 77 69 6e 64  68 61 6e 64 25 2c 77 69  |... windhand%,wi|
000035a0  6e 64 70 74 72 25 0d 11  da 56 c8 99 20 22 58 57  |ndptr%...V.. "XW|
000035b0  69 6d 70 5f 4c 6f 61 64  54 65 6d 70 6c 61 74 65  |imp_LoadTemplate|
000035c0  22 2c 2c 61 64 64 72 25  2b 34 2c 61 64 64 72 25  |",,addr%+4,addr%|
000035d0  2b 26 37 30 30 2c 61 64  64 72 25 2b 26 45 30 30  |+&700,addr%+&E00|
000035e0  2c 2d 31 2c 77 69 6e 64  24 2c 30 20 b8 20 2c 2c  |,-1,wind$,0 . ,,|
000035f0  2c 2c 2c 2c 77 69 6e 64  70 74 72 25 0d 11 e4 53  |,,,,windptr%...S|
00003600  e7 20 77 69 6e 64 70 74  72 25 3d 30 3a f2 66 61  |. windptr%=0:.fa|
00003610  74 61 6c 28 22 4d 69 73  73 69 6e 67 20 22 2b 77  |tal("Missing "+w|
00003620  69 6e 64 24 2b 22 20 77  69 6e 64 6f 77 20 66 72  |ind$+" window fr|
00003630  6f 6d 20 22 2b 70 72 6f  67 24 2b 22 27 73 20 54  |om "+prog$+"'s T|
00003640  65 6d 70 6c 61 74 65 73  20 66 69 6c 65 22 29 0d  |emplates file").|
00003650  11 ee 30 c8 99 20 22 58  57 69 6d 70 5f 43 72 65  |..0.. "XWimp_Cre|
00003660  61 74 65 57 69 6e 64 6f  77 22 2c 2c 61 64 64 72  |ateWindow",,addr|
00003670  25 2b 34 20 b8 20 77 69  6e 64 68 61 6e 64 25 0d  |%+4 . windhand%.|
00003680  11 f8 48 21 61 64 64 72  25 3d 77 69 6e 64 68 61  |..H!addr%=windha|
00003690  6e 64 25 3a f4 20 53 74  6f 72 65 20 77 69 6e 64  |nd%:. Store wind|
000036a0  6f 77 20 68 61 6e 64 6c  65 20 62 65 63 61 75 73  |ow handle becaus|
000036b0  65 20 6e 65 65 64 65 64  20 62 79 20 6c 61 74 65  |e needed by late|
000036c0  72 20 63 61 6c 6c 73 0d  12 02 0e 3d 77 69 6e 64  |r calls....=wind|
000036d0  68 61 6e 64 25 0d 12 0c  04 0d 12 16 11 dd f2 73  |hand%..........s|
000036e0  79 73 74 65 6d 65 72 72  6f 72 0d 12 20 41 f4 20  |ystemerror.. A. |
000036f0  57 68 79 20 64 6f 20 49  20 6e 65 65 64 20 74 68  |Why do I need th|
00003700  69 73 20 70 72 6f 63 20  3f 20 57 65 6c 6c 2c 20  |is proc ? Well, |
00003710  74 68 65 20 57 69 6d 70  20 64 6f 65 73 6e 27 74  |the Wimp doesn't|
00003720  20 72 65 70 6f 72 74 20  74 68 65 0d 12 2a 29 f4  | report the..*).|
00003730  20 6f 66 66 65 6e 64 69  6e 67 20 6c 69 6e 65 20  | offending line |
00003740  6e 75 6d 62 65 72 20 6f  66 20 61 6e 20 65 72 72  |number of an err|
00003750  6f 72 20 21 0d 12 34 0a  ea 20 65 72 72 24 0d 12  |or !..4.. err$..|
00003760  3e 27 e7 20 9f 3a 65 72  72 24 3d 22 20 61 74 20  |>'. .:err$=" at |
00003770  6c 69 6e 65 20 22 2b c3  28 9e 29 20 8b 20 65 72  |line "+.(.) . er|
00003780  72 24 3d 22 22 0d 12 48  09 ee 20 85 20 87 0d 12  |r$=""..H.. . ...|
00003790  52 13 f2 66 61 74 61 6c  28 f6 24 2b 65 72 72 24  |R..fatal(.$+err$|
000037a0  29 0d 12 5c 05 e1 0d 12  66 04 0d 12 70 13 dd f2  |)..\....f...p...|
000037b0  66 61 74 61 6c 28 65 72  72 6f 72 24 29 0d 12 7a  |fatal(error$)..z|
000037c0  16 ff 22 45 72 72 6f 72  20 30 20 22 2b 65 72 72  |.."Error 0 "+err|
000037d0  6f 72 24 0d 12 84 05 e1  0d 12 8e 04 0d 12 98 0c  |or$.............|
000037e0  dd f2 6e 65 78 74 66 73  0d 12 a2 3c ea 20 66 73  |..nextfs...<. fs|
000037f0  6e 61 6d 65 25 2c 6f 6c  64 66 73 79 73 24 2c 73  |name%,oldfsys$,s|
00003800  77 69 24 2c 73 77 69 6e  61 6d 65 24 2c 6e 75 6d  |wi$,swiname$,num|
00003810  66 6c 6f 70 25 2c 6e 75  6d 68 61 72 64 25 2c 6c  |flop%,numhard%,l|
00003820  6f 6f 70 25 0d 12 ac 1b  6f 6c 64 66 73 79 73 24  |oop%....oldfsys$|
00003830  3d 66 73 79 73 24 3a 66  73 79 73 24 3d 22 22 0d  |=fsys$:fsys$="".|
00003840  12 b6 05 f5 0d 12 c0 2c  20 20 20 66 73 79 73 6e  |.......,   fsysn|
00003850  75 6d 25 2b 3d 31 3a e7  20 66 73 79 73 6e 75 6d  |um%+=1:. fsysnum|
00003860  25 3e 32 35 35 3a 66 73  79 73 6e 75 6d 25 3d 31  |%>255:fsysnum%=1|
00003870  0d 12 ca 3b 20 20 20 c8  99 20 22 58 4f 53 5f 46  |...;   .. "XOS_F|
00003880  53 43 6f 6e 74 72 6f 6c  22 2c 33 33 2c 66 73 79  |SControl",33,fsy|
00003890  73 6e 75 6d 25 2c 66 62  75 66 66 25 2c 31 32 20  |snum%,fbuff%,12 |
000038a0  b8 20 2c 2c 66 73 6e 61  6d 65 25 0d 12 d4 13 20  |. ,,fsname%.... |
000038b0  20 20 e7 20 3f 66 73 6e  61 6d 65 25 20 8c 0d 12  |  . ?fsname% ...|
000038c0  de 23 20 20 20 20 20 20  66 73 79 73 24 3d a4 67  |.#      fsys$=.g|
000038d0  65 74 73 74 72 69 6e 67  28 66 73 6e 61 6d 65 25  |etstring(fsname%|
000038e0  29 0d 12 e8 14 20 20 20  20 20 20 c8 8e 20 66 73  |)....      .. fs|
000038f0  79 73 24 20 ca 0d 12 f2  6e 20 20 20 20 20 20 c9  |ys$ ....n      .|
00003900  20 22 6e 75 6c 6c 22 2c  22 70 72 69 6e 74 65 72  | "null","printer|
00003910  22 2c 22 73 65 72 69 61  6c 22 2c 22 76 64 75 22  |","serial","vdu"|
00003920  2c 22 72 61 77 76 64 75  22 2c 22 6b 62 64 22 2c  |,"rawvdu","kbd",|
00003930  22 72 61 77 6b 62 64 22  2c 22 64 65 73 6b 66 73  |"rawkbd","deskfs|
00003940  22 2c 22 6d 73 64 6f 73  22 3a 66 73 79 73 24 3d  |","msdos":fsys$=|
00003950  22 22 3a f4 20 4e 6f 74  20 69 6e 66 65 63 74 61  |"":. Not infecta|
00003960  62 6c 65 0d 12 fc 0b 20  20 20 20 20 20 cb 0d 13  |ble....      ...|
00003970  06 08 20 20 20 cd 0d 13  10 0f fd 20 66 73 79 73  |..   ...... fsys|
00003980  24 3c 3e 22 22 0d 13 1a  17 e7 20 6f 6c 64 66 73  |$<>""..... oldfs|
00003990  79 73 24 3c 3e 66 73 79  73 24 20 8c 0d 13 24 11  |ys$<>fsys$ ...$.|
000039a0  20 20 20 c8 8e 20 66 73  79 73 24 20 ca 0d 13 2e  |   .. fsys$ ....|
000039b0  1f 20 20 20 c9 20 22 61  64 66 73 22 3a 73 77 69  |.   . "adfs":swi|
000039c0  6e 61 6d 65 24 3d 22 41  44 46 53 22 0d 13 38 31  |name$="ADFS"..81|
000039d0  20 20 20 c9 20 22 6e 65  74 22 3a 73 77 69 6e 61  |   . "net":swina|
000039e0  6d 65 24 3d 22 4e 65 74  46 53 22 3a f4 20 49 73  |me$="NetFS":. Is|
000039f0  20 74 68 69 73 20 72 69  67 68 74 20 3f 0d 13 42  | this right ?..B|
00003a00  17 20 20 20 7f 20 73 77  69 6e 61 6d 65 24 3d 66  |.   . swiname$=f|
00003a10  73 79 73 24 0d 13 4c 08  20 20 20 cb 0d 13 56 22  |sys$..L.   ...V"|
00003a20  20 20 20 73 77 69 24 3d  22 58 22 2b 73 77 69 6e  |   swi$="X"+swin|
00003a30  61 6d 65 24 2b 22 5f 44  72 69 76 65 73 22 0d 13  |ame$+"_Drives"..|
00003a40  60 1a 20 20 20 e7 20 a4  63 68 65 63 6b 73 77 69  |`.   . .checkswi|
00003a50  28 73 77 69 24 29 20 8c  0d 13 6a 2c 20 20 20 20  |(swi$) ...j,    |
00003a60  20 20 c8 99 20 73 77 69  24 20 b8 20 64 72 69 76  |  .. swi$ . driv|
00003a70  65 25 2c 6e 75 6d 66 6c  6f 70 25 2c 6e 75 6d 68  |e%,numflop%,numh|
00003a80  61 72 64 25 0d 13 74 47  20 20 20 20 20 20 e7 20  |ard%..tG      . |
00003a90  64 72 69 76 65 25 3e 3d  6e 75 6d 66 6c 6f 70 25  |drive%>=numflop%|
00003aa0  20 80 20 6e 75 6d 68 61  72 64 25 3d 30 20 84 20  | . numhard%=0 . |
00003ab0  64 72 69 76 65 25 3e 3d  6e 75 6d 68 61 72 64 25  |drive%>=numhard%|
00003ac0  2b 34 3a 64 72 69 76 65  25 3d 30 0d 13 7e 08 20  |+4:drive%=0..~. |
00003ad0  20 20 cc 0d 13 88 28 20  20 20 20 20 20 6e 75 6d  |  ....(      num|
00003ae0  66 6c 6f 70 25 3d 31 3a  6e 75 6d 68 61 72 64 25  |flop%=1:numhard%|
00003af0  3d 30 3a 64 72 69 76 65  25 3d 30 0d 13 92 08 20  |=0:drive%=0.... |
00003b00  20 20 cd 0d 13 9c 18 20  20 20 f2 70 75 74 64 61  |  .....   .putda|
00003b10  74 61 28 37 2c 66 73 79  73 24 29 0d 13 a6 14 20  |ta(7,fsys$).... |
00003b20  20 20 e3 20 6c 6f 6f 70  25 3d 30 20 b8 20 37 0d  |  . loop%=0 . 7.|
00003b30  13 b0 65 20 20 20 20 20  20 f2 61 6c 6c 6f 77 64  |..e      .allowd|
00003b40  72 69 76 65 28 6c 6f 6f  70 25 2c 28 6c 6f 6f 70  |rive(loop%,(loop|
00003b50  25 3c 34 20 80 20 6e 75  6d 66 6c 6f 70 25 3e 6c  |%<4 . numflop%>l|
00003b60  6f 6f 70 25 29 20 84 20  28 6c 6f 6f 70 25 3e 33  |oop%) . (loop%>3|
00003b70  20 80 20 6e 75 6d 68 61  72 64 25 2b 34 3e 6c 6f  | . numhard%+4>lo|
00003b80  6f 70 25 29 2c 28 6c 6f  6f 70 25 3d 64 72 69 76  |op%),(loop%=driv|
00003b90  65 25 29 29 0d 13 ba 08  20 20 20 ed 0d 13 c4 05  |e%))....   .....|
00003ba0  cd 0d 13 ce 05 e1 0d 13  d8 04 0d 13 e2 14 dd a4  |................|
00003bb0  63 68 65 63 6b 73 77 69  28 73 77 69 24 29 0d 13  |checkswi(swi$)..|
00003bc0  ec 11 ea 20 73 77 69 25  2c 66 6c 61 67 73 25 0d  |... swi%,flags%.|
00003bd0  13 f6 34 c8 99 20 22 58  4f 53 5f 53 57 49 4e 75  |..4.. "XOS_SWINu|
00003be0  6d 62 65 72 46 72 6f 6d  53 74 72 69 6e 67 22 2c  |mberFromString",|
00003bf0  2c 73 77 69 24 20 b8 20  73 77 69 25 3b 66 6c 61  |,swi$ . swi%;fla|
00003c00  67 73 25 0d 14 00 15 3d  28 28 66 6c 61 67 73 25  |gs%....=((flags%|
00003c10  20 80 20 31 29 3d 30 29  0d 14 0a 04 0d 14 14 22  | . 1)=0)......."|
00003c20  dd f2 68 61 63 6b 66 6c  61 67 73 28 69 63 6f 6e  |..hackflags(icon|
00003c30  25 2c 65 6f 72 25 2c 63  6c 65 61 72 25 29 0d 14  |%,eor%,clear%)..|
00003c40  1e 19 21 69 63 6f 6e 64  61 74 61 25 3d 76 6b 69  |..!icondata%=vki|
00003c50  6c 6c 68 61 6e 64 25 0d  14 28 15 69 63 6f 6e 64  |llhand%..(.icond|
00003c60  61 74 61 25 21 34 3d 69  63 6f 6e 25 0d 14 32 14  |ata%!4=icon%..2.|
00003c70  69 63 6f 6e 64 61 74 61  25 21 38 3d 65 6f 72 25  |icondata%!8=eor%|
00003c80  0d 14 3c 17 69 63 6f 6e  64 61 74 61 25 21 31 32  |..<.icondata%!12|
00003c90  3d 63 6c 65 61 72 25 0d  14 46 26 c8 99 20 22 58  |=clear%..F&.. "X|
00003ca0  57 69 6d 70 5f 53 65 74  49 63 6f 6e 53 74 61 74  |Wimp_SetIconStat|
00003cb0  65 22 2c 2c 69 63 6f 6e  64 61 74 61 25 0d 14 50  |e",,icondata%..P|
00003cc0  05 e1 0d 14 5a 04 0d 14  64 19 dd f2 68 69 6c 69  |....Z...d...hili|
00003cd0  74 65 28 69 63 6f 6e 25  2c 62 6f 6f 6c 25 29 0d  |te(icon%,bool%).|
00003ce0  14 6e 2e f2 68 61 63 6b  66 6c 61 67 73 28 69 63  |.n..hackflags(ic|
00003cf0  6f 6e 25 2c 28 28 2d 62  6f 6f 6c 25 29 3c 3c 32  |on%,((-bool%)<<2|
00003d00  31 29 2c 26 30 30 32 30  30 30 30 30 29 0d 14 78  |1),&00200000)..x|
00003d10  05 e1 0d 14 82 04 0d 14  8c 24 dd f2 61 6c 6c 6f  |.........$..allo|
00003d20  77 64 72 69 76 65 28 64  72 76 25 2c 62 6f 6f 6c  |wdrive(drv%,bool|
00003d30  25 2c 68 69 6c 69 74 65  25 29 0d 14 96 10 62 6f  |%,hilite%)....bo|
00003d40  6f 6c 25 3d 2d 62 6f 6f  6c 25 0d 14 a0 4e f2 68  |ol%=-bool%...N.h|
00003d50  61 63 6b 66 6c 61 67 73  28 64 72 76 25 2b 38 2c  |ackflags(drv%+8,|
00003d60  28 62 6f 6f 6c 25 3c 3c  31 36 29 2b 31 31 2a 28  |(bool%<<16)+11*(|
00003d70  62 6f 6f 6c 25 3c 3c 31  32 29 2b 28 28 31 35 2d  |bool%<<12)+((15-|
00003d80  62 6f 6f 6c 25 2a 36 29  3c 3c 32 38 29 2c 26 46  |bool%*6)<<28),&F|
00003d90  30 31 46 46 30 30 30 29  0d 14 aa 1b f2 68 69 6c  |01FF000).....hil|
00003da0  69 74 65 28 64 72 76 25  2b 38 2c 68 69 6c 69 74  |ite(drv%+8,hilit|
00003db0  65 25 29 0d 14 b4 05 e1  0d 14 be 04 0d 14 c8 10  |e%).............|
00003dc0  dd f2 66 69 6e 69 73 68  73 63 61 6e 0d 14 d2 23  |..finishscan...#|
00003dd0  f2 70 75 74 64 61 74 61  28 32 33 2c 22 53 74 61  |.putdata(23,"Sta|
00003de0  72 74 20 44 72 69 76 65  20 53 63 61 6e 22 29 0d  |rt Drive Scan").|
00003df0  14 dc 1d f2 70 75 74 64  61 74 61 28 64 69 72 73  |....putdata(dirs|
00003e00  63 61 6e 25 2c 22 49 64  6c 65 22 29 0d 14 e6 0f  |can%,"Idle")....|
00003e10  73 63 61 6e 6e 69 6e 67  25 3d a3 0d 14 f0 05 e1  |scanning%=......|
00003e20  0d 14 fa 04 0d 15 04 0f  dd f2 73 74 61 72 74 73  |..........starts|
00003e30  63 61 6e 0d 15 0e 0d ea  20 70 72 65 66 69 78 24  |can..... prefix$|
00003e40  0d 15 18 22 f2 70 75 74  64 61 74 61 28 32 33 2c  |...".putdata(23,|
00003e50  22 53 74 6f 70 20 44 72  69 76 65 20 53 63 61 6e  |"Stop Drive Scan|
00003e60  22 29 0d 15 22 22 73 63  61 6e 6e 69 6e 67 25 3d  |")..""scanning%=|
00003e70  b9 3a 69 6e 66 65 63 74  25 3d a3 3a 73 74 69 6c  |.:infect%=.:stil|
00003e80  6c 25 3d a3 0d 15 2c 20  70 72 65 66 69 78 24 3d  |l%=..., prefix$=|
00003e90  66 73 79 73 24 2b 22 3a  3a 22 2b c3 28 64 72 69  |fsys$+"::"+.(dri|
00003ea0  76 65 25 29 0d 15 36 2a  f2 70 75 74 64 61 74 61  |ve%)..6*.putdata|
00003eb0  28 73 74 61 74 75 73 25  2c 22 44 72 69 76 65 20  |(status%,"Drive |
00003ec0  53 63 61 6e 20 73 74 61  72 74 65 64 22 29 0d 15  |Scan started")..|
00003ed0  40 19 f2 63 68 65 63 6b  28 70 72 65 66 69 78 24  |@..check(prefix$|
00003ee0  2c 22 24 22 2c 30 29 0d  15 4a 11 e7 20 73 63 61  |,"$",0)..J.. sca|
00003ef0  6e 6e 69 6e 67 25 20 8c  0d 15 54 2d 20 20 20 6e  |nning% ...T-   n|
00003f00  75 6d 73 63 61 6e 73 25  2b 3d 31 3a f2 70 75 74  |umscans%+=1:.put|
00003f10  64 61 74 61 28 32 32 2c  c3 28 6e 75 6d 73 63 61  |data(22,.(numsca|
00003f20  6e 73 25 29 29 0d 15 5e  14 20 20 20 f2 68 69 6c  |ns%))..^.   .hil|
00003f30  69 74 65 28 32 33 2c a3  29 0d 15 68 12 20 20 20  |ite(23,.)..h.   |
00003f40  e7 20 69 6e 66 65 63 74  25 20 8c 0d 15 72 14 20  |. infect% ...r. |
00003f50  20 20 20 20 20 e7 20 73  74 69 6c 6c 25 20 8c 0d  |     . still% ..|
00003f60  15 7c 41 20 20 20 20 20  20 20 20 20 f2 70 75 74  |.|A         .put|
00003f70  64 61 74 61 28 73 74 61  74 75 73 25 2c 70 72 65  |data(status%,pre|
00003f80  66 69 78 24 2b 22 20 6d  61 79 20 73 74 69 6c 6c  |fix$+" may still|
00003f90  20 62 65 20 69 6e 66 65  63 74 65 64 20 21 22 29  | be infected !")|
00003fa0  0d 15 86 0b 20 20 20 20  20 20 cc 0d 15 90 45 20  |....      ....E |
00003fb0  20 20 20 20 20 20 20 20  f2 70 75 74 64 61 74 61  |        .putdata|
00003fc0  28 73 74 61 74 75 73 25  2c 70 72 65 66 69 78 24  |(status%,prefix$|
00003fd0  2b 22 20 77 61 73 20 69  6e 66 65 63 74 65 64 2c  |+" was infected,|
00003fe0  20 62 75 74 20 6e 6f 77  20 63 6c 65 61 6e 22 29  | but now clean")|
00003ff0  0d 15 9a 0b 20 20 20 20  20 20 cd 0d 15 a4 08 20  |....      ..... |
00004000  20 20 cc 0d 15 ae 3f 20  20 20 20 20 20 f2 70 75  |  ....?      .pu|
00004010  74 64 61 74 61 28 73 74  61 74 75 73 25 2c 70 72  |tdata(status%,pr|
00004020  65 66 69 78 24 2b 22 20  69 73 20 63 6c 65 61 6e  |efix$+" is clean|
00004030  20 2d 20 6e 6f 20 69 6e  66 65 63 74 69 6f 6e 73  | - no infections|
00004040  22 29 0d 15 b8 08 20 20  20 cd 0d 15 c2 12 20 20  |")....   .....  |
00004050  20 f2 6f 70 65 6e 77 69  6e 64 6f 77 0d 15 cc 05  | .openwindow....|
00004060  cc 0d 15 d6 36 20 20 20  f2 70 75 74 64 61 74 61  |....6   .putdata|
00004070  28 73 74 61 74 75 73 25  2c 22 44 72 69 76 65 20  |(status%,"Drive |
00004080  53 63 61 6e 20 6d 61 6e  75 61 6c 6c 79 20 61 62  |Scan manually ab|
00004090  6f 72 74 65 64 22 29 0d  15 e0 05 cd 0d 15 ea 0f  |orted").........|
000040a0  f2 66 69 6e 69 73 68 73  63 61 6e 0d 15 f4 05 e1  |.finishscan.....|
000040b0  0d ff                                             |..|
000040b2