Home » Archimedes archive » Micro User » MU 1992-03.adf » !VKiller/!RunImage

!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 » Micro User » MU 1992-03.adf
Filename: !VKiller/!RunImage
Read OK:
File size: 8D03 bytes
Load address: FFFFFB43
Exec address: 2B5205D1
File contents
   10REM >$.!VKiller.!RunImage
   20REM Virus Killer V2.30 (C) Richard K. Lloyd 1991
   30REM Currently kills:  Discovered by:   Attacks:
   40REM Extend Virus      Simon Burrows    !Boot files
   50REM ArchieVirus       Hugo Fiennes     Absolute files
   60REM CeBit Virus       ?                !Boot files
   70REM Vigay Virus       Gordon Sinclair  !Boot files
   80REM Icon1 and Icon2   Stuart Tyrrell   !Boot files
   90REM Thanatos Virus    Alan Glover      !Boot files
  100
  110REM Recommended CD:
  120REM B-52's "Cosmic Thing". Weird at first, but it grows on you !
  130
  140REM General error trapper
  150ON ERROR PROCsystemerror
  160
  170quit%=FALSE:REM Nothing happened yet
  180PROCinit
  190WHILE NOT quit%
  200   PROCwimp_poll(TRUE)
  210ENDWHILE
  220
  230PROCshutdown
  240SYS "OS_Exit"
  250
  260DEFPROCinit
  270multi%=FALSE:REM Not a multiple invocation (yet)
  280maxfiles%=16:REM Number of objects read in at a time
  290maxfs%=127:REM Highest known FS number (may eventually need increasing)
  300size%=maxfiles%*64:REM Max files per dir and 64 bytes per file info (increased to allow for longer names)
  310DIM fbuff% 12,inbuff% 20,outbuff% 20,seekbuff% 64
  320RESTORE 4480:FOR x%=0 TO 16 STEP 4:READ x%!inbuff%:NEXT
  330icon$="IconSprites <Obey$Dir>.!Sprites"+CHR$(&A)
  340iconlen%=LEN(icon$)
  350protect$="| This file has been innoculated against the Extend Virus"+CHR$(&A)+"||"+CHR$(&FF)
  360protlen%=LEN(protect$)
  370extendhelp$="Extend"+CHR$(9)+CHR$(9)+"1.56 (08 Jul 1989)"
  380cebithelp$="TlodMod"+CHR$(9)+CHR$(9)+"1.11 (11 Nov 1990) by Devil the LORD OF DARKNESS"
  390cebitobey$="rme. TlodMod 0 rml. <Obey$Dir>.TlodMod"
  400vigayobey$="RUN ""<Obey$Dir>.datadqm"""
  410icon1wimp$="wimpslot -min 16k -max 16k"
  420icon1obey$="BASIC -quit <Obey$Dir>.Icon"
  430thanobey$="Run <Obey$Dir>.RISCOSext"
  440cebitoff%=&4C4:REM Offset of infection count
  450archsize%=&398:REM Size of ArchieVirus code
  460bas_start%=&8F00:REM Start address for BASIC progs
  470vbase%=&8C8:REM Base of vector table (may be RISC OS 2.00 specific)
  480FileV%=8:REM OS_File vector
  490deffs$="adfs":REM Default filing system
  500oldappicon$="":REM Previous application icon
  510infect%=FALSE:still%=FALSE:REM No virus checks yet
  520nummem%=0:numdisk%=0:numinnoc%=0:numscans%=0:REM Reset counters
  530fsysnum%=0:fsys$="":REM Not checked filing system yet
  540innoc%=FALSE:REM Not innoculating by default
  550logging%=FALSE:REM Not logging by default
  560opened%=FALSE:REM Dialogue box not opened yet
  570
  580REM Application Constants
  590prog$="VKiller":REM English text name of program
  600SYS "XOS_CLI","Set "+prog$+"$Version 2.30":REM Register version number
  610vkillvar$="<"+prog$+"$Dir>":REM VKiller environmental variable
  620iconbartype%=-1:REM -1 = Utility (RHS of bar), -2 = Service (LHS of bar)
  630windman%=200:REM Expect at LEAST V2.00 of the Window Manager
  640bl$=CHR$(0):REM NULL char used to terminate strings
  650dirscan%=11:REM Directory spec goes in this icon
  660status%=12:REM Status messages go in this icon
  670appicon%=18:REM Application icon
  680iconname%=22:REM Icon name
  690fileicon%=25:REM File total icon
  700diricon%=26:REM Directory total icon
  710iconbar%=136:REM External coord height of icon bar
  720
  730REM Workspace for application
  740DIM vkillwind% &E00,infowind% &E00:REM Template workspace
  750DIM poll% 256:REM Wimp_Poll workspace
  760DIM icon% 48:REM Icon bar icon workspace
  770DIM taskconst% 8:$taskconst%="TASK":REM Store Task constant here
  780DIM icondata% 256:REM Temp workspace to get/put icon data
  790
  800REM Initialise WIMP
  810SYS "XWimp_Initialise",windman%,!taskconst%,prog$+bl$ TO windvers%,task%
  820IF windvers%<windman% THEN PROCfatal(prog$+" requires Window Manager V"+FNfraction(windman%)+" or later")
  830
  840REM Claim file buffer
  850maxboot%=0:buff%=0:REM No buffer claimed yet
  860minboot%=&800:REM Absolute minimum required (2K)
  870PROCclaim_buffer(minboot%)
  880
  890PROCmenu_initialise(256,256)
  900PROCgettemplates:REM Get window templates from file
  910PROCmakeicon:REM Create icon bar icon
  920PROCbuild_fs_names
  930PROCchoose_fs(0)
  940PROCfinishscan
  950PROCscanRMA
  960hand%=FNgettaskhand("TaskManager"):IF hand%:PROCvigay_running(hand%)
  970hand%=FNgettaskhand(" "):IF hand%:PROCicon_running(hand%)
  980hand%=FNgettaskhand("Thanatos"):IF hand%:PROCthan_running(hand%)
  990PROCstartscan(TRUE)
 1000PROCzerocounts
 1010PROCstatusinform("Idle")
 1020ENDPROC
 1030
 1040DEFPROCshutdown
 1050PROCreleaseRMA(buff%)
 1060SYS "XWimp_CloseDown",task%,!taskconst%
 1070IF multi%=FALSE THEN
 1080   PROCunset(prog$+"$Dir")
 1090   PROCunset(prog$+"$Version")
 1100   PROCunset("Sys$Path")
 1110ENDIF
 1120ENDPROC
 1130
 1140DEFPROCunset(v$)
 1150SYS "XOS_CLI","Unset "+v$
 1160ENDPROC
 1170
 1180DEFFNgettaskhand(taskname$)
 1190REM Many thanks to Martin Avison for this routine. It is very low level
 1200REM and "hacky" so may not work on future OS's :-(
 1210LOCAL handle%,ptr%:handle%=0
 1220SYS "XOS_Module",18,"TaskManager" TO ,,,,ptr%
 1230IF ptr% THEN
 1240   ptr%=ptr%!&1D4
 1250   REPEAT
 1260      IF ptr%?4=4:IF FNrtoz(ptr%+16)=taskname$:handle%=ptr%!12
 1270      ptr%=!ptr%
 1280   UNTIL ptr%=-1 OR handle%<>0
 1290ENDIF
 1300=handle%
 1310
 1320DEFPROCplotappicon(sprname$)
 1330sprname$=FNlower(sprname$)
 1340IF sprname$<>oldappicon$ THEN
 1350   PROCputdata(appicon%,"S"+sprname$,FALSE)
 1360   oldappicon$=sprname$
 1370ENDIF
 1380ENDPROC
 1390
 1400DEFPROCcheck(dir$,leafdir$)
 1410LOCAL off%,base%,num%,loop%,addr%,name$,fullname$,len%,gotboot%,type%,flags%,errblk%,gotappicon%,icon_name$,lowname$
 1420PROCwimp_poll(TRUE):IF quit%=TRUE OR scanning%=FALSE:ENDPROC
 1430base%=FNclaimRMA(size%)
 1440IF base%=0 THEN
 1450   PROCstatus_log("","Insufficient RMA - skipping deeper","")
 1460   ENDPROC
 1470ENDIF
 1480IF leafdir$<>"" THEN
 1490   dir$+="."+leafdir$
 1500   IF ASC(leafdir$)=33 THEN
 1510      REM is the application sprite already in memory?
 1520      SYS "XWimp_SpriteOp",40,,leafdir$ TO ;flags%
 1530      IF flags% AND 1:icon_name$="application" ELSE icon_name$=leafdir$
 1540   ELSE
 1550      icon_name$="directory"
 1560   ENDIF
 1570   PROCputdata(iconname%,leafdir$,FALSE)
 1580   PROCplotappicon(icon_name$)
 1590ENDIF
 1600PROCputdata(dirscan%,dir$,TRUE)
 1610off%=0:gotboot%=FALSE:gotappicon%=FALSE
 1620REPEAT
 1630   PROCwimp_poll(TRUE)
 1640   IF quit%=TRUE OR scanning%=FALSE THEN
 1650      num%=0
 1660   ELSE
 1670      addr%=base%
 1680      SYS "XOS_GBPB",10,dir$+CHR$(0),addr%,maxfiles%,off%,size%,"*"+CHR$(0) TO errblk%,,,num%,off%;flags%
 1690      IF flags% AND 1 THEN
 1700         PROCstatus_log("",FNrtoz(errblk%+4),"")
 1710         num%=0:scanning%=FALSE:badscan%=TRUE
 1720      ENDIF
 1730   ENDIF
 1740   IF num% THEN
 1750      FOR loop%=0 TO num%-1
 1760         obj%=addr%!16
 1770         len%=addr%!8:type%=(!addr%>>>8) AND &FFF
 1780         addr%+=20:name$=FNgetstring(addr%)
 1790         addr%=(addr%+4) DIV 4*4:REM Align to next word
 1800         IF obj%=2 THEN
 1810            numdirs%+=1:PROCdircount
 1820            PROCcheck(dir$,name$)
 1830         ELSE
 1840            numfiles%+=1:PROCfilecount
 1850            lowname$=FNlower(name$)
 1860            IF lowname$="!boot" THEN
 1870               gotboot%=TRUE
 1880               IF type%=&FEB:PROCcheck_for_boot_virus(dir$,name$,len%)
 1890            ENDIF
 1900            CASE type% OF
 1910            WHEN &FF8:IF len%>=archsize% OR innoc%=TRUE THEN
 1920                         PROCcheck_for_abs_virus(dir$,name$,len%)
 1930                      ENDIF
 1940                      IF len%>=11756 AND len%<=11766 AND lowname$="riscosext" THEN
 1950                         PROCfile_virus(dir$,name$,"Thanatos")
 1960                      ENDIF
 1970            WHEN &FF9
 1980               CASE lowname$ OF
 1990               WHEN "!sprites":gotappicon%=TRUE
 2000               WHEN "icon"
 2010                  obj%=-(len%=5574)-(len%=2616)*2
 2020                  IF obj%:PROCfile_virus(dir$,name$,"Icon"+STR$(obj%))
 2030               ENDCASE
 2040            WHEN &FFA:PROCcheck_for_mod_virus(dir$,name$,len%)
 2050            WHEN &FFB:PROCcheck_for_BASIC_virus(dir$,name$)
 2060            ENDCASE
 2070         ENDIF
 2080      NEXT
 2090  ENDIF
 2100UNTIL off%=-1 OR quit%=TRUE OR scanning%=FALSE
 2110IF gotboot%=FALSE AND ASC(leafdir$)=33 AND innoc%=TRUE AND quit%=FALSE AND scanning%=TRUE THEN
 2120   IF FNextend_innocboot(dir$,base%,0,gotappicon%) THEN
 2130      PROCstatus_log(dir$,"!Boot created & innoculated","")
 2140   ENDIF
 2150ENDIF
 2160PROCreleaseRMA(base%)
 2170ENDPROC
 2180
 2190DEFPROCnewinnoc
 2200numinnoc%+=1:PROCputdata(15,STR$(numinnoc%),FALSE)
 2210ENDPROC
 2220
 2230DEFPROCunsupported(virus$)
 2240PROCwarn(virus$+" detected in RMA - the current release of "+prog$+" cannot remove it from RMA. Please hard reset, re-run "+prog$+" ONLY and re-scan all suspect disks.")
 2250quit%=TRUE:scanning%=FALSE
 2260ENDPROC
 2270
 2280DEFPROCnotifyvirus(mess1$,mess2$,count%,rma%)
 2290IF rma% THEN
 2300   nummem%+=1:PROCputdata(13,STR$(nummem%),FALSE):mess1$+=" in RMA"
 2310ELSE
 2320   numdisk%+=1:PROCputdata(14,STR$(numdisk%),FALSE)
 2330ENDIF
 2340IF mess2$<>"":PROCputdata(dirscan%,mess2$+" Count: "+STR$(count%),FALSE)
 2350infect%=TRUE:PROCopenwindow
 2360PROCstatus_log("",mess1$+" found !","")
 2380ENDPROC
 2390
 2400DEFPROCholdit(secs%)
 2410LOCAL t%:t%=TIME+secs%*100
 2420REPEAT
 2430   PROCwimp_poll(FALSE)
 2440UNTIL TIME>t% OR quit%
 2450ENDPROC
 2460
 2470DEFPROCdelfile(m$,type$)
 2480IF FNoscli("Delete",m$,"") THEN
 2490  PROCstatus_log("",type$+" deleted",m$)
 2500ELSE
 2510  PROCstatus_log("","Couldn't delete "+type$,m$)
 2520ENDIF
 2530ENDPROC
 2540
 2550DEFFNoscli(l$,m$,r$)
 2560LOCAL flags%,again%,errblk%,osc$
 2570osc$=l$+" "+m$+" "+r$+" { > null: }"
 2580REPEAT
 2590   IF l$="RMKill" THEN
 2600      SYS "XWimp_StartTask",osc$ TO errblk%;flags%
 2610   ELSE
 2620      SYS "XOS_CLI",osc$ TO errblk%;flags%
 2630   ENDIF
 2640   again%=FALSE
 2650   IF flags% AND 1 THEN
 2660      CASE !errblk% OF
 2670      WHEN &108C9:
 2680         again%=FNyesno("Write-protected disk - retry disk write ?")
 2690      WHEN &108C3:again%=FNoscli("Access",m$,"WR")
 2700      ENDCASE
 2710      IF again%=FALSE:still%=TRUE
 2720   ENDIF
 2730UNTIL again%=FALSE
 2740=((flags% AND 1)=0)
 2750
 2760DEFFNwimperror(mess$,mask%)
 2770LOCAL click%
 2780SYS "XWimp_ReportError",STRING$(4,bl$)+mess$+bl$,mask%,prog$+" Warning"+bl$ TO ,click%
 2790=click%
 2800
 2810DEFFNyesno(mess$)=(FNwimperror(mess$,%10011)=1)
 2820
 2830DEFPROCwarn(mess$)
 2840LOCAL click%
 2850click%=FNwimperror(mess$,%10001)
 2860ENDPROC
 2870
 2880DEFPROCscanRMA
 2890LOCAL start%,flags%
 2900IF FNmodexists("Extend",start%) THEN
 2910   IF FNrtoz(start%+start%!&14)=extendhelp$ THEN
 2920      PROCextend_in_RMA(start%)
 2930   ENDIF
 2940ENDIF
 2950IF FNmodexists("TlodMod",start%) THEN
 2960   IF FNrtoz(start%+start%!&14)=cebithelp$ THEN
 2970      PROCcebit_in_RMA(start%)
 2980   ENDIF
 2990ENDIF
 3000start%=FNvector_scan(FileV%,0,&E3500024)
 3010IF start%:PROCarchie_in_RMA(start%)
 3020ENDPROC
 3030
 3040DEFFNmodexists(mod$,RETURN addr%)
 3050LOCAL flags%
 3060SYS "XOS_Module",18,mod$ TO ,,,addr%;flags%
 3070=((flags% AND 1)=0)
 3080
 3090DEFPROCextend_in_RMA(start%)
 3100LOCAL handle%
 3110handle%=FNgettaskhand(""):REM Save task handle
 3120IF handle% THEN
 3130REM This is a bug-fix :-) It allows the Extend Virus task
 3140REM to shutdown properly without crashing the Task Manager
 3150   start%!&40=handle%
 3160   P%=start%+&70
 3170   [OPT 0
 3180   LDR R2,start%+&64:CMP R2,#1:SWIGT "XOS_Module"
 3190   LDR R0,start%+&40:LDR R1,start%+&54
 3200   ]
 3210ENDIF
 3220PROCnotifyvirus("Extend Virus","Execution",start%!&34,TRUE)
 3230PROCkillmodule("Extend","Extend Virus")
 3240ENDPROC
 3250
 3260DEFPROCcebit_in_RMA(start%)
 3270PROCnotifyvirus("CeBit Virus","Infection",start%!cebitoff%,TRUE)
 3280REM Next line deviously flips UpCall trap to RELEASE vector instead...
 3290P%=start%+&FC:[OPT 0:SWI "XOS_Release":]
 3300start%!8=&EC:REM Point finalisation to modified trap code
 3310PROCkillmodule("TlodMod","CeBit Virus")
 3320ENDPROC
 3330
 3340DEFPROCkillmodule(mod$,name$)
 3350IF FNoscli("RMKill",mod$,"") THEN
 3360   PROCstatus_log("",name$+" killed from RMA","")
 3370ELSE
 3380   PROCstatus_log("","Couldn't kill "+name$+" from RMA","")
 3390   still%=TRUE
 3400ENDIF
 3410ENDPROC
 3420
 3430DEFPROCarchie_in_RMA(addr%)
 3440PROCnotifyvirus("ArchieVirus","",0,TRUE)
 3450SYS "XOS_Release",FileV%,addr%,0
 3460SYS "XOS_Module",7,,addr%
 3470PROCstatus_log("","ArchieVirus killed from RMA","")
 3480ENDPROC
 3490
 3500DEFFNexists(file$,type%)
 3510LOCAL found%,ftype%
 3520SYS "XOS_File",5,file$ TO found%,,ftype%
 3530ftype%=(ftype%>>>8) AND &FFF
 3540=(found%=1 AND type%=ftype%)
 3550
 3560DEFFNupper(s$)=FNflipstr(s$,ASC"a",ASC"z",-32)
 3570
 3580DEFFNlower(s$)=FNflipstr(s$,ASC"A",ASC"Z",32)
 3590
 3600DEFFNflipstr(s$,l%,h%,d%)
 3610LOCAL loop%,n$,c%:n$=""
 3620FOR loop%=1 TO LEN(s$)
 3630   c%=ASC(MID$(s$,loop%))
 3640   IF c%>=l% AND c%<=h%:c%+=d%
 3650   n$+=CHR$(c%)
 3660NEXT
 3670=n$
 3680
 3690DEFFNgetstring(RETURN addr%)
 3700LOCAL s$:s$=""
 3710WHILE ?addr%<>0:s$+=CHR$(?addr%):addr%+=1:ENDWHILE:=s$
 3720
 3730DEFPROCwimp_poll(check%)
 3740LOCAL reason%
 3750SYS "XWimp_Poll",0,poll% TO reason%
 3760CASE reason% OF
 3770WHEN 0:IF check%:PROCcheckcurfs:PROCscanRMA
 3780WHEN 2:SYS "XWimp_OpenWindow",,poll%:REM Info window drag
 3790WHEN 3:PROCclosewindow
 3800WHEN 6:PROCmouseclick
 3810WHEN 9:PROCmenuselect
 3820WHEN 17,18:PROCwimpmessage
 3830WHEN 19: PROCackwimpmessage
 3840ENDCASE
 3850ENDPROC
 3860
 3870DEFPROCcheckcurfs
 3880IF FNgetfsname(fsysnum%)="" THEN
 3890   PROCwarn(fsys$+" has been disabled - cannot scan that filing system")
 3900   PROCbuild_fs_names
 3910   PROCchoose_fs(0)
 3920   scanning%=FALSE:badscan%=TRUE
 3930ENDIF
 3940ENDPROC
 3950
 3960DEFPROCclosewindow
 3970SYS "XWimp_CloseWindow",,vkillwind%:REM Eval close box
 3980ENDPROC
 3990
 4000DEFPROCmouseclick
 4010CASE poll%!8 OF
 4020   WHEN 1,4:PROCstartup
 4030   WHEN   2:PROCshownewmenu
 4040ENDCASE
 4050ENDPROC
 4060
 4070DEFPROCshownewmenu
 4080LOCAL y%
 4090IF poll%!12=-2 THEN
 4100 y%=96+44*2
 4110 PROCbuild_menu(1)
 4120ELSE
 4130 y%=poll%!4+16
 4140 IFscanning%=FALSE THEN
 4150  CASE poll%!16 OF
 4160  WHEN 7, 9: PROCbuild_menu(2)
 4170  WHEN 8,10: PROCbuild_menu(3)
 4180  OTHERWISE: PROCbuild_menu(1)
 4190  ENDCASE
 4200 ELSE
 4210  PROCbuild_menu(1)
 4220 ENDIF
 4230ENDIF
 4240oldx%=!poll%-64:oldy%=y%:PROCshowoldmenu
 4250ENDPROC
 4260
 4270DEFPROCshowoldmenu
 4280SYS "XWimp_CreateMenu",,menu%,oldx%,oldy%
 4290ENDPROC
 4300
 4310DEFPROCopenwindow
 4320LOCAL x%,y%,sx%,sy%
 4330SYS "XWimp_GetWindowState",,vkillwind%
 4340IF opened%=FALSE THEN
 4350   REM Auto-centre window (but only for the very first time it is open)
 4360   SYS "XOS_ReadVduVariables",inbuff%,outbuff%
 4370   x%=outbuff%!8+1:x%=x%<<!outbuff%
 4380   y%=outbuff%!12+1:y%=y%<<outbuff%!4
 4390   sx%=vkillwind%!12-vkillwind%!4
 4400   sy%=vkillwind%!16-vkillwind%!8
 4410   vkillwind%!4=(x%-sx%)/2:vkillwind%!12=vkillwind%!4+sx%
 4420   vkillwind%!8=(y%-sy%+iconbar%/2)/2:vkillwind%!16=vkillwind%!8+sy%
 4430   opened%=TRUE
 4440ENDIF
 4450vkillwind%!28=-1:REM Open on top of everyone else
 4460SYS "XWimp_OpenWindow",,vkillwind%
 4470ENDPROC
 4480DATA 4,5,11,12,-1
 4490
 4500DEFPROCstartup
 4510CASE poll%!12 OF
 4520   WHEN -2:PROCopenwindow
 4530   WHEN vkillhand%:
 4540      CASE poll%!16 OF
 4550      WHEN 7,8,9,10: PROCshownewmenu
 4560      WHEN 19:IF scanning%:PROCfinishscan ELSE PROCstartscan(FALSE)
 4570      ENDCASE
 4580ENDCASE
 4590ENDPROC
 4600
 4610DEFPROCmenuselect
 4620LOCAL mouse%,item%
 4630item%=!poll%+1
 4640SYS "XWimp_GetPointerInfo",,poll%:mouse%=poll%!8
 4650CASE menubuilt% OF
 4660WHEN 1: CASE item% OF
 4670         WHEN numitems%:quit%=TRUE:REM Last Item = Quit
 4680        ENDCASE
 4690WHEN 2: PROCtick_option(menu%,fs_names$,fsys$)
 4700        PROCchoose_fs(item%-1)
 4710        PROCtick_option(menu%,fs_names$,fsys$)
 4720WHEN 3: PROCtick_option(menu%,fs_devices$,fdevice$)
 4730        PROCchoose_device(item%-1)
 4740        PROCtick_option(menu%,fs_devices$,fdevice$)
 4750ENDCASE
 4760IF mouse%=1:PROCshowoldmenu
 4770ENDPROC
 4780
 4790DEFPROCwimpmessage
 4800CASE poll%!16 OF
 4810   WHEN      0:quit%=TRUE:REM Shut down (Desktop Exit, Task Manager Quit)
 4820   WHEN &400C2:PROCappstart
 4830ENDCASE
 4840ENDPROC
 4850
 4860DEFPROCackwimpmessage
 4870IF poll%!16=5 THEN
 4880 REM no editor loaded - run it!
 4890 SYS"XWimp_StartTask","Run "+logname$
 4900ENDIF
 4910ENDPROC
 4920
 4930DEFPROCappstart
 4940REM Unlike, ahem, certain Acorn applications we could mention, it really
 4950REM is nice to make sure only one invocation of the program has been
 4960REM activated - this is done by checking a new task's name/handle
 4970LOCAL hand%:hand%=poll%!4
 4980IF hand%<>task% THEN
 4990   CASE FNrtoz(poll%+28) OF
 5000   WHEN prog$:quit%=TRUE:multi%=TRUE
 5010   WHEN "":PROCscanRMA
 5020   WHEN " ":PROCicon_running(hand%)
 5030   WHEN "TaskManager":PROCvigay_running(hand%)
 5040   WHEN "Thanatos":PROCthan_running(hand%)
 5050   ENDCASE
 5060ENDIF
 5070ENDPROC
 5080
 5090DEFPROCstatuserror(mess$)
 5100PROCputdata(status%,mess$,FALSE)
 5110PROCholdit(1)
 5120ENDPROC
 5130
 5140DEFPROCstatusinform(mess$)
 5150PROCputdata(status%,mess$,FALSE)
 5160PROCwimp_poll(FALSE)
 5170ENDPROC
 5180
 5190DEFFNicon_selected(icon%)
 5200!icondata%=vkillhand%:icondata%!4=icon%
 5210SYS"XWimp_GetIconState",,icondata%
 5220=((icondata%!24 AND (1<<21))=(1<<21))
 5230
 5240DEFPROCputdata(icon%,mess$,path%)
 5250REM Change icon 'icon%' to the string mess$
 5260REM Note that this assumes an indirected icon of course !
 5270LOCAL off%,len%
 5280!icondata%=vkillhand%:icondata%!4=icon%
 5290SYS "XWimp_GetIconState",,icondata%
 5300IF icon%=appicon% THEN
 5310   off%=32
 5320ELSE
 5330   off%=28:len%=icondata%!36-1
 5340   IF path% THEN
 5350      mess$=MID$(mess$,preflen%)
 5360      IF LEN(mess$)>len%:mess$="..."+RIGHT$(mess$,len%-3)
 5370   ELSE
 5380      mess$=LEFT$(mess$,len%)
 5390   ENDIF
 5400ENDIF
 5410$(icondata%!off%)=mess$
 5420icondata%!8=0:icondata%!12=0
 5430SYS "XWimp_SetIconState",,icondata%:REM Philp Colmer improvement
 5440ENDPROC
 5450
 5460DEFPROCmakeicon
 5470P%=icon%:REM Use built in assembler - easier to see structure
 5480[OPT 0
 5490                EQUD    iconbartype%    ; Icon bar 'utility' flag
 5500                EQUD    0               ; Bottom left X
 5510                EQUD    0               ; Bottom left Y
 5520                EQUD    69              ; Top right X
 5530                EQUD    68              ; Top right Y
 5540                EQUB    %00000010       ; Icon is a sprite
 5550                EQUB    %00110001       ; Click notifies/Indirected
 5560                EQUB    %00000000       ; Nothing special about icon
 5570                EQUB    %00000001       ; Forecol = 1, Backcol = 0
 5580.pokespname     EQUD    pokespname+12   ; Pointer to sprite name
 5590                EQUD    1               ; Pointer to WIMP sprites
 5600                EQUD    12              ; Length of sprite name
 5610.spritename     EQUS    "!vkiller"+STRING$(4,bl$) ; Sprite name
 5620]
 5630SYS "XWimp_CreateIcon",,icon% TO iconhand%
 5640ENDPROC
 5650
 5660DEFPROCgettemplates
 5670LOCAL flags%,dummy%
 5680SYS "XWimp_OpenTemplate",,vkillvar$+".Templates" TO ;flags%
 5690IF flags% AND 1:PROCfatal("Missing Templates file for "+prog$)
 5700vkillhand%=FNloadtemplate(vkillwind%,"VKillWindow")
 5710info%=FNloadtemplate(infowind%,"Info")
 5720SYS "XWimp_CloseTemplate"
 5730ENDPROC
 5740
 5750DEFFNloadtemplate(addr%,wind$)
 5760REM Note the +4 on the address - this allows the poking of the handle
 5770LOCAL windhand%,windptr%
 5780SYS "XWimp_LoadTemplate",,addr%+4,addr%+&700,addr%+&E00,-1,wind$,0 TO ,,,,,,windptr%
 5790IF windptr%=0:PROCfatal("Missing "+wind$+" window from "+prog$+"'s Templates file")
 5800SYS "XWimp_CreateWindow",,addr%+4 TO windhand%
 5810!addr%=windhand%:REM Store window handle because needed by later calls
 5820=windhand%
 5830
 5840DEFPROCsystemerror
 5850REM Why do I need this proc ? Well, the Wimp doesn't report the
 5860REM offending line number of an error !
 5870LOCAL err$
 5880IF ERR:err$=" at line "+STR$(ERL) ELSE err$=""
 5890ON ERROR OFF
 5900PROCfatal(REPORT$+err$)
 5910ENDPROC
 5920
 5930DEFPROCfatal(error$)
 5940OSCLI"Error 0 "+error$
 5950ENDPROC
 5960
 5970DEFFNgetfsname(fsnum%)
 5980LOCAL fsname%,fname$
 5990SYS "XOS_FSControl",33,fsnum%,fbuff%,12 TO ,,fsname%
 6000IF ?fsname% THEN
 6010   fname$=FNgetstring(fsname%)
 6020   CASE fname$ OF
 6030   WHEN "null","printer","serial","vdu","rawvdu","kbd","rawkbd","deskfs","msdos","netprint","pipe":fname$="":REM Not infectable
 6040   ENDCASE
 6050ELSE
 6060   fname$=""
 6070ENDIF
 6080=fname$
 6090
 6100DEFFNFSprefix(prefix$)
 6110=FNcheckswi("X"+prefix$+"_Drives")
 6120
 6130DEFFNcheckswi(swi$)
 6140LOCAL swi%,flags%
 6150SYS "XOS_SWINumberFromString",,swi$ TO swi%;flags%
 6160=((flags% AND 1)=0)
 6170
 6180DEFPROChackflags(icon%,eor%,clear%)
 6190!icondata%=vkillhand%
 6200icondata%!4=icon%
 6210icondata%!8=eor%
 6220icondata%!12=clear%
 6230SYS "XWimp_SetIconState",,icondata%
 6240ENDPROC
 6250
 6260DEFPROChilite(icon%,bool%)
 6270PROChackflags(icon%,((-bool%)<<21),&00200000)
 6280ENDPROC
 6290
 6300DEFPROCinit_log
 6310LOCAL f%,flags%,p%,f$
 6320IF logging%=FALSE:ENDPROC
 6330f$="XRamFS_FreeSpace":f%=0
 6340IF FNcheckswi(f$):SYS f$,":0" TO ,f%;flags%:IF flags% AND 1:f%=0
 6350IF f%<32768:logname$=vkillvar$+".Log" ELSE logname$="RAM:$.VKillerLog"
 6360SYS"XOS_File",11,logname$,&FFF TO p%;f%
 6370IF f% AND 1:PROCstop_log(p%)
 6380ENDPROC
 6390
 6400DEFPROCstop_log(eb%)
 6410PROCwarn("Logging of activities disabled: "+FNrtoz(eb%+4))
 6420logging%=FALSE
 6430ENDPROC
 6440
 6450DEFPROClog(s$)
 6460LOCAL c%,f%
 6470IF logging%=FALSE ENDPROC
 6480SYS"XOS_Find",&C0,logname$ TO c%;f%
 6490IF f% AND 1:PROCstop_log(c%):ENDPROC
 6500IFc%<>0 THEN
 6510 PTR#c%=EXT#c%
 6520 BPUT#c%,s$
 6530 CLOSE#c%
 6540ENDIF
 6550ENDPROC
 6560
 6570DEFPROCinfect_log(path$,mess$,suff$)
 6580still%=TRUE:infect%=TRUE
 6590PROCstatus_log(path$,mess$,suff$)
 6600ENDPROC
 6610
 6620DEFPROCstatus_log(path$,mess$,suff$)
 6630IF suff$<>"":suff$=" ("+suff$+")"
 6640IF path$="" THEN
 6650   PROClog(mess$+suff$)
 6660   PROCstatuserror(mess$)
 6670ELSE
 6680   PROClog(path$+"."+mess$+suff$)
 6690   PROCstatusinform(FNappname(path$)+"."+mess$)
 6700ENDIF
 6710ENDPROC
 6720
 6730DEFFNappname(path$)
 6740LOCAL l%:l%=LEN(path$)
 6750WHILE l%>0 AND MID$(path$,l%,1)<>".":l%-=1:ENDWHILE
 6760=MID$(path$,l%+1)
 6770
 6780DEFPROCfilecount
 6790PROCputdata(fileicon%,STR$(numfiles%),FALSE)
 6800ENDPROC
 6810
 6820DEFPROCdircount
 6830PROCputdata(diricon%,STR$(numdirs%),FALSE)
 6840ENDPROC
 6850
 6860DEFPROCfinishscan
 6870PROCputdata(19,"Start scan",FALSE)
 6880PROCputdata(dirscan%,"Idle",FALSE)
 6890PROCputdata(iconname%,"Idle",FALSE)
 6900PROCplotappicon("!"+prog$)
 6910scanning%=FALSE
 6920ENDPROC
 6930
 6940DEFPROCzerocounts
 6950numdirs%=0:numfiles%=0:PROCfilecount:PROCdircount
 6960ENDPROC
 6970
 6980DEFPROCstartscan(self%)
 6990LOCAL prefix$,dev$
 7000PROCputdata(19,"Stop scan",FALSE)
 7010scanning%=TRUE:infect%=FALSE:still%=FALSE:badscan%=FALSE
 7020PROCzerocounts
 7030IF self% THEN
 7040   prefix$=vkillvar$:dev$=vkillvar$:preflen%=1
 7050   innoc%=FALSE:logging%=FALSE
 7060ELSE
 7070   prefix$=FNbuild_path:dev$="Device":preflen%=LEN(prefix$)
 7080   innoc%=FNicon_selected(20)
 7090   logging%=FNicon_selected(21)
 7100ENDIF
 7110IF preflen% THEN
 7120 PROCinit_log
 7130 PROClog("Scan of "+prefix$+" started on "+TIME$)
 7140 PROCstatusinform("Scan started")
 7150 PROCcheck(prefix$,"")
 7160 PROChilite(23,FALSE)
 7170 IF scanning% THEN
 7180    PROClog("Scan of "+prefix$+" finished on "+TIME$)
 7190    IF self%=FALSE THEN
 7200       numscans%+=1:PROCputdata(17,STR$(numscans%),FALSE)
 7210    ENDIF
 7220    IF infect% THEN
 7230       IF still% THEN
 7240          PROCstatus_log("",dev$+" may still be infected !","")
 7250       ELSE
 7260          PROCstatus_log("",dev$+" was infected, but now clean","")
 7270       ENDIF
 7290    ELSE
 7300       PROCstatus_log("",dev$+" is clean - no infections","")
 7310    ENDIF
 7320 ELSE
 7330    IF badscan%=FALSE THEN
 7340       PROCstatus_log("","Scan manually aborted","")
 7350    ENDIF
 7360 ENDIF
 7370 IF self%=FALSE:PROCopenwindow
 7380 REM now ask an editor to pick up the log file
 7390 IFlogging% THEN
 7400  !poll%=(48+LENlogname$)ANDNOT3
 7410  poll%!12=0
 7420  poll%!16=5
 7430  poll%!36=-2
 7440  poll%!40=&FFF
 7450  $(poll%+44)=logname$+CHR$0
 7460  SYS"XWimp_SendMessage",18,poll%,0
 7470  REM and give the editor a chance to do so
 7480  PROCwimp_poll(FALSE)
 7490 ENDIF
 7500ENDIF
 7510PROCfinishscan
 7520ENDPROC
 7530
 7540DEFFNmakestring(addr%,len%)
 7550LOCAL loop%,s$:s$=""
 7560FOR loop%=0 TO len%-1:s$=s$+CHR$(loop%?addr%):NEXT:=s$
 7570
 7580DEFPROCbuild_fs_names
 7590REM this procedure scans for all of the possible filing systems
 7600REM and builds a menu structure string from the result
 7610LOCAL i%
 7620fs_names$="#Filing Sys,"
 7630FORi%=1 TO maxfs%
 7640 REM add this FS name to the string
 7650 fs_names$+=FNgetfsname(i%)+","
 7660 REM if there wasn't a name there, remove the last comma
 7670 IFRIGHT$(fs_names$,2)=",," fs_names$=LEFT$(fs_names$)
 7680NEXT
 7690REM always remove the last comma
 7700fs_names$=LEFT$(fs_names$)
 7710ENDPROC
 7720
 7730DEFPROCchoose_fs(s%)
 7740LOCAL i%,j%,s$
 7750REM get the s% entry from fs_names$ and save that
 7760s$=fs_names$
 7770FORi%=0 TO s%
 7780 j%=INSTR(s$,",")
 7790 IFj%=0 THEN
 7800  PROCwarn("Cannot find FS "+STR$(s%)+" - aborting "+prog$)
 7810  quit%=TRUE
 7820  scanning%=FALSE
 7830  ENDPROC
 7840 ENDIF
 7850 s$=MID$(s$,j%+1)
 7860NEXT
 7870i%=INSTR(s$,","):IFi%=0 i%=LEN(s$)+1
 7880fsys$=LEFT$(s$,i%-1)
 7890REM get the filing system number
 7900SYS"XOS_FSControl",13,fsys$+CHR$(0),0 TO ,fsysnum%
 7910PROCputdata(7,fsys$,FALSE)
 7920REM now rebuild the devices list
 7930PROCbuild_devices_list
 7940PROCchoose_device(0)
 7950ENDPROC
 7960
 7970DEFPROCbuild_devices_list
 7980LOCAL i%,j%,numflop%,numhard%,s$
 7990fs_devices$="#Devices,"
 8000REM this is going to be REALLY tacky code
 8010REM first of all, we need to get rid of the exceptions
 8020REM
 8030REM Econet
 8040REM ~~~~~~
 8050REM Build a list of logged on-to file servers
 8060IFfsys$="net" THEN
 8070 i%=0
 8080 REPEAT
 8090  REM we'll load the info into buff ... it isn't being used at this time!
 8100  SYS"NetFS_EnumerateFS",i%,buff%,maxboot%,1 TO i%,,,j%
 8110  IFj%=1 THEN
 8120   fs_devices$+=FNrtoz(buff%+3)
 8130   WHILE RIGHT$(fs_devices$)=" "
 8140    fs_devices$=LEFT$(fs_devices$)
 8150   ENDWHILE
 8160   fs_devices$+=","
 8170  ENDIF
 8180 UNTIL i%=-1
 8190 IFfs_devices$="#Devices," THEN
 8200  fs_devices$+="(None)"
 8210 ELSE
 8220  fs_devices$=LEFT$(fs_devices$)
 8230 ENDIF
 8240 ENDPROC
 8250ENDIF
 8260REM
 8270REM NFS
 8280REM ~~~
 8290REM Build a list of NFS mounts
 8300IFfsys$="nfs" THEN
 8310 i%=0
 8320 REPEAT
 8330  SYS"NFS_MountList",0,i% TO ,i%
 8340  IFi%<>0 THEN
 8350   fs_devices$+=FNrtoz(i%)+","
 8360  ENDIF
 8370 UNTIL i%=0
 8380 IFfs_devices$="#Devices," THEN
 8390  fs_devices$+="(None)"
 8400 ELSE
 8410  fs_devices$=LEFT$(fs_devices$)
 8420 ENDIF
 8430 ENDPROC
 8440ENDIF
 8450REM
 8460REM FileCore based filing systems
 8470REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 8480REM Try to determine which "drives" this FS supports
 8490IFfsys$="ram" THEN
 8500 s$="RamFS"
 8510ELSE
 8520 IFFNFSprefix(fsys$) THEN
 8530  s$=fsys$
 8540 ELSE
 8550  s$=FNupper(fsys$)
 8560  IFFNFSprefix(s$)=FALSE THEN
 8570   IF RIGHT$(s$,2)="FS":s$=LEFT$(s$,LEN(s$)-2) ELSE s$+="FS"
 8580   IFFNFSprefix(s$)=FALSE THEN
 8590    fs_devices$+="(None)"
 8600    ENDPROC
 8610   ENDIF
 8620  ENDIF
 8630 ENDIF
 8640ENDIF
 8650REM OK, we have a FileCore FS. Now build the list
 8660SYS "X"+s$+"_Drives" TO ,numflop%,numhard%
 8670IFnumflop%<>0 THEN
 8680 FORi%=0 TO numflop%-1
 8690  fs_devices$+=STR$(i%)+","
 8700 NEXT
 8710ENDIF
 8720IFnumhard%<>0 THEN
 8730 FORi%=0 TO numhard%-1
 8740  fs_devices$+=STR$(i%+4)+","
 8750 NEXT
 8760ENDIF
 8770fs_devices$=LEFT$(fs_devices$)
 8780ENDPROC
 8790
 8800DEFFNrtoz(p%)=FNgetstring(p%)
 8810
 8820DEFPROCchoose_device(s%)
 8830LOCAL i%,j%,s$
 8840REM get the s% entry from fs_names$ and save that
 8850s$=fs_devices$
 8860FORi%=0 TO s%
 8870 j%=INSTR(s$,",")
 8880 IFj%=0 THEN
 8890  ERROR 1, "Device menu has not been cleanly built"
 8900 ELSE
 8910  s$=MID$(s$,j%+1)
 8920 ENDIF
 8930NEXT
 8940i%=INSTR(s$,","):IFi%=0 i%=LEN(s$)+1
 8950fdevice$=LEFT$(s$,i%-1)
 8960PROCputdata(8,fdevice$,FALSE)
 8970ENDPROC
 8980
 8990DEFFNbuild_path
 9000REM this procedure builds a valid path depending on the filing system
 9010REM as with building the devices list, we deal with the tacky ones first
 9020IF fsys$="net" THEN
 9030 IF fdevice$="(None)" THEN
 9040  PROCstatusinform("Which file server?")
 9050  =""
 9060 ELSE
 9070  ="net#"+fdevice$+":&"
 9080 ENDIF
 9090ENDIF
 9100IF fsys$="nfs" THEN
 9110 IF fdevice$="(None)" THEN
 9120  PROCstatusinform("Which NFS mount?")
 9130  =""
 9140 ELSE
 9150  ="NFS::"+fdevice$+".$"
 9160 ENDIF
 9170ENDIF
 9180IFfdevice$="(None)" THEN
 9190 =fsys$+":$"
 9200ENDIF
 9210=fsys$+"::"+fdevice$+".$"
 9220
 9230DEFPROCbuild_menu(i%)
 9240menubuilt%=i%
 9250CASE i% OF
 9260WHEN 1: REM icon bar menu
 9270        menu%=FNcreate_menu("#"+prog$+",Info,Quit")
 9280        PROCmenu_attach(menu%,0,info%)
 9290        numitems%=2
 9300WHEN 2: REM filing systems menu
 9310        PROCbuild_fs_names
 9320        menu%=FNcreate_menu(fs_names$)
 9330        PROCtick_option(menu%,fs_names$,fsys$)
 9340WHEN 3: REM filing system devices
 9350        PROCbuild_devices_list
 9360        menu%=FNcreate_menu(fs_devices$)
 9370        PROCtick_option(menu%,fs_devices$,fdevice$)
 9380ENDCASE
 9390ENDPROC
 9400
 9410DEFPROCtick_option(menu%,list$,item$)
 9420LOCAL i%,j%
 9430REM lose the header from the list
 9440i%=INSTR(list$,","):list$=MID$(list$,i%+1)
 9450WHILE list$<>""
 9460 i%=INSTR(list$,","):IFi%=0 i%=LEN(list$)+1
 9470 IFitem$=LEFT$(list$,i%-1) THEN
 9480  PROCmenu_tick(menu%,j%)
 9490  list$=""
 9500 ELSE
 9510  list$=MID$(list$,i%+1)
 9520  j%+=1
 9530 ENDIF
 9540ENDWHILE
 9550ENDPROC
 9560
 9570DEFPROCmenu_initialise(men_ws%,men_df%)
 9580menu_max_ws%=men_ws%:DIM menu_ws% men_ws%
 9590menu_max_df%=men_df%:DIM menu_df% men_df%
 9600menu_end%=menu_df%+men_df%
 9610menu_curws%=menu_ws%
 9620ENDPROC
 9630
 9640DEFFNcreate_menu(menu$)
 9650LOCAL M%,m$,I%,menuptr%,maxx%
 9660REM in this particular application, there are no sub menus
 9670REM and only one actively created menu, so it is PERFECTLY
 9680REM safe to reset the menu pointers
 9690menu_df%=menu_end%-menu_max_df%
 9700menu_curws%=menu_ws%
 9710IF (menu_df%+28>menu_end%) ERROR 1, "Out of menu workspace - increase 2nd parameter to initialisation"
 9720menuptr%=menu_df%
 9730I%=0
 9740IF LEFT$(menu$,1)="#" THEN
 9750 I%=1
 9760 menutitle$=FNmenu_par(menu$,",",I%)
 9770ELSE
 9780 menutitle$=""
 9790ENDIF
 9800$menuptr%=LEFT$(menutitle$,12)
 9810menuptr%?12=7
 9820menuptr%?13=2
 9830menuptr%?14=7
 9840menuptr%?15=0
 9850menuptr%!16=196
 9860menuptr%!20=44
 9870menuptr%!24=0
 9880menuptr%+=28
 9890maxx%=LENmenutitle$-3
 9900REPEAT
 9910 item$=FNmenu_par(menu$,",",I%)
 9920 PROCmenu_item(item$,maxx%,menuptr%)
 9930UNTIL item$=""
 9940M%=menu_df%
 9950M%!16=(maxx%*8+6)*2
 9960menu_df%=menuptr%
 9970=M%
 9980:
 9990DEFPROCmenu_tick(menuhandle%,item%)
10000menuhandle%!(28+24*item%)=menuhandle%!(28+24*item%)EOR 1
10010ENDPROC
10020:
10030DEFFNmenu_par(menu$,sep$,RETURN I%)
10040LOCAL L%
10050L%=I%+1
10060I%=INSTR(menu$+sep$,sep$,L%)
10070=MID$(menu$,L%,I%-L%)
10080:
10090DEFPROCmenu_item(text$,RETURN maxx%,RETURN menuptr%)
10100LOCAL I%,F%,L%
10110IF text$="" menuptr%!-24=(menuptr%!-24)OR &80:ENDPROC
10120IF (menuptr%+24>menu_end%) ERROR 1, "Out of menu workspace - increase 2nd parameter to initialisation"
10130F%=&00
10140IF RIGHT$(text$,1)="#" text$=LEFT$(text$):F%+=&02:REM dotted line follows item
10150IF RIGHT$(text$,1)="@" text$=LEFT$(text$):F%+=&08:REM generate a menu warning
10160menuptr%!0=F%
10170menuptr%!4=-1
10180menuptr%!8=&07000021
10190IF LEFT$(text$,1)="$" THEN
10200 !menuptr%+=&04                                  :REM item is writeable
10210 text$=STRING$(12," ")
10220ELSE
10230 IF LENtext$<=12 THEN
10240  $(menuptr%+12)=text$
10250 ELSE
10260  I%=FNmenu_workspace(LENtext$+1):$I%=text$
10270  menuptr%!12=I%:menuptr%!16=-1:menuptr%!20=LENtext$+1
10280  menuptr%!8=menuptr%!8OR &100
10290 ENDIF
10300ENDIF
10310IF LENtext$>maxx% maxx%=LENtext$
10320menuptr%+=24
10330ENDPROC
10340:
10350DEFPROCmenu_attach(menu%,item%,ptr%)
10360menu%+=28+item%*24
10370menu%!4=ptr%
10380ENDPROC
10390:
10400DEFFNmenu_workspace(L%)
10410IF menu_curws%+L%>menu_ws%+menu_max_ws% ERROR task_fatal%, "Out of menu workspace - increase 1st parameter to initialisation"
10420menu_curws%+=L%
10430=menu_curws%-L%
10440:
10450REM ---------------------------------------------------------------------------
10460REM Virus checking code goes here ...
10470REM ---------------------------------------------------------------------------
10480:
10490DEFPROCcheck_for_mod_virus(dir$,name$,len%)
10500CASE FNlower(name$) OF
10510WHEN "tlodmod"
10520   IF len%=1240 THEN
10530      PROCfix_module(dir$+"."+name$,"CeBit Virus","Infection",cebitoff%)
10540   ENDIF
10550WHEN "monitorrm","checkmod","extendrm","osextend","colourrm","fastmod","coderm","memrm"
10560   IF len%=940 THEN
10570      PROCfix_module(dir$+"."+name$,"Extend Virus","Execution",&34)
10580   ENDIF
10590WHEN "taskalloc"
10600   IF len%=344:PROCfile_virus(dir$,name$,"Thanatos")
10610ENDCASE
10620ENDPROC
10630
10640DEFPROCfix_module(mod$,name$,type$,offset%)
10650LOCAL count%
10660IF FNoscli("Load",mod$,STR$~buff%):count%=buff%!offset% ELSE count%=0
10670name$=name$+" module"
10680PROCnotifyvirus(name$,type$,count%,FALSE)
10690PROCdelfile(mod$,name$)
10700ENDPROC
10710:
10720DEFPROCclaim_buffer(claim%)
10730IF claim%>maxboot% THEN
10740   PROCreleaseRMA(buff%)
10750   maxboot%=(claim%+&3FF) DIV &400*&400
10760   REPEAT
10770      buff%=FNclaimRMA(maxboot%)
10780      IF buff%=0:maxboot%-=&400
10790   UNTIL buff%>0 OR maxboot%<minboot%
10800   IF maxboot%<minboot% THEN
10810      PROCwarn("Cannot claim RMA for file buffer - aborting")
10820      quit%=TRUE:scanning%=FALSE:maxboot%=0
10830   ENDIF
10840ENDIF
10850ENDPROC
10860:
10870DEFPROCcheck_for_boot_virus(path$,name$,l%)
10880LOCAL doinnoc%,s%,t%,u%,s$,olds$,core$,scratch%,force%,oldl%
10890PROCclaim_buffer(l%+protlen%+1)
10900IF l%+protlen%+1>maxboot% THEN
10910   PROCinfect_log(path$,"!Boot too big - not scanned","")
10920   ENDPROC
10930ENDIF
10940doinnoc%=innoc%:core$=FNappname(path$)+".!Boot"
10950scratch%=FALSE
10960IF FNoscli("Load",path$+"."+name$,STR$~buff%) THEN
10970   REPEAT
10980      force%=FALSE:s%=-1:olds$=""
10990      REPEAT
11000         t%=s%+1
11010         REPEAT
11020            s%+=1:u%=buff%?s%
11030         UNTIL u%<32 OR u%>126 OR s%>=l%
11040         IF s%<l% THEN
11050            buff%?s%=&D:s$=$(buff%+t%):buff%?s%=u%
11060            CASE s$ OF
11070            WHEN icon1wimp$:oldl%=t%
11080            WHEN cebitobey$
11090               PROCnotifyvirus("CeBit Virus in "+core$,"",0,FALSE)
11100               u%=buff%?(t%-2):l%=t%+(u%=&FF)+(u%=&A)
11110               doinnoc%=TRUE:force%=TRUE
11120            WHEN vigayobey$
11130               PROCnotifyvirus("Vigay Virus in "+core$,"",0,FALSE)
11140               l%=0:doinnoc%=TRUE:scratch%=TRUE
11150            WHEN icon1obey$
11160               IF olds$=icon1wimp$ THEN
11170                  PROCnotifyvirus("Icon Virus in "+core$,"",0,FALSE)
11180                  l%=oldl%:doinnoc%=TRUE:force%=TRUE
11190               ENDIF
11200            WHEN thanobey$
11210               PROCnotifyvirus("Thanatos Virus in "+core$,"",0,FALSE)
11220               doinnoc%=TRUE:force%=TRUE:l%=t%
11230            ENDCASE
11240            olds$=s$
11250         ENDIF
11260      UNTIL s%>=l%
11270      IF l% THEN
11280         CASE buff%?(l%-1) OF
11290         WHEN &FF:IF l%>4 THEN
11300                     CASE buff%?(l%-4) OF
11310                     WHEN 13
11320                        PROCnotifyvirus("Extend Virus in "+core$,"",0,FALSE)
11330                        l%=l%-4:doinnoc%=TRUE
11340                        WHILE l%>0 AND buff%?(l%-1)<>&D:l%=l%-1:ENDWHILE
11350                        buff%?(l%-1)=&A
11360                     WHEN 10
11370                        IF force% THEN
11380                           l%-=protlen%
11390                        ELSE
11400                           doinnoc%=FALSE
11410                           PROCstatus_log(path$,"!Boot already innoculated","against Extend Virus")
11420                        ENDIF
11430                     OTHERWISE doinnoc%=force%
11440                     ENDCASE
11450                  ENDIF
11460         WHEN &0A:REM Normal terminator
11470         OTHERWISE buff%?l%=&A:l%+=1:REM Add LF on end
11480         ENDCASE
11490      ELSE
11500         scratch%=FNexists(path$+".!Sprites",&FF9)
11510      ENDIF
11520   UNTIL force%=FALSE
11530ELSE
11540   doinnoc%=FALSE
11550   PROCinfect_log(path$,"!Boot could not be loaded","")
11560ENDIF
11570IF doinnoc% THEN
11580   IF l%+protlen%+1>maxboot% THEN
11590      PROCinfect_log(path$,"!Boot too big - not innoculated","against Extend Virus")
11600   ELSE
11610      IF FNextend_innocboot(path$,buff%,l%,scratch%) THEN
11620         PROCstatus_log(path$,"!Boot is now innoculated","against Extend Virus")
11630      ENDIF
11640   ENDIF
11650ENDIF
11660ENDPROC
11670:
11680DEFFNextend_innocboot(dir$,a%,len%,addicon%)
11690LOCAL good%,n$:good%=FALSE:n$=dir$+".!Boot"
11700IF addicon%:$(a%+len%)=icon$:len%+=iconlen%
11710$(a%+len%)=protect$
11720IF FNoscli("Save",n$,STR$~a%+" "+STR$~(a%+len%+protlen%)) THEN
11730   IF FNoscli("SetType",n$,"Obey"):good%=TRUE:PROCnewinnoc
11740ENDIF
11750IF good%=FALSE:PROCinfect_log(dir$,"!Boot could not be innoculated","")
11760=good%
11770:
11780DEFPROCcheck_for_abs_virus(dir$,n$,RETURN l%)
11790LOCAL doinnoc%,handle%,flags%,cancel%,replace%,end$,name$
11800name$=dir$+"."+n$
11810replace%=FALSE
11820handle%=OPENIN name$
11830IF handle% THEN
11840   doinnoc%=innoc%
11850   IF FNabs_readptr(handle%,l%-16,16,end$,dir$,n$) THEN
11860      IF RIGHT$(end$,8)="Hypo1210" THEN
11870         doinnoc%=FALSE
11880         PROCstatus_log(dir$,n$+" already innoculated","against ArchieVirus")
11890      ELSE
11900         IF RIGHT$(end$,4)="1210" THEN
11910            PROCnotifyvirus("ArchieVirus in "+FNappname(dir$)+"."+n$,"Decrement",!seekbuff%,FALSE)
11920            doinnoc%=TRUE:replace%=TRUE
11930         ENDIF
11940      ENDIF
11950   ELSE
11960      doinnoc%=FALSE
11970   ENDIF
11980   SYS "XOS_Find",0,handle%:REM Close file
11990ELSE
12000   doinnoc%=FALSE
12010ENDIF
12020IF doinnoc% THEN
12030   handle%=0
12040   REM Yes, 2 *Access's needed (no I/O if already set to, say, WR)
12050   IF FNoscli("Access",name$,"RL") THEN
12060      IF FNoscli("Access",name$,"WR") THEN
12070         handle%=OPENUP name$
12080         IF handle% THEN
12090            IF replace% THEN
12100               doinnoc%=FNabs_writeptr(handle%,0,MID$(end$,5,4),dir$,n$)
12110               IF doinnoc%:l%=l%-archsize%:REM Shrink file length
12120            ENDIF
12130            IF doinnoc% THEN
12140               IF FNabs_writeptr(handle%,l%,"Hypo1210",dir$,n$) THEN
12150                  l%+=8:EXT#handle%=l%:REM Truncate (allow for innoc)
12160                  PROCnewinnoc
12170                  PROCstatus_log(dir$,n$+" has been innoculated","against ArchieVirus")
12180               ENDIF
12190            ENDIF
12200            SYS "XOS_Find",0,handle%:REM Close file
12210         ENDIF
12220      ENDIF
12230   ENDIF
12240ENDIF
12250IF handle%=0 THEN
12260   PROCinfect_log(dir$,n$+" could not be opened","")
12270ENDIF
12280ENDPROC
12290:
12300DEFPROCcheck_for_BASIC_virus(dir$,name$)
12310CASE FNlower(name$) OF
12320WHEN "datadqm":IF len%=2311:PROCfile_virus(dir$,name$,"Vigay")
12330ENDCASE
12340ENDPROC
12350:
12360DEFPROCfile_virus(d$,n$,name$)
12370name$+=" Virus"
12380PROCnotifyvirus(name$+" in "+FNappname(d$)+"."+n$,"",0,FALSE)
12390PROCdelfile(d$+"."+n$,name$)
12400ENDPROC
12410:
12420DEFPROCkill_virus_task(hand%,name$)
12430name$+=" Virus"
12440PROCnotifyvirus(name$,"",0,TRUE)
12450IF hand% THEN
12460   !poll%=20:poll%!12=0:poll%!16=0
12470   SYS "XWimp_SendMessage",17,poll%,hand%
12480ENDIF
12490PROCstatus_log("",name$+" killed","")
12500ENDPROC
12510:
12520DEFPROCvigay_running(hand%)
12530IF FNgetfromtask(hand%,bas_start%+&1C,10)="PAUL VIGAY" THEN
12540   PROCkill_virus_task(hand%,"Vigay")
12550ENDIF
12560ENDPROC
12570:
12580DEFPROCicon_running(hand%)
12590CASE FNgetfromtask(hand%,bas_start%+&E6,6) OF
12600WHEN "random":PROCmodify_kill(hand%,&1A5,"","Icon1")
12610WHEN "e as p":PROCmodify_kill(hand%,&43D,"","Icon2")
12620ENDCASE
12630ENDPROC
12640:
12650DEFPROCthan_running(hand%)
12651LOCAL addr%
12660IF FNgetfromtask(hand%,bas_start%+&A,8)="Sys$Path" THEN
12661   IF FNgetfromtask(hand%,bas_start%+&315,5)="*dbg*":addr%=&2F1 ELSE addr%=&2A3
12690   PROCmodify_kill(hand%,addr%,"    ","Thanatos")
12700ENDIF
12710ENDPROC
12720:
12730DEFPROCmodify_kill(hand%,off%,hack$,name$)
12740LOCAL s$,t$
12750s$=hack$+CHR$(&B9)+CHR$(&D)+CHR$(&40)+CHR$(0)
12760t$=CHR$(&C8)+CHR$(&99)+"&600DD,&"+STR$~hand%+",&4B534154:"+CHR$(&C8)+CHR$(&99)+"17"+CHR$(&D)+CHR$(&FF)
12770PROCsendtotask(hand%,bas_start%+off%,s$+CHR$(LEN(t$)+2)+t$)
12780PROCkill_virus_task(-(LEN(hack$)>1)*hand%,name$)
12790ENDPROC
12800:
12810DEFFNabs_writeptr(file%,pos%,mess$,dir$,name$)
12820LOCAL flags%,p%
12830$seekbuff%=mess$
12840SYS "XOS_GBPB",1,file%,seekbuff%,LEN(mess$),pos% TO p%;flags%
12850=FNabs_checkerror(flags%,dir$,name$,"writing",p%)
12860:
12870DEFFNabs_readptr(file%,pos%,len%,RETURN s$,dir$,n$)
12880LOCAL flags%,p%
12890SYS "XOS_GBPB",3,file%,seekbuff%,len%,pos% TO p%;flags%
12900s$=FNmakestring(seekbuff%,len%)
12910=FNabs_checkerror(flags%,dir$,n$,"reading",p%)
12920:
12930DEFFNabs_checkerror(f%,dir$,n$,op$,p%)
12940IF f% AND 1 THEN
12950   PROCinfect_log(dir$,n$+" could not be accessed","(for "+op$+", reason: "+FNrtoz(p%+4)+")")
12960   doinnoc%=FALSE
12970ENDIF
12980=((f% AND 1)=0)
12990
13000DEFFNclaimRMA(amount%)
13010LOCAL addr%,flags%
13020IF amount%:SYS "XOS_Module",6,,,amount% TO ,,addr%;flags% ELSE =0
13030IF flags% AND 1:=0 ELSE =addr%
13040
13050DEFPROCreleaseRMA(addr%)
13060IF addr%:SYS "XOS_Module",7,,addr%
13070ENDPROC
13080
13090DEFFNgetfromtask(hand%,addr%,len%)
13100LOCAL flags%
13110SYS "XWimp_TransferBlock",hand%,addr%,task%,seekbuff%,len% TO ;flags%
13120IF flags% AND 1:="" ELSE =FNmakestring(seekbuff%,len%)
13130
13140DEFPROCsendtotask(hand%,addr%,str$)
13150$seekbuff%=str$
13160SYS "XWimp_TransferBlock",task%,seekbuff%,hand%,addr%,LEN(str$)
13170ENDPROC
13180
13190DEFFNvector_scan(vect%,off%,instr%)
13200LOCAL chain%,trap%,addr%
13210chain%=vbase%!(vect%*4):addr%=0
13220WHILE chain%<>0 AND addr%=0
13230   trap%=chain%!8:IF trap%!off%=instr%:addr%=trap%+off%
13240   chain%=!chain%
13250ENDWHILE
13260=addr%

� >$.!VKiller.!RunImage
2� Virus Killer V2.30 (C) Richard K. Lloyd 1991
1� Currently kills:  Discovered by:   Attacks:
(4� Extend Virus      Simon Burrows    !Boot files
27� ArchieVirus       Hugo Fiennes     Absolute files
<4� CeBit Virus       ?                !Boot files
F4� Vigay Virus       Gordon Sinclair  !Boot files
P4� Icon1 and Icon2   Stuart Tyrrell   !Boot files
Z4� Thanatos Virus    Alan Glover      !Boot files
d
n� Recommended CD:
xB� B-52's "Cosmic Thing". Weird at first, but it grows on you !
�
�� General error trapper
�� � �systemerror
�
�"quit%=�:� Nothing happened yet
�	�init
�ȕ � quit%
�   �wimp_poll(�)
��
�
�
�shutdown
�ș "OS_Exit"
�

��init
.multi%=�:� Not a multiple invocation (yet)
6maxfiles%=16:� Number of objects read in at a time
"Imaxfs%=127:� Highest known FS number (may eventually need increasing)
,ksize%=maxfiles%*64:� Max files per dir and 64 bytes per file info (increased to allow for longer names)
63� fbuff% 12,inbuff% 20,outbuff% 20,seekbuff% 64
@)� �t@Q:� x%=0 � 16 � 4:� x%!inbuff%:�
J1icon$="IconSprites <Obey$Dir>.!Sprites"+�(&A)
Ticonlen%=�(icon$)
^Zprotect$="| This file has been innoculated against the Extend Virus"+�(&A)+"||"+�(&FF)
hprotlen%=�(protect$)
r7extendhelp$="Extend"+�(9)+�(9)+"1.56 (08 Jul 1989)"
|Ucebithelp$="TlodMod"+�(9)+�(9)+"1.11 (11 Nov 1990) by Devil the LORD OF DARKNESS"
�7cebitobey$="rme. TlodMod 0 rml. <Obey$Dir>.TlodMod"
�+vigayobey$="RUN ""<Obey$Dir>.datadqm"""
�+icon1wimp$="wimpslot -min 16k -max 16k"
�,icon1obey$="BASIC -quit <Obey$Dir>.Icon"
�(thanobey$="Run <Obey$Dir>.RISCOSext"
�.cebitoff%=&4C4:� Offset of infection count
�-archsize%=&398:� Size of ArchieVirus code
�4bas_start%=&8F00:� Start address for BASIC progs
�Evbase%=&8C8:� Base of vector table (may be RISC OS 2.00 specific)
�FileV%=8:� OS_File vector
�)deffs$="adfs":� Default filing system
�.oldappicon$="":� Previous application icon
�,infect%=�:still%=�:� No virus checks yet
Anummem%=0:numdisk%=0:numinnoc%=0:numscans%=0:� Reset counters
7fsysnum%=0:fsys$="":� Not checked filing system yet
*innoc%=�:� Not innoculating by default
&'logging%=�:� Not logging by default
0+opened%=�:� Dialogue box not opened yet
:
D� Application Constants
N2prog$="VKiller":� English text name of program
XGș "XOS_CLI","Set "+prog$+"$Version 2.30":� Register version number
b@vkillvar$="<"+prog$+"$Dir>":� VKiller environmental variable
lJiconbartype%=-1:� -1 = Utility (RHS of bar), -2 = Service (LHS of bar)
v>windman%=200:� Expect at LEAST V2.00 of the Window Manager
�2bl$=�(0):� NULL char used to terminate strings
�2dirscan%=11:� Directory spec goes in this icon
�0status%=12:� Status messages go in this icon
�"appicon%=18:� Application icon
�iconname%=22:� Icon name
�"fileicon%=25:� File total icon
�&diricon%=26:� Directory total icon
�4iconbar%=136:� External coord height of icon bar
�
�� Workspace for application
�9� vkillwind% &E00,infowind% &E00:� Template workspace
�%� poll% 256:� Wimp_Poll workspace
�(� icon% 48:� Icon bar icon workspace
@� taskconst% 8:$taskconst%="TASK":� Store Task constant here
9� icondata% 256:� Temp workspace to get/put icon data

 � Initialise WIMP
*Jș "XWimp_Initialise",windman%,!taskconst%,prog$+bl$ � windvers%,task%
4e� windvers%<windman% � �fatal(prog$+" requires Window Manager V"+�fraction(windman%)+" or later")
>
H� Claim file buffer
R.maxboot%=0:buff%=0:� No buffer claimed yet
\2minboot%=&800:� Absolute minimum required (2K)
f�claim_buffer(minboot%)
p
z�menu_initialise(256,256)
�2�gettemplates:� Get window templates from file
�$�makeicon:� Create icon bar icon
��build_fs_names
��choose_fs(0)
��finishscan
��scanRMA
�Chand%=�gettaskhand("TaskManager"):� hand%:�vigay_running(hand%)
�8hand%=�gettaskhand(" "):� hand%:�icon_running(hand%)
�?hand%=�gettaskhand("Thanatos"):� hand%:�than_running(hand%)
��startscan(�)
��zerocounts
��statusinform("Idle")
��

��shutdown
�releaseRMA(buff%)
$*È™ "XWimp_CloseDown",task%,!taskconst%
.� multi%=� �
8   �unset(prog$+"$Dir")
B   �unset(prog$+"$Version")
L   �unset("Sys$Path")
V�
`�
j
t��unset(v$)
~È™ "XOS_CLI","Unset "+v$
��
�
�ݤgettaskhand(taskname$)
�I� Many thanks to Martin Avison for this routine. It is very low level
�4� and "hacky" so may not work on future OS's :-(
�� handle%,ptr%:handle%=0
�/ș "XOS_Module",18,"TaskManager" � ,,,,ptr%
�� ptr% �
�   ptr%=ptr%!&1D4
�   �
�?      � ptr%?4=4:� �rtoz(ptr%+16)=taskname$:handle%=ptr%!12
�      ptr%=!ptr%
   � ptr%=-1 � handle%<>0

�
=handle%

(��plotappicon(sprname$)
2sprname$=�lower(sprname$)
<� sprname$<>oldappicon$ �
F(   �putdata(appicon%,"S"+sprname$,�)
P   oldappicon$=sprname$
Z�
d�
n
x��check(dir$,leafdir$)
�t� off%,base%,num%,loop%,addr%,name$,fullname$,len%,gotboot%,type%,flags%,errblk%,gotappicon%,icon_name$,lowname$
�+�wimp_poll(�):� quit%=� � scanning%=�:�
�base%=�claimRMA(size%)
�� base%=0 �
�>   �status_log("","Insufficient RMA - skipping deeper","")
�   �
��
�� leafdir$<>"" �
�   dir$+="."+leafdir$
�   � �(leafdir$)=33 �
�8      � is the application sprite already in memory?
�4      ș "XWimp_SpriteOp",40,,leafdir$ � ;flags%
�E      � flags% � 1:icon_name$="application" � icon_name$=leafdir$
   �
       icon_name$="directory"
   �
"%   �putdata(iconname%,leafdir$,�)
,   �plotappicon(icon_name$)
6�
@�putdata(dirscan%,dir$,�)
J#off%=0:gotboot%=�:gotappicon%=�
T�
^   �wimp_poll(�)
h    � quit%=� � scanning%=� �
r      num%=0
|   �
�      addr%=base%
�e      ș "XOS_GBPB",10,dir$+�(0),addr%,maxfiles%,off%,size%,"*"+�(0) � errblk%,,,num%,off%;flags%
�      � flags% � 1 �
�0         �status_log("",�rtoz(errblk%+4),"")
�*         num%=0:scanning%=�:badscan%=�
�      �
�   �
�   � 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 �
%            numdirs%+=1:�dircount
"            �check(dir$,name$)
&         �
0'            numfiles%+=1:�filecount
:&            lowname$=�lower(name$)
D$            � lowname$="!boot" �
N               gotboot%=�
XF               � type%=&FEB:�check_for_boot_virus(dir$,name$,len%)
b            �
l            ÈŽ type% �
v5            � &FF8:� len%>=archsize% � innoc%=� �
�B                         �check_for_abs_virus(dir$,name$,len%)
�                      �
�N                      � len%>=11756 � len%<=11766 � lowname$="riscosext" �
�?                         �file_virus(dir$,name$,"Thanatos")
�                      �
�            � &FF9
�                Ȏ lowname$ �
�-               � "!sprites":gotappicon%=�
�               � "icon"
�5                  obj%=-(len%=5574)-(len%=2616)*2
�C                  � obj%:�file_virus(dir$,name$,"Icon"+�(obj%))
�               �
�<            � &FFA:�check_for_mod_virus(dir$,name$,len%)
9            � &FFB:�check_for_BASIC_virus(dir$,name$)
            �
         �
       �
*  �
4%� off%=-1 � quit%=� � scanning%=�
>F� gotboot%=� � �(leafdir$)=33 � innoc%=� � quit%=� � scanning%=� �
H6   � �extend_innocboot(dir$,base%,0,gotappicon%) �
R<      �status_log(dir$,"!Boot created & innoculated","")
\   �
f�
p�releaseRMA(base%)
z�
�
���newinnoc
�,numinnoc%+=1:�putdata(15,�(numinnoc%),�)
��
�
���unsupported(virus$)
���warn(virus$+" detected in RMA - the current release of "+prog$+" cannot remove it from RMA. Please hard reset, re-run "+prog$+" ONLY and re-scan all suspect disks.")
�quit%=�:scanning%=�
��
�
�,��notifyvirus(mess1$,mess2$,count%,rma%)
�� rma% �
�=   nummem%+=1:�putdata(13,�(nummem%),�):mess1$+=" in RMA"
	�
	-   numdisk%+=1:�putdata(14,�(numdisk%),�)
	�
	$A� mess2$<>"":�putdata(dirscan%,mess2$+" Count: "+�(count%),�)
	.infect%=�:�openwindow
	8(�status_log("",mess1$+" found !","")
	L�
	V
	`��holdit(secs%)
	j� t%:t%=�+secs%*100
	t�
	~   �wimp_poll(�)
	�� �>t% � quit%
	��
	�
	���delfile(m$,type$)
	�� �oscli("Delete",m$,"") �
	�)  �status_log("",type$+" deleted",m$)
	��
	�1  �status_log("","Couldn't delete "+type$,m$)
	��
	��
	�
	�ݤoscli(l$,m$,r$)
 � flags%,again%,errblk%,osc$

(osc$=l$+" "+m$+" "+r$+" { > null: }"
�
   � l$="RMKill" �
(4      ș "XWimp_StartTask",osc$ � errblk%;flags%
2   �
<,      ș "XOS_CLI",osc$ � errblk%;flags%
F   �
P   again%=�
Z   � flags% � 1 �
d      Ȏ !errblk% �
n      � &108C9:
xG         again%=�yesno("Write-protected disk - retry disk write ?")
�2      � &108C3:again%=�oscli("Access",m$,"WR")
�      �
�      � again%=�:still%=�
�   �
�� again%=�
�=((flags% � 1)=0)
�
�ݤwimperror(mess$,mask%)
�� click%
�Qș "XWimp_ReportError",�4,bl$)+mess$+bl$,mask%,prog$+" Warning"+bl$ � ,click%
�=click%
�
�/ݤyesno(mess$)=(�wimperror(mess$,%10011)=1)

��warn(mess$)
� click%
"#click%=�wimperror(mess$,%10001)
,�
6
@
��scanRMA
J� start%,flags%
T#� �modexists("Extend",start%) �
^/   � �rtoz(start%+start%!&14)=extendhelp$ �
h       �extend_in_RMA(start%)
r   �
|�
�$� �modexists("TlodMod",start%) �
�.   � �rtoz(start%+start%!&14)=cebithelp$ �
�      �cebit_in_RMA(start%)
�   �
��
�+start%=�vector_scan(FileV%,0,&E3500024)
�#� start%:�archie_in_RMA(start%)
��
�
�ݤmodexists(mod$,� addr%)
�� flags%
�-ș "XOS_Module",18,mod$ � ,,,addr%;flags%
�=((flags% � 1)=0)

��extend_in_RMA(start%)

� handle%
&/handle%=�gettaskhand(""):� Save task handle
0� handle% �
:;� This is a bug-fix :-) It allows the Extend Virus task
D<� to shutdown properly without crashing the Task Manager
N   start%!&40=handle%
X   P%=start%+&70
b
   [OPT 0
l5   LDR R2,start%+&64:CMP R2,#1:SWIGT "XOS_Module"
v*   LDR R0,start%+&40:LDR R1,start%+&54
�   ]
��
�9�notifyvirus("Extend Virus","Execution",start%!&34,�)
�(�killmodule("Extend","Extend Virus")
��
�
���cebit_in_RMA(start%)
�>�notifyvirus("CeBit Virus","Infection",start%!cebitoff%,�)
�H� Next line deviously flips UpCall trap to RELEASE vector instead...
�,P%=start%+&FC:[OPT 0:SWI "XOS_Release":]
�;start%!8=&EC:� Point finalisation to modified trap code
�(�killmodule("TlodMod","CeBit Virus")
��



��killmodule(mod$,name$)

 � �oscli("RMKill",mod$,"") �

 2   �status_log("",name$+" killed from RMA","")

*�

4<   �status_log("","Couldn't kill "+name$+" from RMA","")

>   still%=�

H�

R�

\

f��archie_in_RMA(addr%)

p&�notifyvirus("ArchieVirus","",0,�)

z#È™ "XOS_Release",FileV%,addr%,0

�ș "XOS_Module",7,,addr%

�4�status_log("","ArchieVirus killed from RMA","")

��

�

�ݤexists(file$,type%)

�� found%,ftype%

�*ș "XOS_File",5,file$ � found%,,ftype%

�ftype%=(ftype%>>>8) � &FFF

�=(found%=1 � type%=ftype%)

�

�*ݤupper(s$)=�flipstr(s$,�"a",�"z",-32)

�

�)ݤlower(s$)=�flipstr(s$,�"A",�"Z",32)

ݤflipstr(s$,l%,h%,d%)
� loop%,n$,c%:n$=""
$� loop%=1 � �(s$)
.   c%=�(�s$,loop%))
8   � c%>=l% � c%<=h%:c%+=d%
B   n$+=�(c%)
L�
V=n$
`
jݤgetstring(� addr%)
t� s$:s$=""
~-ȕ ?addr%<>0:s$+=�(?addr%):addr%+=1:�:=s$
�
���wimp_poll(check%)
�
� reason%
�%ș "XWimp_Poll",0,poll% � reason%
�Ȏ reason% �
�%� 0:� check%:�checkcurfs:�scanRMA
�7� 2:ș "XWimp_OpenWindow",,poll%:� Info window drag
�� 3:�closewindow
�� 6:�mouseclick
�� 9:�menuselect
�� 17,18:�wimpmessage
�� 19: �ackwimpmessage
�

�

��checkcurfs
(� �getfsname(fsysnum%)="" �
2I   �warn(fsys$+" has been disabled - cannot scan that filing system")
<   �build_fs_names
F   �choose_fs(0)
P   scanning%=�:badscan%=�
Z�
d�
n
x��closewindow
�7ș "XWimp_CloseWindow",,vkillwind%:� Eval close box
��
�
���mouseclick
�Ȏ poll%!8 �
�   � 1,4:�startup
�   �   2:�shownewmenu
��
��
�
���shownewmenu
�� y%
�� poll%!12=-2 �
 y%=96+44*2
 �build_menu(1)
�
" y%=poll%!4+16
, �scanning%=� �
6  Ȏ poll%!16 �
@  � 7, 9: �build_menu(2)
J  � 8,10: �build_menu(3)
T  : �build_menu(1)
^  �
h �
r  �build_menu(1)
| �
��
�)oldx%=!poll%-64:oldy%=y%:�showoldmenu
��
�
���showoldmenu
�,ș "XWimp_CreateMenu",,menu%,oldx%,oldy%
��
�
���openwindow
�� x%,y%,sx%,sy%
�)ș "XWimp_GetWindowState",,vkillwind%
�� opened%=� �
�I   � Auto-centre window (but only for the very first time it is open)
1   È™ "XOS_ReadVduVariables",inbuff%,outbuff%
'   x%=outbuff%!8+1:x%=x%<<!outbuff%
)   y%=outbuff%!12+1:y%=y%<<outbuff%!4
&%   sx%=vkillwind%!12-vkillwind%!4
0%   sy%=vkillwind%!16-vkillwind%!8
:=   vkillwind%!4=(x%-sx%)/2:vkillwind%!12=vkillwind%!4+sx%
DH   vkillwind%!8=(y%-sy%+iconbar%/2)/2:vkillwind%!16=vkillwind%!8+sy%
N   opened%=�
X�
b3vkillwind%!28=-1:� Open on top of everyone else
l%È™ "XWimp_OpenWindow",,vkillwind%
v�
�� 4,5,11,12,-1
�
�
��startup
�Ȏ poll%!12 �
�   � -2:�openwindow
�   � vkillhand%:
�      Ȏ poll%!16 �
�"      � 7,8,9,10: �shownewmenu
�6      � 19:� scanning%:�finishscan � �startscan(�)
�      �
��
��
�
��menuselect
� mouse%,item%
item%=!poll%+1
 3È™ "XWimp_GetPointerInfo",,poll%:mouse%=poll%!8
*Ȏ menubuilt% �
4� 1: Ȏ item% �
>3         � numitems%:quit%=�:� Last Item = Quit
H
        �
R,� 2: �tick_option(menu%,fs_names$,fsys$)
\        �choose_fs(item%-1)
f/        �tick_option(menu%,fs_names$,fsys$)
p1� 3: �tick_option(menu%,fs_devices$,fdevice$)
z#        �choose_device(item%-1)
�4        �tick_option(menu%,fs_devices$,fdevice$)
��
�� mouse%=1:�showoldmenu
��
�
���wimpmessage
�Ȏ poll%!16 �
�E   �      0:quit%=�:� Shut down (Desktop Exit, Task Manager Quit)
�   � &400C2:�appstart
��
��
�
���ackwimpmessage
� poll%!16=5 �
! � no editor loaded - run it!
( È™"XWimp_StartTask","Run "+logname$
$�
.�
8
B��appstart
LJ� Unlike, ahem, certain Acorn applications we could mention, it really
VF� is nice to make sure only one invocation of the program has been
`C� activated - this is done by checking a new task's name/handle
j� hand%:hand%=poll%!4
t� hand%<>task% �
~   Ȏ �rtoz(poll%+28) �
�   � prog$:quit%=�:multi%=�
�   � "":�scanRMA
�!   � " ":�icon_running(hand%)
�,   � "TaskManager":�vigay_running(hand%)
�(   � "Thanatos":�than_running(hand%)
�   �
��
��
�
���statuserror(mess$)
��putdata(status%,mess$,�)
��holdit(1)
�


��statusinform(mess$)
�putdata(status%,mess$,�)
(�wimp_poll(�)
2�
<
Fݤicon_selected(icon%)
P+!icondata%=vkillhand%:icondata%!4=icon%
Z%È™"XWimp_GetIconState",,icondata%
d'=((icondata%!24 � (1<<21))=(1<<21))
n
x ��putdata(icon%,mess$,path%)
�-� Change icon 'icon%' to the string mess$
�;� Note that this assumes an indirected icon of course !
�� off%,len%
�+!icondata%=vkillhand%:icondata%!4=icon%
�&ș "XWimp_GetIconState",,icondata%
�� icon%=appicon% �
�   off%=32
��
�"   off%=28:len%=icondata%!36-1
�   � path% �
�       mess$=�mess$,preflen%)
�4      � �(mess$)>len%:mess$="..."+�mess$,len%-3)
�   �
      mess$=�mess$,len%)
   �
�
"$(icondata%!off%)=mess$
, icondata%!8=0:icondata%!12=0
6Aș "XWimp_SetIconState",,icondata%:� Philp Colmer improvement
@�
J
T��makeicon
^?P%=icon%:� Use built in assembler - easier to see structure
h
[OPT 0
rE                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
�<.spritename     EQUS    "!vkiller"+�4,bl$) ; Sprite name
�]
�,ș "XWimp_CreateIcon",,icon% � iconhand%
�

��gettemplates
&� flags%,dummy%
0=ș "XWimp_OpenTemplate",,vkillvar$+".Templates" � ;flags%
:<� flags% � 1:�fatal("Missing Templates file for "+prog$)
D6vkillhand%=�loadtemplate(vkillwind%,"VKillWindow")
N)info%=�loadtemplate(infowind%,"Info")
XÈ™ "XWimp_CloseTemplate"
b�
l
vݤ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 !
�
� err$
�'� �:err$=" at line "+�(�) � err$=""
	� � �
�fatal(�$+err$)
�
 
*��fatal(error$)
4�"Error 0 "+error$
>�
H
Rݤgetfsname(fsnum%)
\� fsname%,fname$
f6ș "XOS_FSControl",33,fsnum%,fbuff%,12 � ,,fsname%
p� ?fsname% �
z!   fname$=�getstring(fsname%)
�   Ȏ fname$ �
�~   � "null","printer","serial","vdu","rawvdu","kbd","rawkbd","deskfs","msdos","netprint","pipe":fname$="":� Not infectable
�   �
��
�   fname$=""
��
�=fname$
�
�ݤFSprefix(prefix$)
�%=�checkswi("X"+prefix$+"_Drives")
�
�ݤcheckswi(swi$)
�� swi%,flags%
4ș "XOS_SWINumberFromString",,swi$ � swi%;flags%
=((flags% � 1)=0)

$"��hackflags(icon%,eor%,clear%)
.!icondata%=vkillhand%
8icondata%!4=icon%
Bicondata%!8=eor%
Licondata%!12=clear%
V&È™ "XWimp_SetIconState",,icondata%
`�
j
t��hilite(icon%,bool%)
~.�hackflags(icon%,((-bool%)<<21),&00200000)
��
�
���init_log
�� f%,flags%,p%,f$
�� logging%=�:�
�f$="XRamFS_FreeSpace":f%=0
�=� �checkswi(f$):ș f$,":0" � ,f%;flags%:� flags% � 1:f%=0
�F� f%<32768:logname$=vkillvar$+".Log" � logname$="RAM:$.VKillerLog"
�)ș"XOS_File",11,logname$,&FFF � p%;f%
�� f% � 1:�stop_log(p%)
��
�
��stop_log(eb%)

:�warn("Logging of activities disabled: "+�rtoz(eb%+4))
logging%=�
�
(
2
��log(s$)
<� c%,f%
F� logging%=� �
P%ș"XOS_Find",&C0,logname$ � c%;f%
Z� f% � 1:�stop_log(c%):�
d�c%<>0 �
n �#c%=�#c%
x �#c%,s$
�	 �#c%
��
��
�
�#��infect_log(path$,mess$,suff$)
�still%=�:infect%=�
�"�status_log(path$,mess$,suff$)
��
�
�#��status_log(path$,mess$,suff$)
�$� suff$<>"":suff$=" ("+suff$+")"
�� path$="" �
�   �log(mess$+suff$)
   �statuserror(mess$)
�
"   �log(path$+"."+mess$+suff$)
"/   �statusinform(�appname(path$)+"."+mess$)
,�
6�
@
Jݤappname(path$)
T� l%:l%=�(path$)
^'È• l%>0 � �path$,l%,1)<>".":l%-=1:�
h=�path$,l%+1)
r
|��filecount
�&�putdata(fileicon%,�(numfiles%),�)
��
�
���dircount
�$�putdata(diricon%,�(numdirs%),�)
��
�
���finishscan
��putdata(19,"Start scan",�)
��putdata(dirscan%,"Idle",�)
� �putdata(iconname%,"Idle",�)
��plotappicon("!"+prog$)
�scanning%=�
�

��zerocounts
&/numdirs%=0:numfiles%=0:�filecount:�dircount
0�
:
D��startscan(self%)
N� prefix$,dev$
X�putdata(19,"Stop scan",�)
b-scanning%=�:infect%=�:still%=�:badscan%=�
l�zerocounts
v
� self% �
�2   prefix$=vkillvar$:dev$=vkillvar$:preflen%=1
�   innoc%=�:logging%=�
��
�<   prefix$=�build_path:dev$="Device":preflen%=�(prefix$)
�    innoc%=�icon_selected(20)
�"   logging%=�icon_selected(21)
��
�� preflen% �
� �init_log
�/ �log("Scan of "+prefix$+" started on "+�$)
�" �statusinform("Scan started")
� �check(prefix$,"")
� �hilite(23,�)
 � scanning% �
3    �log("Scan of "+prefix$+" finished on "+�$)
    � self%=� �
 3       numscans%+=1:�putdata(17,�(numscans%),�)
*	    �
4    � infect% �
>       � still% �
H@          �status_log("",dev$+" may still be infected !","")
R       �
\D          �status_log("",dev$+" was infected, but now clean","")
f       �
z	    �
�>       �status_log("",dev$+" is clean - no infections","")
�	    �
� �
�    � badscan%=� �
�5       �status_log("","Scan manually aborted","")
�	    �
� �
� � self%=�:�openwindow
�0 � now ask an editor to pick up the log file
� �logging% �
�  !poll%=(48+�logname$)��3
�  poll%!12=0
�  poll%!16=5
  poll%!36=-2
  poll%!40=&FFF
  $(poll%+44)=logname$+�0
$&  È™"XWimp_SendMessage",18,poll%,0
.-  � and give the editor a chance to do so
8  �wimp_poll(�)
B �
L�
V�finishscan
`�
j
tݤmakestring(addr%,len%)
~� loop%,s$:s$=""
�1� loop%=0 � len%-1:s$=s$+�(loop%?addr%):�:=s$
�
���build_fs_names
�A� this procedure scans for all of the possible filing systems
�8� and builds a menu structure string from the result
�� i%
�fs_names$="#Filing Sys,"
��i%=1 � maxfs%
�% � add this FS name to the string
�" fs_names$+=�getfsname(i%)+","
�: � if there wasn't a name there, remove the last comma
�. ��fs_names$,2)=",," fs_names$=�fs_names$)
�

"� always remove the last comma
fs_names$=�fs_names$)
�
(
2��choose_fs(s%)
<� i%,j%,s$
F3� get the s% entry from fs_names$ and save that
Ps$=fs_names$
Z�i%=0 � s%
d j%=�s$,",")
n �j%=0 �
x9  �warn("Cannot find FS "+�(s%)+" - aborting "+prog$)
�
  quit%=�
�  scanning%=�
�  �
� �
� s$=�s$,j%+1)
��
� i%=�s$,","):�i%=0 i%=�(s$)+1
�fsys$=�s$,i%-1)
�"� get the filing system number
�1ș"XOS_FSControl",13,fsys$+�(0),0 � ,fsysnum%
��putdata(7,fsys$,�)
�"� now rebuild the devices list
��build_devices_list
�choose_device(0)
�

"��build_devices_list
, � i%,j%,numflop%,numhard%,s$
6fs_devices$="#Devices,"
@+� this is going to be REALLY tacky code
J8� first of all, we need to get rid of the exceptions
T�
^� Econet
h� ~~~~~~
r/� Build a list of logged on-to file servers
|�fsys$="net" �
�	 i%=0
� �
�K  � we'll load the info into buff ... it isn't being used at this time!
�9  ș"NetFS_EnumerateFS",i%,buff%,maxboot%,1 � i%,,,j%
�
  �j%=1 �
�"   fs_devices$+=�rtoz(buff%+3)
�   ȕ �fs_devices$)=" "
�!    fs_devices$=�fs_devices$)
�   �
�   fs_devices$+=","
�  �
� � i%=-1
� �fs_devices$="#Devices," �
   fs_devices$+="(None)"
  �
   fs_devices$=�fs_devices$)
 & �
 0 �
 :�
 D�
 N	� NFS
 X	� ~~~
 b � Build a list of NFS mounts
 l�fsys$="nfs" �
 v	 i%=0
 � �
 �"  ș"NFS_MountList",0,i% � ,i%
 �  �i%<>0 �
 �!   fs_devices$+=�rtoz(i%)+","
 �  �
 � � i%=0
 � �fs_devices$="#Devices," �
 �  fs_devices$+="(None)"
 � �
 �  fs_devices$=�fs_devices$)
 � �
 � �
 ��
!�
!#� FileCore based filing systems
!#� ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! 6� Try to determine which "drives" this FS supports
!*�fsys$="ram" �
!4 s$="RamFS"
!>�
!H �FSprefix(fsys$) �
!R  s$=fsys$
!\ �
!f  s$=�upper(fsys$)
!p  �FSprefix(s$)=� �
!z/   � �s$,2)="FS":s$=�s$,�(s$)-2) � s$+="FS"
!�   �FSprefix(s$)=� �
!�    fs_devices$+="(None)"
!�	    �
!�   �
!�  �
!� �
!��
!�3� OK, we have a FileCore FS. Now build the list
!�,ș "X"+s$+"_Drives" � ,numflop%,numhard%
!��numflop%<>0 �
!� �i%=0 � numflop%-1
!�  fs_devices$+=�(i%)+","
!� �
"�
"�numhard%<>0 �
" �i%=0 � numhard%-1
"$  fs_devices$+=�(i%+4)+","
". �
"8�
"Bfs_devices$=�fs_devices$)
"L�
"V
"`ݤrtoz(p%)=�getstring(p%)
"j
"t��choose_device(s%)
"~� i%,j%,s$
"�3� get the s% entry from fs_names$ and save that
"�s$=fs_devices$
"��i%=0 � s%
"� j%=�s$,",")
"� �j%=0 �
"�3  � 1, "Device menu has not been cleanly built"
"� �
"�  s$=�s$,j%+1)
"� �
"��
"� i%=�s$,","):�i%=0 i%=�(s$)+1
"�fdevice$=�s$,i%-1)
#�putdata(8,fdevice$,�)
#
�
#
#ݤbuild_path
#(G� this procedure builds a valid path depending on the filing system
#2J� as with building the devices list, we deal with the tacky ones first
#<� fsys$="net" �
#F � fdevice$="(None)" �
#P)  �statusinform("Which file server?")
#Z	  =""
#d �
#n  ="net#"+fdevice$+":&"
#x �
#��
#�� fsys$="nfs" �
#� � fdevice$="(None)" �
#�'  �statusinform("Which NFS mount?")
#�	  =""
#� �
#�  ="NFS::"+fdevice$+".$"
#� �
#��
#��fdevice$="(None)" �
#� =fsys$+":$"
#��
#�=fsys$+"::"+fdevice$+".$"
$
$��build_menu(i%)
$menubuilt%=i%
$"Ȏ i% �
$,� 1: � icon bar menu
$66        menu%=�create_menu("#"+prog$+",Info,Quit")
$@'        �menu_attach(menu%,0,info%)
$J        numitems%=2
$T� 2: � filing systems menu
$^        �build_fs_names
$h)        menu%=�create_menu(fs_names$)
$r/        �tick_option(menu%,fs_names$,fsys$)
$| � 3: � filing system devices
$�        �build_devices_list
$�+        menu%=�create_menu(fs_devices$)
$�4        �tick_option(menu%,fs_devices$,fdevice$)
$��
$��
$�
$�$��tick_option(menu%,list$,item$)
$�� i%,j%
$�#� lose the header from the list
$�%i%=�list$,","):list$=�list$,i%+1)
$�ȕ list$<>""
$�' i%=�list$,","):�i%=0 i%=�(list$)+1
$� �item$=�list$,i%-1) �
%  �menu_tick(menu%,j%)
%  list$=""
% �
%&  list$=�list$,i%+1)
%0  j%+=1
%: �
%D�
%N�
%X
%b&��menu_initialise(men_ws%,men_df%)
%l+menu_max_ws%=men_ws%:� menu_ws% men_ws%
%v+menu_max_df%=men_df%:� menu_df% men_df%
%�menu_end%=menu_df%+men_df%
%�menu_curws%=menu_ws%
%��
%�
%�ݤcreate_menu(menu$)
%�� M%,m$,I%,menuptr%,maxx%
%�<� in this particular application, there are no sub menus
%�<� and only one actively created menu, so it is PERFECTLY
%�%� safe to reset the menu pointers
%�#menu_df%=menu_end%-menu_max_df%
%�menu_curws%=menu_ws%
%�e� (menu_df%+28>menu_end%) � 1, "Out of menu workspace - increase 2nd parameter to initialisation"
%�menuptr%=menu_df%
&I%=0
&� �menu$,1)="#" �
&	 I%=1
& ' menutitle$=�menu_par(menu$,",",I%)
&*�
&4 menutitle$=""
&>�
&H$menuptr%=�menutitle$,12)
&Rmenuptr%?12=7
&\menuptr%?13=2
&fmenuptr%?14=7
&pmenuptr%?15=0
&zmenuptr%!16=196
&�menuptr%!20=44
&�menuptr%!24=0
&�menuptr%+=28
&�maxx%=�menutitle$-3
&��
&�" item$=�menu_par(menu$,",",I%)
&�% �menu_item(item$,maxx%,menuptr%)
&�� item$=""
&�M%=menu_df%
&�M%!16=(maxx%*8+6)*2
&�menu_df%=menuptr%
&�=M%
&�:
'"��menu_tick(menuhandle%,item%)
':menuhandle%!(28+24*item%)=menuhandle%!(28+24*item%)� 1
'�
'$:
'.ݤmenu_par(menu$,sep$,� I%)
'8� L%
'BL%=I%+1
'LI%=�menu$+sep$,sep$,L%)
'V=�menu$,L%,I%-L%)
'`:
'j)��menu_item(text$,� maxx%,� menuptr%)
't� I%,F%,L%
'~1� text$="" menuptr%!-24=(menuptr%!-24)� &80:�
'�e� (menuptr%+24>menu_end%) � 1, "Out of menu workspace - increase 2nd parameter to initialisation"
'�
F%=&00
'�D� �text$,1)="#" text$=�text$):F%+=&02:� dotted line follows item
'�C� �text$,1)="@" text$=�text$):F%+=&08:� generate a menu warning
'�menuptr%!0=F%
'�menuptr%!4=-1
'�menuptr%!8=&07000021
'�� �text$,1)="$" �
'�I !menuptr%+=&04                                  :� item is writeable
'� text$=�12," ")
'��
'� � �text$<=12 �
(  $(menuptr%+12)=text$
(
 �
(,  I%=�menu_workspace(�text$+1):$I%=text$
(8  menuptr%!12=I%:menuptr%!16=-1:menuptr%!20=�text$+1
((!  menuptr%!8=menuptr%!8� &100
(2 �
(<�
(F� �text$>maxx% maxx%=�text$
(Pmenuptr%+=24
(Z�
(d:
(n#��menu_attach(menu%,item%,ptr%)
(xmenu%+=28+item%*24
(�menu%!4=ptr%
(��
(�:
(�ݤmenu_workspace(L%)
(�|� menu_curws%+L%>menu_ws%+menu_max_ws% � task_fatal%, "Out of menu workspace - increase 1st parameter to initialisation"
(�menu_curws%+=L%
(�=menu_curws%-L%
(�:
(�Q� ---------------------------------------------------------------------------
(�'� Virus checking code goes here ...
(�Q� ---------------------------------------------------------------------------
(�:
(�*��check_for_mod_virus(dir$,name$,len%)
)Ȏ �lower(name$) �
)� "tlodmod"
)   � len%=1240 �
)"I      �fix_module(dir$+"."+name$,"CeBit Virus","Infection",cebitoff%)
),   �
)6X� "monitorrm","checkmod","extendrm","osextend","colourrm","fastmod","coderm","memrm"
)@   � len%=940 �
)JD      �fix_module(dir$+"."+name$,"Extend Virus","Execution",&34)
)T   �
)^� "taskalloc"
)h4   � len%=344:�file_virus(dir$,name$,"Thanatos")
)r�
)|�
)�
)�*��fix_module(mod$,name$,type$,offset%)
)�� count%
)�A� �oscli("Load",mod$,�~buff%):count%=buff%!offset% � count%=0
)�name$=name$+" module"
)�&�notifyvirus(name$,type$,count%,�)
)��delfile(mod$,name$)
)��
)�:
)���claim_buffer(claim%)
)�� claim%>maxboot% �
)�   �releaseRMA(buff%)
)�)   maxboot%=(claim%+&3FF) � &400*&400
*   �
*#      buff%=�claimRMA(maxboot%)
*"      � buff%=0:maxboot%-=&400
*&$   � buff%>0 � maxboot%<minboot%
*0   � maxboot%<minboot% �
*:>      �warn("Cannot claim RMA for file buffer - aborting")
*D(      quit%=�:scanning%=�:maxboot%=0
*N   �
*X�
*b�
*l:
*v*��check_for_boot_virus(path$,name$,l%)
*�<� doinnoc%,s%,t%,u%,s$,olds$,core$,scratch%,force%,oldl%
*� �claim_buffer(l%+protlen%+1)
*�� l%+protlen%+1>maxboot% �
*�:   �infect_log(path$,"!Boot too big - not scanned","")
*�   �
*��
*�2doinnoc%=innoc%:core$=�appname(path$)+".!Boot"
*�scratch%=�
*�.� �oscli("Load",path$+"."+name$,�~buff%) �
*�   �
*�!      force%=�:s%=-1:olds$=""
*�      �
*�         t%=s%+1
+         �
+!            s%+=1:u%=buff%?s%
+&         � u%<32 � u%>126 � s%>=l%
+          � s%<l% �
+*6            buff%?s%=&D:s$=$(buff%+t%):buff%?s%=u%
+4            Ȏ s$ �
+>%            � icon1wimp$:oldl%=t%
+H            � cebitobey$
+R?               �notifyvirus("CeBit Virus in "+core$,"",0,�)
+\9               u%=buff%?(t%-2):l%=t%+(u%=&FF)+(u%=&A)
+f&               doinnoc%=�:force%=�
+p            � vigayobey$
+z?               �notifyvirus("Vigay Virus in "+core$,"",0,�)
+�-               l%=0:doinnoc%=�:scratch%=�
+�            � icon1obey$
+�'               � olds$=icon1wimp$ �
+�A                  �notifyvirus("Icon Virus in "+core$,"",0,�)
+�2                  l%=oldl%:doinnoc%=�:force%=�
+�               �
+�            � thanobey$
+�B               �notifyvirus("Thanatos Virus in "+core$,"",0,�)
+�,               doinnoc%=�:force%=�:l%=t%
+�            �
+�            olds$=s$
+�         �
+�      � s%>=l%
,      � l% �
,         Ȏ buff%?(l%-1) �
,         � &FF:� l%>4 �
,$*                     Ȏ buff%?(l%-4) �
,.                     � 13
,8I                        �notifyvirus("Extend Virus in "+core$,"",0,�)
,B.                        l%=l%-4:doinnoc%=�
,L@                        ȕ l%>0 � buff%?(l%-1)<>&D:l%=l%-1:�
,V+                        buff%?(l%-1)=&A
,`                     � 10
,j&                        � force% �
,t+                           l%-=protlen%
,~                        �
,�)                           doinnoc%=�
,�d                           �status_log(path$,"!Boot already innoculated","against Extend Virus")
,�                        �
,�*                      doinnoc%=force%
,�                     �
,�                  �
,�&         � &0A:� Normal terminator
,�0          buff%?l%=&A:l%+=1:� Add LF on end
,�         �
,�      �
,�5         scratch%=�exists(path$+".!Sprites",&FF9)
,�      �
-   � force%=�
-
�
-   doinnoc%=�
-8   �infect_log(path$,"!Boot could not be loaded","")
-(�
-2� doinnoc% �
-<!   � l%+protlen%+1>maxboot% �
-FU      �infect_log(path$,"!Boot too big - not innoculated","against Extend Virus")
-P   �
-Z8      � �extend_innocboot(path$,buff%,l%,scratch%) �
-dQ         �status_log(path$,"!Boot is now innoculated","against Extend Virus")
-n      �
-x   �
-��
-��
-�:
-�-ݤextend_innocboot(dir$,a%,len%,addicon%)
-�'� good%,n$:good%=�:n$=dir$+".!Boot"
-�.� addicon%:$(a%+len%)=icon$:len%+=iconlen%
-�$(a%+len%)=protect$
-�7� �oscli("Save",n$,�~a%+" "+�~(a%+len%+protlen%)) �
-�6   � �oscli("SetType",n$,"Obey"):good%=�:�newinnoc
-��
-�C� good%=�:�infect_log(dir$,"!Boot could not be innoculated","")
-�
=good%
-�:
.'��check_for_abs_virus(dir$,n$,� l%)
.9� doinnoc%,handle%,flags%,cancel%,replace%,end$,name$
.name$=dir$+"."+n$
."replace%=�
.,handle%=� name$
.6� handle% �
.@   doinnoc%=innoc%
.J6   � �abs_readptr(handle%,l%-16,16,end$,dir$,n$) �
.T!      � �end$,8)="Hypo1210" �
.^         doinnoc%=�
.hN         �status_log(dir$,n$+" already innoculated","against ArchieVirus")
.r      �
.|          � �end$,4)="1210" �
.�^            �notifyvirus("ArchieVirus in "+�appname(dir$)+"."+n$,"Decrement",!seekbuff%,�)
.�%            doinnoc%=�:replace%=�
.�         �
.�      �
.�   �
.�      doinnoc%=�
.�   �
.�+   ș "XOS_Find",0,handle%:� Close file
.��
.�   doinnoc%=�
.��
.�� doinnoc% �
.�   handle%=0
/D   � Yes, 2 *Access's needed (no I/O if already set to, say, WR)
/&   � �oscli("Access",name$,"RL") �
/)      � �oscli("Access",name$,"WR") �
/&         handle%=� name$
/0         � handle% �
/:            � replace% �
/DG               doinnoc%=�abs_writeptr(handle%,0,�end$,5,4),dir$,n$)
/NB               � doinnoc%:l%=l%-archsize%:� Shrink file length
/X            �
/b            � doinnoc% �
/lC               � �abs_writeptr(handle%,l%,"Hypo1210",dir$,n$) �
/vE                  l%+=8:�#handle%=l%:� Truncate (allow for innoc)
/�                  �newinnoc
/�X                  �status_log(dir$,n$+" has been innoculated","against ArchieVirus")
/�               �
/�            �
/�4            ș "XOS_Find",0,handle%:� Close file
/�         �
/�      �
/�   �
/��
/�� handle%=0 �
/�5   �infect_log(dir$,n$+" could not be opened","")
/��
/��
0:
0'��check_for_BASIC_virus(dir$,name$)
0Ȏ �lower(name$) �
0 ;� "datadqm":� len%=2311:�file_virus(dir$,name$,"Vigay")
0*�
04�
0>:
0H��file_virus(d$,n$,name$)
0Rname$+=" Virus"
0\9�notifyvirus(name$+" in "+�appname(d$)+"."+n$,"",0,�)
0f�delfile(d$+"."+n$,name$)
0p�
0z:
0�"��kill_virus_task(hand%,name$)
0�name$+=" Virus"
0��notifyvirus(name$,"",0,�)
0�
� hand% �
0�&   !poll%=20:poll%!12=0:poll%!16=0
0�,   ș "XWimp_SendMessage",17,poll%,hand%
0��
0�&�status_log("",name$+" killed","")
0��
0�:
0���vigay_running(hand%)
0�:� �getfromtask(hand%,bas_start%+&1C,10)="PAUL VIGAY" �
0�&   �kill_virus_task(hand%,"Vigay")
1�
1�
1:
1$��icon_running(hand%)
1.-Ȏ �getfromtask(hand%,bas_start%+&E6,6) �
182� "random":�modify_kill(hand%,&1A5,"","Icon1")
1B2� "e as p":�modify_kill(hand%,&43D,"","Icon2")
1L�
1V�
1`:
1j��than_running(hand%)
1k� addr%
1t6� �getfromtask(hand%,bas_start%+&A,8)="Sys$Path" �
1uN   � �getfromtask(hand%,bas_start%+&315,5)="*dbg*":addr%=&2F1 � addr%=&2A3
1�2   �modify_kill(hand%,addr%,"    ","Thanatos")
1��
1��
1�:
1�)��modify_kill(hand%,off%,hack$,name$)
1�� s$,t$
1�%s$=hack$+�(&B9)+�(&D)+�(&40)+�(0)
1�Ut$=�(&C8)+�(&99)+"&600DD,&"+�~hand%+",&4B534154:"+�(&C8)+�(&99)+"17"+�(&D)+�(&FF)
1�7�sendtotask(hand%,bas_start%+off%,s$+�(�(t$)+2)+t$)
1�/�kill_virus_task(-(�(hack$)>1)*hand%,name$)
1��
2:
2
/ݤabs_writeptr(file%,pos%,mess$,dir$,name$)
2� flags%,p%
2$seekbuff%=mess$
2(=ș "XOS_GBPB",1,file%,seekbuff%,�(mess$),pos% � p%;flags%
224=�abs_checkerror(flags%,dir$,name$,"writing",p%)
2<:
2F/ݤabs_readptr(file%,pos%,len%,� s$,dir$,n$)
2P� flags%,p%
2Z9ș "XOS_GBPB",3,file%,seekbuff%,len%,pos% � p%;flags%
2d"s$=�makestring(seekbuff%,len%)
2n1=�abs_checkerror(flags%,dir$,n$,"reading",p%)
2x:
2�'ݤabs_checkerror(f%,dir$,n$,op$,p%)
2�� f% � 1 �
2�]   �infect_log(dir$,n$+" could not be accessed","(for "+op$+", reason: "+�rtoz(p%+4)+")")
2�   doinnoc%=�
2��
2�=((f% � 1)=0)
2�
2�ݤclaimRMA(amount%)
2�� addr%,flags%
2�?� amount%:ș "XOS_Module",6,,,amount% � ,,addr%;flags% � =0
2�� flags% � 1:=0 � =addr%
2�
2���releaseRMA(addr%)
3$� addr%:ș "XOS_Module",7,,addr%
3�
3
3"#ݤgetfromtask(hand%,addr%,len%)
3,� flags%
36Gș "XWimp_TransferBlock",hand%,addr%,task%,seekbuff%,len% � ;flags%
3@3� flags% � 1:="" � =�makestring(seekbuff%,len%)
3J
3T"��sendtotask(hand%,addr%,str$)
3^$seekbuff%=str$
3h@ș "XWimp_TransferBlock",task%,seekbuff%,hand%,addr%,�(str$)
3r�
3|
3�$ݤvector_scan(vect%,off%,instr%)
3�� chain%,trap%,addr%
3�#chain%=vbase%!(vect%*4):addr%=0
3�ȕ chain%<>0 � addr%=0
3�:   trap%=chain%!8:� trap%!off%=instr%:addr%=trap%+off%
3�   chain%=!chain%
3��
3�
=addr%
�
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 32  | Virus Killer V2|
00000030  2e 33 30 20 28 43 29 20  52 69 63 68 61 72 64 20  |.30 (C) Richard |
00000040  4b 2e 20 4c 6c 6f 79 64  20 31 39 39 31 0d 00 1e  |K. Lloyd 1991...|
00000050  31 f4 20 43 75 72 72 65  6e 74 6c 79 20 6b 69 6c  |1. Currently kil|
00000060  6c 73 3a 20 20 44 69 73  63 6f 76 65 72 65 64 20  |ls:  Discovered |
00000070  62 79 3a 20 20 20 41 74  74 61 63 6b 73 3a 0d 00  |by:   Attacks:..|
00000080  28 34 f4 20 45 78 74 65  6e 64 20 56 69 72 75 73  |(4. Extend Virus|
00000090  20 20 20 20 20 20 53 69  6d 6f 6e 20 42 75 72 72  |      Simon Burr|
000000a0  6f 77 73 20 20 20 20 21  42 6f 6f 74 20 66 69 6c  |ows    !Boot fil|
000000b0  65 73 0d 00 32 37 f4 20  41 72 63 68 69 65 56 69  |es..27. ArchieVi|
000000c0  72 75 73 20 20 20 20 20  20 20 48 75 67 6f 20 46  |rus       Hugo F|
000000d0  69 65 6e 6e 65 73 20 20  20 20 20 41 62 73 6f 6c  |iennes     Absol|
000000e0  75 74 65 20 66 69 6c 65  73 0d 00 3c 34 f4 20 43  |ute files..<4. C|
000000f0  65 42 69 74 20 56 69 72  75 73 20 20 20 20 20 20  |eBit Virus      |
00000100  20 3f 20 20 20 20 20 20  20 20 20 20 20 20 20 20  | ?              |
00000110  20 20 21 42 6f 6f 74 20  66 69 6c 65 73 0d 00 46  |  !Boot files..F|
00000120  34 f4 20 56 69 67 61 79  20 56 69 72 75 73 20 20  |4. Vigay Virus  |
00000130  20 20 20 20 20 47 6f 72  64 6f 6e 20 53 69 6e 63  |     Gordon Sinc|
00000140  6c 61 69 72 20 20 21 42  6f 6f 74 20 66 69 6c 65  |lair  !Boot file|
00000150  73 0d 00 50 34 f4 20 49  63 6f 6e 31 20 61 6e 64  |s..P4. Icon1 and|
00000160  20 49 63 6f 6e 32 20 20  20 53 74 75 61 72 74 20  | Icon2   Stuart |
00000170  54 79 72 72 65 6c 6c 20  20 20 21 42 6f 6f 74 20  |Tyrrell   !Boot |
00000180  66 69 6c 65 73 0d 00 5a  34 f4 20 54 68 61 6e 61  |files..Z4. Thana|
00000190  74 6f 73 20 56 69 72 75  73 20 20 20 20 41 6c 61  |tos Virus    Ala|
000001a0  6e 20 47 6c 6f 76 65 72  20 20 20 20 20 20 21 42  |n Glover      !B|
000001b0  6f 6f 74 20 66 69 6c 65  73 0d 00 64 04 0d 00 6e  |oot files..d...n|
000001c0  15 f4 20 52 65 63 6f 6d  6d 65 6e 64 65 64 20 43  |.. Recommended C|
000001d0  44 3a 0d 00 78 42 f4 20  42 2d 35 32 27 73 20 22  |D:..xB. B-52's "|
000001e0  43 6f 73 6d 69 63 20 54  68 69 6e 67 22 2e 20 57  |Cosmic Thing". W|
000001f0  65 69 72 64 20 61 74 20  66 69 72 73 74 2c 20 62  |eird at first, b|
00000200  75 74 20 69 74 20 67 72  6f 77 73 20 6f 6e 20 79  |ut it grows on y|
00000210  6f 75 20 21 0d 00 82 04  0d 00 8c 1b f4 20 47 65  |ou !......... Ge|
00000220  6e 65 72 61 6c 20 65 72  72 6f 72 20 74 72 61 70  |neral error trap|
00000230  70 65 72 0d 00 96 14 ee  20 85 20 f2 73 79 73 74  |per..... . .syst|
00000240  65 6d 65 72 72 6f 72 0d  00 a0 04 0d 00 aa 22 71  |emerror......."q|
00000250  75 69 74 25 3d a3 3a f4  20 4e 6f 74 68 69 6e 67  |uit%=.:. Nothing|
00000260  20 68 61 70 70 65 6e 65  64 20 79 65 74 0d 00 b4  | happened yet...|
00000270  09 f2 69 6e 69 74 0d 00  be 0e c8 95 20 ac 20 71  |..init...... . q|
00000280  75 69 74 25 0d 00 c8 14  20 20 20 f2 77 69 6d 70  |uit%....   .wimp|
00000290  5f 70 6f 6c 6c 28 b9 29  0d 00 d2 05 ce 0d 00 dc  |_poll(.)........|
000002a0  04 0d 00 e6 0d f2 73 68  75 74 64 6f 77 6e 0d 00  |......shutdown..|
000002b0  f0 10 c8 99 20 22 4f 53  5f 45 78 69 74 22 0d 00  |.... "OS_Exit"..|
000002c0  fa 04 0d 01 04 0a dd f2  69 6e 69 74 0d 01 0e 2e  |........init....|
000002d0  6d 75 6c 74 69 25 3d a3  3a f4 20 4e 6f 74 20 61  |multi%=.:. Not a|
000002e0  20 6d 75 6c 74 69 70 6c  65 20 69 6e 76 6f 63 61  | multiple invoca|
000002f0  74 69 6f 6e 20 28 79 65  74 29 0d 01 18 36 6d 61  |tion (yet)...6ma|
00000300  78 66 69 6c 65 73 25 3d  31 36 3a f4 20 4e 75 6d  |xfiles%=16:. Num|
00000310  62 65 72 20 6f 66 20 6f  62 6a 65 63 74 73 20 72  |ber of objects r|
00000320  65 61 64 20 69 6e 20 61  74 20 61 20 74 69 6d 65  |ead in at a time|
00000330  0d 01 22 49 6d 61 78 66  73 25 3d 31 32 37 3a f4  |.."Imaxfs%=127:.|
00000340  20 48 69 67 68 65 73 74  20 6b 6e 6f 77 6e 20 46  | Highest known F|
00000350  53 20 6e 75 6d 62 65 72  20 28 6d 61 79 20 65 76  |S number (may ev|
00000360  65 6e 74 75 61 6c 6c 79  20 6e 65 65 64 20 69 6e  |entually need in|
00000370  63 72 65 61 73 69 6e 67  29 0d 01 2c 6b 73 69 7a  |creasing)..,ksiz|
00000380  65 25 3d 6d 61 78 66 69  6c 65 73 25 2a 36 34 3a  |e%=maxfiles%*64:|
00000390  f4 20 4d 61 78 20 66 69  6c 65 73 20 70 65 72 20  |. Max files per |
000003a0  64 69 72 20 61 6e 64 20  36 34 20 62 79 74 65 73  |dir and 64 bytes|
000003b0  20 70 65 72 20 66 69 6c  65 20 69 6e 66 6f 20 28  | per file info (|
000003c0  69 6e 63 72 65 61 73 65  64 20 74 6f 20 61 6c 6c  |increased to all|
000003d0  6f 77 20 66 6f 72 20 6c  6f 6e 67 65 72 20 6e 61  |ow for longer na|
000003e0  6d 65 73 29 0d 01 36 33  de 20 66 62 75 66 66 25  |mes)..63. fbuff%|
000003f0  20 31 32 2c 69 6e 62 75  66 66 25 20 32 30 2c 6f  | 12,inbuff% 20,o|
00000400  75 74 62 75 66 66 25 20  32 30 2c 73 65 65 6b 62  |utbuff% 20,seekb|
00000410  75 66 66 25 20 36 34 0d  01 40 29 f7 20 8d 74 40  |uff% 64..@). .t@|
00000420  51 3a e3 20 78 25 3d 30  20 b8 20 31 36 20 88 20  |Q:. x%=0 . 16 . |
00000430  34 3a f3 20 78 25 21 69  6e 62 75 66 66 25 3a ed  |4:. x%!inbuff%:.|
00000440  0d 01 4a 31 69 63 6f 6e  24 3d 22 49 63 6f 6e 53  |..J1icon$="IconS|
00000450  70 72 69 74 65 73 20 3c  4f 62 65 79 24 44 69 72  |prites <Obey$Dir|
00000460  3e 2e 21 53 70 72 69 74  65 73 22 2b bd 28 26 41  |>.!Sprites"+.(&A|
00000470  29 0d 01 54 15 69 63 6f  6e 6c 65 6e 25 3d a9 28  |)..T.iconlen%=.(|
00000480  69 63 6f 6e 24 29 0d 01  5e 5a 70 72 6f 74 65 63  |icon$)..^Zprotec|
00000490  74 24 3d 22 7c 20 54 68  69 73 20 66 69 6c 65 20  |t$="| This file |
000004a0  68 61 73 20 62 65 65 6e  20 69 6e 6e 6f 63 75 6c  |has been innocul|
000004b0  61 74 65 64 20 61 67 61  69 6e 73 74 20 74 68 65  |ated against the|
000004c0  20 45 78 74 65 6e 64 20  56 69 72 75 73 22 2b bd  | Extend Virus"+.|
000004d0  28 26 41 29 2b 22 7c 7c  22 2b bd 28 26 46 46 29  |(&A)+"||"+.(&FF)|
000004e0  0d 01 68 18 70 72 6f 74  6c 65 6e 25 3d a9 28 70  |..h.protlen%=.(p|
000004f0  72 6f 74 65 63 74 24 29  0d 01 72 37 65 78 74 65  |rotect$)..r7exte|
00000500  6e 64 68 65 6c 70 24 3d  22 45 78 74 65 6e 64 22  |ndhelp$="Extend"|
00000510  2b bd 28 39 29 2b bd 28  39 29 2b 22 31 2e 35 36  |+.(9)+.(9)+"1.56|
00000520  20 28 30 38 20 4a 75 6c  20 31 39 38 39 29 22 0d  | (08 Jul 1989)".|
00000530  01 7c 55 63 65 62 69 74  68 65 6c 70 24 3d 22 54  |.|Ucebithelp$="T|
00000540  6c 6f 64 4d 6f 64 22 2b  bd 28 39 29 2b bd 28 39  |lodMod"+.(9)+.(9|
00000550  29 2b 22 31 2e 31 31 20  28 31 31 20 4e 6f 76 20  |)+"1.11 (11 Nov |
00000560  31 39 39 30 29 20 62 79  20 44 65 76 69 6c 20 74  |1990) by Devil t|
00000570  68 65 20 4c 4f 52 44 20  4f 46 20 44 41 52 4b 4e  |he LORD OF DARKN|
00000580  45 53 53 22 0d 01 86 37  63 65 62 69 74 6f 62 65  |ESS"...7cebitobe|
00000590  79 24 3d 22 72 6d 65 2e  20 54 6c 6f 64 4d 6f 64  |y$="rme. TlodMod|
000005a0  20 30 20 72 6d 6c 2e 20  3c 4f 62 65 79 24 44 69  | 0 rml. <Obey$Di|
000005b0  72 3e 2e 54 6c 6f 64 4d  6f 64 22 0d 01 90 2b 76  |r>.TlodMod"...+v|
000005c0  69 67 61 79 6f 62 65 79  24 3d 22 52 55 4e 20 22  |igayobey$="RUN "|
000005d0  22 3c 4f 62 65 79 24 44  69 72 3e 2e 64 61 74 61  |"<Obey$Dir>.data|
000005e0  64 71 6d 22 22 22 0d 01  9a 2b 69 63 6f 6e 31 77  |dqm"""...+icon1w|
000005f0  69 6d 70 24 3d 22 77 69  6d 70 73 6c 6f 74 20 2d  |imp$="wimpslot -|
00000600  6d 69 6e 20 31 36 6b 20  2d 6d 61 78 20 31 36 6b  |min 16k -max 16k|
00000610  22 0d 01 a4 2c 69 63 6f  6e 31 6f 62 65 79 24 3d  |"...,icon1obey$=|
00000620  22 42 41 53 49 43 20 2d  71 75 69 74 20 3c 4f 62  |"BASIC -quit <Ob|
00000630  65 79 24 44 69 72 3e 2e  49 63 6f 6e 22 0d 01 ae  |ey$Dir>.Icon"...|
00000640  28 74 68 61 6e 6f 62 65  79 24 3d 22 52 75 6e 20  |(thanobey$="Run |
00000650  3c 4f 62 65 79 24 44 69  72 3e 2e 52 49 53 43 4f  |<Obey$Dir>.RISCO|
00000660  53 65 78 74 22 0d 01 b8  2e 63 65 62 69 74 6f 66  |Sext"....cebitof|
00000670  66 25 3d 26 34 43 34 3a  f4 20 4f 66 66 73 65 74  |f%=&4C4:. Offset|
00000680  20 6f 66 20 69 6e 66 65  63 74 69 6f 6e 20 63 6f  | of infection co|
00000690  75 6e 74 0d 01 c2 2d 61  72 63 68 73 69 7a 65 25  |unt...-archsize%|
000006a0  3d 26 33 39 38 3a f4 20  53 69 7a 65 20 6f 66 20  |=&398:. Size of |
000006b0  41 72 63 68 69 65 56 69  72 75 73 20 63 6f 64 65  |ArchieVirus code|
000006c0  0d 01 cc 34 62 61 73 5f  73 74 61 72 74 25 3d 26  |...4bas_start%=&|
000006d0  38 46 30 30 3a f4 20 53  74 61 72 74 20 61 64 64  |8F00:. Start add|
000006e0  72 65 73 73 20 66 6f 72  20 42 41 53 49 43 20 70  |ress for BASIC p|
000006f0  72 6f 67 73 0d 01 d6 45  76 62 61 73 65 25 3d 26  |rogs...Evbase%=&|
00000700  38 43 38 3a f4 20 42 61  73 65 20 6f 66 20 76 65  |8C8:. Base of ve|
00000710  63 74 6f 72 20 74 61 62  6c 65 20 28 6d 61 79 20  |ctor table (may |
00000720  62 65 20 52 49 53 43 20  4f 53 20 32 2e 30 30 20  |be RISC OS 2.00 |
00000730  73 70 65 63 69 66 69 63  29 0d 01 e0 1d 46 69 6c  |specific)....Fil|
00000740  65 56 25 3d 38 3a f4 20  4f 53 5f 46 69 6c 65 20  |eV%=8:. OS_File |
00000750  76 65 63 74 6f 72 0d 01  ea 29 64 65 66 66 73 24  |vector...)deffs$|
00000760  3d 22 61 64 66 73 22 3a  f4 20 44 65 66 61 75 6c  |="adfs":. Defaul|
00000770  74 20 66 69 6c 69 6e 67  20 73 79 73 74 65 6d 0d  |t filing system.|
00000780  01 f4 2e 6f 6c 64 61 70  70 69 63 6f 6e 24 3d 22  |...oldappicon$="|
00000790  22 3a f4 20 50 72 65 76  69 6f 75 73 20 61 70 70  |":. Previous app|
000007a0  6c 69 63 61 74 69 6f 6e  20 69 63 6f 6e 0d 01 fe  |lication icon...|
000007b0  2c 69 6e 66 65 63 74 25  3d a3 3a 73 74 69 6c 6c  |,infect%=.:still|
000007c0  25 3d a3 3a f4 20 4e 6f  20 76 69 72 75 73 20 63  |%=.:. No virus c|
000007d0  68 65 63 6b 73 20 79 65  74 0d 02 08 41 6e 75 6d  |hecks yet...Anum|
000007e0  6d 65 6d 25 3d 30 3a 6e  75 6d 64 69 73 6b 25 3d  |mem%=0:numdisk%=|
000007f0  30 3a 6e 75 6d 69 6e 6e  6f 63 25 3d 30 3a 6e 75  |0:numinnoc%=0:nu|
00000800  6d 73 63 61 6e 73 25 3d  30 3a f4 20 52 65 73 65  |mscans%=0:. Rese|
00000810  74 20 63 6f 75 6e 74 65  72 73 0d 02 12 37 66 73  |t counters...7fs|
00000820  79 73 6e 75 6d 25 3d 30  3a 66 73 79 73 24 3d 22  |ysnum%=0:fsys$="|
00000830  22 3a f4 20 4e 6f 74 20  63 68 65 63 6b 65 64 20  |":. Not checked |
00000840  66 69 6c 69 6e 67 20 73  79 73 74 65 6d 20 79 65  |filing system ye|
00000850  74 0d 02 1c 2a 69 6e 6e  6f 63 25 3d a3 3a f4 20  |t...*innoc%=.:. |
00000860  4e 6f 74 20 69 6e 6e 6f  63 75 6c 61 74 69 6e 67  |Not innoculating|
00000870  20 62 79 20 64 65 66 61  75 6c 74 0d 02 26 27 6c  | by default..&'l|
00000880  6f 67 67 69 6e 67 25 3d  a3 3a f4 20 4e 6f 74 20  |ogging%=.:. Not |
00000890  6c 6f 67 67 69 6e 67 20  62 79 20 64 65 66 61 75  |logging by defau|
000008a0  6c 74 0d 02 30 2b 6f 70  65 6e 65 64 25 3d a3 3a  |lt..0+opened%=.:|
000008b0  f4 20 44 69 61 6c 6f 67  75 65 20 62 6f 78 20 6e  |. Dialogue box n|
000008c0  6f 74 20 6f 70 65 6e 65  64 20 79 65 74 0d 02 3a  |ot opened yet..:|
000008d0  04 0d 02 44 1b f4 20 41  70 70 6c 69 63 61 74 69  |...D.. Applicati|
000008e0  6f 6e 20 43 6f 6e 73 74  61 6e 74 73 0d 02 4e 32  |on Constants..N2|
000008f0  70 72 6f 67 24 3d 22 56  4b 69 6c 6c 65 72 22 3a  |prog$="VKiller":|
00000900  f4 20 45 6e 67 6c 69 73  68 20 74 65 78 74 20 6e  |. English text n|
00000910  61 6d 65 20 6f 66 20 70  72 6f 67 72 61 6d 0d 02  |ame of program..|
00000920  58 47 c8 99 20 22 58 4f  53 5f 43 4c 49 22 2c 22  |XG.. "XOS_CLI","|
00000930  53 65 74 20 22 2b 70 72  6f 67 24 2b 22 24 56 65  |Set "+prog$+"$Ve|
00000940  72 73 69 6f 6e 20 32 2e  33 30 22 3a f4 20 52 65  |rsion 2.30":. Re|
00000950  67 69 73 74 65 72 20 76  65 72 73 69 6f 6e 20 6e  |gister version n|
00000960  75 6d 62 65 72 0d 02 62  40 76 6b 69 6c 6c 76 61  |umber..b@vkillva|
00000970  72 24 3d 22 3c 22 2b 70  72 6f 67 24 2b 22 24 44  |r$="<"+prog$+"$D|
00000980  69 72 3e 22 3a f4 20 56  4b 69 6c 6c 65 72 20 65  |ir>":. VKiller e|
00000990  6e 76 69 72 6f 6e 6d 65  6e 74 61 6c 20 76 61 72  |nvironmental var|
000009a0  69 61 62 6c 65 0d 02 6c  4a 69 63 6f 6e 62 61 72  |iable..lJiconbar|
000009b0  74 79 70 65 25 3d 2d 31  3a f4 20 2d 31 20 3d 20  |type%=-1:. -1 = |
000009c0  55 74 69 6c 69 74 79 20  28 52 48 53 20 6f 66 20  |Utility (RHS of |
000009d0  62 61 72 29 2c 20 2d 32  20 3d 20 53 65 72 76 69  |bar), -2 = Servi|
000009e0  63 65 20 28 4c 48 53 20  6f 66 20 62 61 72 29 0d  |ce (LHS of bar).|
000009f0  02 76 3e 77 69 6e 64 6d  61 6e 25 3d 32 30 30 3a  |.v>windman%=200:|
00000a00  f4 20 45 78 70 65 63 74  20 61 74 20 4c 45 41 53  |. Expect at LEAS|
00000a10  54 20 56 32 2e 30 30 20  6f 66 20 74 68 65 20 57  |T V2.00 of the W|
00000a20  69 6e 64 6f 77 20 4d 61  6e 61 67 65 72 0d 02 80  |indow Manager...|
00000a30  32 62 6c 24 3d bd 28 30  29 3a f4 20 4e 55 4c 4c  |2bl$=.(0):. NULL|
00000a40  20 63 68 61 72 20 75 73  65 64 20 74 6f 20 74 65  | char used to te|
00000a50  72 6d 69 6e 61 74 65 20  73 74 72 69 6e 67 73 0d  |rminate strings.|
00000a60  02 8a 32 64 69 72 73 63  61 6e 25 3d 31 31 3a f4  |..2dirscan%=11:.|
00000a70  20 44 69 72 65 63 74 6f  72 79 20 73 70 65 63 20  | Directory spec |
00000a80  67 6f 65 73 20 69 6e 20  74 68 69 73 20 69 63 6f  |goes in this ico|
00000a90  6e 0d 02 94 30 73 74 61  74 75 73 25 3d 31 32 3a  |n...0status%=12:|
00000aa0  f4 20 53 74 61 74 75 73  20 6d 65 73 73 61 67 65  |. Status message|
00000ab0  73 20 67 6f 20 69 6e 20  74 68 69 73 20 69 63 6f  |s go in this ico|
00000ac0  6e 0d 02 9e 22 61 70 70  69 63 6f 6e 25 3d 31 38  |n..."appicon%=18|
00000ad0  3a f4 20 41 70 70 6c 69  63 61 74 69 6f 6e 20 69  |:. Application i|
00000ae0  63 6f 6e 0d 02 a8 1c 69  63 6f 6e 6e 61 6d 65 25  |con....iconname%|
00000af0  3d 32 32 3a f4 20 49 63  6f 6e 20 6e 61 6d 65 0d  |=22:. Icon name.|
00000b00  02 b2 22 66 69 6c 65 69  63 6f 6e 25 3d 32 35 3a  |.."fileicon%=25:|
00000b10  f4 20 46 69 6c 65 20 74  6f 74 61 6c 20 69 63 6f  |. File total ico|
00000b20  6e 0d 02 bc 26 64 69 72  69 63 6f 6e 25 3d 32 36  |n...&diricon%=26|
00000b30  3a f4 20 44 69 72 65 63  74 6f 72 79 20 74 6f 74  |:. Directory tot|
00000b40  61 6c 20 69 63 6f 6e 0d  02 c6 34 69 63 6f 6e 62  |al icon...4iconb|
00000b50  61 72 25 3d 31 33 36 3a  f4 20 45 78 74 65 72 6e  |ar%=136:. Extern|
00000b60  61 6c 20 63 6f 6f 72 64  20 68 65 69 67 68 74 20  |al coord height |
00000b70  6f 66 20 69 63 6f 6e 20  62 61 72 0d 02 d0 04 0d  |of icon bar.....|
00000b80  02 da 1f f4 20 57 6f 72  6b 73 70 61 63 65 20 66  |.... Workspace f|
00000b90  6f 72 20 61 70 70 6c 69  63 61 74 69 6f 6e 0d 02  |or application..|
00000ba0  e4 39 de 20 76 6b 69 6c  6c 77 69 6e 64 25 20 26  |.9. vkillwind% &|
00000bb0  45 30 30 2c 69 6e 66 6f  77 69 6e 64 25 20 26 45  |E00,infowind% &E|
00000bc0  30 30 3a f4 20 54 65 6d  70 6c 61 74 65 20 77 6f  |00:. Template wo|
00000bd0  72 6b 73 70 61 63 65 0d  02 ee 25 de 20 70 6f 6c  |rkspace...%. pol|
00000be0  6c 25 20 32 35 36 3a f4  20 57 69 6d 70 5f 50 6f  |l% 256:. Wimp_Po|
00000bf0  6c 6c 20 77 6f 72 6b 73  70 61 63 65 0d 02 f8 28  |ll workspace...(|
00000c00  de 20 69 63 6f 6e 25 20  34 38 3a f4 20 49 63 6f  |. icon% 48:. Ico|
00000c10  6e 20 62 61 72 20 69 63  6f 6e 20 77 6f 72 6b 73  |n bar icon works|
00000c20  70 61 63 65 0d 03 02 40  de 20 74 61 73 6b 63 6f  |pace...@. taskco|
00000c30  6e 73 74 25 20 38 3a 24  74 61 73 6b 63 6f 6e 73  |nst% 8:$taskcons|
00000c40  74 25 3d 22 54 41 53 4b  22 3a f4 20 53 74 6f 72  |t%="TASK":. Stor|
00000c50  65 20 54 61 73 6b 20 63  6f 6e 73 74 61 6e 74 20  |e Task constant |
00000c60  68 65 72 65 0d 03 0c 39  de 20 69 63 6f 6e 64 61  |here...9. iconda|
00000c70  74 61 25 20 32 35 36 3a  f4 20 54 65 6d 70 20 77  |ta% 256:. Temp w|
00000c80  6f 72 6b 73 70 61 63 65  20 74 6f 20 67 65 74 2f  |orkspace to get/|
00000c90  70 75 74 20 69 63 6f 6e  20 64 61 74 61 0d 03 16  |put icon data...|
00000ca0  04 0d 03 20 15 f4 20 49  6e 69 74 69 61 6c 69 73  |... .. Initialis|
00000cb0  65 20 57 49 4d 50 0d 03  2a 4a c8 99 20 22 58 57  |e WIMP..*J.. "XW|
00000cc0  69 6d 70 5f 49 6e 69 74  69 61 6c 69 73 65 22 2c  |imp_Initialise",|
00000cd0  77 69 6e 64 6d 61 6e 25  2c 21 74 61 73 6b 63 6f  |windman%,!taskco|
00000ce0  6e 73 74 25 2c 70 72 6f  67 24 2b 62 6c 24 20 b8  |nst%,prog$+bl$ .|
00000cf0  20 77 69 6e 64 76 65 72  73 25 2c 74 61 73 6b 25  | windvers%,task%|
00000d00  0d 03 34 65 e7 20 77 69  6e 64 76 65 72 73 25 3c  |..4e. windvers%<|
00000d10  77 69 6e 64 6d 61 6e 25  20 8c 20 f2 66 61 74 61  |windman% . .fata|
00000d20  6c 28 70 72 6f 67 24 2b  22 20 72 65 71 75 69 72  |l(prog$+" requir|
00000d30  65 73 20 57 69 6e 64 6f  77 20 4d 61 6e 61 67 65  |es Window Manage|
00000d40  72 20 56 22 2b a4 66 72  61 63 74 69 6f 6e 28 77  |r V"+.fraction(w|
00000d50  69 6e 64 6d 61 6e 25 29  2b 22 20 6f 72 20 6c 61  |indman%)+" or la|
00000d60  74 65 72 22 29 0d 03 3e  04 0d 03 48 17 f4 20 43  |ter")..>...H.. C|
00000d70  6c 61 69 6d 20 66 69 6c  65 20 62 75 66 66 65 72  |laim file buffer|
00000d80  0d 03 52 2e 6d 61 78 62  6f 6f 74 25 3d 30 3a 62  |..R.maxboot%=0:b|
00000d90  75 66 66 25 3d 30 3a f4  20 4e 6f 20 62 75 66 66  |uff%=0:. No buff|
00000da0  65 72 20 63 6c 61 69 6d  65 64 20 79 65 74 0d 03  |er claimed yet..|
00000db0  5c 32 6d 69 6e 62 6f 6f  74 25 3d 26 38 30 30 3a  |\2minboot%=&800:|
00000dc0  f4 20 41 62 73 6f 6c 75  74 65 20 6d 69 6e 69 6d  |. Absolute minim|
00000dd0  75 6d 20 72 65 71 75 69  72 65 64 20 28 32 4b 29  |um required (2K)|
00000de0  0d 03 66 1b f2 63 6c 61  69 6d 5f 62 75 66 66 65  |..f..claim_buffe|
00000df0  72 28 6d 69 6e 62 6f 6f  74 25 29 0d 03 70 04 0d  |r(minboot%)..p..|
00000e00  03 7a 1d f2 6d 65 6e 75  5f 69 6e 69 74 69 61 6c  |.z..menu_initial|
00000e10  69 73 65 28 32 35 36 2c  32 35 36 29 0d 03 84 32  |ise(256,256)...2|
00000e20  f2 67 65 74 74 65 6d 70  6c 61 74 65 73 3a f4 20  |.gettemplates:. |
00000e30  47 65 74 20 77 69 6e 64  6f 77 20 74 65 6d 70 6c  |Get window templ|
00000e40  61 74 65 73 20 66 72 6f  6d 20 66 69 6c 65 0d 03  |ates from file..|
00000e50  8e 24 f2 6d 61 6b 65 69  63 6f 6e 3a f4 20 43 72  |.$.makeicon:. Cr|
00000e60  65 61 74 65 20 69 63 6f  6e 20 62 61 72 20 69 63  |eate icon bar ic|
00000e70  6f 6e 0d 03 98 13 f2 62  75 69 6c 64 5f 66 73 5f  |on.....build_fs_|
00000e80  6e 61 6d 65 73 0d 03 a2  11 f2 63 68 6f 6f 73 65  |names.....choose|
00000e90  5f 66 73 28 30 29 0d 03  ac 0f f2 66 69 6e 69 73  |_fs(0).....finis|
00000ea0  68 73 63 61 6e 0d 03 b6  0c f2 73 63 61 6e 52 4d  |hscan.....scanRM|
00000eb0  41 0d 03 c0 43 68 61 6e  64 25 3d a4 67 65 74 74  |A...Chand%=.gett|
00000ec0  61 73 6b 68 61 6e 64 28  22 54 61 73 6b 4d 61 6e  |askhand("TaskMan|
00000ed0  61 67 65 72 22 29 3a e7  20 68 61 6e 64 25 3a f2  |ager"):. hand%:.|
00000ee0  76 69 67 61 79 5f 72 75  6e 6e 69 6e 67 28 68 61  |vigay_running(ha|
00000ef0  6e 64 25 29 0d 03 ca 38  68 61 6e 64 25 3d a4 67  |nd%)...8hand%=.g|
00000f00  65 74 74 61 73 6b 68 61  6e 64 28 22 20 22 29 3a  |ettaskhand(" "):|
00000f10  e7 20 68 61 6e 64 25 3a  f2 69 63 6f 6e 5f 72 75  |. hand%:.icon_ru|
00000f20  6e 6e 69 6e 67 28 68 61  6e 64 25 29 0d 03 d4 3f  |nning(hand%)...?|
00000f30  68 61 6e 64 25 3d a4 67  65 74 74 61 73 6b 68 61  |hand%=.gettaskha|
00000f40  6e 64 28 22 54 68 61 6e  61 74 6f 73 22 29 3a e7  |nd("Thanatos"):.|
00000f50  20 68 61 6e 64 25 3a f2  74 68 61 6e 5f 72 75 6e  | hand%:.than_run|
00000f60  6e 69 6e 67 28 68 61 6e  64 25 29 0d 03 de 11 f2  |ning(hand%).....|
00000f70  73 74 61 72 74 73 63 61  6e 28 b9 29 0d 03 e8 0f  |startscan(.)....|
00000f80  f2 7a 65 72 6f 63 6f 75  6e 74 73 0d 03 f2 19 f2  |.zerocounts.....|
00000f90  73 74 61 74 75 73 69 6e  66 6f 72 6d 28 22 49 64  |statusinform("Id|
00000fa0  6c 65 22 29 0d 03 fc 05  e1 0d 04 06 04 0d 04 10  |le")............|
00000fb0  0e dd f2 73 68 75 74 64  6f 77 6e 0d 04 1a 16 f2  |...shutdown.....|
00000fc0  72 65 6c 65 61 73 65 52  4d 41 28 62 75 66 66 25  |releaseRMA(buff%|
00000fd0  29 0d 04 24 2a c8 99 20  22 58 57 69 6d 70 5f 43  |)..$*.. "XWimp_C|
00000fe0  6c 6f 73 65 44 6f 77 6e  22 2c 74 61 73 6b 25 2c  |loseDown",task%,|
00000ff0  21 74 61 73 6b 63 6f 6e  73 74 25 0d 04 2e 10 e7  |!taskconst%.....|
00001000  20 6d 75 6c 74 69 25 3d  a3 20 8c 0d 04 38 1b 20  | multi%=. ...8. |
00001010  20 20 f2 75 6e 73 65 74  28 70 72 6f 67 24 2b 22  |  .unset(prog$+"|
00001020  24 44 69 72 22 29 0d 04  42 1f 20 20 20 f2 75 6e  |$Dir")..B.   .un|
00001030  73 65 74 28 70 72 6f 67  24 2b 22 24 56 65 72 73  |set(prog$+"$Vers|
00001040  69 6f 6e 22 29 0d 04 4c  19 20 20 20 f2 75 6e 73  |ion")..L.   .uns|
00001050  65 74 28 22 53 79 73 24  50 61 74 68 22 29 0d 04  |et("Sys$Path")..|
00001060  56 05 cd 0d 04 60 05 e1  0d 04 6a 04 0d 04 74 0f  |V....`....j...t.|
00001070  dd f2 75 6e 73 65 74 28  76 24 29 0d 04 7e 1c c8  |..unset(v$)..~..|
00001080  99 20 22 58 4f 53 5f 43  4c 49 22 2c 22 55 6e 73  |. "XOS_CLI","Uns|
00001090  65 74 20 22 2b 76 24 0d  04 88 05 e1 0d 04 92 04  |et "+v$.........|
000010a0  0d 04 9c 1c dd a4 67 65  74 74 61 73 6b 68 61 6e  |......gettaskhan|
000010b0  64 28 74 61 73 6b 6e 61  6d 65 24 29 0d 04 a6 49  |d(taskname$)...I|
000010c0  f4 20 4d 61 6e 79 20 74  68 61 6e 6b 73 20 74 6f  |. Many thanks to|
000010d0  20 4d 61 72 74 69 6e 20  41 76 69 73 6f 6e 20 66  | Martin Avison f|
000010e0  6f 72 20 74 68 69 73 20  72 6f 75 74 69 6e 65 2e  |or this routine.|
000010f0  20 49 74 20 69 73 20 76  65 72 79 20 6c 6f 77 20  | It is very low |
00001100  6c 65 76 65 6c 0d 04 b0  34 f4 20 61 6e 64 20 22  |level...4. and "|
00001110  68 61 63 6b 79 22 20 73  6f 20 6d 61 79 20 6e 6f  |hacky" so may no|
00001120  74 20 77 6f 72 6b 20 6f  6e 20 66 75 74 75 72 65  |t work on future|
00001130  20 4f 53 27 73 20 3a 2d  28 0d 04 ba 1c ea 20 68  | OS's :-(..... h|
00001140  61 6e 64 6c 65 25 2c 70  74 72 25 3a 68 61 6e 64  |andle%,ptr%:hand|
00001150  6c 65 25 3d 30 0d 04 c4  2f c8 99 20 22 58 4f 53  |le%=0.../.. "XOS|
00001160  5f 4d 6f 64 75 6c 65 22  2c 31 38 2c 22 54 61 73  |_Module",18,"Tas|
00001170  6b 4d 61 6e 61 67 65 72  22 20 b8 20 2c 2c 2c 2c  |kManager" . ,,,,|
00001180  70 74 72 25 0d 04 ce 0c  e7 20 70 74 72 25 20 8c  |ptr%..... ptr% .|
00001190  0d 04 d8 15 20 20 20 70  74 72 25 3d 70 74 72 25  |....   ptr%=ptr%|
000011a0  21 26 31 44 34 0d 04 e2  08 20 20 20 f5 0d 04 ec  |!&1D4....   ....|
000011b0  3f 20 20 20 20 20 20 e7  20 70 74 72 25 3f 34 3d  |?      . ptr%?4=|
000011c0  34 3a e7 20 a4 72 74 6f  7a 28 70 74 72 25 2b 31  |4:. .rtoz(ptr%+1|
000011d0  36 29 3d 74 61 73 6b 6e  61 6d 65 24 3a 68 61 6e  |6)=taskname$:han|
000011e0  64 6c 65 25 3d 70 74 72  25 21 31 32 0d 04 f6 14  |dle%=ptr%!12....|
000011f0  20 20 20 20 20 20 70 74  72 25 3d 21 70 74 72 25  |      ptr%=!ptr%|
00001200  0d 05 00 1d 20 20 20 fd  20 70 74 72 25 3d 2d 31  |....   . ptr%=-1|
00001210  20 84 20 68 61 6e 64 6c  65 25 3c 3e 30 0d 05 0a  | . handle%<>0...|
00001220  05 cd 0d 05 14 0c 3d 68  61 6e 64 6c 65 25 0d 05  |......=handle%..|
00001230  1e 04 0d 05 28 1b dd f2  70 6c 6f 74 61 70 70 69  |....(...plotappi|
00001240  63 6f 6e 28 73 70 72 6e  61 6d 65 24 29 0d 05 32  |con(sprname$)..2|
00001250  1d 73 70 72 6e 61 6d 65  24 3d a4 6c 6f 77 65 72  |.sprname$=.lower|
00001260  28 73 70 72 6e 61 6d 65  24 29 0d 05 3c 1d e7 20  |(sprname$)..<.. |
00001270  73 70 72 6e 61 6d 65 24  3c 3e 6f 6c 64 61 70 70  |sprname$<>oldapp|
00001280  69 63 6f 6e 24 20 8c 0d  05 46 28 20 20 20 f2 70  |icon$ ...F(   .p|
00001290  75 74 64 61 74 61 28 61  70 70 69 63 6f 6e 25 2c  |utdata(appicon%,|
000012a0  22 53 22 2b 73 70 72 6e  61 6d 65 24 2c a3 29 0d  |"S"+sprname$,.).|
000012b0  05 50 1b 20 20 20 6f 6c  64 61 70 70 69 63 6f 6e  |.P.   oldappicon|
000012c0  24 3d 73 70 72 6e 61 6d  65 24 0d 05 5a 05 cd 0d  |$=sprname$..Z...|
000012d0  05 64 05 e1 0d 05 6e 04  0d 05 78 1a dd f2 63 68  |.d....n...x...ch|
000012e0  65 63 6b 28 64 69 72 24  2c 6c 65 61 66 64 69 72  |eck(dir$,leafdir|
000012f0  24 29 0d 05 82 74 ea 20  6f 66 66 25 2c 62 61 73  |$)...t. off%,bas|
00001300  65 25 2c 6e 75 6d 25 2c  6c 6f 6f 70 25 2c 61 64  |e%,num%,loop%,ad|
00001310  64 72 25 2c 6e 61 6d 65  24 2c 66 75 6c 6c 6e 61  |dr%,name$,fullna|
00001320  6d 65 24 2c 6c 65 6e 25  2c 67 6f 74 62 6f 6f 74  |me$,len%,gotboot|
00001330  25 2c 74 79 70 65 25 2c  66 6c 61 67 73 25 2c 65  |%,type%,flags%,e|
00001340  72 72 62 6c 6b 25 2c 67  6f 74 61 70 70 69 63 6f  |rrblk%,gotappico|
00001350  6e 25 2c 69 63 6f 6e 5f  6e 61 6d 65 24 2c 6c 6f  |n%,icon_name$,lo|
00001360  77 6e 61 6d 65 24 0d 05  8c 2b f2 77 69 6d 70 5f  |wname$...+.wimp_|
00001370  70 6f 6c 6c 28 b9 29 3a  e7 20 71 75 69 74 25 3d  |poll(.):. quit%=|
00001380  b9 20 84 20 73 63 61 6e  6e 69 6e 67 25 3d a3 3a  |. . scanning%=.:|
00001390  e1 0d 05 96 1a 62 61 73  65 25 3d a4 63 6c 61 69  |.....base%=.clai|
000013a0  6d 52 4d 41 28 73 69 7a  65 25 29 0d 05 a0 0f e7  |mRMA(size%).....|
000013b0  20 62 61 73 65 25 3d 30  20 8c 0d 05 aa 3e 20 20  | base%=0 ....>  |
000013c0  20 f2 73 74 61 74 75 73  5f 6c 6f 67 28 22 22 2c  | .status_log("",|
000013d0  22 49 6e 73 75 66 66 69  63 69 65 6e 74 20 52 4d  |"Insufficient RM|
000013e0  41 20 2d 20 73 6b 69 70  70 69 6e 67 20 64 65 65  |A - skipping dee|
000013f0  70 65 72 22 2c 22 22 29  0d 05 b4 08 20 20 20 e1  |per","")....   .|
00001400  0d 05 be 05 cd 0d 05 c8  14 e7 20 6c 65 61 66 64  |.......... leafd|
00001410  69 72 24 3c 3e 22 22 20  8c 0d 05 d2 19 20 20 20  |ir$<>"" .....   |
00001420  64 69 72 24 2b 3d 22 2e  22 2b 6c 65 61 66 64 69  |dir$+="."+leafdi|
00001430  72 24 0d 05 dc 19 20 20  20 e7 20 97 28 6c 65 61  |r$....   . .(lea|
00001440  66 64 69 72 24 29 3d 33  33 20 8c 0d 05 e6 38 20  |fdir$)=33 ....8 |
00001450  20 20 20 20 20 f4 20 69  73 20 74 68 65 20 61 70  |     . is the ap|
00001460  70 6c 69 63 61 74 69 6f  6e 20 73 70 72 69 74 65  |plication sprite|
00001470  20 61 6c 72 65 61 64 79  20 69 6e 20 6d 65 6d 6f  | already in memo|
00001480  72 79 3f 0d 05 f0 34 20  20 20 20 20 20 c8 99 20  |ry?...4      .. |
00001490  22 58 57 69 6d 70 5f 53  70 72 69 74 65 4f 70 22  |"XWimp_SpriteOp"|
000014a0  2c 34 30 2c 2c 6c 65 61  66 64 69 72 24 20 b8 20  |,40,,leafdir$ . |
000014b0  3b 66 6c 61 67 73 25 0d  05 fa 45 20 20 20 20 20  |;flags%...E     |
000014c0  20 e7 20 66 6c 61 67 73  25 20 80 20 31 3a 69 63  | . flags% . 1:ic|
000014d0  6f 6e 5f 6e 61 6d 65 24  3d 22 61 70 70 6c 69 63  |on_name$="applic|
000014e0  61 74 69 6f 6e 22 20 8b  20 69 63 6f 6e 5f 6e 61  |ation" . icon_na|
000014f0  6d 65 24 3d 6c 65 61 66  64 69 72 24 0d 06 04 08  |me$=leafdir$....|
00001500  20 20 20 cc 0d 06 0e 20  20 20 20 20 20 20 69 63  |   ....       ic|
00001510  6f 6e 5f 6e 61 6d 65 24  3d 22 64 69 72 65 63 74  |on_name$="direct|
00001520  6f 72 79 22 0d 06 18 08  20 20 20 cd 0d 06 22 25  |ory"....   ..."%|
00001530  20 20 20 f2 70 75 74 64  61 74 61 28 69 63 6f 6e  |   .putdata(icon|
00001540  6e 61 6d 65 25 2c 6c 65  61 66 64 69 72 24 2c a3  |name%,leafdir$,.|
00001550  29 0d 06 2c 1f 20 20 20  f2 70 6c 6f 74 61 70 70  |)..,.   .plotapp|
00001560  69 63 6f 6e 28 69 63 6f  6e 5f 6e 61 6d 65 24 29  |icon(icon_name$)|
00001570  0d 06 36 05 cd 0d 06 40  1d f2 70 75 74 64 61 74  |..6....@..putdat|
00001580  61 28 64 69 72 73 63 61  6e 25 2c 64 69 72 24 2c  |a(dirscan%,dir$,|
00001590  b9 29 0d 06 4a 23 6f 66  66 25 3d 30 3a 67 6f 74  |.)..J#off%=0:got|
000015a0  62 6f 6f 74 25 3d a3 3a  67 6f 74 61 70 70 69 63  |boot%=.:gotappic|
000015b0  6f 6e 25 3d a3 0d 06 54  05 f5 0d 06 5e 14 20 20  |on%=...T....^.  |
000015c0  20 f2 77 69 6d 70 5f 70  6f 6c 6c 28 b9 29 0d 06  | .wimp_poll(.)..|
000015d0  68 20 20 20 20 e7 20 71  75 69 74 25 3d b9 20 84  |h    . quit%=. .|
000015e0  20 73 63 61 6e 6e 69 6e  67 25 3d a3 20 8c 0d 06  | scanning%=. ...|
000015f0  72 10 20 20 20 20 20 20  6e 75 6d 25 3d 30 0d 06  |r.      num%=0..|
00001600  7c 08 20 20 20 cc 0d 06  86 15 20 20 20 20 20 20  ||.   .....      |
00001610  61 64 64 72 25 3d 62 61  73 65 25 0d 06 90 65 20  |addr%=base%...e |
00001620  20 20 20 20 20 c8 99 20  22 58 4f 53 5f 47 42 50  |     .. "XOS_GBP|
00001630  42 22 2c 31 30 2c 64 69  72 24 2b bd 28 30 29 2c  |B",10,dir$+.(0),|
00001640  61 64 64 72 25 2c 6d 61  78 66 69 6c 65 73 25 2c  |addr%,maxfiles%,|
00001650  6f 66 66 25 2c 73 69 7a  65 25 2c 22 2a 22 2b bd  |off%,size%,"*"+.|
00001660  28 30 29 20 b8 20 65 72  72 62 6c 6b 25 2c 2c 2c  |(0) . errblk%,,,|
00001670  6e 75 6d 25 2c 6f 66 66  25 3b 66 6c 61 67 73 25  |num%,off%;flags%|
00001680  0d 06 9a 18 20 20 20 20  20 20 e7 20 66 6c 61 67  |....      . flag|
00001690  73 25 20 80 20 31 20 8c  0d 06 a4 30 20 20 20 20  |s% . 1 ....0    |
000016a0  20 20 20 20 20 f2 73 74  61 74 75 73 5f 6c 6f 67  |     .status_log|
000016b0  28 22 22 2c a4 72 74 6f  7a 28 65 72 72 62 6c 6b  |("",.rtoz(errblk|
000016c0  25 2b 34 29 2c 22 22 29  0d 06 ae 2a 20 20 20 20  |%+4),"")...*    |
000016d0  20 20 20 20 20 6e 75 6d  25 3d 30 3a 73 63 61 6e  |     num%=0:scan|
000016e0  6e 69 6e 67 25 3d a3 3a  62 61 64 73 63 61 6e 25  |ning%=.:badscan%|
000016f0  3d b9 0d 06 b8 0b 20 20  20 20 20 20 cd 0d 06 c2  |=.....      ....|
00001700  08 20 20 20 cd 0d 06 cc  0f 20 20 20 e7 20 6e 75  |.   .....   . nu|
00001710  6d 25 20 8c 0d 06 d6 1c  20 20 20 20 20 20 e3 20  |m% .....      . |
00001720  6c 6f 6f 70 25 3d 30 20  b8 20 6e 75 6d 25 2d 31  |loop%=0 . num%-1|
00001730  0d 06 e0 1a 20 20 20 20  20 20 20 20 20 6f 62 6a  |....         obj|
00001740  25 3d 61 64 64 72 25 21  31 36 0d 06 ea 33 20 20  |%=addr%!16...3  |
00001750  20 20 20 20 20 20 20 6c  65 6e 25 3d 61 64 64 72  |       len%=addr|
00001760  25 21 38 3a 74 79 70 65  25 3d 28 21 61 64 64 72  |%!8:type%=(!addr|
00001770  25 3e 3e 3e 38 29 20 80  20 26 46 46 46 0d 06 f4  |%>>>8) . &FFF...|
00001780  2e 20 20 20 20 20 20 20  20 20 61 64 64 72 25 2b  |.         addr%+|
00001790  3d 32 30 3a 6e 61 6d 65  24 3d a4 67 65 74 73 74  |=20:name$=.getst|
000017a0  72 69 6e 67 28 61 64 64  72 25 29 0d 06 fe 37 20  |ring(addr%)...7 |
000017b0  20 20 20 20 20 20 20 20  61 64 64 72 25 3d 28 61  |        addr%=(a|
000017c0  64 64 72 25 2b 34 29 20  81 20 34 2a 34 3a f4 20  |ddr%+4) . 4*4:. |
000017d0  41 6c 69 67 6e 20 74 6f  20 6e 65 78 74 20 77 6f  |Align to next wo|
000017e0  72 64 0d 07 08 17 20 20  20 20 20 20 20 20 20 e7  |rd....         .|
000017f0  20 6f 62 6a 25 3d 32 20  8c 0d 07 12 25 20 20 20  | obj%=2 ....%   |
00001800  20 20 20 20 20 20 20 20  20 6e 75 6d 64 69 72 73  |         numdirs|
00001810  25 2b 3d 31 3a f2 64 69  72 63 6f 75 6e 74 0d 07  |%+=1:.dircount..|
00001820  1c 22 20 20 20 20 20 20  20 20 20 20 20 20 f2 63  |."            .c|
00001830  68 65 63 6b 28 64 69 72  24 2c 6e 61 6d 65 24 29  |heck(dir$,name$)|
00001840  0d 07 26 0e 20 20 20 20  20 20 20 20 20 cc 0d 07  |..&.         ...|
00001850  30 27 20 20 20 20 20 20  20 20 20 20 20 20 6e 75  |0'            nu|
00001860  6d 66 69 6c 65 73 25 2b  3d 31 3a f2 66 69 6c 65  |mfiles%+=1:.file|
00001870  63 6f 75 6e 74 0d 07 3a  26 20 20 20 20 20 20 20  |count..:&       |
00001880  20 20 20 20 20 6c 6f 77  6e 61 6d 65 24 3d a4 6c  |     lowname$=.l|
00001890  6f 77 65 72 28 6e 61 6d  65 24 29 0d 07 44 24 20  |ower(name$)..D$ |
000018a0  20 20 20 20 20 20 20 20  20 20 20 e7 20 6c 6f 77  |           . low|
000018b0  6e 61 6d 65 24 3d 22 21  62 6f 6f 74 22 20 8c 0d  |name$="!boot" ..|
000018c0  07 4e 1d 20 20 20 20 20  20 20 20 20 20 20 20 20  |.N.             |
000018d0  20 20 67 6f 74 62 6f 6f  74 25 3d b9 0d 07 58 46  |  gotboot%=...XF|
000018e0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 e7  |               .|
000018f0  20 74 79 70 65 25 3d 26  46 45 42 3a f2 63 68 65  | type%=&FEB:.che|
00001900  63 6b 5f 66 6f 72 5f 62  6f 6f 74 5f 76 69 72 75  |ck_for_boot_viru|
00001910  73 28 64 69 72 24 2c 6e  61 6d 65 24 2c 6c 65 6e  |s(dir$,name$,len|
00001920  25 29 0d 07 62 11 20 20  20 20 20 20 20 20 20 20  |%)..b.          |
00001930  20 20 cd 0d 07 6c 1a 20  20 20 20 20 20 20 20 20  |  ...l.         |
00001940  20 20 20 c8 8e 20 74 79  70 65 25 20 ca 0d 07 76  |   .. type% ...v|
00001950  35 20 20 20 20 20 20 20  20 20 20 20 20 c9 20 26  |5            . &|
00001960  46 46 38 3a e7 20 6c 65  6e 25 3e 3d 61 72 63 68  |FF8:. len%>=arch|
00001970  73 69 7a 65 25 20 84 20  69 6e 6e 6f 63 25 3d b9  |size% . innoc%=.|
00001980  20 8c 0d 07 80 42 20 20  20 20 20 20 20 20 20 20  | ....B          |
00001990  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 f2  |               .|
000019a0  63 68 65 63 6b 5f 66 6f  72 5f 61 62 73 5f 76 69  |check_for_abs_vi|
000019b0  72 75 73 28 64 69 72 24  2c 6e 61 6d 65 24 2c 6c  |rus(dir$,name$,l|
000019c0  65 6e 25 29 0d 07 8a 1b  20 20 20 20 20 20 20 20  |en%)....        |
000019d0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 cd 0d  |              ..|
000019e0  07 94 4e 20 20 20 20 20  20 20 20 20 20 20 20 20  |..N             |
000019f0  20 20 20 20 20 20 20 20  20 e7 20 6c 65 6e 25 3e  |         . len%>|
00001a00  3d 31 31 37 35 36 20 80  20 6c 65 6e 25 3c 3d 31  |=11756 . len%<=1|
00001a10  31 37 36 36 20 80 20 6c  6f 77 6e 61 6d 65 24 3d  |1766 . lowname$=|
00001a20  22 72 69 73 63 6f 73 65  78 74 22 20 8c 0d 07 9e  |"riscosext" ....|
00001a30  3f 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |?               |
00001a40  20 20 20 20 20 20 20 20  20 20 f2 66 69 6c 65 5f  |          .file_|
00001a50  76 69 72 75 73 28 64 69  72 24 2c 6e 61 6d 65 24  |virus(dir$,name$|
00001a60  2c 22 54 68 61 6e 61 74  6f 73 22 29 0d 07 a8 1b  |,"Thanatos")....|
00001a70  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001a80  20 20 20 20 20 20 cd 0d  07 b2 16 20 20 20 20 20  |      .....     |
00001a90  20 20 20 20 20 20 20 c9  20 26 46 46 39 0d 07 bc  |       . &FF9...|
00001aa0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001ab0  c8 8e 20 6c 6f 77 6e 61  6d 65 24 20 ca 0d 07 c6  |.. lowname$ ....|
00001ac0  2d 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |-               |
00001ad0  c9 20 22 21 73 70 72 69  74 65 73 22 3a 67 6f 74  |. "!sprites":got|
00001ae0  61 70 70 69 63 6f 6e 25  3d b9 0d 07 d0 1b 20 20  |appicon%=.....  |
00001af0  20 20 20 20 20 20 20 20  20 20 20 20 20 c9 20 22  |             . "|
00001b00  69 63 6f 6e 22 0d 07 da  35 20 20 20 20 20 20 20  |icon"...5       |
00001b10  20 20 20 20 20 20 20 20  20 20 20 6f 62 6a 25 3d  |           obj%=|
00001b20  2d 28 6c 65 6e 25 3d 35  35 37 34 29 2d 28 6c 65  |-(len%=5574)-(le|
00001b30  6e 25 3d 32 36 31 36 29  2a 32 0d 07 e4 43 20 20  |n%=2616)*2...C  |
00001b40  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001b50  e7 20 6f 62 6a 25 3a f2  66 69 6c 65 5f 76 69 72  |. obj%:.file_vir|
00001b60  75 73 28 64 69 72 24 2c  6e 61 6d 65 24 2c 22 49  |us(dir$,name$,"I|
00001b70  63 6f 6e 22 2b c3 28 6f  62 6a 25 29 29 0d 07 ee  |con"+.(obj%))...|
00001b80  14 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |.               |
00001b90  cb 0d 07 f8 3c 20 20 20  20 20 20 20 20 20 20 20  |....<           |
00001ba0  20 c9 20 26 46 46 41 3a  f2 63 68 65 63 6b 5f 66  | . &FFA:.check_f|
00001bb0  6f 72 5f 6d 6f 64 5f 76  69 72 75 73 28 64 69 72  |or_mod_virus(dir|
00001bc0  24 2c 6e 61 6d 65 24 2c  6c 65 6e 25 29 0d 08 02  |$,name$,len%)...|
00001bd0  39 20 20 20 20 20 20 20  20 20 20 20 20 c9 20 26  |9            . &|
00001be0  46 46 42 3a f2 63 68 65  63 6b 5f 66 6f 72 5f 42  |FFB:.check_for_B|
00001bf0  41 53 49 43 5f 76 69 72  75 73 28 64 69 72 24 2c  |ASIC_virus(dir$,|
00001c00  6e 61 6d 65 24 29 0d 08  0c 11 20 20 20 20 20 20  |name$)....      |
00001c10  20 20 20 20 20 20 cb 0d  08 16 0e 20 20 20 20 20  |      .....     |
00001c20  20 20 20 20 cd 0d 08 20  0b 20 20 20 20 20 20 ed  |    ... .      .|
00001c30  0d 08 2a 07 20 20 cd 0d  08 34 25 fd 20 6f 66 66  |..*.  ...4%. off|
00001c40  25 3d 2d 31 20 84 20 71  75 69 74 25 3d b9 20 84  |%=-1 . quit%=. .|
00001c50  20 73 63 61 6e 6e 69 6e  67 25 3d a3 0d 08 3e 46  | scanning%=...>F|
00001c60  e7 20 67 6f 74 62 6f 6f  74 25 3d a3 20 80 20 97  |. gotboot%=. . .|
00001c70  28 6c 65 61 66 64 69 72  24 29 3d 33 33 20 80 20  |(leafdir$)=33 . |
00001c80  69 6e 6e 6f 63 25 3d b9  20 80 20 71 75 69 74 25  |innoc%=. . quit%|
00001c90  3d a3 20 80 20 73 63 61  6e 6e 69 6e 67 25 3d b9  |=. . scanning%=.|
00001ca0  20 8c 0d 08 48 36 20 20  20 e7 20 a4 65 78 74 65  | ...H6   . .exte|
00001cb0  6e 64 5f 69 6e 6e 6f 63  62 6f 6f 74 28 64 69 72  |nd_innocboot(dir|
00001cc0  24 2c 62 61 73 65 25 2c  30 2c 67 6f 74 61 70 70  |$,base%,0,gotapp|
00001cd0  69 63 6f 6e 25 29 20 8c  0d 08 52 3c 20 20 20 20  |icon%) ...R<    |
00001ce0  20 20 f2 73 74 61 74 75  73 5f 6c 6f 67 28 64 69  |  .status_log(di|
00001cf0  72 24 2c 22 21 42 6f 6f  74 20 63 72 65 61 74 65  |r$,"!Boot create|
00001d00  64 20 26 20 69 6e 6e 6f  63 75 6c 61 74 65 64 22  |d & innoculated"|
00001d10  2c 22 22 29 0d 08 5c 08  20 20 20 cd 0d 08 66 05  |,"")..\.   ...f.|
00001d20  cd 0d 08 70 16 f2 72 65  6c 65 61 73 65 52 4d 41  |...p..releaseRMA|
00001d30  28 62 61 73 65 25 29 0d  08 7a 05 e1 0d 08 84 04  |(base%)..z......|
00001d40  0d 08 8e 0e dd f2 6e 65  77 69 6e 6e 6f 63 0d 08  |......newinnoc..|
00001d50  98 2c 6e 75 6d 69 6e 6e  6f 63 25 2b 3d 31 3a f2  |.,numinnoc%+=1:.|
00001d60  70 75 74 64 61 74 61 28  31 35 2c c3 28 6e 75 6d  |putdata(15,.(num|
00001d70  69 6e 6e 6f 63 25 29 2c  a3 29 0d 08 a2 05 e1 0d  |innoc%),.)......|
00001d80  08 ac 04 0d 08 b6 19 dd  f2 75 6e 73 75 70 70 6f  |.........unsuppo|
00001d90  72 74 65 64 28 76 69 72  75 73 24 29 0d 08 c0 aa  |rted(virus$)....|
00001da0  f2 77 61 72 6e 28 76 69  72 75 73 24 2b 22 20 64  |.warn(virus$+" d|
00001db0  65 74 65 63 74 65 64 20  69 6e 20 52 4d 41 20 2d  |etected in RMA -|
00001dc0  20 74 68 65 20 63 75 72  72 65 6e 74 20 72 65 6c  | the current rel|
00001dd0  65 61 73 65 20 6f 66 20  22 2b 70 72 6f 67 24 2b  |ease of "+prog$+|
00001de0  22 20 63 61 6e 6e 6f 74  20 72 65 6d 6f 76 65 20  |" cannot remove |
00001df0  69 74 20 66 72 6f 6d 20  52 4d 41 2e 20 50 6c 65  |it from RMA. Ple|
00001e00  61 73 65 20 68 61 72 64  20 72 65 73 65 74 2c 20  |ase hard reset, |
00001e10  72 65 2d 72 75 6e 20 22  2b 70 72 6f 67 24 2b 22  |re-run "+prog$+"|
00001e20  20 4f 4e 4c 59 20 61 6e  64 20 72 65 2d 73 63 61  | ONLY and re-sca|
00001e30  6e 20 61 6c 6c 20 73 75  73 70 65 63 74 20 64 69  |n all suspect di|
00001e40  73 6b 73 2e 22 29 0d 08  ca 17 71 75 69 74 25 3d  |sks.")....quit%=|
00001e50  b9 3a 73 63 61 6e 6e 69  6e 67 25 3d a3 0d 08 d4  |.:scanning%=....|
00001e60  05 e1 0d 08 de 04 0d 08  e8 2c dd f2 6e 6f 74 69  |.........,..noti|
00001e70  66 79 76 69 72 75 73 28  6d 65 73 73 31 24 2c 6d  |fyvirus(mess1$,m|
00001e80  65 73 73 32 24 2c 63 6f  75 6e 74 25 2c 72 6d 61  |ess2$,count%,rma|
00001e90  25 29 0d 08 f2 0c e7 20  72 6d 61 25 20 8c 0d 08  |%)..... rma% ...|
00001ea0  fc 3d 20 20 20 6e 75 6d  6d 65 6d 25 2b 3d 31 3a  |.=   nummem%+=1:|
00001eb0  f2 70 75 74 64 61 74 61  28 31 33 2c c3 28 6e 75  |.putdata(13,.(nu|
00001ec0  6d 6d 65 6d 25 29 2c a3  29 3a 6d 65 73 73 31 24  |mmem%),.):mess1$|
00001ed0  2b 3d 22 20 69 6e 20 52  4d 41 22 0d 09 06 05 cc  |+=" in RMA".....|
00001ee0  0d 09 10 2d 20 20 20 6e  75 6d 64 69 73 6b 25 2b  |...-   numdisk%+|
00001ef0  3d 31 3a f2 70 75 74 64  61 74 61 28 31 34 2c c3  |=1:.putdata(14,.|
00001f00  28 6e 75 6d 64 69 73 6b  25 29 2c a3 29 0d 09 1a  |(numdisk%),.)...|
00001f10  05 cd 0d 09 24 41 e7 20  6d 65 73 73 32 24 3c 3e  |....$A. mess2$<>|
00001f20  22 22 3a f2 70 75 74 64  61 74 61 28 64 69 72 73  |"":.putdata(dirs|
00001f30  63 61 6e 25 2c 6d 65 73  73 32 24 2b 22 20 43 6f  |can%,mess2$+" Co|
00001f40  75 6e 74 3a 20 22 2b c3  28 63 6f 75 6e 74 25 29  |unt: "+.(count%)|
00001f50  2c a3 29 0d 09 2e 19 69  6e 66 65 63 74 25 3d b9  |,.)....infect%=.|
00001f60  3a f2 6f 70 65 6e 77 69  6e 64 6f 77 0d 09 38 28  |:.openwindow..8(|
00001f70  f2 73 74 61 74 75 73 5f  6c 6f 67 28 22 22 2c 6d  |.status_log("",m|
00001f80  65 73 73 31 24 2b 22 20  66 6f 75 6e 64 20 21 22  |ess1$+" found !"|
00001f90  2c 22 22 29 0d 09 4c 05  e1 0d 09 56 04 0d 09 60  |,"")..L....V...`|
00001fa0  13 dd f2 68 6f 6c 64 69  74 28 73 65 63 73 25 29  |...holdit(secs%)|
00001fb0  0d 09 6a 17 ea 20 74 25  3a 74 25 3d 91 2b 73 65  |..j.. t%:t%=.+se|
00001fc0  63 73 25 2a 31 30 30 0d  09 74 05 f5 0d 09 7e 14  |cs%*100..t....~.|
00001fd0  20 20 20 f2 77 69 6d 70  5f 70 6f 6c 6c 28 a3 29  |   .wimp_poll(.)|
00001fe0  0d 09 88 12 fd 20 91 3e  74 25 20 84 20 71 75 69  |..... .>t% . qui|
00001ff0  74 25 0d 09 92 05 e1 0d  09 9c 04 0d 09 a6 17 dd  |t%..............|
00002000  f2 64 65 6c 66 69 6c 65  28 6d 24 2c 74 79 70 65  |.delfile(m$,type|
00002010  24 29 0d 09 b0 1e e7 20  a4 6f 73 63 6c 69 28 22  |$)..... .oscli("|
00002020  44 65 6c 65 74 65 22 2c  6d 24 2c 22 22 29 20 8c  |Delete",m$,"") .|
00002030  0d 09 ba 29 20 20 f2 73  74 61 74 75 73 5f 6c 6f  |...)  .status_lo|
00002040  67 28 22 22 2c 74 79 70  65 24 2b 22 20 64 65 6c  |g("",type$+" del|
00002050  65 74 65 64 22 2c 6d 24  29 0d 09 c4 05 cc 0d 09  |eted",m$).......|
00002060  ce 31 20 20 f2 73 74 61  74 75 73 5f 6c 6f 67 28  |.1  .status_log(|
00002070  22 22 2c 22 43 6f 75 6c  64 6e 27 74 20 64 65 6c  |"","Couldn't del|
00002080  65 74 65 20 22 2b 74 79  70 65 24 2c 6d 24 29 0d  |ete "+type$,m$).|
00002090  09 d8 05 cd 0d 09 e2 05  e1 0d 09 ec 04 0d 09 f6  |................|
000020a0  15 dd a4 6f 73 63 6c 69  28 6c 24 2c 6d 24 2c 72  |...oscli(l$,m$,r|
000020b0  24 29 0d 0a 00 20 ea 20  66 6c 61 67 73 25 2c 61  |$)... . flags%,a|
000020c0  67 61 69 6e 25 2c 65 72  72 62 6c 6b 25 2c 6f 73  |gain%,errblk%,os|
000020d0  63 24 0d 0a 0a 28 6f 73  63 24 3d 6c 24 2b 22 20  |c$...(osc$=l$+" |
000020e0  22 2b 6d 24 2b 22 20 22  2b 72 24 2b 22 20 7b 20  |"+m$+" "+r$+" { |
000020f0  3e 20 6e 75 6c 6c 3a 20  7d 22 0d 0a 14 05 f5 0d  |> null: }"......|
00002100  0a 1e 16 20 20 20 e7 20  6c 24 3d 22 52 4d 4b 69  |...   . l$="RMKi|
00002110  6c 6c 22 20 8c 0d 0a 28  34 20 20 20 20 20 20 c8  |ll" ...(4      .|
00002120  99 20 22 58 57 69 6d 70  5f 53 74 61 72 74 54 61  |. "XWimp_StartTa|
00002130  73 6b 22 2c 6f 73 63 24  20 b8 20 65 72 72 62 6c  |sk",osc$ . errbl|
00002140  6b 25 3b 66 6c 61 67 73  25 0d 0a 32 08 20 20 20  |k%;flags%..2.   |
00002150  cc 0d 0a 3c 2c 20 20 20  20 20 20 c8 99 20 22 58  |...<,      .. "X|
00002160  4f 53 5f 43 4c 49 22 2c  6f 73 63 24 20 b8 20 65  |OS_CLI",osc$ . e|
00002170  72 72 62 6c 6b 25 3b 66  6c 61 67 73 25 0d 0a 46  |rrblk%;flags%..F|
00002180  08 20 20 20 cd 0d 0a 50  0f 20 20 20 61 67 61 69  |.   ...P.   agai|
00002190  6e 25 3d a3 0d 0a 5a 15  20 20 20 e7 20 66 6c 61  |n%=...Z.   . fla|
000021a0  67 73 25 20 80 20 31 20  8c 0d 0a 64 17 20 20 20  |gs% . 1 ...d.   |
000021b0  20 20 20 c8 8e 20 21 65  72 72 62 6c 6b 25 20 ca  |   .. !errblk% .|
000021c0  0d 0a 6e 13 20 20 20 20  20 20 c9 20 26 31 30 38  |..n.      . &108|
000021d0  43 39 3a 0d 0a 78 47 20  20 20 20 20 20 20 20 20  |C9:..xG         |
000021e0  61 67 61 69 6e 25 3d a4  79 65 73 6e 6f 28 22 57  |again%=.yesno("W|
000021f0  72 69 74 65 2d 70 72 6f  74 65 63 74 65 64 20 64  |rite-protected d|
00002200  69 73 6b 20 2d 20 72 65  74 72 79 20 64 69 73 6b  |isk - retry disk|
00002210  20 77 72 69 74 65 20 3f  22 29 0d 0a 82 32 20 20  | write ?")...2  |
00002220  20 20 20 20 c9 20 26 31  30 38 43 33 3a 61 67 61  |    . &108C3:aga|
00002230  69 6e 25 3d a4 6f 73 63  6c 69 28 22 41 63 63 65  |in%=.oscli("Acce|
00002240  73 73 22 2c 6d 24 2c 22  57 52 22 29 0d 0a 8c 0b  |ss",m$,"WR")....|
00002250  20 20 20 20 20 20 cb 0d  0a 96 1d 20 20 20 20 20  |      .....     |
00002260  20 e7 20 61 67 61 69 6e  25 3d a3 3a 73 74 69 6c  | . again%=.:stil|
00002270  6c 25 3d b9 0d 0a a0 08  20 20 20 cd 0d 0a aa 0e  |l%=.....   .....|
00002280  fd 20 61 67 61 69 6e 25  3d a3 0d 0a b4 15 3d 28  |. again%=.....=(|
00002290  28 66 6c 61 67 73 25 20  80 20 31 29 3d 30 29 0d  |(flags% . 1)=0).|
000022a0  0a be 04 0d 0a c8 1c dd  a4 77 69 6d 70 65 72 72  |.........wimperr|
000022b0  6f 72 28 6d 65 73 73 24  2c 6d 61 73 6b 25 29 0d  |or(mess$,mask%).|
000022c0  0a d2 0c ea 20 63 6c 69  63 6b 25 0d 0a dc 51 c8  |.... click%...Q.|
000022d0  99 20 22 58 57 69 6d 70  5f 52 65 70 6f 72 74 45  |. "XWimp_ReportE|
000022e0  72 72 6f 72 22 2c c4 34  2c 62 6c 24 29 2b 6d 65  |rror",.4,bl$)+me|
000022f0  73 73 24 2b 62 6c 24 2c  6d 61 73 6b 25 2c 70 72  |ss$+bl$,mask%,pr|
00002300  6f 67 24 2b 22 20 57 61  72 6e 69 6e 67 22 2b 62  |og$+" Warning"+b|
00002310  6c 24 20 b8 20 2c 63 6c  69 63 6b 25 0d 0a e6 0b  |l$ . ,click%....|
00002320  3d 63 6c 69 63 6b 25 0d  0a f0 04 0d 0a fa 2f dd  |=click%......./.|
00002330  a4 79 65 73 6e 6f 28 6d  65 73 73 24 29 3d 28 a4  |.yesno(mess$)=(.|
00002340  77 69 6d 70 65 72 72 6f  72 28 6d 65 73 73 24 2c  |wimperror(mess$,|
00002350  25 31 30 30 31 31 29 3d  31 29 0d 0b 04 04 0d 0b  |%10011)=1)......|
00002360  0e 11 dd f2 77 61 72 6e  28 6d 65 73 73 24 29 0d  |....warn(mess$).|
00002370  0b 18 0c ea 20 63 6c 69  63 6b 25 0d 0b 22 23 63  |.... click%.."#c|
00002380  6c 69 63 6b 25 3d a4 77  69 6d 70 65 72 72 6f 72  |lick%=.wimperror|
00002390  28 6d 65 73 73 24 2c 25  31 30 30 30 31 29 0d 0b  |(mess$,%10001)..|
000023a0  2c 05 e1 0d 0b 36 04 0d  0b 40 0d dd f2 73 63 61  |,....6...@...sca|
000023b0  6e 52 4d 41 0d 0b 4a 13  ea 20 73 74 61 72 74 25  |nRMA..J.. start%|
000023c0  2c 66 6c 61 67 73 25 0d  0b 54 23 e7 20 a4 6d 6f  |,flags%..T#. .mo|
000023d0  64 65 78 69 73 74 73 28  22 45 78 74 65 6e 64 22  |dexists("Extend"|
000023e0  2c 73 74 61 72 74 25 29  20 8c 0d 0b 5e 2f 20 20  |,start%) ...^/  |
000023f0  20 e7 20 a4 72 74 6f 7a  28 73 74 61 72 74 25 2b  | . .rtoz(start%+|
00002400  73 74 61 72 74 25 21 26  31 34 29 3d 65 78 74 65  |start%!&14)=exte|
00002410  6e 64 68 65 6c 70 24 20  8c 0d 0b 68 20 20 20 20  |ndhelp$ ...h    |
00002420  20 20 20 f2 65 78 74 65  6e 64 5f 69 6e 5f 52 4d  |   .extend_in_RM|
00002430  41 28 73 74 61 72 74 25  29 0d 0b 72 08 20 20 20  |A(start%)..r.   |
00002440  cd 0d 0b 7c 05 cd 0d 0b  86 24 e7 20 a4 6d 6f 64  |...|.....$. .mod|
00002450  65 78 69 73 74 73 28 22  54 6c 6f 64 4d 6f 64 22  |exists("TlodMod"|
00002460  2c 73 74 61 72 74 25 29  20 8c 0d 0b 90 2e 20 20  |,start%) .....  |
00002470  20 e7 20 a4 72 74 6f 7a  28 73 74 61 72 74 25 2b  | . .rtoz(start%+|
00002480  73 74 61 72 74 25 21 26  31 34 29 3d 63 65 62 69  |start%!&14)=cebi|
00002490  74 68 65 6c 70 24 20 8c  0d 0b 9a 1f 20 20 20 20  |thelp$ .....    |
000024a0  20 20 f2 63 65 62 69 74  5f 69 6e 5f 52 4d 41 28  |  .cebit_in_RMA(|
000024b0  73 74 61 72 74 25 29 0d  0b a4 08 20 20 20 cd 0d  |start%)....   ..|
000024c0  0b ae 05 cd 0d 0b b8 2b  73 74 61 72 74 25 3d a4  |.......+start%=.|
000024d0  76 65 63 74 6f 72 5f 73  63 61 6e 28 46 69 6c 65  |vector_scan(File|
000024e0  56 25 2c 30 2c 26 45 33  35 30 30 30 32 34 29 0d  |V%,0,&E3500024).|
000024f0  0b c2 23 e7 20 73 74 61  72 74 25 3a f2 61 72 63  |..#. start%:.arc|
00002500  68 69 65 5f 69 6e 5f 52  4d 41 28 73 74 61 72 74  |hie_in_RMA(start|
00002510  25 29 0d 0b cc 05 e1 0d  0b d6 04 0d 0b e0 1d dd  |%)..............|
00002520  a4 6d 6f 64 65 78 69 73  74 73 28 6d 6f 64 24 2c  |.modexists(mod$,|
00002530  f8 20 61 64 64 72 25 29  0d 0b ea 0c ea 20 66 6c  |. addr%)..... fl|
00002540  61 67 73 25 0d 0b f4 2d  c8 99 20 22 58 4f 53 5f  |ags%...-.. "XOS_|
00002550  4d 6f 64 75 6c 65 22 2c  31 38 2c 6d 6f 64 24 20  |Module",18,mod$ |
00002560  b8 20 2c 2c 2c 61 64 64  72 25 3b 66 6c 61 67 73  |. ,,,addr%;flags|
00002570  25 0d 0b fe 15 3d 28 28  66 6c 61 67 73 25 20 80  |%....=((flags% .|
00002580  20 31 29 3d 30 29 0d 0c  08 04 0d 0c 12 1b dd f2  | 1)=0)..........|
00002590  65 78 74 65 6e 64 5f 69  6e 5f 52 4d 41 28 73 74  |extend_in_RMA(st|
000025a0  61 72 74 25 29 0d 0c 1c  0d ea 20 68 61 6e 64 6c  |art%)..... handl|
000025b0  65 25 0d 0c 26 2f 68 61  6e 64 6c 65 25 3d a4 67  |e%..&/handle%=.g|
000025c0  65 74 74 61 73 6b 68 61  6e 64 28 22 22 29 3a f4  |ettaskhand(""):.|
000025d0  20 53 61 76 65 20 74 61  73 6b 20 68 61 6e 64 6c  | Save task handl|
000025e0  65 0d 0c 30 0f e7 20 68  61 6e 64 6c 65 25 20 8c  |e..0.. handle% .|
000025f0  0d 0c 3a 3b f4 20 54 68  69 73 20 69 73 20 61 20  |..:;. This is a |
00002600  62 75 67 2d 66 69 78 20  3a 2d 29 20 49 74 20 61  |bug-fix :-) It a|
00002610  6c 6c 6f 77 73 20 74 68  65 20 45 78 74 65 6e 64  |llows the Extend|
00002620  20 56 69 72 75 73 20 74  61 73 6b 0d 0c 44 3c f4  | Virus task..D<.|
00002630  20 74 6f 20 73 68 75 74  64 6f 77 6e 20 70 72 6f  | to shutdown pro|
00002640  70 65 72 6c 79 20 77 69  74 68 6f 75 74 20 63 72  |perly without cr|
00002650  61 73 68 69 6e 67 20 74  68 65 20 54 61 73 6b 20  |ashing the Task |
00002660  4d 61 6e 61 67 65 72 0d  0c 4e 19 20 20 20 73 74  |Manager..N.   st|
00002670  61 72 74 25 21 26 34 30  3d 68 61 6e 64 6c 65 25  |art%!&40=handle%|
00002680  0d 0c 58 14 20 20 20 50  25 3d 73 74 61 72 74 25  |..X.   P%=start%|
00002690  2b 26 37 30 0d 0c 62 0d  20 20 20 5b 4f 50 54 20  |+&70..b.   [OPT |
000026a0  30 0d 0c 6c 35 20 20 20  4c 44 52 20 52 32 2c 73  |0..l5   LDR R2,s|
000026b0  74 61 72 74 25 2b 26 36  34 3a 43 4d 50 20 52 32  |tart%+&64:CMP R2|
000026c0  2c 23 31 3a 53 57 49 47  54 20 22 58 4f 53 5f 4d  |,#1:SWIGT "XOS_M|
000026d0  6f 64 75 6c 65 22 0d 0c  76 2a 20 20 20 4c 44 52  |odule"..v*   LDR|
000026e0  20 52 30 2c 73 74 61 72  74 25 2b 26 34 30 3a 4c  | R0,start%+&40:L|
000026f0  44 52 20 52 31 2c 73 74  61 72 74 25 2b 26 35 34  |DR R1,start%+&54|
00002700  0d 0c 80 08 20 20 20 5d  0d 0c 8a 05 cd 0d 0c 94  |....   ]........|
00002710  39 f2 6e 6f 74 69 66 79  76 69 72 75 73 28 22 45  |9.notifyvirus("E|
00002720  78 74 65 6e 64 20 56 69  72 75 73 22 2c 22 45 78  |xtend Virus","Ex|
00002730  65 63 75 74 69 6f 6e 22  2c 73 74 61 72 74 25 21  |ecution",start%!|
00002740  26 33 34 2c b9 29 0d 0c  9e 28 f2 6b 69 6c 6c 6d  |&34,.)...(.killm|
00002750  6f 64 75 6c 65 28 22 45  78 74 65 6e 64 22 2c 22  |odule("Extend","|
00002760  45 78 74 65 6e 64 20 56  69 72 75 73 22 29 0d 0c  |Extend Virus")..|
00002770  a8 05 e1 0d 0c b2 04 0d  0c bc 1a dd f2 63 65 62  |.............ceb|
00002780  69 74 5f 69 6e 5f 52 4d  41 28 73 74 61 72 74 25  |it_in_RMA(start%|
00002790  29 0d 0c c6 3e f2 6e 6f  74 69 66 79 76 69 72 75  |)...>.notifyviru|
000027a0  73 28 22 43 65 42 69 74  20 56 69 72 75 73 22 2c  |s("CeBit Virus",|
000027b0  22 49 6e 66 65 63 74 69  6f 6e 22 2c 73 74 61 72  |"Infection",star|
000027c0  74 25 21 63 65 62 69 74  6f 66 66 25 2c b9 29 0d  |t%!cebitoff%,.).|
000027d0  0c d0 48 f4 20 4e 65 78  74 20 6c 69 6e 65 20 64  |..H. Next line d|
000027e0  65 76 69 6f 75 73 6c 79  20 66 6c 69 70 73 20 55  |eviously flips U|
000027f0  70 43 61 6c 6c 20 74 72  61 70 20 74 6f 20 52 45  |pCall trap to RE|
00002800  4c 45 41 53 45 20 76 65  63 74 6f 72 20 69 6e 73  |LEASE vector ins|
00002810  74 65 61 64 2e 2e 2e 0d  0c da 2c 50 25 3d 73 74  |tead......,P%=st|
00002820  61 72 74 25 2b 26 46 43  3a 5b 4f 50 54 20 30 3a  |art%+&FC:[OPT 0:|
00002830  53 57 49 20 22 58 4f 53  5f 52 65 6c 65 61 73 65  |SWI "XOS_Release|
00002840  22 3a 5d 0d 0c e4 3b 73  74 61 72 74 25 21 38 3d  |":]...;start%!8=|
00002850  26 45 43 3a f4 20 50 6f  69 6e 74 20 66 69 6e 61  |&EC:. Point fina|
00002860  6c 69 73 61 74 69 6f 6e  20 74 6f 20 6d 6f 64 69  |lisation to modi|
00002870  66 69 65 64 20 74 72 61  70 20 63 6f 64 65 0d 0c  |fied trap code..|
00002880  ee 28 f2 6b 69 6c 6c 6d  6f 64 75 6c 65 28 22 54  |.(.killmodule("T|
00002890  6c 6f 64 4d 6f 64 22 2c  22 43 65 42 69 74 20 56  |lodMod","CeBit V|
000028a0  69 72 75 73 22 29 0d 0c  f8 05 e1 0d 0d 02 04 0d  |irus")..........|
000028b0  0d 0c 1c dd f2 6b 69 6c  6c 6d 6f 64 75 6c 65 28  |.....killmodule(|
000028c0  6d 6f 64 24 2c 6e 61 6d  65 24 29 0d 0d 16 20 e7  |mod$,name$)... .|
000028d0  20 a4 6f 73 63 6c 69 28  22 52 4d 4b 69 6c 6c 22  | .oscli("RMKill"|
000028e0  2c 6d 6f 64 24 2c 22 22  29 20 8c 0d 0d 20 32 20  |,mod$,"") ... 2 |
000028f0  20 20 f2 73 74 61 74 75  73 5f 6c 6f 67 28 22 22  |  .status_log(""|
00002900  2c 6e 61 6d 65 24 2b 22  20 6b 69 6c 6c 65 64 20  |,name$+" killed |
00002910  66 72 6f 6d 20 52 4d 41  22 2c 22 22 29 0d 0d 2a  |from RMA","")..*|
00002920  05 cc 0d 0d 34 3c 20 20  20 f2 73 74 61 74 75 73  |....4<   .status|
00002930  5f 6c 6f 67 28 22 22 2c  22 43 6f 75 6c 64 6e 27  |_log("","Couldn'|
00002940  74 20 6b 69 6c 6c 20 22  2b 6e 61 6d 65 24 2b 22  |t kill "+name$+"|
00002950  20 66 72 6f 6d 20 52 4d  41 22 2c 22 22 29 0d 0d  | from RMA","")..|
00002960  3e 0f 20 20 20 73 74 69  6c 6c 25 3d b9 0d 0d 48  |>.   still%=...H|
00002970  05 cd 0d 0d 52 05 e1 0d  0d 5c 04 0d 0d 66 1a dd  |....R....\...f..|
00002980  f2 61 72 63 68 69 65 5f  69 6e 5f 52 4d 41 28 61  |.archie_in_RMA(a|
00002990  64 64 72 25 29 0d 0d 70  26 f2 6e 6f 74 69 66 79  |ddr%)..p&.notify|
000029a0  76 69 72 75 73 28 22 41  72 63 68 69 65 56 69 72  |virus("ArchieVir|
000029b0  75 73 22 2c 22 22 2c 30  2c b9 29 0d 0d 7a 23 c8  |us","",0,.)..z#.|
000029c0  99 20 22 58 4f 53 5f 52  65 6c 65 61 73 65 22 2c  |. "XOS_Release",|
000029d0  46 69 6c 65 56 25 2c 61  64 64 72 25 2c 30 0d 0d  |FileV%,addr%,0..|
000029e0  84 1c c8 99 20 22 58 4f  53 5f 4d 6f 64 75 6c 65  |.... "XOS_Module|
000029f0  22 2c 37 2c 2c 61 64 64  72 25 0d 0d 8e 34 f2 73  |",7,,addr%...4.s|
00002a00  74 61 74 75 73 5f 6c 6f  67 28 22 22 2c 22 41 72  |tatus_log("","Ar|
00002a10  63 68 69 65 56 69 72 75  73 20 6b 69 6c 6c 65 64  |chieVirus killed|
00002a20  20 66 72 6f 6d 20 52 4d  41 22 2c 22 22 29 0d 0d  | from RMA","")..|
00002a30  98 05 e1 0d 0d a2 04 0d  0d ac 19 dd a4 65 78 69  |.............exi|
00002a40  73 74 73 28 66 69 6c 65  24 2c 74 79 70 65 25 29  |sts(file$,type%)|
00002a50  0d 0d b6 13 ea 20 66 6f  75 6e 64 25 2c 66 74 79  |..... found%,fty|
00002a60  70 65 25 0d 0d c0 2a c8  99 20 22 58 4f 53 5f 46  |pe%...*.. "XOS_F|
00002a70  69 6c 65 22 2c 35 2c 66  69 6c 65 24 20 b8 20 66  |ile",5,file$ . f|
00002a80  6f 75 6e 64 25 2c 2c 66  74 79 70 65 25 0d 0d ca  |ound%,,ftype%...|
00002a90  1e 66 74 79 70 65 25 3d  28 66 74 79 70 65 25 3e  |.ftype%=(ftype%>|
00002aa0  3e 3e 38 29 20 80 20 26  46 46 46 0d 0d d4 1e 3d  |>>8) . &FFF....=|
00002ab0  28 66 6f 75 6e 64 25 3d  31 20 80 20 74 79 70 65  |(found%=1 . type|
00002ac0  25 3d 66 74 79 70 65 25  29 0d 0d de 04 0d 0d e8  |%=ftype%).......|
00002ad0  2a dd a4 75 70 70 65 72  28 73 24 29 3d a4 66 6c  |*..upper(s$)=.fl|
00002ae0  69 70 73 74 72 28 73 24  2c 97 22 61 22 2c 97 22  |ipstr(s$,."a",."|
00002af0  7a 22 2c 2d 33 32 29 0d  0d f2 04 0d 0d fc 29 dd  |z",-32).......).|
00002b00  a4 6c 6f 77 65 72 28 73  24 29 3d a4 66 6c 69 70  |.lower(s$)=.flip|
00002b10  73 74 72 28 73 24 2c 97  22 41 22 2c 97 22 5a 22  |str(s$,."A",."Z"|
00002b20  2c 33 32 29 0d 0e 06 04  0d 0e 10 1a dd a4 66 6c  |,32)..........fl|
00002b30  69 70 73 74 72 28 73 24  2c 6c 25 2c 68 25 2c 64  |ipstr(s$,l%,h%,d|
00002b40  25 29 0d 0e 1a 17 ea 20  6c 6f 6f 70 25 2c 6e 24  |%)..... loop%,n$|
00002b50  2c 63 25 3a 6e 24 3d 22  22 0d 0e 24 15 e3 20 6c  |,c%:n$=""..$.. l|
00002b60  6f 6f 70 25 3d 31 20 b8  20 a9 28 73 24 29 0d 0e  |oop%=1 . .(s$)..|
00002b70  2e 17 20 20 20 63 25 3d  97 28 c1 73 24 2c 6c 6f  |..   c%=.(.s$,lo|
00002b80  6f 70 25 29 29 0d 0e 38  1f 20 20 20 e7 20 63 25  |op%))..8.   . c%|
00002b90  3e 3d 6c 25 20 80 20 63  25 3c 3d 68 25 3a 63 25  |>=l% . c%<=h%:c%|
00002ba0  2b 3d 64 25 0d 0e 42 10  20 20 20 6e 24 2b 3d bd  |+=d%..B.   n$+=.|
00002bb0  28 63 25 29 0d 0e 4c 05  ed 0d 0e 56 07 3d 6e 24  |(c%)..L....V.=n$|
00002bc0  0d 0e 60 04 0d 0e 6a 18  dd a4 67 65 74 73 74 72  |..`...j...getstr|
00002bd0  69 6e 67 28 f8 20 61 64  64 72 25 29 0d 0e 74 0e  |ing(. addr%)..t.|
00002be0  ea 20 73 24 3a 73 24 3d  22 22 0d 0e 7e 2d c8 95  |. s$:s$=""..~-..|
00002bf0  20 3f 61 64 64 72 25 3c  3e 30 3a 73 24 2b 3d bd  | ?addr%<>0:s$+=.|
00002c00  28 3f 61 64 64 72 25 29  3a 61 64 64 72 25 2b 3d  |(?addr%):addr%+=|
00002c10  31 3a ce 3a 3d 73 24 0d  0e 88 04 0d 0e 92 17 dd  |1:.:=s$.........|
00002c20  f2 77 69 6d 70 5f 70 6f  6c 6c 28 63 68 65 63 6b  |.wimp_poll(check|
00002c30  25 29 0d 0e 9c 0d ea 20  72 65 61 73 6f 6e 25 0d  |%)..... reason%.|
00002c40  0e a6 25 c8 99 20 22 58  57 69 6d 70 5f 50 6f 6c  |..%.. "XWimp_Pol|
00002c50  6c 22 2c 30 2c 70 6f 6c  6c 25 20 b8 20 72 65 61  |l",0,poll% . rea|
00002c60  73 6f 6e 25 0d 0e b0 10  c8 8e 20 72 65 61 73 6f  |son%...... reaso|
00002c70  6e 25 20 ca 0d 0e ba 25  c9 20 30 3a e7 20 63 68  |n% ....%. 0:. ch|
00002c80  65 63 6b 25 3a f2 63 68  65 63 6b 63 75 72 66 73  |eck%:.checkcurfs|
00002c90  3a f2 73 63 61 6e 52 4d  41 0d 0e c4 37 c9 20 32  |:.scanRMA...7. 2|
00002ca0  3a c8 99 20 22 58 57 69  6d 70 5f 4f 70 65 6e 57  |:.. "XWimp_OpenW|
00002cb0  69 6e 64 6f 77 22 2c 2c  70 6f 6c 6c 25 3a f4 20  |indow",,poll%:. |
00002cc0  49 6e 66 6f 20 77 69 6e  64 6f 77 20 64 72 61 67  |Info window drag|
00002cd0  0d 0e ce 14 c9 20 33 3a  f2 63 6c 6f 73 65 77 69  |..... 3:.closewi|
00002ce0  6e 64 6f 77 0d 0e d8 13  c9 20 36 3a f2 6d 6f 75  |ndow..... 6:.mou|
00002cf0  73 65 63 6c 69 63 6b 0d  0e e2 13 c9 20 39 3a f2  |seclick..... 9:.|
00002d00  6d 65 6e 75 73 65 6c 65  63 74 0d 0e ec 18 c9 20  |menuselect..... |
00002d10  31 37 2c 31 38 3a f2 77  69 6d 70 6d 65 73 73 61  |17,18:.wimpmessa|
00002d20  67 65 0d 0e f6 19 c9 20  31 39 3a 20 f2 61 63 6b  |ge..... 19: .ack|
00002d30  77 69 6d 70 6d 65 73 73  61 67 65 0d 0f 00 05 cb  |wimpmessage.....|
00002d40  0d 0f 0a 05 e1 0d 0f 14  04 0d 0f 1e 10 dd f2 63  |...............c|
00002d50  68 65 63 6b 63 75 72 66  73 0d 0f 28 1f e7 20 a4  |heckcurfs..(.. .|
00002d60  67 65 74 66 73 6e 61 6d  65 28 66 73 79 73 6e 75  |getfsname(fsysnu|
00002d70  6d 25 29 3d 22 22 20 8c  0d 0f 32 49 20 20 20 f2  |m%)="" ...2I   .|
00002d80  77 61 72 6e 28 66 73 79  73 24 2b 22 20 68 61 73  |warn(fsys$+" has|
00002d90  20 62 65 65 6e 20 64 69  73 61 62 6c 65 64 20 2d  | been disabled -|
00002da0  20 63 61 6e 6e 6f 74 20  73 63 61 6e 20 74 68 61  | cannot scan tha|
00002db0  74 20 66 69 6c 69 6e 67  20 73 79 73 74 65 6d 22  |t filing system"|
00002dc0  29 0d 0f 3c 16 20 20 20  f2 62 75 69 6c 64 5f 66  |)..<.   .build_f|
00002dd0  73 5f 6e 61 6d 65 73 0d  0f 46 14 20 20 20 f2 63  |s_names..F.   .c|
00002de0  68 6f 6f 73 65 5f 66 73  28 30 29 0d 0f 50 1d 20  |hoose_fs(0)..P. |
00002df0  20 20 73 63 61 6e 6e 69  6e 67 25 3d a3 3a 62 61  |  scanning%=.:ba|
00002e00  64 73 63 61 6e 25 3d b9  0d 0f 5a 05 cd 0d 0f 64  |dscan%=...Z....d|
00002e10  05 e1 0d 0f 6e 04 0d 0f  78 11 dd f2 63 6c 6f 73  |....n...x...clos|
00002e20  65 77 69 6e 64 6f 77 0d  0f 82 37 c8 99 20 22 58  |ewindow...7.. "X|
00002e30  57 69 6d 70 5f 43 6c 6f  73 65 57 69 6e 64 6f 77  |Wimp_CloseWindow|
00002e40  22 2c 2c 76 6b 69 6c 6c  77 69 6e 64 25 3a f4 20  |",,vkillwind%:. |
00002e50  45 76 61 6c 20 63 6c 6f  73 65 20 62 6f 78 0d 0f  |Eval close box..|
00002e60  8c 05 e1 0d 0f 96 04 0d  0f a0 10 dd f2 6d 6f 75  |.............mou|
00002e70  73 65 63 6c 69 63 6b 0d  0f aa 10 c8 8e 20 70 6f  |seclick...... po|
00002e80  6c 6c 25 21 38 20 ca 0d  0f b4 15 20 20 20 c9 20  |ll%!8 .....   . |
00002e90  31 2c 34 3a f2 73 74 61  72 74 75 70 0d 0f be 19  |1,4:.startup....|
00002ea0  20 20 20 c9 20 20 20 32  3a f2 73 68 6f 77 6e 65  |   .   2:.showne|
00002eb0  77 6d 65 6e 75 0d 0f c8  05 cb 0d 0f d2 05 e1 0d  |wmenu...........|
00002ec0  0f dc 04 0d 0f e6 11 dd  f2 73 68 6f 77 6e 65 77  |.........shownew|
00002ed0  6d 65 6e 75 0d 0f f0 08  ea 20 79 25 0d 0f fa 13  |menu..... y%....|
00002ee0  e7 20 70 6f 6c 6c 25 21  31 32 3d 2d 32 20 8c 0d  |. poll%!12=-2 ..|
00002ef0  10 04 0f 20 79 25 3d 39  36 2b 34 34 2a 32 0d 10  |... y%=96+44*2..|
00002f00  0e 13 20 f2 62 75 69 6c  64 5f 6d 65 6e 75 28 31  |.. .build_menu(1|
00002f10  29 0d 10 18 05 cc 0d 10  22 12 20 79 25 3d 70 6f  |).......". y%=po|
00002f20  6c 6c 25 21 34 2b 31 36  0d 10 2c 13 20 e7 73 63  |ll%!4+16..,. .sc|
00002f30  61 6e 6e 69 6e 67 25 3d  a3 20 8c 0d 10 36 13 20  |anning%=. ...6. |
00002f40  20 c8 8e 20 70 6f 6c 6c  25 21 31 36 20 ca 0d 10  | .. poll%!16 ...|
00002f50  40 1c 20 20 c9 20 37 2c  20 39 3a 20 f2 62 75 69  |@.  . 7, 9: .bui|
00002f60  6c 64 5f 6d 65 6e 75 28  32 29 0d 10 4a 1c 20 20  |ld_menu(2)..J.  |
00002f70  c9 20 38 2c 31 30 3a 20  f2 62 75 69 6c 64 5f 6d  |. 8,10: .build_m|
00002f80  65 6e 75 28 33 29 0d 10  54 17 20 20 7f 3a 20 f2  |enu(3)..T.  .: .|
00002f90  62 75 69 6c 64 5f 6d 65  6e 75 28 31 29 0d 10 5e  |build_menu(1)..^|
00002fa0  07 20 20 cb 0d 10 68 06  20 cc 0d 10 72 14 20 20  |.  ...h. ...r.  |
00002fb0  f2 62 75 69 6c 64 5f 6d  65 6e 75 28 31 29 0d 10  |.build_menu(1)..|
00002fc0  7c 06 20 cd 0d 10 86 05  cd 0d 10 90 29 6f 6c 64  ||. .........)old|
00002fd0  78 25 3d 21 70 6f 6c 6c  25 2d 36 34 3a 6f 6c 64  |x%=!poll%-64:old|
00002fe0  79 25 3d 79 25 3a f2 73  68 6f 77 6f 6c 64 6d 65  |y%=y%:.showoldme|
00002ff0  6e 75 0d 10 9a 05 e1 0d  10 a4 04 0d 10 ae 11 dd  |nu..............|
00003000  f2 73 68 6f 77 6f 6c 64  6d 65 6e 75 0d 10 b8 2c  |.showoldmenu...,|
00003010  c8 99 20 22 58 57 69 6d  70 5f 43 72 65 61 74 65  |.. "XWimp_Create|
00003020  4d 65 6e 75 22 2c 2c 6d  65 6e 75 25 2c 6f 6c 64  |Menu",,menu%,old|
00003030  78 25 2c 6f 6c 64 79 25  0d 10 c2 05 e1 0d 10 cc  |x%,oldy%........|
00003040  04 0d 10 d6 10 dd f2 6f  70 65 6e 77 69 6e 64 6f  |.......openwindo|
00003050  77 0d 10 e0 13 ea 20 78  25 2c 79 25 2c 73 78 25  |w..... x%,y%,sx%|
00003060  2c 73 79 25 0d 10 ea 29  c8 99 20 22 58 57 69 6d  |,sy%...).. "XWim|
00003070  70 5f 47 65 74 57 69 6e  64 6f 77 53 74 61 74 65  |p_GetWindowState|
00003080  22 2c 2c 76 6b 69 6c 6c  77 69 6e 64 25 0d 10 f4  |",,vkillwind%...|
00003090  11 e7 20 6f 70 65 6e 65  64 25 3d a3 20 8c 0d 10  |.. opened%=. ...|
000030a0  fe 49 20 20 20 f4 20 41  75 74 6f 2d 63 65 6e 74  |.I   . Auto-cent|
000030b0  72 65 20 77 69 6e 64 6f  77 20 28 62 75 74 20 6f  |re window (but o|
000030c0  6e 6c 79 20 66 6f 72 20  74 68 65 20 76 65 72 79  |nly for the very|
000030d0  20 66 69 72 73 74 20 74  69 6d 65 20 69 74 20 69  | first time it i|
000030e0  73 20 6f 70 65 6e 29 0d  11 08 31 20 20 20 c8 99  |s open)...1   ..|
000030f0  20 22 58 4f 53 5f 52 65  61 64 56 64 75 56 61 72  | "XOS_ReadVduVar|
00003100  69 61 62 6c 65 73 22 2c  69 6e 62 75 66 66 25 2c  |iables",inbuff%,|
00003110  6f 75 74 62 75 66 66 25  0d 11 12 27 20 20 20 78  |outbuff%...'   x|
00003120  25 3d 6f 75 74 62 75 66  66 25 21 38 2b 31 3a 78  |%=outbuff%!8+1:x|
00003130  25 3d 78 25 3c 3c 21 6f  75 74 62 75 66 66 25 0d  |%=x%<<!outbuff%.|
00003140  11 1c 29 20 20 20 79 25  3d 6f 75 74 62 75 66 66  |..)   y%=outbuff|
00003150  25 21 31 32 2b 31 3a 79  25 3d 79 25 3c 3c 6f 75  |%!12+1:y%=y%<<ou|
00003160  74 62 75 66 66 25 21 34  0d 11 26 25 20 20 20 73  |tbuff%!4..&%   s|
00003170  78 25 3d 76 6b 69 6c 6c  77 69 6e 64 25 21 31 32  |x%=vkillwind%!12|
00003180  2d 76 6b 69 6c 6c 77 69  6e 64 25 21 34 0d 11 30  |-vkillwind%!4..0|
00003190  25 20 20 20 73 79 25 3d  76 6b 69 6c 6c 77 69 6e  |%   sy%=vkillwin|
000031a0  64 25 21 31 36 2d 76 6b  69 6c 6c 77 69 6e 64 25  |d%!16-vkillwind%|
000031b0  21 38 0d 11 3a 3d 20 20  20 76 6b 69 6c 6c 77 69  |!8..:=   vkillwi|
000031c0  6e 64 25 21 34 3d 28 78  25 2d 73 78 25 29 2f 32  |nd%!4=(x%-sx%)/2|
000031d0  3a 76 6b 69 6c 6c 77 69  6e 64 25 21 31 32 3d 76  |:vkillwind%!12=v|
000031e0  6b 69 6c 6c 77 69 6e 64  25 21 34 2b 73 78 25 0d  |killwind%!4+sx%.|
000031f0  11 44 48 20 20 20 76 6b  69 6c 6c 77 69 6e 64 25  |.DH   vkillwind%|
00003200  21 38 3d 28 79 25 2d 73  79 25 2b 69 63 6f 6e 62  |!8=(y%-sy%+iconb|
00003210  61 72 25 2f 32 29 2f 32  3a 76 6b 69 6c 6c 77 69  |ar%/2)/2:vkillwi|
00003220  6e 64 25 21 31 36 3d 76  6b 69 6c 6c 77 69 6e 64  |nd%!16=vkillwind|
00003230  25 21 38 2b 73 79 25 0d  11 4e 10 20 20 20 6f 70  |%!8+sy%..N.   op|
00003240  65 6e 65 64 25 3d b9 0d  11 58 05 cd 0d 11 62 33  |ened%=...X....b3|
00003250  76 6b 69 6c 6c 77 69 6e  64 25 21 32 38 3d 2d 31  |vkillwind%!28=-1|
00003260  3a f4 20 4f 70 65 6e 20  6f 6e 20 74 6f 70 20 6f  |:. Open on top o|
00003270  66 20 65 76 65 72 79 6f  6e 65 20 65 6c 73 65 0d  |f everyone else.|
00003280  11 6c 25 c8 99 20 22 58  57 69 6d 70 5f 4f 70 65  |.l%.. "XWimp_Ope|
00003290  6e 57 69 6e 64 6f 77 22  2c 2c 76 6b 69 6c 6c 77  |nWindow",,vkillw|
000032a0  69 6e 64 25 0d 11 76 05  e1 0d 11 80 12 dc 20 34  |ind%..v....... 4|
000032b0  2c 35 2c 31 31 2c 31 32  2c 2d 31 0d 11 8a 04 0d  |,5,11,12,-1.....|
000032c0  11 94 0d dd f2 73 74 61  72 74 75 70 0d 11 9e 11  |.....startup....|
000032d0  c8 8e 20 70 6f 6c 6c 25  21 31 32 20 ca 0d 11 a8  |.. poll%!12 ....|
000032e0  17 20 20 20 c9 20 2d 32  3a f2 6f 70 65 6e 77 69  |.   . -2:.openwi|
000032f0  6e 64 6f 77 0d 11 b2 14  20 20 20 c9 20 76 6b 69  |ndow....   . vki|
00003300  6c 6c 68 61 6e 64 25 3a  0d 11 bc 17 20 20 20 20  |llhand%:....    |
00003310  20 20 c8 8e 20 70 6f 6c  6c 25 21 31 36 20 ca 0d  |  .. poll%!16 ..|
00003320  11 c6 22 20 20 20 20 20  20 c9 20 37 2c 38 2c 39  |.."      . 7,8,9|
00003330  2c 31 30 3a 20 f2 73 68  6f 77 6e 65 77 6d 65 6e  |,10: .shownewmen|
00003340  75 0d 11 d0 36 20 20 20  20 20 20 c9 20 31 39 3a  |u...6      . 19:|
00003350  e7 20 73 63 61 6e 6e 69  6e 67 25 3a f2 66 69 6e  |. scanning%:.fin|
00003360  69 73 68 73 63 61 6e 20  8b 20 f2 73 74 61 72 74  |ishscan . .start|
00003370  73 63 61 6e 28 a3 29 0d  11 da 0b 20 20 20 20 20  |scan(.)....     |
00003380  20 cb 0d 11 e4 05 cb 0d  11 ee 05 e1 0d 11 f8 04  | ...............|
00003390  0d 12 02 10 dd f2 6d 65  6e 75 73 65 6c 65 63 74  |......menuselect|
000033a0  0d 12 0c 12 ea 20 6d 6f  75 73 65 25 2c 69 74 65  |..... mouse%,ite|
000033b0  6d 25 0d 12 16 12 69 74  65 6d 25 3d 21 70 6f 6c  |m%....item%=!pol|
000033c0  6c 25 2b 31 0d 12 20 33  c8 99 20 22 58 57 69 6d  |l%+1.. 3.. "XWim|
000033d0  70 5f 47 65 74 50 6f 69  6e 74 65 72 49 6e 66 6f  |p_GetPointerInfo|
000033e0  22 2c 2c 70 6f 6c 6c 25  3a 6d 6f 75 73 65 25 3d  |",,poll%:mouse%=|
000033f0  70 6f 6c 6c 25 21 38 0d  12 2a 13 c8 8e 20 6d 65  |poll%!8..*... me|
00003400  6e 75 62 75 69 6c 74 25  20 ca 0d 12 34 13 c9 20  |nubuilt% ...4.. |
00003410  31 3a 20 c8 8e 20 69 74  65 6d 25 20 ca 0d 12 3e  |1: .. item% ...>|
00003420  33 20 20 20 20 20 20 20  20 20 c9 20 6e 75 6d 69  |3         . numi|
00003430  74 65 6d 73 25 3a 71 75  69 74 25 3d b9 3a f4 20  |tems%:quit%=.:. |
00003440  4c 61 73 74 20 49 74 65  6d 20 3d 20 51 75 69 74  |Last Item = Quit|
00003450  0d 12 48 0d 20 20 20 20  20 20 20 20 cb 0d 12 52  |..H.        ...R|
00003460  2c c9 20 32 3a 20 f2 74  69 63 6b 5f 6f 70 74 69  |,. 2: .tick_opti|
00003470  6f 6e 28 6d 65 6e 75 25  2c 66 73 5f 6e 61 6d 65  |on(menu%,fs_name|
00003480  73 24 2c 66 73 79 73 24  29 0d 12 5c 1f 20 20 20  |s$,fsys$)..\.   |
00003490  20 20 20 20 20 f2 63 68  6f 6f 73 65 5f 66 73 28  |     .choose_fs(|
000034a0  69 74 65 6d 25 2d 31 29  0d 12 66 2f 20 20 20 20  |item%-1)..f/    |
000034b0  20 20 20 20 f2 74 69 63  6b 5f 6f 70 74 69 6f 6e  |    .tick_option|
000034c0  28 6d 65 6e 75 25 2c 66  73 5f 6e 61 6d 65 73 24  |(menu%,fs_names$|
000034d0  2c 66 73 79 73 24 29 0d  12 70 31 c9 20 33 3a 20  |,fsys$)..p1. 3: |
000034e0  f2 74 69 63 6b 5f 6f 70  74 69 6f 6e 28 6d 65 6e  |.tick_option(men|
000034f0  75 25 2c 66 73 5f 64 65  76 69 63 65 73 24 2c 66  |u%,fs_devices$,f|
00003500  64 65 76 69 63 65 24 29  0d 12 7a 23 20 20 20 20  |device$)..z#    |
00003510  20 20 20 20 f2 63 68 6f  6f 73 65 5f 64 65 76 69  |    .choose_devi|
00003520  63 65 28 69 74 65 6d 25  2d 31 29 0d 12 84 34 20  |ce(item%-1)...4 |
00003530  20 20 20 20 20 20 20 f2  74 69 63 6b 5f 6f 70 74  |       .tick_opt|
00003540  69 6f 6e 28 6d 65 6e 75  25 2c 66 73 5f 64 65 76  |ion(menu%,fs_dev|
00003550  69 63 65 73 24 2c 66 64  65 76 69 63 65 24 29 0d  |ices$,fdevice$).|
00003560  12 8e 05 cb 0d 12 98 1b  e7 20 6d 6f 75 73 65 25  |......... mouse%|
00003570  3d 31 3a f2 73 68 6f 77  6f 6c 64 6d 65 6e 75 0d  |=1:.showoldmenu.|
00003580  12 a2 05 e1 0d 12 ac 04  0d 12 b6 11 dd f2 77 69  |..............wi|
00003590  6d 70 6d 65 73 73 61 67  65 0d 12 c0 11 c8 8e 20  |mpmessage...... |
000035a0  70 6f 6c 6c 25 21 31 36  20 ca 0d 12 ca 45 20 20  |poll%!16 ....E  |
000035b0  20 c9 20 20 20 20 20 20  30 3a 71 75 69 74 25 3d  | .      0:quit%=|
000035c0  b9 3a f4 20 53 68 75 74  20 64 6f 77 6e 20 28 44  |.:. Shut down (D|
000035d0  65 73 6b 74 6f 70 20 45  78 69 74 2c 20 54 61 73  |esktop Exit, Tas|
000035e0  6b 20 4d 61 6e 61 67 65  72 20 51 75 69 74 29 0d  |k Manager Quit).|
000035f0  12 d4 19 20 20 20 c9 20  26 34 30 30 43 32 3a f2  |...   . &400C2:.|
00003600  61 70 70 73 74 61 72 74  0d 12 de 05 cb 0d 12 e8  |appstart........|
00003610  05 e1 0d 12 f2 04 0d 12  fc 14 dd f2 61 63 6b 77  |............ackw|
00003620  69 6d 70 6d 65 73 73 61  67 65 0d 13 06 12 e7 20  |impmessage..... |
00003630  70 6f 6c 6c 25 21 31 36  3d 35 20 8c 0d 13 10 21  |poll%!16=5 ....!|
00003640  20 f4 20 6e 6f 20 65 64  69 74 6f 72 20 6c 6f 61  | . no editor loa|
00003650  64 65 64 20 2d 20 72 75  6e 20 69 74 21 0d 13 1a  |ded - run it!...|
00003660  28 20 c8 99 22 58 57 69  6d 70 5f 53 74 61 72 74  |( .."XWimp_Start|
00003670  54 61 73 6b 22 2c 22 52  75 6e 20 22 2b 6c 6f 67  |Task","Run "+log|
00003680  6e 61 6d 65 24 0d 13 24  05 cd 0d 13 2e 05 e1 0d  |name$..$........|
00003690  13 38 04 0d 13 42 0e dd  f2 61 70 70 73 74 61 72  |.8...B...appstar|
000036a0  74 0d 13 4c 4a f4 20 55  6e 6c 69 6b 65 2c 20 61  |t..LJ. Unlike, a|
000036b0  68 65 6d 2c 20 63 65 72  74 61 69 6e 20 41 63 6f  |hem, certain Aco|
000036c0  72 6e 20 61 70 70 6c 69  63 61 74 69 6f 6e 73 20  |rn applications |
000036d0  77 65 20 63 6f 75 6c 64  20 6d 65 6e 74 69 6f 6e  |we could mention|
000036e0  2c 20 69 74 20 72 65 61  6c 6c 79 0d 13 56 46 f4  |, it really..VF.|
000036f0  20 69 73 20 6e 69 63 65  20 74 6f 20 6d 61 6b 65  | is nice to make|
00003700  20 73 75 72 65 20 6f 6e  6c 79 20 6f 6e 65 20 69  | sure only one i|
00003710  6e 76 6f 63 61 74 69 6f  6e 20 6f 66 20 74 68 65  |nvocation of the|
00003720  20 70 72 6f 67 72 61 6d  20 68 61 73 20 62 65 65  | program has bee|
00003730  6e 0d 13 60 43 f4 20 61  63 74 69 76 61 74 65 64  |n..`C. activated|
00003740  20 2d 20 74 68 69 73 20  69 73 20 64 6f 6e 65 20  | - this is done |
00003750  62 79 20 63 68 65 63 6b  69 6e 67 20 61 20 6e 65  |by checking a ne|
00003760  77 20 74 61 73 6b 27 73  20 6e 61 6d 65 2f 68 61  |w task's name/ha|
00003770  6e 64 6c 65 0d 13 6a 19  ea 20 68 61 6e 64 25 3a  |ndle..j.. hand%:|
00003780  68 61 6e 64 25 3d 70 6f  6c 6c 25 21 34 0d 13 74  |hand%=poll%!4..t|
00003790  14 e7 20 68 61 6e 64 25  3c 3e 74 61 73 6b 25 20  |.. hand%<>task% |
000037a0  8c 0d 13 7e 1b 20 20 20  c8 8e 20 a4 72 74 6f 7a  |...~.   .. .rtoz|
000037b0  28 70 6f 6c 6c 25 2b 32  38 29 20 ca 0d 13 88 1f  |(poll%+28) .....|
000037c0  20 20 20 c9 20 70 72 6f  67 24 3a 71 75 69 74 25  |   . prog$:quit%|
000037d0  3d b9 3a 6d 75 6c 74 69  25 3d b9 0d 13 92 14 20  |=.:multi%=..... |
000037e0  20 20 c9 20 22 22 3a f2  73 63 61 6e 52 4d 41 0d  |  . "":.scanRMA.|
000037f0  13 9c 21 20 20 20 c9 20  22 20 22 3a f2 69 63 6f  |..!   . " ":.ico|
00003800  6e 5f 72 75 6e 6e 69 6e  67 28 68 61 6e 64 25 29  |n_running(hand%)|
00003810  0d 13 a6 2c 20 20 20 c9  20 22 54 61 73 6b 4d 61  |...,   . "TaskMa|
00003820  6e 61 67 65 72 22 3a f2  76 69 67 61 79 5f 72 75  |nager":.vigay_ru|
00003830  6e 6e 69 6e 67 28 68 61  6e 64 25 29 0d 13 b0 28  |nning(hand%)...(|
00003840  20 20 20 c9 20 22 54 68  61 6e 61 74 6f 73 22 3a  |   . "Thanatos":|
00003850  f2 74 68 61 6e 5f 72 75  6e 6e 69 6e 67 28 68 61  |.than_running(ha|
00003860  6e 64 25 29 0d 13 ba 08  20 20 20 cb 0d 13 c4 05  |nd%)....   .....|
00003870  cd 0d 13 ce 05 e1 0d 13  d8 04 0d 13 e2 18 dd f2  |................|
00003880  73 74 61 74 75 73 65 72  72 6f 72 28 6d 65 73 73  |statuserror(mess|
00003890  24 29 0d 13 ec 1d f2 70  75 74 64 61 74 61 28 73  |$).....putdata(s|
000038a0  74 61 74 75 73 25 2c 6d  65 73 73 24 2c a3 29 0d  |tatus%,mess$,.).|
000038b0  13 f6 0e f2 68 6f 6c 64  69 74 28 31 29 0d 14 00  |....holdit(1)...|
000038c0  05 e1 0d 14 0a 04 0d 14  14 19 dd f2 73 74 61 74  |............stat|
000038d0  75 73 69 6e 66 6f 72 6d  28 6d 65 73 73 24 29 0d  |usinform(mess$).|
000038e0  14 1e 1d f2 70 75 74 64  61 74 61 28 73 74 61 74  |....putdata(stat|
000038f0  75 73 25 2c 6d 65 73 73  24 2c a3 29 0d 14 28 11  |us%,mess$,.)..(.|
00003900  f2 77 69 6d 70 5f 70 6f  6c 6c 28 a3 29 0d 14 32  |.wimp_poll(.)..2|
00003910  05 e1 0d 14 3c 04 0d 14  46 1a dd a4 69 63 6f 6e  |....<...F...icon|
00003920  5f 73 65 6c 65 63 74 65  64 28 69 63 6f 6e 25 29  |_selected(icon%)|
00003930  0d 14 50 2b 21 69 63 6f  6e 64 61 74 61 25 3d 76  |..P+!icondata%=v|
00003940  6b 69 6c 6c 68 61 6e 64  25 3a 69 63 6f 6e 64 61  |killhand%:iconda|
00003950  74 61 25 21 34 3d 69 63  6f 6e 25 0d 14 5a 25 c8  |ta%!4=icon%..Z%.|
00003960  99 22 58 57 69 6d 70 5f  47 65 74 49 63 6f 6e 53  |."XWimp_GetIconS|
00003970  74 61 74 65 22 2c 2c 69  63 6f 6e 64 61 74 61 25  |tate",,icondata%|
00003980  0d 14 64 27 3d 28 28 69  63 6f 6e 64 61 74 61 25  |..d'=((icondata%|
00003990  21 32 34 20 80 20 28 31  3c 3c 32 31 29 29 3d 28  |!24 . (1<<21))=(|
000039a0  31 3c 3c 32 31 29 29 0d  14 6e 04 0d 14 78 20 dd  |1<<21))..n...x .|
000039b0  f2 70 75 74 64 61 74 61  28 69 63 6f 6e 25 2c 6d  |.putdata(icon%,m|
000039c0  65 73 73 24 2c 70 61 74  68 25 29 0d 14 82 2d f4  |ess$,path%)...-.|
000039d0  20 43 68 61 6e 67 65 20  69 63 6f 6e 20 27 69 63  | Change icon 'ic|
000039e0  6f 6e 25 27 20 74 6f 20  74 68 65 20 73 74 72 69  |on%' to the stri|
000039f0  6e 67 20 6d 65 73 73 24  0d 14 8c 3b f4 20 4e 6f  |ng mess$...;. No|
00003a00  74 65 20 74 68 61 74 20  74 68 69 73 20 61 73 73  |te that this ass|
00003a10  75 6d 65 73 20 61 6e 20  69 6e 64 69 72 65 63 74  |umes an indirect|
00003a20  65 64 20 69 63 6f 6e 20  6f 66 20 63 6f 75 72 73  |ed icon of cours|
00003a30  65 20 21 0d 14 96 0f ea  20 6f 66 66 25 2c 6c 65  |e !..... off%,le|
00003a40  6e 25 0d 14 a0 2b 21 69  63 6f 6e 64 61 74 61 25  |n%...+!icondata%|
00003a50  3d 76 6b 69 6c 6c 68 61  6e 64 25 3a 69 63 6f 6e  |=vkillhand%:icon|
00003a60  64 61 74 61 25 21 34 3d  69 63 6f 6e 25 0d 14 aa  |data%!4=icon%...|
00003a70  26 c8 99 20 22 58 57 69  6d 70 5f 47 65 74 49 63  |&.. "XWimp_GetIc|
00003a80  6f 6e 53 74 61 74 65 22  2c 2c 69 63 6f 6e 64 61  |onState",,iconda|
00003a90  74 61 25 0d 14 b4 16 e7  20 69 63 6f 6e 25 3d 61  |ta%..... icon%=a|
00003aa0  70 70 69 63 6f 6e 25 20  8c 0d 14 be 0e 20 20 20  |ppicon% .....   |
00003ab0  6f 66 66 25 3d 33 32 0d  14 c8 05 cc 0d 14 d2 22  |off%=32........"|
00003ac0  20 20 20 6f 66 66 25 3d  32 38 3a 6c 65 6e 25 3d  |   off%=28:len%=|
00003ad0  69 63 6f 6e 64 61 74 61  25 21 33 36 2d 31 0d 14  |icondata%!36-1..|
00003ae0  dc 10 20 20 20 e7 20 70  61 74 68 25 20 8c 0d 14  |..   . path% ...|
00003af0  e6 20 20 20 20 20 20 20  6d 65 73 73 24 3d c1 6d  |.       mess$=.m|
00003b00  65 73 73 24 2c 70 72 65  66 6c 65 6e 25 29 0d 14  |ess$,preflen%)..|
00003b10  f0 34 20 20 20 20 20 20  e7 20 a9 28 6d 65 73 73  |.4      . .(mess|
00003b20  24 29 3e 6c 65 6e 25 3a  6d 65 73 73 24 3d 22 2e  |$)>len%:mess$=".|
00003b30  2e 2e 22 2b c2 6d 65 73  73 24 2c 6c 65 6e 25 2d  |.."+.mess$,len%-|
00003b40  33 29 0d 14 fa 08 20 20  20 cc 0d 15 04 1c 20 20  |3)....   .....  |
00003b50  20 20 20 20 6d 65 73 73  24 3d c0 6d 65 73 73 24  |    mess$=.mess$|
00003b60  2c 6c 65 6e 25 29 0d 15  0e 08 20 20 20 cd 0d 15  |,len%)....   ...|
00003b70  18 05 cd 0d 15 22 1b 24  28 69 63 6f 6e 64 61 74  |.....".$(icondat|
00003b80  61 25 21 6f 66 66 25 29  3d 6d 65 73 73 24 0d 15  |a%!off%)=mess$..|
00003b90  2c 20 69 63 6f 6e 64 61  74 61 25 21 38 3d 30 3a  |, icondata%!8=0:|
00003ba0  69 63 6f 6e 64 61 74 61  25 21 31 32 3d 30 0d 15  |icondata%!12=0..|
00003bb0  36 41 c8 99 20 22 58 57  69 6d 70 5f 53 65 74 49  |6A.. "XWimp_SetI|
00003bc0  63 6f 6e 53 74 61 74 65  22 2c 2c 69 63 6f 6e 64  |conState",,icond|
00003bd0  61 74 61 25 3a f4 20 50  68 69 6c 70 20 43 6f 6c  |ata%:. Philp Col|
00003be0  6d 65 72 20 69 6d 70 72  6f 76 65 6d 65 6e 74 0d  |mer improvement.|
00003bf0  15 40 05 e1 0d 15 4a 04  0d 15 54 0e dd f2 6d 61  |.@....J...T...ma|
00003c00  6b 65 69 63 6f 6e 0d 15  5e 3f 50 25 3d 69 63 6f  |keicon..^?P%=ico|
00003c10  6e 25 3a f4 20 55 73 65  20 62 75 69 6c 74 20 69  |n%:. Use built i|
00003c20  6e 20 61 73 73 65 6d 62  6c 65 72 20 2d 20 65 61  |n assembler - ea|
00003c30  73 69 65 72 20 74 6f 20  73 65 65 20 73 74 72 75  |sier to see stru|
00003c40  63 74 75 72 65 0d 15 68  0a 5b 4f 50 54 20 30 0d  |cture..h.[OPT 0.|
00003c50  15 72 45 20 20 20 20 20  20 20 20 20 20 20 20 20  |.rE             |
00003c60  20 20 20 45 51 55 44 20  20 20 20 69 63 6f 6e 62  |   EQUD    iconb|
00003c70  61 72 74 79 70 65 25 20  20 20 20 3b 20 49 63 6f  |artype%    ; Ico|
00003c80  6e 20 62 61 72 20 27 75  74 69 6c 69 74 79 27 20  |n bar 'utility' |
00003c90  66 6c 61 67 0d 15 7c 3b  20 20 20 20 20 20 20 20  |flag..|;        |
00003ca0  20 20 20 20 20 20 20 20  45 51 55 44 20 20 20 20  |        EQUD    |
00003cb0  30 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |0               |
00003cc0  3b 20 42 6f 74 74 6f 6d  20 6c 65 66 74 20 58 0d  |; Bottom left X.|
00003cd0  15 86 3b 20 20 20 20 20  20 20 20 20 20 20 20 20  |..;             |
00003ce0  20 20 20 45 51 55 44 20  20 20 20 30 20 20 20 20  |   EQUD    0    |
00003cf0  20 20 20 20 20 20 20 20  20 20 20 3b 20 42 6f 74  |           ; Bot|
00003d00  74 6f 6d 20 6c 65 66 74  20 59 0d 15 90 39 20 20  |tom left Y...9  |
00003d10  20 20 20 20 20 20 20 20  20 20 20 20 20 20 45 51  |              EQ|
00003d20  55 44 20 20 20 20 36 39  20 20 20 20 20 20 20 20  |UD    69        |
00003d30  20 20 20 20 20 20 3b 20  54 6f 70 20 72 69 67 68  |      ; Top righ|
00003d40  74 20 58 0d 15 9a 39 20  20 20 20 20 20 20 20 20  |t X...9         |
00003d50  20 20 20 20 20 20 20 45  51 55 44 20 20 20 20 36  |       EQUD    6|
00003d60  38 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |8              ;|
00003d70  20 54 6f 70 20 72 69 67  68 74 20 59 0d 15 a4 3e  | Top right Y...>|
00003d80  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003d90  45 51 55 42 20 20 20 20  25 30 30 30 30 30 30 31  |EQUB    %0000001|
00003da0  30 20 20 20 20 20 20 20  3b 20 49 63 6f 6e 20 69  |0       ; Icon i|
00003db0  73 20 61 20 73 70 72 69  74 65 0d 15 ae 47 20 20  |s a sprite...G  |
00003dc0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 45 51  |              EQ|
00003dd0  55 42 20 20 20 20 25 30  30 31 31 30 30 30 31 20  |UB    %00110001 |
00003de0  20 20 20 20 20 20 3b 20  43 6c 69 63 6b 20 6e 6f  |      ; Click no|
00003df0  74 69 66 69 65 73 2f 49  6e 64 69 72 65 63 74 65  |tifies/Indirecte|
00003e00  64 0d 15 b8 48 20 20 20  20 20 20 20 20 20 20 20  |d...H           |
00003e10  20 20 20 20 20 45 51 55  42 20 20 20 20 25 30 30  |     EQUB    %00|
00003e20  30 30 30 30 30 30 20 20  20 20 20 20 20 3b 20 4e  |000000       ; N|
00003e30  6f 74 68 69 6e 67 20 73  70 65 63 69 61 6c 20 61  |othing special a|
00003e40  62 6f 75 74 20 69 63 6f  6e 0d 15 c2 46 20 20 20  |bout icon...F   |
00003e50  20 20 20 20 20 20 20 20  20 20 20 20 20 45 51 55  |             EQU|
00003e60  42 20 20 20 20 25 30 30  30 30 30 30 30 31 20 20  |B    %00000001  |
00003e70  20 20 20 20 20 3b 20 46  6f 72 65 63 6f 6c 20 3d  |     ; Forecol =|
00003e80  20 31 2c 20 42 61 63 6b  63 6f 6c 20 3d 20 30 0d  | 1, Backcol = 0.|
00003e90  15 cc 44 2e 70 6f 6b 65  73 70 6e 61 6d 65 20 20  |..D.pokespname  |
00003ea0  20 20 20 45 51 55 44 20  20 20 20 70 6f 6b 65 73  |   EQUD    pokes|
00003eb0  70 6e 61 6d 65 2b 31 32  20 20 20 3b 20 50 6f 69  |pname+12   ; Poi|
00003ec0  6e 74 65 72 20 74 6f 20  73 70 72 69 74 65 20 6e  |nter to sprite n|
00003ed0  61 6d 65 0d 15 d6 45 20  20 20 20 20 20 20 20 20  |ame...E         |
00003ee0  20 20 20 20 20 20 20 45  51 55 44 20 20 20 20 31  |       EQUD    1|
00003ef0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00003f00  20 50 6f 69 6e 74 65 72  20 74 6f 20 57 49 4d 50  | Pointer to WIMP|
00003f10  20 73 70 72 69 74 65 73  0d 15 e0 43 20 20 20 20  | sprites...C    |
00003f20  20 20 20 20 20 20 20 20  20 20 20 20 45 51 55 44  |            EQUD|
00003f30  20 20 20 20 31 32 20 20  20 20 20 20 20 20 20 20  |    12          |
00003f40  20 20 20 20 3b 20 4c 65  6e 67 74 68 20 6f 66 20  |    ; Length of |
00003f50  73 70 72 69 74 65 20 6e  61 6d 65 0d 15 ea 3c 2e  |sprite name...<.|
00003f60  73 70 72 69 74 65 6e 61  6d 65 20 20 20 20 20 45  |spritename     E|
00003f70  51 55 53 20 20 20 20 22  21 76 6b 69 6c 6c 65 72  |QUS    "!vkiller|
00003f80  22 2b c4 34 2c 62 6c 24  29 20 3b 20 53 70 72 69  |"+.4,bl$) ; Spri|
00003f90  74 65 20 6e 61 6d 65 0d  15 f4 05 5d 0d 15 fe 2c  |te name....]...,|
00003fa0  c8 99 20 22 58 57 69 6d  70 5f 43 72 65 61 74 65  |.. "XWimp_Create|
00003fb0  49 63 6f 6e 22 2c 2c 69  63 6f 6e 25 20 b8 20 69  |Icon",,icon% . i|
00003fc0  63 6f 6e 68 61 6e 64 25  0d 16 08 05 e1 0d 16 12  |conhand%........|
00003fd0  04 0d 16 1c 12 dd f2 67  65 74 74 65 6d 70 6c 61  |.......gettempla|
00003fe0  74 65 73 0d 16 26 13 ea  20 66 6c 61 67 73 25 2c  |tes..&.. flags%,|
00003ff0  64 75 6d 6d 79 25 0d 16  30 3d c8 99 20 22 58 57  |dummy%..0=.. "XW|
00004000  69 6d 70 5f 4f 70 65 6e  54 65 6d 70 6c 61 74 65  |imp_OpenTemplate|
00004010  22 2c 2c 76 6b 69 6c 6c  76 61 72 24 2b 22 2e 54  |",,vkillvar$+".T|
00004020  65 6d 70 6c 61 74 65 73  22 20 b8 20 3b 66 6c 61  |emplates" . ;fla|
00004030  67 73 25 0d 16 3a 3c e7  20 66 6c 61 67 73 25 20  |gs%..:<. flags% |
00004040  80 20 31 3a f2 66 61 74  61 6c 28 22 4d 69 73 73  |. 1:.fatal("Miss|
00004050  69 6e 67 20 54 65 6d 70  6c 61 74 65 73 20 66 69  |ing Templates fi|
00004060  6c 65 20 66 6f 72 20 22  2b 70 72 6f 67 24 29 0d  |le for "+prog$).|
00004070  16 44 36 76 6b 69 6c 6c  68 61 6e 64 25 3d a4 6c  |.D6vkillhand%=.l|
00004080  6f 61 64 74 65 6d 70 6c  61 74 65 28 76 6b 69 6c  |oadtemplate(vkil|
00004090  6c 77 69 6e 64 25 2c 22  56 4b 69 6c 6c 57 69 6e  |lwind%,"VKillWin|
000040a0  64 6f 77 22 29 0d 16 4e  29 69 6e 66 6f 25 3d a4  |dow")..N)info%=.|
000040b0  6c 6f 61 64 74 65 6d 70  6c 61 74 65 28 69 6e 66  |loadtemplate(inf|
000040c0  6f 77 69 6e 64 25 2c 22  49 6e 66 6f 22 29 0d 16  |owind%,"Info")..|
000040d0  58 1c c8 99 20 22 58 57  69 6d 70 5f 43 6c 6f 73  |X... "XWimp_Clos|
000040e0  65 54 65 6d 70 6c 61 74  65 22 0d 16 62 05 e1 0d  |eTemplate"..b...|
000040f0  16 6c 04 0d 16 76 1f dd  a4 6c 6f 61 64 74 65 6d  |.l...v...loadtem|
00004100  70 6c 61 74 65 28 61 64  64 72 25 2c 77 69 6e 64  |plate(addr%,wind|
00004110  24 29 0d 16 80 47 f4 20  4e 6f 74 65 20 74 68 65  |$)...G. Note the|
00004120  20 2b 34 20 6f 6e 20 74  68 65 20 61 64 64 72 65  | +4 on the addre|
00004130  73 73 20 2d 20 74 68 69  73 20 61 6c 6c 6f 77 73  |ss - this allows|
00004140  20 74 68 65 20 70 6f 6b  69 6e 67 20 6f 66 20 74  | the poking of t|
00004150  68 65 20 68 61 6e 64 6c  65 0d 16 8a 18 ea 20 77  |he handle..... w|
00004160  69 6e 64 68 61 6e 64 25  2c 77 69 6e 64 70 74 72  |indhand%,windptr|
00004170  25 0d 16 94 56 c8 99 20  22 58 57 69 6d 70 5f 4c  |%...V.. "XWimp_L|
00004180  6f 61 64 54 65 6d 70 6c  61 74 65 22 2c 2c 61 64  |oadTemplate",,ad|
00004190  64 72 25 2b 34 2c 61 64  64 72 25 2b 26 37 30 30  |dr%+4,addr%+&700|
000041a0  2c 61 64 64 72 25 2b 26  45 30 30 2c 2d 31 2c 77  |,addr%+&E00,-1,w|
000041b0  69 6e 64 24 2c 30 20 b8  20 2c 2c 2c 2c 2c 2c 77  |ind$,0 . ,,,,,,w|
000041c0  69 6e 64 70 74 72 25 0d  16 9e 53 e7 20 77 69 6e  |indptr%...S. win|
000041d0  64 70 74 72 25 3d 30 3a  f2 66 61 74 61 6c 28 22  |dptr%=0:.fatal("|
000041e0  4d 69 73 73 69 6e 67 20  22 2b 77 69 6e 64 24 2b  |Missing "+wind$+|
000041f0  22 20 77 69 6e 64 6f 77  20 66 72 6f 6d 20 22 2b  |" window from "+|
00004200  70 72 6f 67 24 2b 22 27  73 20 54 65 6d 70 6c 61  |prog$+"'s Templa|
00004210  74 65 73 20 66 69 6c 65  22 29 0d 16 a8 30 c8 99  |tes file")...0..|
00004220  20 22 58 57 69 6d 70 5f  43 72 65 61 74 65 57 69  | "XWimp_CreateWi|
00004230  6e 64 6f 77 22 2c 2c 61  64 64 72 25 2b 34 20 b8  |ndow",,addr%+4 .|
00004240  20 77 69 6e 64 68 61 6e  64 25 0d 16 b2 48 21 61  | windhand%...H!a|
00004250  64 64 72 25 3d 77 69 6e  64 68 61 6e 64 25 3a f4  |ddr%=windhand%:.|
00004260  20 53 74 6f 72 65 20 77  69 6e 64 6f 77 20 68 61  | Store window ha|
00004270  6e 64 6c 65 20 62 65 63  61 75 73 65 20 6e 65 65  |ndle because nee|
00004280  64 65 64 20 62 79 20 6c  61 74 65 72 20 63 61 6c  |ded by later cal|
00004290  6c 73 0d 16 bc 0e 3d 77  69 6e 64 68 61 6e 64 25  |ls....=windhand%|
000042a0  0d 16 c6 04 0d 16 d0 11  dd f2 73 79 73 74 65 6d  |..........system|
000042b0  65 72 72 6f 72 0d 16 da  41 f4 20 57 68 79 20 64  |error...A. Why d|
000042c0  6f 20 49 20 6e 65 65 64  20 74 68 69 73 20 70 72  |o I need this pr|
000042d0  6f 63 20 3f 20 57 65 6c  6c 2c 20 74 68 65 20 57  |oc ? Well, the W|
000042e0  69 6d 70 20 64 6f 65 73  6e 27 74 20 72 65 70 6f  |imp doesn't repo|
000042f0  72 74 20 74 68 65 0d 16  e4 29 f4 20 6f 66 66 65  |rt the...). offe|
00004300  6e 64 69 6e 67 20 6c 69  6e 65 20 6e 75 6d 62 65  |nding line numbe|
00004310  72 20 6f 66 20 61 6e 20  65 72 72 6f 72 20 21 0d  |r of an error !.|
00004320  16 ee 0a ea 20 65 72 72  24 0d 16 f8 27 e7 20 9f  |.... err$...'. .|
00004330  3a 65 72 72 24 3d 22 20  61 74 20 6c 69 6e 65 20  |:err$=" at line |
00004340  22 2b c3 28 9e 29 20 8b  20 65 72 72 24 3d 22 22  |"+.(.) . err$=""|
00004350  0d 17 02 09 ee 20 85 20  87 0d 17 0c 13 f2 66 61  |..... . ......fa|
00004360  74 61 6c 28 f6 24 2b 65  72 72 24 29 0d 17 16 05  |tal(.$+err$)....|
00004370  e1 0d 17 20 04 0d 17 2a  13 dd f2 66 61 74 61 6c  |... ...*...fatal|
00004380  28 65 72 72 6f 72 24 29  0d 17 34 16 ff 22 45 72  |(error$)..4.."Er|
00004390  72 6f 72 20 30 20 22 2b  65 72 72 6f 72 24 0d 17  |ror 0 "+error$..|
000043a0  3e 05 e1 0d 17 48 04 0d  17 52 17 dd a4 67 65 74  |>....H...R...get|
000043b0  66 73 6e 61 6d 65 28 66  73 6e 75 6d 25 29 0d 17  |fsname(fsnum%)..|
000043c0  5c 14 ea 20 66 73 6e 61  6d 65 25 2c 66 6e 61 6d  |\.. fsname%,fnam|
000043d0  65 24 0d 17 66 36 c8 99  20 22 58 4f 53 5f 46 53  |e$..f6.. "XOS_FS|
000043e0  43 6f 6e 74 72 6f 6c 22  2c 33 33 2c 66 73 6e 75  |Control",33,fsnu|
000043f0  6d 25 2c 66 62 75 66 66  25 2c 31 32 20 b8 20 2c  |m%,fbuff%,12 . ,|
00004400  2c 66 73 6e 61 6d 65 25  0d 17 70 10 e7 20 3f 66  |,fsname%..p.. ?f|
00004410  73 6e 61 6d 65 25 20 8c  0d 17 7a 21 20 20 20 66  |sname% ...z!   f|
00004420  6e 61 6d 65 24 3d a4 67  65 74 73 74 72 69 6e 67  |name$=.getstring|
00004430  28 66 73 6e 61 6d 65 25  29 0d 17 84 12 20 20 20  |(fsname%)....   |
00004440  c8 8e 20 66 6e 61 6d 65  24 20 ca 0d 17 8e 7e 20  |.. fname$ ....~ |
00004450  20 20 c9 20 22 6e 75 6c  6c 22 2c 22 70 72 69 6e  |  . "null","prin|
00004460  74 65 72 22 2c 22 73 65  72 69 61 6c 22 2c 22 76  |ter","serial","v|
00004470  64 75 22 2c 22 72 61 77  76 64 75 22 2c 22 6b 62  |du","rawvdu","kb|
00004480  64 22 2c 22 72 61 77 6b  62 64 22 2c 22 64 65 73  |d","rawkbd","des|
00004490  6b 66 73 22 2c 22 6d 73  64 6f 73 22 2c 22 6e 65  |kfs","msdos","ne|
000044a0  74 70 72 69 6e 74 22 2c  22 70 69 70 65 22 3a 66  |tprint","pipe":f|
000044b0  6e 61 6d 65 24 3d 22 22  3a f4 20 4e 6f 74 20 69  |name$="":. Not i|
000044c0  6e 66 65 63 74 61 62 6c  65 0d 17 98 08 20 20 20  |nfectable....   |
000044d0  cb 0d 17 a2 05 cc 0d 17  ac 10 20 20 20 66 6e 61  |..........   fna|
000044e0  6d 65 24 3d 22 22 0d 17  b6 05 cd 0d 17 c0 0b 3d  |me$="".........=|
000044f0  66 6e 61 6d 65 24 0d 17  ca 04 0d 17 d4 17 dd a4  |fname$..........|
00004500  46 53 70 72 65 66 69 78  28 70 72 65 66 69 78 24  |FSprefix(prefix$|
00004510  29 0d 17 de 25 3d a4 63  68 65 63 6b 73 77 69 28  |)...%=.checkswi(|
00004520  22 58 22 2b 70 72 65 66  69 78 24 2b 22 5f 44 72  |"X"+prefix$+"_Dr|
00004530  69 76 65 73 22 29 0d 17  e8 04 0d 17 f2 14 dd a4  |ives")..........|
00004540  63 68 65 63 6b 73 77 69  28 73 77 69 24 29 0d 17  |checkswi(swi$)..|
00004550  fc 11 ea 20 73 77 69 25  2c 66 6c 61 67 73 25 0d  |... swi%,flags%.|
00004560  18 06 34 c8 99 20 22 58  4f 53 5f 53 57 49 4e 75  |..4.. "XOS_SWINu|
00004570  6d 62 65 72 46 72 6f 6d  53 74 72 69 6e 67 22 2c  |mberFromString",|
00004580  2c 73 77 69 24 20 b8 20  73 77 69 25 3b 66 6c 61  |,swi$ . swi%;fla|
00004590  67 73 25 0d 18 10 15 3d  28 28 66 6c 61 67 73 25  |gs%....=((flags%|
000045a0  20 80 20 31 29 3d 30 29  0d 18 1a 04 0d 18 24 22  | . 1)=0)......$"|
000045b0  dd f2 68 61 63 6b 66 6c  61 67 73 28 69 63 6f 6e  |..hackflags(icon|
000045c0  25 2c 65 6f 72 25 2c 63  6c 65 61 72 25 29 0d 18  |%,eor%,clear%)..|
000045d0  2e 19 21 69 63 6f 6e 64  61 74 61 25 3d 76 6b 69  |..!icondata%=vki|
000045e0  6c 6c 68 61 6e 64 25 0d  18 38 15 69 63 6f 6e 64  |llhand%..8.icond|
000045f0  61 74 61 25 21 34 3d 69  63 6f 6e 25 0d 18 42 14  |ata%!4=icon%..B.|
00004600  69 63 6f 6e 64 61 74 61  25 21 38 3d 65 6f 72 25  |icondata%!8=eor%|
00004610  0d 18 4c 17 69 63 6f 6e  64 61 74 61 25 21 31 32  |..L.icondata%!12|
00004620  3d 63 6c 65 61 72 25 0d  18 56 26 c8 99 20 22 58  |=clear%..V&.. "X|
00004630  57 69 6d 70 5f 53 65 74  49 63 6f 6e 53 74 61 74  |Wimp_SetIconStat|
00004640  65 22 2c 2c 69 63 6f 6e  64 61 74 61 25 0d 18 60  |e",,icondata%..`|
00004650  05 e1 0d 18 6a 04 0d 18  74 19 dd f2 68 69 6c 69  |....j...t...hili|
00004660  74 65 28 69 63 6f 6e 25  2c 62 6f 6f 6c 25 29 0d  |te(icon%,bool%).|
00004670  18 7e 2e f2 68 61 63 6b  66 6c 61 67 73 28 69 63  |.~..hackflags(ic|
00004680  6f 6e 25 2c 28 28 2d 62  6f 6f 6c 25 29 3c 3c 32  |on%,((-bool%)<<2|
00004690  31 29 2c 26 30 30 32 30  30 30 30 30 29 0d 18 88  |1),&00200000)...|
000046a0  05 e1 0d 18 92 04 0d 18  9c 0e dd f2 69 6e 69 74  |............init|
000046b0  5f 6c 6f 67 0d 18 a6 15  ea 20 66 25 2c 66 6c 61  |_log..... f%,fla|
000046c0  67 73 25 2c 70 25 2c 66  24 0d 18 b0 12 e7 20 6c  |gs%,p%,f$..... l|
000046d0  6f 67 67 69 6e 67 25 3d  a3 3a e1 0d 18 ba 1e 66  |ogging%=.:.....f|
000046e0  24 3d 22 58 52 61 6d 46  53 5f 46 72 65 65 53 70  |$="XRamFS_FreeSp|
000046f0  61 63 65 22 3a 66 25 3d  30 0d 18 c4 3d e7 20 a4  |ace":f%=0...=. .|
00004700  63 68 65 63 6b 73 77 69  28 66 24 29 3a c8 99 20  |checkswi(f$):.. |
00004710  66 24 2c 22 3a 30 22 20  b8 20 2c 66 25 3b 66 6c  |f$,":0" . ,f%;fl|
00004720  61 67 73 25 3a e7 20 66  6c 61 67 73 25 20 80 20  |ags%:. flags% . |
00004730  31 3a 66 25 3d 30 0d 18  ce 46 e7 20 66 25 3c 33  |1:f%=0...F. f%<3|
00004740  32 37 36 38 3a 6c 6f 67  6e 61 6d 65 24 3d 76 6b  |2768:logname$=vk|
00004750  69 6c 6c 76 61 72 24 2b  22 2e 4c 6f 67 22 20 8b  |illvar$+".Log" .|
00004760  20 6c 6f 67 6e 61 6d 65  24 3d 22 52 41 4d 3a 24  | logname$="RAM:$|
00004770  2e 56 4b 69 6c 6c 65 72  4c 6f 67 22 0d 18 d8 29  |.VKillerLog"...)|
00004780  c8 99 22 58 4f 53 5f 46  69 6c 65 22 2c 31 31 2c  |.."XOS_File",11,|
00004790  6c 6f 67 6e 61 6d 65 24  2c 26 46 46 46 20 b8 20  |logname$,&FFF . |
000047a0  70 25 3b 66 25 0d 18 e2  1a e7 20 66 25 20 80 20  |p%;f%..... f% . |
000047b0  31 3a f2 73 74 6f 70 5f  6c 6f 67 28 70 25 29 0d  |1:.stop_log(p%).|
000047c0  18 ec 05 e1 0d 18 f6 04  0d 19 00 13 dd f2 73 74  |..............st|
000047d0  6f 70 5f 6c 6f 67 28 65  62 25 29 0d 19 0a 3a f2  |op_log(eb%)...:.|
000047e0  77 61 72 6e 28 22 4c 6f  67 67 69 6e 67 20 6f 66  |warn("Logging of|
000047f0  20 61 63 74 69 76 69 74  69 65 73 20 64 69 73 61  | activities disa|
00004800  62 6c 65 64 3a 20 22 2b  a4 72 74 6f 7a 28 65 62  |bled: "+.rtoz(eb|
00004810  25 2b 34 29 29 0d 19 14  0e 6c 6f 67 67 69 6e 67  |%+4))....logging|
00004820  25 3d a3 0d 19 1e 05 e1  0d 19 28 04 0d 19 32 0d  |%=........(...2.|
00004830  dd f2 6c 6f 67 28 73 24  29 0d 19 3c 0b ea 20 63  |..log(s$)..<.. c|
00004840  25 2c 66 25 0d 19 46 12  e7 20 6c 6f 67 67 69 6e  |%,f%..F.. loggin|
00004850  67 25 3d a3 20 e1 0d 19  50 25 c8 99 22 58 4f 53  |g%=. ...P%.."XOS|
00004860  5f 46 69 6e 64 22 2c 26  43 30 2c 6c 6f 67 6e 61  |_Find",&C0,logna|
00004870  6d 65 24 20 b8 20 63 25  3b 66 25 0d 19 5a 1c e7  |me$ . c%;f%..Z..|
00004880  20 66 25 20 80 20 31 3a  f2 73 74 6f 70 5f 6c 6f  | f% . 1:.stop_lo|
00004890  67 28 63 25 29 3a e1 0d  19 64 0c e7 63 25 3c 3e  |g(c%):...d..c%<>|
000048a0  30 20 8c 0d 19 6e 0e 20  cf 23 63 25 3d a2 23 63  |0 ...n. .#c%=.#c|
000048b0  25 0d 19 78 0c 20 d5 23  63 25 2c 73 24 0d 19 82  |%..x. .#c%,s$...|
000048c0  09 20 d9 23 63 25 0d 19  8c 05 cd 0d 19 96 05 e1  |. .#c%..........|
000048d0  0d 19 a0 04 0d 19 aa 23  dd f2 69 6e 66 65 63 74  |.......#..infect|
000048e0  5f 6c 6f 67 28 70 61 74  68 24 2c 6d 65 73 73 24  |_log(path$,mess$|
000048f0  2c 73 75 66 66 24 29 0d  19 b4 16 73 74 69 6c 6c  |,suff$)....still|
00004900  25 3d b9 3a 69 6e 66 65  63 74 25 3d b9 0d 19 be  |%=.:infect%=....|
00004910  22 f2 73 74 61 74 75 73  5f 6c 6f 67 28 70 61 74  |".status_log(pat|
00004920  68 24 2c 6d 65 73 73 24  2c 73 75 66 66 24 29 0d  |h$,mess$,suff$).|
00004930  19 c8 05 e1 0d 19 d2 04  0d 19 dc 23 dd f2 73 74  |...........#..st|
00004940  61 74 75 73 5f 6c 6f 67  28 70 61 74 68 24 2c 6d  |atus_log(path$,m|
00004950  65 73 73 24 2c 73 75 66  66 24 29 0d 19 e6 24 e7  |ess$,suff$)...$.|
00004960  20 73 75 66 66 24 3c 3e  22 22 3a 73 75 66 66 24  | suff$<>"":suff$|
00004970  3d 22 20 28 22 2b 73 75  66 66 24 2b 22 29 22 0d  |=" ("+suff$+")".|
00004980  19 f0 10 e7 20 70 61 74  68 24 3d 22 22 20 8c 0d  |.... path$="" ..|
00004990  19 fa 18 20 20 20 f2 6c  6f 67 28 6d 65 73 73 24  |...   .log(mess$|
000049a0  2b 73 75 66 66 24 29 0d  1a 04 1a 20 20 20 f2 73  |+suff$)....   .s|
000049b0  74 61 74 75 73 65 72 72  6f 72 28 6d 65 73 73 24  |tatuserror(mess$|
000049c0  29 0d 1a 0e 05 cc 0d 1a  18 22 20 20 20 f2 6c 6f  |)........"   .lo|
000049d0  67 28 70 61 74 68 24 2b  22 2e 22 2b 6d 65 73 73  |g(path$+"."+mess|
000049e0  24 2b 73 75 66 66 24 29  0d 1a 22 2f 20 20 20 f2  |$+suff$).."/   .|
000049f0  73 74 61 74 75 73 69 6e  66 6f 72 6d 28 a4 61 70  |statusinform(.ap|
00004a00  70 6e 61 6d 65 28 70 61  74 68 24 29 2b 22 2e 22  |pname(path$)+"."|
00004a10  2b 6d 65 73 73 24 29 0d  1a 2c 05 cd 0d 1a 36 05  |+mess$)..,....6.|
00004a20  e1 0d 1a 40 04 0d 1a 4a  14 dd a4 61 70 70 6e 61  |...@...J...appna|
00004a30  6d 65 28 70 61 74 68 24  29 0d 1a 54 14 ea 20 6c  |me(path$)..T.. l|
00004a40  25 3a 6c 25 3d a9 28 70  61 74 68 24 29 0d 1a 5e  |%:l%=.(path$)..^|
00004a50  27 c8 95 20 6c 25 3e 30  20 80 20 c1 70 61 74 68  |'.. l%>0 . .path|
00004a60  24 2c 6c 25 2c 31 29 3c  3e 22 2e 22 3a 6c 25 2d  |$,l%,1)<>".":l%-|
00004a70  3d 31 3a ce 0d 1a 68 11  3d c1 70 61 74 68 24 2c  |=1:...h.=.path$,|
00004a80  6c 25 2b 31 29 0d 1a 72  04 0d 1a 7c 0f dd f2 66  |l%+1)..r...|...f|
00004a90  69 6c 65 63 6f 75 6e 74  0d 1a 86 26 f2 70 75 74  |ilecount...&.put|
00004aa0  64 61 74 61 28 66 69 6c  65 69 63 6f 6e 25 2c c3  |data(fileicon%,.|
00004ab0  28 6e 75 6d 66 69 6c 65  73 25 29 2c a3 29 0d 1a  |(numfiles%),.)..|
00004ac0  90 05 e1 0d 1a 9a 04 0d  1a a4 0e dd f2 64 69 72  |.............dir|
00004ad0  63 6f 75 6e 74 0d 1a ae  24 f2 70 75 74 64 61 74  |count...$.putdat|
00004ae0  61 28 64 69 72 69 63 6f  6e 25 2c c3 28 6e 75 6d  |a(diricon%,.(num|
00004af0  64 69 72 73 25 29 2c a3  29 0d 1a b8 05 e1 0d 1a  |dirs%),.).......|
00004b00  c2 04 0d 1a cc 10 dd f2  66 69 6e 69 73 68 73 63  |........finishsc|
00004b10  61 6e 0d 1a d6 1f f2 70  75 74 64 61 74 61 28 31  |an.....putdata(1|
00004b20  39 2c 22 53 74 61 72 74  20 73 63 61 6e 22 2c a3  |9,"Start scan",.|
00004b30  29 0d 1a e0 1f f2 70 75  74 64 61 74 61 28 64 69  |).....putdata(di|
00004b40  72 73 63 61 6e 25 2c 22  49 64 6c 65 22 2c a3 29  |rscan%,"Idle",.)|
00004b50  0d 1a ea 20 f2 70 75 74  64 61 74 61 28 69 63 6f  |... .putdata(ico|
00004b60  6e 6e 61 6d 65 25 2c 22  49 64 6c 65 22 2c a3 29  |nname%,"Idle",.)|
00004b70  0d 1a f4 1b f2 70 6c 6f  74 61 70 70 69 63 6f 6e  |.....plotappicon|
00004b80  28 22 21 22 2b 70 72 6f  67 24 29 0d 1a fe 0f 73  |("!"+prog$)....s|
00004b90  63 61 6e 6e 69 6e 67 25  3d a3 0d 1b 08 05 e1 0d  |canning%=.......|
00004ba0  1b 12 04 0d 1b 1c 10 dd  f2 7a 65 72 6f 63 6f 75  |.........zerocou|
00004bb0  6e 74 73 0d 1b 26 2f 6e  75 6d 64 69 72 73 25 3d  |nts..&/numdirs%=|
00004bc0  30 3a 6e 75 6d 66 69 6c  65 73 25 3d 30 3a f2 66  |0:numfiles%=0:.f|
00004bd0  69 6c 65 63 6f 75 6e 74  3a f2 64 69 72 63 6f 75  |ilecount:.dircou|
00004be0  6e 74 0d 1b 30 05 e1 0d  1b 3a 04 0d 1b 44 16 dd  |nt..0....:...D..|
00004bf0  f2 73 74 61 72 74 73 63  61 6e 28 73 65 6c 66 25  |.startscan(self%|
00004c00  29 0d 1b 4e 12 ea 20 70  72 65 66 69 78 24 2c 64  |)..N.. prefix$,d|
00004c10  65 76 24 0d 1b 58 1e f2  70 75 74 64 61 74 61 28  |ev$..X..putdata(|
00004c20  31 39 2c 22 53 74 6f 70  20 73 63 61 6e 22 2c a3  |19,"Stop scan",.|
00004c30  29 0d 1b 62 2d 73 63 61  6e 6e 69 6e 67 25 3d b9  |)..b-scanning%=.|
00004c40  3a 69 6e 66 65 63 74 25  3d a3 3a 73 74 69 6c 6c  |:infect%=.:still|
00004c50  25 3d a3 3a 62 61 64 73  63 61 6e 25 3d a3 0d 1b  |%=.:badscan%=...|
00004c60  6c 0f f2 7a 65 72 6f 63  6f 75 6e 74 73 0d 1b 76  |l..zerocounts..v|
00004c70  0d e7 20 73 65 6c 66 25  20 8c 0d 1b 80 32 20 20  |.. self% ....2  |
00004c80  20 70 72 65 66 69 78 24  3d 76 6b 69 6c 6c 76 61  | prefix$=vkillva|
00004c90  72 24 3a 64 65 76 24 3d  76 6b 69 6c 6c 76 61 72  |r$:dev$=vkillvar|
00004ca0  24 3a 70 72 65 66 6c 65  6e 25 3d 31 0d 1b 8a 1a  |$:preflen%=1....|
00004cb0  20 20 20 69 6e 6e 6f 63  25 3d a3 3a 6c 6f 67 67  |   innoc%=.:logg|
00004cc0  69 6e 67 25 3d a3 0d 1b  94 05 cc 0d 1b 9e 3c 20  |ing%=.........< |
00004cd0  20 20 70 72 65 66 69 78  24 3d a4 62 75 69 6c 64  |  prefix$=.build|
00004ce0  5f 70 61 74 68 3a 64 65  76 24 3d 22 44 65 76 69  |_path:dev$="Devi|
00004cf0  63 65 22 3a 70 72 65 66  6c 65 6e 25 3d a9 28 70  |ce":preflen%=.(p|
00004d00  72 65 66 69 78 24 29 0d  1b a8 20 20 20 20 69 6e  |refix$)...    in|
00004d10  6e 6f 63 25 3d a4 69 63  6f 6e 5f 73 65 6c 65 63  |noc%=.icon_selec|
00004d20  74 65 64 28 32 30 29 0d  1b b2 22 20 20 20 6c 6f  |ted(20)..."   lo|
00004d30  67 67 69 6e 67 25 3d a4  69 63 6f 6e 5f 73 65 6c  |gging%=.icon_sel|
00004d40  65 63 74 65 64 28 32 31  29 0d 1b bc 05 cd 0d 1b  |ected(21).......|
00004d50  c6 10 e7 20 70 72 65 66  6c 65 6e 25 20 8c 0d 1b  |... preflen% ...|
00004d60  d0 0e 20 f2 69 6e 69 74  5f 6c 6f 67 0d 1b da 2f  |.. .init_log.../|
00004d70  20 f2 6c 6f 67 28 22 53  63 61 6e 20 6f 66 20 22  | .log("Scan of "|
00004d80  2b 70 72 65 66 69 78 24  2b 22 20 73 74 61 72 74  |+prefix$+" start|
00004d90  65 64 20 6f 6e 20 22 2b  91 24 29 0d 1b e4 22 20  |ed on "+.$)..." |
00004da0  f2 73 74 61 74 75 73 69  6e 66 6f 72 6d 28 22 53  |.statusinform("S|
00004db0  63 61 6e 20 73 74 61 72  74 65 64 22 29 0d 1b ee  |can started")...|
00004dc0  17 20 f2 63 68 65 63 6b  28 70 72 65 66 69 78 24  |. .check(prefix$|
00004dd0  2c 22 22 29 0d 1b f8 12  20 f2 68 69 6c 69 74 65  |,"").... .hilite|
00004de0  28 32 33 2c a3 29 0d 1c  02 12 20 e7 20 73 63 61  |(23,.).... . sca|
00004df0  6e 6e 69 6e 67 25 20 8c  0d 1c 0c 33 20 20 20 20  |nning% ....3    |
00004e00  f2 6c 6f 67 28 22 53 63  61 6e 20 6f 66 20 22 2b  |.log("Scan of "+|
00004e10  70 72 65 66 69 78 24 2b  22 20 66 69 6e 69 73 68  |prefix$+" finish|
00004e20  65 64 20 6f 6e 20 22 2b  91 24 29 0d 1c 16 13 20  |ed on "+.$).... |
00004e30  20 20 20 e7 20 73 65 6c  66 25 3d a3 20 8c 0d 1c  |   . self%=. ...|
00004e40  20 33 20 20 20 20 20 20  20 6e 75 6d 73 63 61 6e  | 3       numscan|
00004e50  73 25 2b 3d 31 3a f2 70  75 74 64 61 74 61 28 31  |s%+=1:.putdata(1|
00004e60  37 2c c3 28 6e 75 6d 73  63 61 6e 73 25 29 2c a3  |7,.(numscans%),.|
00004e70  29 0d 1c 2a 09 20 20 20  20 cd 0d 1c 34 13 20 20  |)..*.    ...4.  |
00004e80  20 20 e7 20 69 6e 66 65  63 74 25 20 8c 0d 1c 3e  |  . infect% ...>|
00004e90  15 20 20 20 20 20 20 20  e7 20 73 74 69 6c 6c 25  |.       . still%|
00004ea0  20 8c 0d 1c 48 40 20 20  20 20 20 20 20 20 20 20  | ...H@          |
00004eb0  f2 73 74 61 74 75 73 5f  6c 6f 67 28 22 22 2c 64  |.status_log("",d|
00004ec0  65 76 24 2b 22 20 6d 61  79 20 73 74 69 6c 6c 20  |ev$+" may still |
00004ed0  62 65 20 69 6e 66 65 63  74 65 64 20 21 22 2c 22  |be infected !","|
00004ee0  22 29 0d 1c 52 0c 20 20  20 20 20 20 20 cc 0d 1c  |")..R.       ...|
00004ef0  5c 44 20 20 20 20 20 20  20 20 20 20 f2 73 74 61  |\D          .sta|
00004f00  74 75 73 5f 6c 6f 67 28  22 22 2c 64 65 76 24 2b  |tus_log("",dev$+|
00004f10  22 20 77 61 73 20 69 6e  66 65 63 74 65 64 2c 20  |" was infected, |
00004f20  62 75 74 20 6e 6f 77 20  63 6c 65 61 6e 22 2c 22  |but now clean","|
00004f30  22 29 0d 1c 66 0c 20 20  20 20 20 20 20 cd 0d 1c  |")..f.       ...|
00004f40  7a 09 20 20 20 20 cc 0d  1c 84 3e 20 20 20 20 20  |z.    ....>     |
00004f50  20 20 f2 73 74 61 74 75  73 5f 6c 6f 67 28 22 22  |  .status_log(""|
00004f60  2c 64 65 76 24 2b 22 20  69 73 20 63 6c 65 61 6e  |,dev$+" is clean|
00004f70  20 2d 20 6e 6f 20 69 6e  66 65 63 74 69 6f 6e 73  | - no infections|
00004f80  22 2c 22 22 29 0d 1c 8e  09 20 20 20 20 cd 0d 1c  |","")....    ...|
00004f90  98 06 20 cc 0d 1c a2 16  20 20 20 20 e7 20 62 61  |.. .....    . ba|
00004fa0  64 73 63 61 6e 25 3d a3  20 8c 0d 1c ac 35 20 20  |dscan%=. ....5  |
00004fb0  20 20 20 20 20 f2 73 74  61 74 75 73 5f 6c 6f 67  |     .status_log|
00004fc0  28 22 22 2c 22 53 63 61  6e 20 6d 61 6e 75 61 6c  |("","Scan manual|
00004fd0  6c 79 20 61 62 6f 72 74  65 64 22 2c 22 22 29 0d  |ly aborted","").|
00004fe0  1c b6 09 20 20 20 20 cd  0d 1c c0 06 20 cd 0d 1c  |...    ..... ...|
00004ff0  ca 1a 20 e7 20 73 65 6c  66 25 3d a3 3a f2 6f 70  |.. . self%=.:.op|
00005000  65 6e 77 69 6e 64 6f 77  0d 1c d4 30 20 f4 20 6e  |enwindow...0 . n|
00005010  6f 77 20 61 73 6b 20 61  6e 20 65 64 69 74 6f 72  |ow ask an editor|
00005020  20 74 6f 20 70 69 63 6b  20 75 70 20 74 68 65 20  | to pick up the |
00005030  6c 6f 67 20 66 69 6c 65  0d 1c de 10 20 e7 6c 6f  |log file.... .lo|
00005040  67 67 69 6e 67 25 20 8c  0d 1c e8 1e 20 20 21 70  |gging% .....  !p|
00005050  6f 6c 6c 25 3d 28 34 38  2b a9 6c 6f 67 6e 61 6d  |oll%=(48+.lognam|
00005060  65 24 29 80 ac 33 0d 1c  f2 10 20 20 70 6f 6c 6c  |e$)..3....  poll|
00005070  25 21 31 32 3d 30 0d 1c  fc 10 20 20 70 6f 6c 6c  |%!12=0....  poll|
00005080  25 21 31 36 3d 35 0d 1d  06 11 20 20 70 6f 6c 6c  |%!16=5....  poll|
00005090  25 21 33 36 3d 2d 32 0d  1d 10 13 20 20 70 6f 6c  |%!36=-2....  pol|
000050a0  6c 25 21 34 30 3d 26 46  46 46 0d 1d 1a 1d 20 20  |l%!40=&FFF....  |
000050b0  24 28 70 6f 6c 6c 25 2b  34 34 29 3d 6c 6f 67 6e  |$(poll%+44)=logn|
000050c0  61 6d 65 24 2b bd 30 0d  1d 24 26 20 20 c8 99 22  |ame$+.0..$&  .."|
000050d0  58 57 69 6d 70 5f 53 65  6e 64 4d 65 73 73 61 67  |XWimp_SendMessag|
000050e0  65 22 2c 31 38 2c 70 6f  6c 6c 25 2c 30 0d 1d 2e  |e",18,poll%,0...|
000050f0  2d 20 20 f4 20 61 6e 64  20 67 69 76 65 20 74 68  |-  . and give th|
00005100  65 20 65 64 69 74 6f 72  20 61 20 63 68 61 6e 63  |e editor a chanc|
00005110  65 20 74 6f 20 64 6f 20  73 6f 0d 1d 38 13 20 20  |e to do so..8.  |
00005120  f2 77 69 6d 70 5f 70 6f  6c 6c 28 a3 29 0d 1d 42  |.wimp_poll(.)..B|
00005130  06 20 cd 0d 1d 4c 05 cd  0d 1d 56 0f f2 66 69 6e  |. ...L....V..fin|
00005140  69 73 68 73 63 61 6e 0d  1d 60 05 e1 0d 1d 6a 04  |ishscan..`....j.|
00005150  0d 1d 74 1c dd a4 6d 61  6b 65 73 74 72 69 6e 67  |..t...makestring|
00005160  28 61 64 64 72 25 2c 6c  65 6e 25 29 0d 1d 7e 14  |(addr%,len%)..~.|
00005170  ea 20 6c 6f 6f 70 25 2c  73 24 3a 73 24 3d 22 22  |. loop%,s$:s$=""|
00005180  0d 1d 88 31 e3 20 6c 6f  6f 70 25 3d 30 20 b8 20  |...1. loop%=0 . |
00005190  6c 65 6e 25 2d 31 3a 73  24 3d 73 24 2b bd 28 6c  |len%-1:s$=s$+.(l|
000051a0  6f 6f 70 25 3f 61 64 64  72 25 29 3a ed 3a 3d 73  |oop%?addr%):.:=s|
000051b0  24 0d 1d 92 04 0d 1d 9c  14 dd f2 62 75 69 6c 64  |$..........build|
000051c0  5f 66 73 5f 6e 61 6d 65  73 0d 1d a6 41 f4 20 74  |_fs_names...A. t|
000051d0  68 69 73 20 70 72 6f 63  65 64 75 72 65 20 73 63  |his procedure sc|
000051e0  61 6e 73 20 66 6f 72 20  61 6c 6c 20 6f 66 20 74  |ans for all of t|
000051f0  68 65 20 70 6f 73 73 69  62 6c 65 20 66 69 6c 69  |he possible fili|
00005200  6e 67 20 73 79 73 74 65  6d 73 0d 1d b0 38 f4 20  |ng systems...8. |
00005210  61 6e 64 20 62 75 69 6c  64 73 20 61 20 6d 65 6e  |and builds a men|
00005220  75 20 73 74 72 75 63 74  75 72 65 20 73 74 72 69  |u structure stri|
00005230  6e 67 20 66 72 6f 6d 20  74 68 65 20 72 65 73 75  |ng from the resu|
00005240  6c 74 0d 1d ba 08 ea 20  69 25 0d 1d c4 1c 66 73  |lt..... i%....fs|
00005250  5f 6e 61 6d 65 73 24 3d  22 23 46 69 6c 69 6e 67  |_names$="#Filing|
00005260  20 53 79 73 2c 22 0d 1d  ce 12 e3 69 25 3d 31 20  | Sys,".....i%=1 |
00005270  b8 20 6d 61 78 66 73 25  0d 1d d8 25 20 f4 20 61  |. maxfs%...% . a|
00005280  64 64 20 74 68 69 73 20  46 53 20 6e 61 6d 65 20  |dd this FS name |
00005290  74 6f 20 74 68 65 20 73  74 72 69 6e 67 0d 1d e2  |to the string...|
000052a0  22 20 66 73 5f 6e 61 6d  65 73 24 2b 3d a4 67 65  |" fs_names$+=.ge|
000052b0  74 66 73 6e 61 6d 65 28  69 25 29 2b 22 2c 22 0d  |tfsname(i%)+",".|
000052c0  1d ec 3a 20 f4 20 69 66  20 74 68 65 72 65 20 77  |..: . if there w|
000052d0  61 73 6e 27 74 20 61 20  6e 61 6d 65 20 74 68 65  |asn't a name the|
000052e0  72 65 2c 20 72 65 6d 6f  76 65 20 74 68 65 20 6c  |re, remove the l|
000052f0  61 73 74 20 63 6f 6d 6d  61 0d 1d f6 2e 20 e7 c2  |ast comma.... ..|
00005300  66 73 5f 6e 61 6d 65 73  24 2c 32 29 3d 22 2c 2c  |fs_names$,2)=",,|
00005310  22 20 66 73 5f 6e 61 6d  65 73 24 3d c0 66 73 5f  |" fs_names$=.fs_|
00005320  6e 61 6d 65 73 24 29 0d  1e 00 05 ed 0d 1e 0a 22  |names$)........"|
00005330  f4 20 61 6c 77 61 79 73  20 72 65 6d 6f 76 65 20  |. always remove |
00005340  74 68 65 20 6c 61 73 74  20 63 6f 6d 6d 61 0d 1e  |the last comma..|
00005350  14 19 66 73 5f 6e 61 6d  65 73 24 3d c0 66 73 5f  |..fs_names$=.fs_|
00005360  6e 61 6d 65 73 24 29 0d  1e 1e 05 e1 0d 1e 28 04  |names$).......(.|
00005370  0d 1e 32 13 dd f2 63 68  6f 6f 73 65 5f 66 73 28  |..2...choose_fs(|
00005380  73 25 29 0d 1e 3c 0e ea  20 69 25 2c 6a 25 2c 73  |s%)..<.. i%,j%,s|
00005390  24 0d 1e 46 33 f4 20 67  65 74 20 74 68 65 20 73  |$..F3. get the s|
000053a0  25 20 65 6e 74 72 79 20  66 72 6f 6d 20 66 73 5f  |% entry from fs_|
000053b0  6e 61 6d 65 73 24 20 61  6e 64 20 73 61 76 65 20  |names$ and save |
000053c0  74 68 61 74 0d 1e 50 10  73 24 3d 66 73 5f 6e 61  |that..P.s$=fs_na|
000053d0  6d 65 73 24 0d 1e 5a 0e  e3 69 25 3d 30 20 b8 20  |mes$..Z..i%=0 . |
000053e0  73 25 0d 1e 64 10 20 6a  25 3d a7 73 24 2c 22 2c  |s%..d. j%=.s$,",|
000053f0  22 29 0d 1e 6e 0c 20 e7  6a 25 3d 30 20 8c 0d 1e  |")..n. .j%=0 ...|
00005400  78 39 20 20 f2 77 61 72  6e 28 22 43 61 6e 6e 6f  |x9  .warn("Canno|
00005410  74 20 66 69 6e 64 20 46  53 20 22 2b c3 28 73 25  |t find FS "+.(s%|
00005420  29 2b 22 20 2d 20 61 62  6f 72 74 69 6e 67 20 22  |)+" - aborting "|
00005430  2b 70 72 6f 67 24 29 0d  1e 82 0d 20 20 71 75 69  |+prog$)....  qui|
00005440  74 25 3d b9 0d 1e 8c 11  20 20 73 63 61 6e 6e 69  |t%=.....  scanni|
00005450  6e 67 25 3d a3 0d 1e 96  07 20 20 e1 0d 1e a0 06  |ng%=.....  .....|
00005460  20 cd 0d 1e aa 11 20 73  24 3d c1 73 24 2c 6a 25  | ..... s$=.s$,j%|
00005470  2b 31 29 0d 1e b4 05 ed  0d 1e be 20 69 25 3d a7  |+1)........ i%=.|
00005480  73 24 2c 22 2c 22 29 3a  e7 69 25 3d 30 20 69 25  |s$,","):.i%=0 i%|
00005490  3d a9 28 73 24 29 2b 31  0d 1e c8 13 66 73 79 73  |=.(s$)+1....fsys|
000054a0  24 3d c0 73 24 2c 69 25  2d 31 29 0d 1e d2 22 f4  |$=.s$,i%-1)...".|
000054b0  20 67 65 74 20 74 68 65  20 66 69 6c 69 6e 67 20  | get the filing |
000054c0  73 79 73 74 65 6d 20 6e  75 6d 62 65 72 0d 1e dc  |system number...|
000054d0  31 c8 99 22 58 4f 53 5f  46 53 43 6f 6e 74 72 6f  |1.."XOS_FSContro|
000054e0  6c 22 2c 31 33 2c 66 73  79 73 24 2b bd 28 30 29  |l",13,fsys$+.(0)|
000054f0  2c 30 20 b8 20 2c 66 73  79 73 6e 75 6d 25 0d 1e  |,0 . ,fsysnum%..|
00005500  e6 17 f2 70 75 74 64 61  74 61 28 37 2c 66 73 79  |...putdata(7,fsy|
00005510  73 24 2c a3 29 0d 1e f0  22 f4 20 6e 6f 77 20 72  |s$,.)...". now r|
00005520  65 62 75 69 6c 64 20 74  68 65 20 64 65 76 69 63  |ebuild the devic|
00005530  65 73 20 6c 69 73 74 0d  1e fa 17 f2 62 75 69 6c  |es list.....buil|
00005540  64 5f 64 65 76 69 63 65  73 5f 6c 69 73 74 0d 1f  |d_devices_list..|
00005550  04 15 f2 63 68 6f 6f 73  65 5f 64 65 76 69 63 65  |...choose_device|
00005560  28 30 29 0d 1f 0e 05 e1  0d 1f 18 04 0d 1f 22 18  |(0)...........".|
00005570  dd f2 62 75 69 6c 64 5f  64 65 76 69 63 65 73 5f  |..build_devices_|
00005580  6c 69 73 74 0d 1f 2c 20  ea 20 69 25 2c 6a 25 2c  |list.., . i%,j%,|
00005590  6e 75 6d 66 6c 6f 70 25  2c 6e 75 6d 68 61 72 64  |numflop%,numhard|
000055a0  25 2c 73 24 0d 1f 36 1b  66 73 5f 64 65 76 69 63  |%,s$..6.fs_devic|
000055b0  65 73 24 3d 22 23 44 65  76 69 63 65 73 2c 22 0d  |es$="#Devices,".|
000055c0  1f 40 2b f4 20 74 68 69  73 20 69 73 20 67 6f 69  |.@+. this is goi|
000055d0  6e 67 20 74 6f 20 62 65  20 52 45 41 4c 4c 59 20  |ng to be REALLY |
000055e0  74 61 63 6b 79 20 63 6f  64 65 0d 1f 4a 38 f4 20  |tacky code..J8. |
000055f0  66 69 72 73 74 20 6f 66  20 61 6c 6c 2c 20 77 65  |first of all, we|
00005600  20 6e 65 65 64 20 74 6f  20 67 65 74 20 72 69 64  | need to get rid|
00005610  20 6f 66 20 74 68 65 20  65 78 63 65 70 74 69 6f  | of the exceptio|
00005620  6e 73 0d 1f 54 05 f4 0d  1f 5e 0c f4 20 45 63 6f  |ns..T....^.. Eco|
00005630  6e 65 74 0d 1f 68 0c f4  20 7e 7e 7e 7e 7e 7e 0d  |net..h.. ~~~~~~.|
00005640  1f 72 2f f4 20 42 75 69  6c 64 20 61 20 6c 69 73  |.r/. Build a lis|
00005650  74 20 6f 66 20 6c 6f 67  67 65 64 20 6f 6e 2d 74  |t of logged on-t|
00005660  6f 20 66 69 6c 65 20 73  65 72 76 65 72 73 0d 1f  |o file servers..|
00005670  7c 12 e7 66 73 79 73 24  3d 22 6e 65 74 22 20 8c  ||..fsys$="net" .|
00005680  0d 1f 86 09 20 69 25 3d  30 0d 1f 90 06 20 f5 0d  |.... i%=0.... ..|
00005690  1f 9a 4b 20 20 f4 20 77  65 27 6c 6c 20 6c 6f 61  |..K  . we'll loa|
000056a0  64 20 74 68 65 20 69 6e  66 6f 20 69 6e 74 6f 20  |d the info into |
000056b0  62 75 66 66 20 2e 2e 2e  20 69 74 20 69 73 6e 27  |buff ... it isn'|
000056c0  74 20 62 65 69 6e 67 20  75 73 65 64 20 61 74 20  |t being used at |
000056d0  74 68 69 73 20 74 69 6d  65 21 0d 1f a4 39 20 20  |this time!...9  |
000056e0  c8 99 22 4e 65 74 46 53  5f 45 6e 75 6d 65 72 61  |.."NetFS_Enumera|
000056f0  74 65 46 53 22 2c 69 25  2c 62 75 66 66 25 2c 6d  |teFS",i%,buff%,m|
00005700  61 78 62 6f 6f 74 25 2c  31 20 b8 20 69 25 2c 2c  |axboot%,1 . i%,,|
00005710  2c 6a 25 0d 1f ae 0d 20  20 e7 6a 25 3d 31 20 8c  |,j%....  .j%=1 .|
00005720  0d 1f b8 22 20 20 20 66  73 5f 64 65 76 69 63 65  |..."   fs_device|
00005730  73 24 2b 3d a4 72 74 6f  7a 28 62 75 66 66 25 2b  |s$+=.rtoz(buff%+|
00005740  33 29 0d 1f c2 1b 20 20  20 c8 95 20 c2 66 73 5f  |3)....   .. .fs_|
00005750  64 65 76 69 63 65 73 24  29 3d 22 20 22 0d 1f cc  |devices$)=" "...|
00005760  21 20 20 20 20 66 73 5f  64 65 76 69 63 65 73 24  |!    fs_devices$|
00005770  3d c0 66 73 5f 64 65 76  69 63 65 73 24 29 0d 1f  |=.fs_devices$)..|
00005780  d6 08 20 20 20 ce 0d 1f  e0 17 20 20 20 66 73 5f  |..   .....   fs_|
00005790  64 65 76 69 63 65 73 24  2b 3d 22 2c 22 0d 1f ea  |devices$+=","...|
000057a0  07 20 20 cd 0d 1f f4 0c  20 fd 20 69 25 3d 2d 31  |.  ..... . i%=-1|
000057b0  0d 1f fe 1f 20 e7 66 73  5f 64 65 76 69 63 65 73  |.... .fs_devices|
000057c0  24 3d 22 23 44 65 76 69  63 65 73 2c 22 20 8c 0d  |$="#Devices," ..|
000057d0  20 08 1b 20 20 66 73 5f  64 65 76 69 63 65 73 24  | ..  fs_devices$|
000057e0  2b 3d 22 28 4e 6f 6e 65  29 22 0d 20 12 06 20 cc  |+="(None)". .. .|
000057f0  0d 20 1c 1f 20 20 66 73  5f 64 65 76 69 63 65 73  |. ..  fs_devices|
00005800  24 3d c0 66 73 5f 64 65  76 69 63 65 73 24 29 0d  |$=.fs_devices$).|
00005810  20 26 06 20 cd 0d 20 30  06 20 e1 0d 20 3a 05 cd  | &. .. 0. .. :..|
00005820  0d 20 44 05 f4 0d 20 4e  09 f4 20 4e 46 53 0d 20  |. D... N.. NFS. |
00005830  58 09 f4 20 7e 7e 7e 0d  20 62 20 f4 20 42 75 69  |X.. ~~~. b . Bui|
00005840  6c 64 20 61 20 6c 69 73  74 20 6f 66 20 4e 46 53  |ld a list of NFS|
00005850  20 6d 6f 75 6e 74 73 0d  20 6c 12 e7 66 73 79 73  | mounts. l..fsys|
00005860  24 3d 22 6e 66 73 22 20  8c 0d 20 76 09 20 69 25  |$="nfs" .. v. i%|
00005870  3d 30 0d 20 80 06 20 f5  0d 20 8a 22 20 20 c8 99  |=0. .. .. ."  ..|
00005880  22 4e 46 53 5f 4d 6f 75  6e 74 4c 69 73 74 22 2c  |"NFS_MountList",|
00005890  30 2c 69 25 20 b8 20 2c  69 25 0d 20 94 0e 20 20  |0,i% . ,i%. ..  |
000058a0  e7 69 25 3c 3e 30 20 8c  0d 20 9e 21 20 20 20 66  |.i%<>0 .. .!   f|
000058b0  73 5f 64 65 76 69 63 65  73 24 2b 3d a4 72 74 6f  |s_devices$+=.rto|
000058c0  7a 28 69 25 29 2b 22 2c  22 0d 20 a8 07 20 20 cd  |z(i%)+",". ..  .|
000058d0  0d 20 b2 0b 20 fd 20 69  25 3d 30 0d 20 bc 1f 20  |. .. . i%=0. .. |
000058e0  e7 66 73 5f 64 65 76 69  63 65 73 24 3d 22 23 44  |.fs_devices$="#D|
000058f0  65 76 69 63 65 73 2c 22  20 8c 0d 20 c6 1b 20 20  |evices," .. ..  |
00005900  66 73 5f 64 65 76 69 63  65 73 24 2b 3d 22 28 4e  |fs_devices$+="(N|
00005910  6f 6e 65 29 22 0d 20 d0  06 20 cc 0d 20 da 1f 20  |one)". .. .. .. |
00005920  20 66 73 5f 64 65 76 69  63 65 73 24 3d c0 66 73  | fs_devices$=.fs|
00005930  5f 64 65 76 69 63 65 73  24 29 0d 20 e4 06 20 cd  |_devices$). .. .|
00005940  0d 20 ee 06 20 e1 0d 20  f8 05 cd 0d 21 02 05 f4  |. .. .. ....!...|
00005950  0d 21 0c 23 f4 20 46 69  6c 65 43 6f 72 65 20 62  |.!.#. FileCore b|
00005960  61 73 65 64 20 66 69 6c  69 6e 67 20 73 79 73 74  |ased filing syst|
00005970  65 6d 73 0d 21 16 23 f4  20 7e 7e 7e 7e 7e 7e 7e  |ems.!.#. ~~~~~~~|
00005980  7e 7e 7e 7e 7e 7e 7e 7e  7e 7e 7e 7e 7e 7e 7e 7e  |~~~~~~~~~~~~~~~~|
00005990  7e 7e 7e 7e 7e 7e 0d 21  20 36 f4 20 54 72 79 20  |~~~~~~.! 6. Try |
000059a0  74 6f 20 64 65 74 65 72  6d 69 6e 65 20 77 68 69  |to determine whi|
000059b0  63 68 20 22 64 72 69 76  65 73 22 20 74 68 69 73  |ch "drives" this|
000059c0  20 46 53 20 73 75 70 70  6f 72 74 73 0d 21 2a 12  | FS supports.!*.|
000059d0  e7 66 73 79 73 24 3d 22  72 61 6d 22 20 8c 0d 21  |.fsys$="ram" ..!|
000059e0  34 0f 20 73 24 3d 22 52  61 6d 46 53 22 0d 21 3e  |4. s$="RamFS".!>|
000059f0  05 cc 0d 21 48 18 20 e7  a4 46 53 70 72 65 66 69  |...!H. ..FSprefi|
00005a00  78 28 66 73 79 73 24 29  20 8c 0d 21 52 0e 20 20  |x(fsys$) ..!R.  |
00005a10  73 24 3d 66 73 79 73 24  0d 21 5c 06 20 cc 0d 21  |s$=fsys$.!\. ..!|
00005a20  66 16 20 20 73 24 3d a4  75 70 70 65 72 28 66 73  |f.  s$=.upper(fs|
00005a30  79 73 24 29 0d 21 70 18  20 20 e7 a4 46 53 70 72  |ys$).!p.  ..FSpr|
00005a40  65 66 69 78 28 73 24 29  3d a3 20 8c 0d 21 7a 2f  |efix(s$)=. ..!z/|
00005a50  20 20 20 e7 20 c2 73 24  2c 32 29 3d 22 46 53 22  |   . .s$,2)="FS"|
00005a60  3a 73 24 3d c0 73 24 2c  a9 28 73 24 29 2d 32 29  |:s$=.s$,.(s$)-2)|
00005a70  20 8b 20 73 24 2b 3d 22  46 53 22 0d 21 84 19 20  | . s$+="FS".!.. |
00005a80  20 20 e7 a4 46 53 70 72  65 66 69 78 28 73 24 29  |  ..FSprefix(s$)|
00005a90  3d a3 20 8c 0d 21 8e 1d  20 20 20 20 66 73 5f 64  |=. ..!..    fs_d|
00005aa0  65 76 69 63 65 73 24 2b  3d 22 28 4e 6f 6e 65 29  |evices$+="(None)|
00005ab0  22 0d 21 98 09 20 20 20  20 e1 0d 21 a2 08 20 20  |".!..    ..!..  |
00005ac0  20 cd 0d 21 ac 07 20 20  cd 0d 21 b6 06 20 cd 0d  | ..!..  ..!.. ..|
00005ad0  21 c0 05 cd 0d 21 ca 33  f4 20 4f 4b 2c 20 77 65  |!....!.3. OK, we|
00005ae0  20 68 61 76 65 20 61 20  46 69 6c 65 43 6f 72 65  | have a FileCore|
00005af0  20 46 53 2e 20 4e 6f 77  20 62 75 69 6c 64 20 74  | FS. Now build t|
00005b00  68 65 20 6c 69 73 74 0d  21 d4 2c c8 99 20 22 58  |he list.!.,.. "X|
00005b10  22 2b 73 24 2b 22 5f 44  72 69 76 65 73 22 20 b8  |"+s$+"_Drives" .|
00005b20  20 2c 6e 75 6d 66 6c 6f  70 25 2c 6e 75 6d 68 61  | ,numflop%,numha|
00005b30  72 64 25 0d 21 de 12 e7  6e 75 6d 66 6c 6f 70 25  |rd%.!...numflop%|
00005b40  3c 3e 30 20 8c 0d 21 e8  17 20 e3 69 25 3d 30 20  |<>0 ..!.. .i%=0 |
00005b50  b8 20 6e 75 6d 66 6c 6f  70 25 2d 31 0d 21 f2 1c  |. numflop%-1.!..|
00005b60  20 20 66 73 5f 64 65 76  69 63 65 73 24 2b 3d c3  |  fs_devices$+=.|
00005b70  28 69 25 29 2b 22 2c 22  0d 21 fc 06 20 ed 0d 22  |(i%)+",".!.. .."|
00005b80  06 05 cd 0d 22 10 12 e7  6e 75 6d 68 61 72 64 25  |...."...numhard%|
00005b90  3c 3e 30 20 8c 0d 22 1a  17 20 e3 69 25 3d 30 20  |<>0 ..".. .i%=0 |
00005ba0  b8 20 6e 75 6d 68 61 72  64 25 2d 31 0d 22 24 1e  |. numhard%-1."$.|
00005bb0  20 20 66 73 5f 64 65 76  69 63 65 73 24 2b 3d c3  |  fs_devices$+=.|
00005bc0  28 69 25 2b 34 29 2b 22  2c 22 0d 22 2e 06 20 ed  |(i%+4)+",".".. .|
00005bd0  0d 22 38 05 cd 0d 22 42  1d 66 73 5f 64 65 76 69  |."8..."B.fs_devi|
00005be0  63 65 73 24 3d c0 66 73  5f 64 65 76 69 63 65 73  |ces$=.fs_devices|
00005bf0  24 29 0d 22 4c 05 e1 0d  22 56 04 0d 22 60 1d dd  |$)."L..."V.."`..|
00005c00  a4 72 74 6f 7a 28 70 25  29 3d a4 67 65 74 73 74  |.rtoz(p%)=.getst|
00005c10  72 69 6e 67 28 70 25 29  0d 22 6a 04 0d 22 74 17  |ring(p%)."j.."t.|
00005c20  dd f2 63 68 6f 6f 73 65  5f 64 65 76 69 63 65 28  |..choose_device(|
00005c30  73 25 29 0d 22 7e 0e ea  20 69 25 2c 6a 25 2c 73  |s%)."~.. i%,j%,s|
00005c40  24 0d 22 88 33 f4 20 67  65 74 20 74 68 65 20 73  |$.".3. get the s|
00005c50  25 20 65 6e 74 72 79 20  66 72 6f 6d 20 66 73 5f  |% entry from fs_|
00005c60  6e 61 6d 65 73 24 20 61  6e 64 20 73 61 76 65 20  |names$ and save |
00005c70  74 68 61 74 0d 22 92 12  73 24 3d 66 73 5f 64 65  |that."..s$=fs_de|
00005c80  76 69 63 65 73 24 0d 22  9c 0e e3 69 25 3d 30 20  |vices$."...i%=0 |
00005c90  b8 20 73 25 0d 22 a6 10  20 6a 25 3d a7 73 24 2c  |. s%.".. j%=.s$,|
00005ca0  22 2c 22 29 0d 22 b0 0c  20 e7 6a 25 3d 30 20 8c  |",").".. .j%=0 .|
00005cb0  0d 22 ba 33 20 20 85 20  31 2c 20 22 44 65 76 69  |.".3  . 1, "Devi|
00005cc0  63 65 20 6d 65 6e 75 20  68 61 73 20 6e 6f 74 20  |ce menu has not |
00005cd0  62 65 65 6e 20 63 6c 65  61 6e 6c 79 20 62 75 69  |been cleanly bui|
00005ce0  6c 74 22 0d 22 c4 06 20  cc 0d 22 ce 12 20 20 73  |lt".".. .."..  s|
00005cf0  24 3d c1 73 24 2c 6a 25  2b 31 29 0d 22 d8 06 20  |$=.s$,j%+1).".. |
00005d00  cd 0d 22 e2 05 ed 0d 22  ec 20 69 25 3d a7 73 24  |.."....". i%=.s$|
00005d10  2c 22 2c 22 29 3a e7 69  25 3d 30 20 69 25 3d a9  |,","):.i%=0 i%=.|
00005d20  28 73 24 29 2b 31 0d 22  f6 16 66 64 65 76 69 63  |(s$)+1."..fdevic|
00005d30  65 24 3d c0 73 24 2c 69  25 2d 31 29 0d 23 00 1a  |e$=.s$,i%-1).#..|
00005d40  f2 70 75 74 64 61 74 61  28 38 2c 66 64 65 76 69  |.putdata(8,fdevi|
00005d50  63 65 24 2c a3 29 0d 23  0a 05 e1 0d 23 14 04 0d  |ce$,.).#....#...|
00005d60  23 1e 10 dd a4 62 75 69  6c 64 5f 70 61 74 68 0d  |#....build_path.|
00005d70  23 28 47 f4 20 74 68 69  73 20 70 72 6f 63 65 64  |#(G. this proced|
00005d80  75 72 65 20 62 75 69 6c  64 73 20 61 20 76 61 6c  |ure builds a val|
00005d90  69 64 20 70 61 74 68 20  64 65 70 65 6e 64 69 6e  |id path dependin|
00005da0  67 20 6f 6e 20 74 68 65  20 66 69 6c 69 6e 67 20  |g on the filing |
00005db0  73 79 73 74 65 6d 0d 23  32 4a f4 20 61 73 20 77  |system.#2J. as w|
00005dc0  69 74 68 20 62 75 69 6c  64 69 6e 67 20 74 68 65  |ith building the|
00005dd0  20 64 65 76 69 63 65 73  20 6c 69 73 74 2c 20 77  | devices list, w|
00005de0  65 20 64 65 61 6c 20 77  69 74 68 20 74 68 65 20  |e deal with the |
00005df0  74 61 63 6b 79 20 6f 6e  65 73 20 66 69 72 73 74  |tacky ones first|
00005e00  0d 23 3c 13 e7 20 66 73  79 73 24 3d 22 6e 65 74  |.#<.. fsys$="net|
00005e10  22 20 8c 0d 23 46 1a 20  e7 20 66 64 65 76 69 63  |" ..#F. . fdevic|
00005e20  65 24 3d 22 28 4e 6f 6e  65 29 22 20 8c 0d 23 50  |e$="(None)" ..#P|
00005e30  29 20 20 f2 73 74 61 74  75 73 69 6e 66 6f 72 6d  |)  .statusinform|
00005e40  28 22 57 68 69 63 68 20  66 69 6c 65 20 73 65 72  |("Which file ser|
00005e50  76 65 72 3f 22 29 0d 23  5a 09 20 20 3d 22 22 0d  |ver?").#Z.  ="".|
00005e60  23 64 06 20 cc 0d 23 6e  1b 20 20 3d 22 6e 65 74  |#d. ..#n.  ="net|
00005e70  23 22 2b 66 64 65 76 69  63 65 24 2b 22 3a 26 22  |#"+fdevice$+":&"|
00005e80  0d 23 78 06 20 cd 0d 23  82 05 cd 0d 23 8c 13 e7  |.#x. ..#....#...|
00005e90  20 66 73 79 73 24 3d 22  6e 66 73 22 20 8c 0d 23  | fsys$="nfs" ..#|
00005ea0  96 1a 20 e7 20 66 64 65  76 69 63 65 24 3d 22 28  |.. . fdevice$="(|
00005eb0  4e 6f 6e 65 29 22 20 8c  0d 23 a0 27 20 20 f2 73  |None)" ..#.'  .s|
00005ec0  74 61 74 75 73 69 6e 66  6f 72 6d 28 22 57 68 69  |tatusinform("Whi|
00005ed0  63 68 20 4e 46 53 20 6d  6f 75 6e 74 3f 22 29 0d  |ch NFS mount?").|
00005ee0  23 aa 09 20 20 3d 22 22  0d 23 b4 06 20 cc 0d 23  |#..  ="".#.. ..#|
00005ef0  be 1c 20 20 3d 22 4e 46  53 3a 3a 22 2b 66 64 65  |..  ="NFS::"+fde|
00005f00  76 69 63 65 24 2b 22 2e  24 22 0d 23 c8 06 20 cd  |vice$+".$".#.. .|
00005f10  0d 23 d2 05 cd 0d 23 dc  18 e7 66 64 65 76 69 63  |.#....#...fdevic|
00005f20  65 24 3d 22 28 4e 6f 6e  65 29 22 20 8c 0d 23 e6  |e$="(None)" ..#.|
00005f30  10 20 3d 66 73 79 73 24  2b 22 3a 24 22 0d 23 f0  |. =fsys$+":$".#.|
00005f40  05 cd 0d 23 fa 1d 3d 66  73 79 73 24 2b 22 3a 3a  |...#..=fsys$+"::|
00005f50  22 2b 66 64 65 76 69 63  65 24 2b 22 2e 24 22 0d  |"+fdevice$+".$".|
00005f60  24 04 04 0d 24 0e 14 dd  f2 62 75 69 6c 64 5f 6d  |$...$....build_m|
00005f70  65 6e 75 28 69 25 29 0d  24 18 11 6d 65 6e 75 62  |enu(i%).$..menub|
00005f80  75 69 6c 74 25 3d 69 25  0d 24 22 0b c8 8e 20 69  |uilt%=i%.$"... i|
00005f90  25 20 ca 0d 24 2c 18 c9  20 31 3a 20 f4 20 69 63  |% ..$,.. 1: . ic|
00005fa0  6f 6e 20 62 61 72 20 6d  65 6e 75 0d 24 36 36 20  |on bar menu.$66 |
00005fb0  20 20 20 20 20 20 20 6d  65 6e 75 25 3d a4 63 72  |       menu%=.cr|
00005fc0  65 61 74 65 5f 6d 65 6e  75 28 22 23 22 2b 70 72  |eate_menu("#"+pr|
00005fd0  6f 67 24 2b 22 2c 49 6e  66 6f 2c 51 75 69 74 22  |og$+",Info,Quit"|
00005fe0  29 0d 24 40 27 20 20 20  20 20 20 20 20 f2 6d 65  |).$@'        .me|
00005ff0  6e 75 5f 61 74 74 61 63  68 28 6d 65 6e 75 25 2c  |nu_attach(menu%,|
00006000  30 2c 69 6e 66 6f 25 29  0d 24 4a 17 20 20 20 20  |0,info%).$J.    |
00006010  20 20 20 20 6e 75 6d 69  74 65 6d 73 25 3d 32 0d  |    numitems%=2.|
00006020  24 54 1e c9 20 32 3a 20  f4 20 66 69 6c 69 6e 67  |$T.. 2: . filing|
00006030  20 73 79 73 74 65 6d 73  20 6d 65 6e 75 0d 24 5e  | systems menu.$^|
00006040  1b 20 20 20 20 20 20 20  20 f2 62 75 69 6c 64 5f  |.        .build_|
00006050  66 73 5f 6e 61 6d 65 73  0d 24 68 29 20 20 20 20  |fs_names.$h)    |
00006060  20 20 20 20 6d 65 6e 75  25 3d a4 63 72 65 61 74  |    menu%=.creat|
00006070  65 5f 6d 65 6e 75 28 66  73 5f 6e 61 6d 65 73 24  |e_menu(fs_names$|
00006080  29 0d 24 72 2f 20 20 20  20 20 20 20 20 f2 74 69  |).$r/        .ti|
00006090  63 6b 5f 6f 70 74 69 6f  6e 28 6d 65 6e 75 25 2c  |ck_option(menu%,|
000060a0  66 73 5f 6e 61 6d 65 73  24 2c 66 73 79 73 24 29  |fs_names$,fsys$)|
000060b0  0d 24 7c 20 c9 20 33 3a  20 f4 20 66 69 6c 69 6e  |.$| . 3: . filin|
000060c0  67 20 73 79 73 74 65 6d  20 64 65 76 69 63 65 73  |g system devices|
000060d0  0d 24 86 1f 20 20 20 20  20 20 20 20 f2 62 75 69  |.$..        .bui|
000060e0  6c 64 5f 64 65 76 69 63  65 73 5f 6c 69 73 74 0d  |ld_devices_list.|
000060f0  24 90 2b 20 20 20 20 20  20 20 20 6d 65 6e 75 25  |$.+        menu%|
00006100  3d a4 63 72 65 61 74 65  5f 6d 65 6e 75 28 66 73  |=.create_menu(fs|
00006110  5f 64 65 76 69 63 65 73  24 29 0d 24 9a 34 20 20  |_devices$).$.4  |
00006120  20 20 20 20 20 20 f2 74  69 63 6b 5f 6f 70 74 69  |      .tick_opti|
00006130  6f 6e 28 6d 65 6e 75 25  2c 66 73 5f 64 65 76 69  |on(menu%,fs_devi|
00006140  63 65 73 24 2c 66 64 65  76 69 63 65 24 29 0d 24  |ces$,fdevice$).$|
00006150  a4 05 cb 0d 24 ae 05 e1  0d 24 b8 04 0d 24 c2 24  |....$....$...$.$|
00006160  dd f2 74 69 63 6b 5f 6f  70 74 69 6f 6e 28 6d 65  |..tick_option(me|
00006170  6e 75 25 2c 6c 69 73 74  24 2c 69 74 65 6d 24 29  |nu%,list$,item$)|
00006180  0d 24 cc 0b ea 20 69 25  2c 6a 25 0d 24 d6 23 f4  |.$... i%,j%.$.#.|
00006190  20 6c 6f 73 65 20 74 68  65 20 68 65 61 64 65 72  | lose the header|
000061a0  20 66 72 6f 6d 20 74 68  65 20 6c 69 73 74 0d 24  | from the list.$|
000061b0  e0 25 69 25 3d a7 6c 69  73 74 24 2c 22 2c 22 29  |.%i%=.list$,",")|
000061c0  3a 6c 69 73 74 24 3d c1  6c 69 73 74 24 2c 69 25  |:list$=.list$,i%|
000061d0  2b 31 29 0d 24 ea 10 c8  95 20 6c 69 73 74 24 3c  |+1).$.... list$<|
000061e0  3e 22 22 0d 24 f4 27 20  69 25 3d a7 6c 69 73 74  |>"".$.' i%=.list|
000061f0  24 2c 22 2c 22 29 3a e7  69 25 3d 30 20 69 25 3d  |$,","):.i%=0 i%=|
00006200  a9 28 6c 69 73 74 24 29  2b 31 0d 24 fe 1a 20 e7  |.(list$)+1.$.. .|
00006210  69 74 65 6d 24 3d c0 6c  69 73 74 24 2c 69 25 2d  |item$=.list$,i%-|
00006220  31 29 20 8c 0d 25 08 1a  20 20 f2 6d 65 6e 75 5f  |1) ..%..  .menu_|
00006230  74 69 63 6b 28 6d 65 6e  75 25 2c 6a 25 29 0d 25  |tick(menu%,j%).%|
00006240  12 0e 20 20 6c 69 73 74  24 3d 22 22 0d 25 1c 06  |..  list$="".%..|
00006250  20 cc 0d 25 26 18 20 20  6c 69 73 74 24 3d c1 6c  | ..%&.  list$=.l|
00006260  69 73 74 24 2c 69 25 2b  31 29 0d 25 30 0b 20 20  |ist$,i%+1).%0.  |
00006270  6a 25 2b 3d 31 0d 25 3a  06 20 cd 0d 25 44 05 ce  |j%+=1.%:. ..%D..|
00006280  0d 25 4e 05 e1 0d 25 58  04 0d 25 62 26 dd f2 6d  |.%N...%X..%b&..m|
00006290  65 6e 75 5f 69 6e 69 74  69 61 6c 69 73 65 28 6d  |enu_initialise(m|
000062a0  65 6e 5f 77 73 25 2c 6d  65 6e 5f 64 66 25 29 0d  |en_ws%,men_df%).|
000062b0  25 6c 2b 6d 65 6e 75 5f  6d 61 78 5f 77 73 25 3d  |%l+menu_max_ws%=|
000062c0  6d 65 6e 5f 77 73 25 3a  de 20 6d 65 6e 75 5f 77  |men_ws%:. menu_w|
000062d0  73 25 20 6d 65 6e 5f 77  73 25 0d 25 76 2b 6d 65  |s% men_ws%.%v+me|
000062e0  6e 75 5f 6d 61 78 5f 64  66 25 3d 6d 65 6e 5f 64  |nu_max_df%=men_d|
000062f0  66 25 3a de 20 6d 65 6e  75 5f 64 66 25 20 6d 65  |f%:. menu_df% me|
00006300  6e 5f 64 66 25 0d 25 80  1e 6d 65 6e 75 5f 65 6e  |n_df%.%..menu_en|
00006310  64 25 3d 6d 65 6e 75 5f  64 66 25 2b 6d 65 6e 5f  |d%=menu_df%+men_|
00006320  64 66 25 0d 25 8a 18 6d  65 6e 75 5f 63 75 72 77  |df%.%..menu_curw|
00006330  73 25 3d 6d 65 6e 75 5f  77 73 25 0d 25 94 05 e1  |s%=menu_ws%.%...|
00006340  0d 25 9e 04 0d 25 a8 18  dd a4 63 72 65 61 74 65  |.%...%....create|
00006350  5f 6d 65 6e 75 28 6d 65  6e 75 24 29 0d 25 b2 1d  |_menu(menu$).%..|
00006360  ea 20 4d 25 2c 6d 24 2c  49 25 2c 6d 65 6e 75 70  |. M%,m$,I%,menup|
00006370  74 72 25 2c 6d 61 78 78  25 0d 25 bc 3c f4 20 69  |tr%,maxx%.%.<. i|
00006380  6e 20 74 68 69 73 20 70  61 72 74 69 63 75 6c 61  |n this particula|
00006390  72 20 61 70 70 6c 69 63  61 74 69 6f 6e 2c 20 74  |r application, t|
000063a0  68 65 72 65 20 61 72 65  20 6e 6f 20 73 75 62 20  |here are no sub |
000063b0  6d 65 6e 75 73 0d 25 c6  3c f4 20 61 6e 64 20 6f  |menus.%.<. and o|
000063c0  6e 6c 79 20 6f 6e 65 20  61 63 74 69 76 65 6c 79  |nly one actively|
000063d0  20 63 72 65 61 74 65 64  20 6d 65 6e 75 2c 20 73  | created menu, s|
000063e0  6f 20 69 74 20 69 73 20  50 45 52 46 45 43 54 4c  |o it is PERFECTL|
000063f0  59 0d 25 d0 25 f4 20 73  61 66 65 20 74 6f 20 72  |Y.%.%. safe to r|
00006400  65 73 65 74 20 74 68 65  20 6d 65 6e 75 20 70 6f  |eset the menu po|
00006410  69 6e 74 65 72 73 0d 25  da 23 6d 65 6e 75 5f 64  |inters.%.#menu_d|
00006420  66 25 3d 6d 65 6e 75 5f  65 6e 64 25 2d 6d 65 6e  |f%=menu_end%-men|
00006430  75 5f 6d 61 78 5f 64 66  25 0d 25 e4 18 6d 65 6e  |u_max_df%.%..men|
00006440  75 5f 63 75 72 77 73 25  3d 6d 65 6e 75 5f 77 73  |u_curws%=menu_ws|
00006450  25 0d 25 ee 65 e7 20 28  6d 65 6e 75 5f 64 66 25  |%.%.e. (menu_df%|
00006460  2b 32 38 3e 6d 65 6e 75  5f 65 6e 64 25 29 20 85  |+28>menu_end%) .|
00006470  20 31 2c 20 22 4f 75 74  20 6f 66 20 6d 65 6e 75  | 1, "Out of menu|
00006480  20 77 6f 72 6b 73 70 61  63 65 20 2d 20 69 6e 63  | workspace - inc|
00006490  72 65 61 73 65 20 32 6e  64 20 70 61 72 61 6d 65  |rease 2nd parame|
000064a0  74 65 72 20 74 6f 20 69  6e 69 74 69 61 6c 69 73  |ter to initialis|
000064b0  61 74 69 6f 6e 22 0d 25  f8 15 6d 65 6e 75 70 74  |ation".%..menupt|
000064c0  72 25 3d 6d 65 6e 75 5f  64 66 25 0d 26 02 08 49  |r%=menu_df%.&..I|
000064d0  25 3d 30 0d 26 0c 15 e7  20 c0 6d 65 6e 75 24 2c  |%=0.&... .menu$,|
000064e0  31 29 3d 22 23 22 20 8c  0d 26 16 09 20 49 25 3d  |1)="#" ..&.. I%=|
000064f0  31 0d 26 20 27 20 6d 65  6e 75 74 69 74 6c 65 24  |1.& ' menutitle$|
00006500  3d a4 6d 65 6e 75 5f 70  61 72 28 6d 65 6e 75 24  |=.menu_par(menu$|
00006510  2c 22 2c 22 2c 49 25 29  0d 26 2a 05 cc 0d 26 34  |,",",I%).&*...&4|
00006520  12 20 6d 65 6e 75 74 69  74 6c 65 24 3d 22 22 0d  |. menutitle$="".|
00006530  26 3e 05 cd 0d 26 48 1d  24 6d 65 6e 75 70 74 72  |&>...&H.$menuptr|
00006540  25 3d c0 6d 65 6e 75 74  69 74 6c 65 24 2c 31 32  |%=.menutitle$,12|
00006550  29 0d 26 52 11 6d 65 6e  75 70 74 72 25 3f 31 32  |).&R.menuptr%?12|
00006560  3d 37 0d 26 5c 11 6d 65  6e 75 70 74 72 25 3f 31  |=7.&\.menuptr%?1|
00006570  33 3d 32 0d 26 66 11 6d  65 6e 75 70 74 72 25 3f  |3=2.&f.menuptr%?|
00006580  31 34 3d 37 0d 26 70 11  6d 65 6e 75 70 74 72 25  |14=7.&p.menuptr%|
00006590  3f 31 35 3d 30 0d 26 7a  13 6d 65 6e 75 70 74 72  |?15=0.&z.menuptr|
000065a0  25 21 31 36 3d 31 39 36  0d 26 84 12 6d 65 6e 75  |%!16=196.&..menu|
000065b0  70 74 72 25 21 32 30 3d  34 34 0d 26 8e 11 6d 65  |ptr%!20=44.&..me|
000065c0  6e 75 70 74 72 25 21 32  34 3d 30 0d 26 98 10 6d  |nuptr%!24=0.&..m|
000065d0  65 6e 75 70 74 72 25 2b  3d 32 38 0d 26 a2 17 6d  |enuptr%+=28.&..m|
000065e0  61 78 78 25 3d a9 6d 65  6e 75 74 69 74 6c 65 24  |axx%=.menutitle$|
000065f0  2d 33 0d 26 ac 05 f5 0d  26 b6 22 20 69 74 65 6d  |-3.&....&." item|
00006600  24 3d a4 6d 65 6e 75 5f  70 61 72 28 6d 65 6e 75  |$=.menu_par(menu|
00006610  24 2c 22 2c 22 2c 49 25  29 0d 26 c0 25 20 f2 6d  |$,",",I%).&.% .m|
00006620  65 6e 75 5f 69 74 65 6d  28 69 74 65 6d 24 2c 6d  |enu_item(item$,m|
00006630  61 78 78 25 2c 6d 65 6e  75 70 74 72 25 29 0d 26  |axx%,menuptr%).&|
00006640  ca 0e fd 20 69 74 65 6d  24 3d 22 22 0d 26 d4 0f  |... item$="".&..|
00006650  4d 25 3d 6d 65 6e 75 5f  64 66 25 0d 26 de 17 4d  |M%=menu_df%.&..M|
00006660  25 21 31 36 3d 28 6d 61  78 78 25 2a 38 2b 36 29  |%!16=(maxx%*8+6)|
00006670  2a 32 0d 26 e8 15 6d 65  6e 75 5f 64 66 25 3d 6d  |*2.&..menu_df%=m|
00006680  65 6e 75 70 74 72 25 0d  26 f2 07 3d 4d 25 0d 26  |enuptr%.&..=M%.&|
00006690  fc 05 3a 0d 27 06 22 dd  f2 6d 65 6e 75 5f 74 69  |..:.'."..menu_ti|
000066a0  63 6b 28 6d 65 6e 75 68  61 6e 64 6c 65 25 2c 69  |ck(menuhandle%,i|
000066b0  74 65 6d 25 29 0d 27 10  3a 6d 65 6e 75 68 61 6e  |tem%).'.:menuhan|
000066c0  64 6c 65 25 21 28 32 38  2b 32 34 2a 69 74 65 6d  |dle%!(28+24*item|
000066d0  25 29 3d 6d 65 6e 75 68  61 6e 64 6c 65 25 21 28  |%)=menuhandle%!(|
000066e0  32 38 2b 32 34 2a 69 74  65 6d 25 29 82 20 31 0d  |28+24*item%). 1.|
000066f0  27 1a 05 e1 0d 27 24 05  3a 0d 27 2e 1f dd a4 6d  |'....'$.:.'....m|
00006700  65 6e 75 5f 70 61 72 28  6d 65 6e 75 24 2c 73 65  |enu_par(menu$,se|
00006710  70 24 2c f8 20 49 25 29  0d 27 38 08 ea 20 4c 25  |p$,. I%).'8.. L%|
00006720  0d 27 42 0b 4c 25 3d 49  25 2b 31 0d 27 4c 1b 49  |.'B.L%=I%+1.'L.I|
00006730  25 3d a7 6d 65 6e 75 24  2b 73 65 70 24 2c 73 65  |%=.menu$+sep$,se|
00006740  70 24 2c 4c 25 29 0d 27  56 15 3d c1 6d 65 6e 75  |p$,L%).'V.=.menu|
00006750  24 2c 4c 25 2c 49 25 2d  4c 25 29 0d 27 60 05 3a  |$,L%,I%-L%).'`.:|
00006760  0d 27 6a 29 dd f2 6d 65  6e 75 5f 69 74 65 6d 28  |.'j)..menu_item(|
00006770  74 65 78 74 24 2c f8 20  6d 61 78 78 25 2c f8 20  |text$,. maxx%,. |
00006780  6d 65 6e 75 70 74 72 25  29 0d 27 74 0e ea 20 49  |menuptr%).'t.. I|
00006790  25 2c 46 25 2c 4c 25 0d  27 7e 31 e7 20 74 65 78  |%,F%,L%.'~1. tex|
000067a0  74 24 3d 22 22 20 6d 65  6e 75 70 74 72 25 21 2d  |t$="" menuptr%!-|
000067b0  32 34 3d 28 6d 65 6e 75  70 74 72 25 21 2d 32 34  |24=(menuptr%!-24|
000067c0  29 84 20 26 38 30 3a e1  0d 27 88 65 e7 20 28 6d  |). &80:..'.e. (m|
000067d0  65 6e 75 70 74 72 25 2b  32 34 3e 6d 65 6e 75 5f  |enuptr%+24>menu_|
000067e0  65 6e 64 25 29 20 85 20  31 2c 20 22 4f 75 74 20  |end%) . 1, "Out |
000067f0  6f 66 20 6d 65 6e 75 20  77 6f 72 6b 73 70 61 63  |of menu workspac|
00006800  65 20 2d 20 69 6e 63 72  65 61 73 65 20 32 6e 64  |e - increase 2nd|
00006810  20 70 61 72 61 6d 65 74  65 72 20 74 6f 20 69 6e  | parameter to in|
00006820  69 74 69 61 6c 69 73 61  74 69 6f 6e 22 0d 27 92  |itialisation".'.|
00006830  0a 46 25 3d 26 30 30 0d  27 9c 44 e7 20 c2 74 65  |.F%=&00.'.D. .te|
00006840  78 74 24 2c 31 29 3d 22  23 22 20 74 65 78 74 24  |xt$,1)="#" text$|
00006850  3d c0 74 65 78 74 24 29  3a 46 25 2b 3d 26 30 32  |=.text$):F%+=&02|
00006860  3a f4 20 64 6f 74 74 65  64 20 6c 69 6e 65 20 66  |:. dotted line f|
00006870  6f 6c 6c 6f 77 73 20 69  74 65 6d 0d 27 a6 43 e7  |ollows item.'.C.|
00006880  20 c2 74 65 78 74 24 2c  31 29 3d 22 40 22 20 74  | .text$,1)="@" t|
00006890  65 78 74 24 3d c0 74 65  78 74 24 29 3a 46 25 2b  |ext$=.text$):F%+|
000068a0  3d 26 30 38 3a f4 20 67  65 6e 65 72 61 74 65 20  |=&08:. generate |
000068b0  61 20 6d 65 6e 75 20 77  61 72 6e 69 6e 67 0d 27  |a menu warning.'|
000068c0  b0 11 6d 65 6e 75 70 74  72 25 21 30 3d 46 25 0d  |..menuptr%!0=F%.|
000068d0  27 ba 11 6d 65 6e 75 70  74 72 25 21 34 3d 2d 31  |'..menuptr%!4=-1|
000068e0  0d 27 c4 18 6d 65 6e 75  70 74 72 25 21 38 3d 26  |.'..menuptr%!8=&|
000068f0  30 37 30 30 30 30 32 31  0d 27 ce 15 e7 20 c0 74  |07000021.'... .t|
00006900  65 78 74 24 2c 31 29 3d  22 24 22 20 8c 0d 27 d8  |ext$,1)="$" ..'.|
00006910  49 20 21 6d 65 6e 75 70  74 72 25 2b 3d 26 30 34  |I !menuptr%+=&04|
00006920  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
*
00006940  20 20 3a f4 20 69 74 65  6d 20 69 73 20 77 72 69  |  :. item is wri|
00006950  74 65 61 62 6c 65 0d 27  e2 13 20 74 65 78 74 24  |teable.'.. text$|
00006960  3d c4 31 32 2c 22 20 22  29 0d 27 ec 05 cc 0d 27  |=.12," ").'....'|
00006970  f6 13 20 e7 20 a9 74 65  78 74 24 3c 3d 31 32 20  |.. . .text$<=12 |
00006980  8c 0d 28 00 1a 20 20 24  28 6d 65 6e 75 70 74 72  |..(..  $(menuptr|
00006990  25 2b 31 32 29 3d 74 65  78 74 24 0d 28 0a 06 20  |%+12)=text$.(.. |
000069a0  cc 0d 28 14 2c 20 20 49  25 3d a4 6d 65 6e 75 5f  |..(.,  I%=.menu_|
000069b0  77 6f 72 6b 73 70 61 63  65 28 a9 74 65 78 74 24  |workspace(.text$|
000069c0  2b 31 29 3a 24 49 25 3d  74 65 78 74 24 0d 28 1e  |+1):$I%=text$.(.|
000069d0  38 20 20 6d 65 6e 75 70  74 72 25 21 31 32 3d 49  |8  menuptr%!12=I|
000069e0  25 3a 6d 65 6e 75 70 74  72 25 21 31 36 3d 2d 31  |%:menuptr%!16=-1|
000069f0  3a 6d 65 6e 75 70 74 72  25 21 32 30 3d a9 74 65  |:menuptr%!20=.te|
00006a00  78 74 24 2b 31 0d 28 28  21 20 20 6d 65 6e 75 70  |xt$+1.((!  menup|
00006a10  74 72 25 21 38 3d 6d 65  6e 75 70 74 72 25 21 38  |tr%!8=menuptr%!8|
00006a20  84 20 26 31 30 30 0d 28  32 06 20 cd 0d 28 3c 05  |. &100.(2. ..(<.|
00006a30  cd 0d 28 46 1f e7 20 a9  74 65 78 74 24 3e 6d 61  |..(F.. .text$>ma|
00006a40  78 78 25 20 6d 61 78 78  25 3d a9 74 65 78 74 24  |xx% maxx%=.text$|
00006a50  0d 28 50 10 6d 65 6e 75  70 74 72 25 2b 3d 32 34  |.(P.menuptr%+=24|
00006a60  0d 28 5a 05 e1 0d 28 64  05 3a 0d 28 6e 23 dd f2  |.(Z...(d.:.(n#..|
00006a70  6d 65 6e 75 5f 61 74 74  61 63 68 28 6d 65 6e 75  |menu_attach(menu|
00006a80  25 2c 69 74 65 6d 25 2c  70 74 72 25 29 0d 28 78  |%,item%,ptr%).(x|
00006a90  16 6d 65 6e 75 25 2b 3d  32 38 2b 69 74 65 6d 25  |.menu%+=28+item%|
00006aa0  2a 32 34 0d 28 82 10 6d  65 6e 75 25 21 34 3d 70  |*24.(..menu%!4=p|
00006ab0  74 72 25 0d 28 8c 05 e1  0d 28 96 05 3a 0d 28 a0  |tr%.(....(..:.(.|
00006ac0  18 dd a4 6d 65 6e 75 5f  77 6f 72 6b 73 70 61 63  |...menu_workspac|
00006ad0  65 28 4c 25 29 0d 28 aa  7c e7 20 6d 65 6e 75 5f  |e(L%).(.|. menu_|
00006ae0  63 75 72 77 73 25 2b 4c  25 3e 6d 65 6e 75 5f 77  |curws%+L%>menu_w|
00006af0  73 25 2b 6d 65 6e 75 5f  6d 61 78 5f 77 73 25 20  |s%+menu_max_ws% |
00006b00  85 20 74 61 73 6b 5f 66  61 74 61 6c 25 2c 20 22  |. task_fatal%, "|
00006b10  4f 75 74 20 6f 66 20 6d  65 6e 75 20 77 6f 72 6b  |Out of menu work|
00006b20  73 70 61 63 65 20 2d 20  69 6e 63 72 65 61 73 65  |space - increase|
00006b30  20 31 73 74 20 70 61 72  61 6d 65 74 65 72 20 74  | 1st parameter t|
00006b40  6f 20 69 6e 69 74 69 61  6c 69 73 61 74 69 6f 6e  |o initialisation|
00006b50  22 0d 28 b4 13 6d 65 6e  75 5f 63 75 72 77 73 25  |".(..menu_curws%|
00006b60  2b 3d 4c 25 0d 28 be 13  3d 6d 65 6e 75 5f 63 75  |+=L%.(..=menu_cu|
00006b70  72 77 73 25 2d 4c 25 0d  28 c8 05 3a 0d 28 d2 51  |rws%-L%.(..:.(.Q|
00006b80  f4 20 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |. --------------|
00006b90  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00006bc0  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 0d 28 dc  |-------------.(.|
00006bd0  27 f4 20 56 69 72 75 73  20 63 68 65 63 6b 69 6e  |'. Virus checkin|
00006be0  67 20 63 6f 64 65 20 67  6f 65 73 20 68 65 72 65  |g code goes here|
00006bf0  20 2e 2e 2e 0d 28 e6 51  f4 20 2d 2d 2d 2d 2d 2d  | ....(.Q. ------|
00006c00  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00006c40  2d 2d 2d 2d 2d 0d 28 f0  05 3a 0d 28 fa 2a dd f2  |-----.(..:.(.*..|
00006c50  63 68 65 63 6b 5f 66 6f  72 5f 6d 6f 64 5f 76 69  |check_for_mod_vi|
00006c60  72 75 73 28 64 69 72 24  2c 6e 61 6d 65 24 2c 6c  |rus(dir$,name$,l|
00006c70  65 6e 25 29 0d 29 04 16  c8 8e 20 a4 6c 6f 77 65  |en%).).... .lowe|
00006c80  72 28 6e 61 6d 65 24 29  20 ca 0d 29 0e 0f c9 20  |r(name$) ..)... |
00006c90  22 74 6c 6f 64 6d 6f 64  22 0d 29 18 14 20 20 20  |"tlodmod".)..   |
00006ca0  e7 20 6c 65 6e 25 3d 31  32 34 30 20 8c 0d 29 22  |. len%=1240 ..)"|
00006cb0  49 20 20 20 20 20 20 f2  66 69 78 5f 6d 6f 64 75  |I      .fix_modu|
00006cc0  6c 65 28 64 69 72 24 2b  22 2e 22 2b 6e 61 6d 65  |le(dir$+"."+name|
00006cd0  24 2c 22 43 65 42 69 74  20 56 69 72 75 73 22 2c  |$,"CeBit Virus",|
00006ce0  22 49 6e 66 65 63 74 69  6f 6e 22 2c 63 65 62 69  |"Infection",cebi|
00006cf0  74 6f 66 66 25 29 0d 29  2c 08 20 20 20 cd 0d 29  |toff%).),.   ..)|
00006d00  36 58 c9 20 22 6d 6f 6e  69 74 6f 72 72 6d 22 2c  |6X. "monitorrm",|
00006d10  22 63 68 65 63 6b 6d 6f  64 22 2c 22 65 78 74 65  |"checkmod","exte|
00006d20  6e 64 72 6d 22 2c 22 6f  73 65 78 74 65 6e 64 22  |ndrm","osextend"|
00006d30  2c 22 63 6f 6c 6f 75 72  72 6d 22 2c 22 66 61 73  |,"colourrm","fas|
00006d40  74 6d 6f 64 22 2c 22 63  6f 64 65 72 6d 22 2c 22  |tmod","coderm","|
00006d50  6d 65 6d 72 6d 22 0d 29  40 13 20 20 20 e7 20 6c  |memrm".)@.   . l|
00006d60  65 6e 25 3d 39 34 30 20  8c 0d 29 4a 44 20 20 20  |en%=940 ..)JD   |
00006d70  20 20 20 f2 66 69 78 5f  6d 6f 64 75 6c 65 28 64  |   .fix_module(d|
00006d80  69 72 24 2b 22 2e 22 2b  6e 61 6d 65 24 2c 22 45  |ir$+"."+name$,"E|
00006d90  78 74 65 6e 64 20 56 69  72 75 73 22 2c 22 45 78  |xtend Virus","Ex|
00006da0  65 63 75 74 69 6f 6e 22  2c 26 33 34 29 0d 29 54  |ecution",&34).)T|
00006db0  08 20 20 20 cd 0d 29 5e  11 c9 20 22 74 61 73 6b  |.   ..)^.. "task|
00006dc0  61 6c 6c 6f 63 22 0d 29  68 34 20 20 20 e7 20 6c  |alloc".)h4   . l|
00006dd0  65 6e 25 3d 33 34 34 3a  f2 66 69 6c 65 5f 76 69  |en%=344:.file_vi|
00006de0  72 75 73 28 64 69 72 24  2c 6e 61 6d 65 24 2c 22  |rus(dir$,name$,"|
00006df0  54 68 61 6e 61 74 6f 73  22 29 0d 29 72 05 cb 0d  |Thanatos").)r...|
00006e00  29 7c 05 e1 0d 29 86 04  0d 29 90 2a dd f2 66 69  |)|...)...).*..fi|
00006e10  78 5f 6d 6f 64 75 6c 65  28 6d 6f 64 24 2c 6e 61  |x_module(mod$,na|
00006e20  6d 65 24 2c 74 79 70 65  24 2c 6f 66 66 73 65 74  |me$,type$,offset|
00006e30  25 29 0d 29 9a 0c ea 20  63 6f 75 6e 74 25 0d 29  |%).)... count%.)|
00006e40  a4 41 e7 20 a4 6f 73 63  6c 69 28 22 4c 6f 61 64  |.A. .oscli("Load|
00006e50  22 2c 6d 6f 64 24 2c c3  7e 62 75 66 66 25 29 3a  |",mod$,.~buff%):|
00006e60  63 6f 75 6e 74 25 3d 62  75 66 66 25 21 6f 66 66  |count%=buff%!off|
00006e70  73 65 74 25 20 8b 20 63  6f 75 6e 74 25 3d 30 0d  |set% . count%=0.|
00006e80  29 ae 19 6e 61 6d 65 24  3d 6e 61 6d 65 24 2b 22  |)..name$=name$+"|
00006e90  20 6d 6f 64 75 6c 65 22  0d 29 b8 26 f2 6e 6f 74  | module".).&.not|
00006ea0  69 66 79 76 69 72 75 73  28 6e 61 6d 65 24 2c 74  |ifyvirus(name$,t|
00006eb0  79 70 65 24 2c 63 6f 75  6e 74 25 2c a3 29 0d 29  |ype$,count%,.).)|
00006ec0  c2 18 f2 64 65 6c 66 69  6c 65 28 6d 6f 64 24 2c  |...delfile(mod$,|
00006ed0  6e 61 6d 65 24 29 0d 29  cc 05 e1 0d 29 d6 05 3a  |name$).)....)..:|
00006ee0  0d 29 e0 1a dd f2 63 6c  61 69 6d 5f 62 75 66 66  |.)....claim_buff|
00006ef0  65 72 28 63 6c 61 69 6d  25 29 0d 29 ea 17 e7 20  |er(claim%).)... |
00006f00  63 6c 61 69 6d 25 3e 6d  61 78 62 6f 6f 74 25 20  |claim%>maxboot% |
00006f10  8c 0d 29 f4 19 20 20 20  f2 72 65 6c 65 61 73 65  |..)..   .release|
00006f20  52 4d 41 28 62 75 66 66  25 29 0d 29 fe 29 20 20  |RMA(buff%).).)  |
00006f30  20 6d 61 78 62 6f 6f 74  25 3d 28 63 6c 61 69 6d  | maxboot%=(claim|
00006f40  25 2b 26 33 46 46 29 20  81 20 26 34 30 30 2a 26  |%+&3FF) . &400*&|
00006f50  34 30 30 0d 2a 08 08 20  20 20 f5 0d 2a 12 23 20  |400.*..   ..*.# |
00006f60  20 20 20 20 20 62 75 66  66 25 3d a4 63 6c 61 69  |     buff%=.clai|
00006f70  6d 52 4d 41 28 6d 61 78  62 6f 6f 74 25 29 0d 2a  |mRMA(maxboot%).*|
00006f80  1c 22 20 20 20 20 20 20  e7 20 62 75 66 66 25 3d  |."      . buff%=|
00006f90  30 3a 6d 61 78 62 6f 6f  74 25 2d 3d 26 34 30 30  |0:maxboot%-=&400|
00006fa0  0d 2a 26 24 20 20 20 fd  20 62 75 66 66 25 3e 30  |.*&$   . buff%>0|
00006fb0  20 84 20 6d 61 78 62 6f  6f 74 25 3c 6d 69 6e 62  | . maxboot%<minb|
00006fc0  6f 6f 74 25 0d 2a 30 1c  20 20 20 e7 20 6d 61 78  |oot%.*0.   . max|
00006fd0  62 6f 6f 74 25 3c 6d 69  6e 62 6f 6f 74 25 20 8c  |boot%<minboot% .|
00006fe0  0d 2a 3a 3e 20 20 20 20  20 20 f2 77 61 72 6e 28  |.*:>      .warn(|
00006ff0  22 43 61 6e 6e 6f 74 20  63 6c 61 69 6d 20 52 4d  |"Cannot claim RM|
00007000  41 20 66 6f 72 20 66 69  6c 65 20 62 75 66 66 65  |A for file buffe|
00007010  72 20 2d 20 61 62 6f 72  74 69 6e 67 22 29 0d 2a  |r - aborting").*|
00007020  44 28 20 20 20 20 20 20  71 75 69 74 25 3d b9 3a  |D(      quit%=.:|
00007030  73 63 61 6e 6e 69 6e 67  25 3d a3 3a 6d 61 78 62  |scanning%=.:maxb|
00007040  6f 6f 74 25 3d 30 0d 2a  4e 08 20 20 20 cd 0d 2a  |oot%=0.*N.   ..*|
00007050  58 05 cd 0d 2a 62 05 e1  0d 2a 6c 05 3a 0d 2a 76  |X...*b...*l.:.*v|
00007060  2a dd f2 63 68 65 63 6b  5f 66 6f 72 5f 62 6f 6f  |*..check_for_boo|
00007070  74 5f 76 69 72 75 73 28  70 61 74 68 24 2c 6e 61  |t_virus(path$,na|
00007080  6d 65 24 2c 6c 25 29 0d  2a 80 3c ea 20 64 6f 69  |me$,l%).*.<. doi|
00007090  6e 6e 6f 63 25 2c 73 25  2c 74 25 2c 75 25 2c 73  |nnoc%,s%,t%,u%,s|
000070a0  24 2c 6f 6c 64 73 24 2c  63 6f 72 65 24 2c 73 63  |$,olds$,core$,sc|
000070b0  72 61 74 63 68 25 2c 66  6f 72 63 65 25 2c 6f 6c  |ratch%,force%,ol|
000070c0  64 6c 25 0d 2a 8a 20 f2  63 6c 61 69 6d 5f 62 75  |dl%.*. .claim_bu|
000070d0  66 66 65 72 28 6c 25 2b  70 72 6f 74 6c 65 6e 25  |ffer(l%+protlen%|
000070e0  2b 31 29 0d 2a 94 1e e7  20 6c 25 2b 70 72 6f 74  |+1).*... l%+prot|
000070f0  6c 65 6e 25 2b 31 3e 6d  61 78 62 6f 6f 74 25 20  |len%+1>maxboot% |
00007100  8c 0d 2a 9e 3a 20 20 20  f2 69 6e 66 65 63 74 5f  |..*.:   .infect_|
00007110  6c 6f 67 28 70 61 74 68  24 2c 22 21 42 6f 6f 74  |log(path$,"!Boot|
00007120  20 74 6f 6f 20 62 69 67  20 2d 20 6e 6f 74 20 73  | too big - not s|
00007130  63 61 6e 6e 65 64 22 2c  22 22 29 0d 2a a8 08 20  |canned","").*.. |
00007140  20 20 e1 0d 2a b2 05 cd  0d 2a bc 32 64 6f 69 6e  |  ..*....*.2doin|
00007150  6e 6f 63 25 3d 69 6e 6e  6f 63 25 3a 63 6f 72 65  |noc%=innoc%:core|
00007160  24 3d a4 61 70 70 6e 61  6d 65 28 70 61 74 68 24  |$=.appname(path$|
00007170  29 2b 22 2e 21 42 6f 6f  74 22 0d 2a c6 0e 73 63  |)+".!Boot".*..sc|
00007180  72 61 74 63 68 25 3d a3  0d 2a d0 2e e7 20 a4 6f  |ratch%=..*... .o|
00007190  73 63 6c 69 28 22 4c 6f  61 64 22 2c 70 61 74 68  |scli("Load",path|
000071a0  24 2b 22 2e 22 2b 6e 61  6d 65 24 2c c3 7e 62 75  |$+"."+name$,.~bu|
000071b0  66 66 25 29 20 8c 0d 2a  da 08 20 20 20 f5 0d 2a  |ff%) ..*..   ..*|
000071c0  e4 21 20 20 20 20 20 20  66 6f 72 63 65 25 3d a3  |.!      force%=.|
000071d0  3a 73 25 3d 2d 31 3a 6f  6c 64 73 24 3d 22 22 0d  |:s%=-1:olds$="".|
000071e0  2a ee 0b 20 20 20 20 20  20 f5 0d 2a f8 14 20 20  |*..      ..*..  |
000071f0  20 20 20 20 20 20 20 74  25 3d 73 25 2b 31 0d 2b  |       t%=s%+1.+|
00007200  02 0e 20 20 20 20 20 20  20 20 20 f5 0d 2b 0c 21  |..         ..+.!|
00007210  20 20 20 20 20 20 20 20  20 20 20 20 73 25 2b 3d  |            s%+=|
00007220  31 3a 75 25 3d 62 75 66  66 25 3f 73 25 0d 2b 16  |1:u%=buff%?s%.+.|
00007230  26 20 20 20 20 20 20 20  20 20 fd 20 75 25 3c 33  |&         . u%<3|
00007240  32 20 84 20 75 25 3e 31  32 36 20 84 20 73 25 3e  |2 . u%>126 . s%>|
00007250  3d 6c 25 0d 2b 20 16 20  20 20 20 20 20 20 20 20  |=l%.+ .         |
00007260  e7 20 73 25 3c 6c 25 20  8c 0d 2b 2a 36 20 20 20  |. s%<l% ..+*6   |
00007270  20 20 20 20 20 20 20 20  20 62 75 66 66 25 3f 73  |         buff%?s|
00007280  25 3d 26 44 3a 73 24 3d  24 28 62 75 66 66 25 2b  |%=&D:s$=$(buff%+|
00007290  74 25 29 3a 62 75 66 66  25 3f 73 25 3d 75 25 0d  |t%):buff%?s%=u%.|
000072a0  2b 34 17 20 20 20 20 20  20 20 20 20 20 20 20 c8  |+4.            .|
000072b0  8e 20 73 24 20 ca 0d 2b  3e 25 20 20 20 20 20 20  |. s$ ..+>%      |
000072c0  20 20 20 20 20 20 c9 20  69 63 6f 6e 31 77 69 6d  |      . icon1wim|
000072d0  70 24 3a 6f 6c 64 6c 25  3d 74 25 0d 2b 48 1c 20  |p$:oldl%=t%.+H. |
000072e0  20 20 20 20 20 20 20 20  20 20 20 c9 20 63 65 62  |           . ceb|
000072f0  69 74 6f 62 65 79 24 0d  2b 52 3f 20 20 20 20 20  |itobey$.+R?     |
00007300  20 20 20 20 20 20 20 20  20 20 f2 6e 6f 74 69 66  |          .notif|
00007310  79 76 69 72 75 73 28 22  43 65 42 69 74 20 56 69  |yvirus("CeBit Vi|
00007320  72 75 73 20 69 6e 20 22  2b 63 6f 72 65 24 2c 22  |rus in "+core$,"|
00007330  22 2c 30 2c a3 29 0d 2b  5c 39 20 20 20 20 20 20  |",0,.).+\9      |
00007340  20 20 20 20 20 20 20 20  20 75 25 3d 62 75 66 66  |         u%=buff|
00007350  25 3f 28 74 25 2d 32 29  3a 6c 25 3d 74 25 2b 28  |%?(t%-2):l%=t%+(|
00007360  75 25 3d 26 46 46 29 2b  28 75 25 3d 26 41 29 0d  |u%=&FF)+(u%=&A).|
00007370  2b 66 26 20 20 20 20 20  20 20 20 20 20 20 20 20  |+f&             |
00007380  20 20 64 6f 69 6e 6e 6f  63 25 3d b9 3a 66 6f 72  |  doinnoc%=.:for|
00007390  63 65 25 3d b9 0d 2b 70  1c 20 20 20 20 20 20 20  |ce%=..+p.       |
000073a0  20 20 20 20 20 c9 20 76  69 67 61 79 6f 62 65 79  |     . vigayobey|
000073b0  24 0d 2b 7a 3f 20 20 20  20 20 20 20 20 20 20 20  |$.+z?           |
000073c0  20 20 20 20 f2 6e 6f 74  69 66 79 76 69 72 75 73  |    .notifyvirus|
000073d0  28 22 56 69 67 61 79 20  56 69 72 75 73 20 69 6e  |("Vigay Virus in|
000073e0  20 22 2b 63 6f 72 65 24  2c 22 22 2c 30 2c a3 29  | "+core$,"",0,.)|
000073f0  0d 2b 84 2d 20 20 20 20  20 20 20 20 20 20 20 20  |.+.-            |
00007400  20 20 20 6c 25 3d 30 3a  64 6f 69 6e 6e 6f 63 25  |   l%=0:doinnoc%|
00007410  3d b9 3a 73 63 72 61 74  63 68 25 3d b9 0d 2b 8e  |=.:scratch%=..+.|
00007420  1c 20 20 20 20 20 20 20  20 20 20 20 20 c9 20 69  |.            . i|
00007430  63 6f 6e 31 6f 62 65 79  24 0d 2b 98 27 20 20 20  |con1obey$.+.'   |
00007440  20 20 20 20 20 20 20 20  20 20 20 20 e7 20 6f 6c  |            . ol|
00007450  64 73 24 3d 69 63 6f 6e  31 77 69 6d 70 24 20 8c  |ds$=icon1wimp$ .|
00007460  0d 2b a2 41 20 20 20 20  20 20 20 20 20 20 20 20  |.+.A            |
00007470  20 20 20 20 20 20 f2 6e  6f 74 69 66 79 76 69 72  |      .notifyvir|
00007480  75 73 28 22 49 63 6f 6e  20 56 69 72 75 73 20 69  |us("Icon Virus i|
00007490  6e 20 22 2b 63 6f 72 65  24 2c 22 22 2c 30 2c a3  |n "+core$,"",0,.|
000074a0  29 0d 2b ac 32 20 20 20  20 20 20 20 20 20 20 20  |).+.2           |
000074b0  20 20 20 20 20 20 20 6c  25 3d 6f 6c 64 6c 25 3a  |       l%=oldl%:|
000074c0  64 6f 69 6e 6e 6f 63 25  3d b9 3a 66 6f 72 63 65  |doinnoc%=.:force|
000074d0  25 3d b9 0d 2b b6 14 20  20 20 20 20 20 20 20 20  |%=..+..         |
000074e0  20 20 20 20 20 20 cd 0d  2b c0 1b 20 20 20 20 20  |      ..+..     |
000074f0  20 20 20 20 20 20 20 c9  20 74 68 61 6e 6f 62 65  |       . thanobe|
00007500  79 24 0d 2b ca 42 20 20  20 20 20 20 20 20 20 20  |y$.+.B          |
00007510  20 20 20 20 20 f2 6e 6f  74 69 66 79 76 69 72 75  |     .notifyviru|
00007520  73 28 22 54 68 61 6e 61  74 6f 73 20 56 69 72 75  |s("Thanatos Viru|
00007530  73 20 69 6e 20 22 2b 63  6f 72 65 24 2c 22 22 2c  |s in "+core$,"",|
00007540  30 2c a3 29 0d 2b d4 2c  20 20 20 20 20 20 20 20  |0,.).+.,        |
00007550  20 20 20 20 20 20 20 64  6f 69 6e 6e 6f 63 25 3d  |       doinnoc%=|
00007560  b9 3a 66 6f 72 63 65 25  3d b9 3a 6c 25 3d 74 25  |.:force%=.:l%=t%|
00007570  0d 2b de 11 20 20 20 20  20 20 20 20 20 20 20 20  |.+..            |
00007580  cb 0d 2b e8 18 20 20 20  20 20 20 20 20 20 20 20  |..+..           |
00007590  20 6f 6c 64 73 24 3d 73  24 0d 2b f2 0e 20 20 20  | olds$=s$.+..   |
000075a0  20 20 20 20 20 20 cd 0d  2b fc 12 20 20 20 20 20  |      ..+..     |
000075b0  20 fd 20 73 25 3e 3d 6c  25 0d 2c 06 10 20 20 20  | . s%>=l%.,..   |
000075c0  20 20 20 e7 20 6c 25 20  8c 0d 2c 10 1e 20 20 20  |   . l% ..,..   |
000075d0  20 20 20 20 20 20 c8 8e  20 62 75 66 66 25 3f 28  |      .. buff%?(|
000075e0  6c 25 2d 31 29 20 ca 0d  2c 1a 1b 20 20 20 20 20  |l%-1) ..,..     |
000075f0  20 20 20 20 c9 20 26 46  46 3a e7 20 6c 25 3e 34  |    . &FF:. l%>4|
00007600  20 8c 0d 2c 24 2a 20 20  20 20 20 20 20 20 20 20  | ..,$*          |
00007610  20 20 20 20 20 20 20 20  20 20 20 c8 8e 20 62 75  |           .. bu|
00007620  66 66 25 3f 28 6c 25 2d  34 29 20 ca 0d 2c 2e 1d  |ff%?(l%-4) ..,..|
00007630  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00007640  20 20 20 20 20 c9 20 31  33 0d 2c 38 49 20 20 20  |     . 13.,8I   |
00007650  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00007660  20 20 20 20 20 f2 6e 6f  74 69 66 79 76 69 72 75  |     .notifyviru|
00007670  73 28 22 45 78 74 65 6e  64 20 56 69 72 75 73 20  |s("Extend Virus |
00007680  69 6e 20 22 2b 63 6f 72  65 24 2c 22 22 2c 30 2c  |in "+core$,"",0,|
00007690  a3 29 0d 2c 42 2e 20 20  20 20 20 20 20 20 20 20  |.).,B.          |
000076a0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 6c 25  |              l%|
000076b0  3d 6c 25 2d 34 3a 64 6f  69 6e 6e 6f 63 25 3d b9  |=l%-4:doinnoc%=.|
000076c0  0d 2c 4c 40 20 20 20 20  20 20 20 20 20 20 20 20  |.,L@            |
000076d0  20 20 20 20 20 20 20 20  20 20 20 20 c8 95 20 6c  |            .. l|
000076e0  25 3e 30 20 80 20 62 75  66 66 25 3f 28 6c 25 2d  |%>0 . buff%?(l%-|
000076f0  31 29 3c 3e 26 44 3a 6c  25 3d 6c 25 2d 31 3a ce  |1)<>&D:l%=l%-1:.|
00007700  0d 2c 56 2b 20 20 20 20  20 20 20 20 20 20 20 20  |.,V+            |
00007710  20 20 20 20 20 20 20 20  20 20 20 20 62 75 66 66  |            buff|
00007720  25 3f 28 6c 25 2d 31 29  3d 26 41 0d 2c 60 1d 20  |%?(l%-1)=&A.,`. |
00007730  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00007740  20 20 20 20 c9 20 31 30  0d 2c 6a 26 20 20 20 20  |    . 10.,j&    |
00007750  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00007760  20 20 20 20 e7 20 66 6f  72 63 65 25 20 8c 0d 2c  |    . force% ..,|
00007770  74 2b 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |t+              |
00007780  20 20 20 20 20 20 20 20  20 20 20 20 20 6c 25 2d  |             l%-|
00007790  3d 70 72 6f 74 6c 65 6e  25 0d 2c 7e 1d 20 20 20  |=protlen%.,~.   |
000077a0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000077b0  20 20 20 20 20 cc 0d 2c  88 29 20 20 20 20 20 20  |     ..,.)      |
000077c0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000077d0  20 20 20 20 20 64 6f 69  6e 6e 6f 63 25 3d a3 0d  |     doinnoc%=..|
000077e0  2c 92 64 20 20 20 20 20  20 20 20 20 20 20 20 20  |,.d             |
000077f0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 f2 73  |              .s|
00007800  74 61 74 75 73 5f 6c 6f  67 28 70 61 74 68 24 2c  |tatus_log(path$,|
00007810  22 21 42 6f 6f 74 20 61  6c 72 65 61 64 79 20 69  |"!Boot already i|
00007820  6e 6e 6f 63 75 6c 61 74  65 64 22 2c 22 61 67 61  |nnoculated","aga|
00007830  69 6e 73 74 20 45 78 74  65 6e 64 20 56 69 72 75  |inst Extend Viru|
00007840  73 22 29 0d 2c 9c 1d 20  20 20 20 20 20 20 20 20  |s").,..         |
00007850  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 cd  |               .|
00007860  0d 2c a6 2a 20 20 20 20  20 20 20 20 20 20 20 20  |.,.*            |
00007870  20 20 20 20 20 20 20 20  20 7f 20 64 6f 69 6e 6e  |         . doinn|
00007880  6f 63 25 3d 66 6f 72 63  65 25 0d 2c b0 1a 20 20  |oc%=force%.,..  |
00007890  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000078a0  20 20 20 cb 0d 2c ba 17  20 20 20 20 20 20 20 20  |   ..,..        |
000078b0  20 20 20 20 20 20 20 20  20 20 cd 0d 2c c4 26 20  |          ..,.& |
000078c0  20 20 20 20 20 20 20 20  c9 20 26 30 41 3a f4 20  |        . &0A:. |
000078d0  4e 6f 72 6d 61 6c 20 74  65 72 6d 69 6e 61 74 6f  |Normal terminato|
000078e0  72 0d 2c ce 30 20 20 20  20 20 20 20 20 20 7f 20  |r.,.0         . |
000078f0  62 75 66 66 25 3f 6c 25  3d 26 41 3a 6c 25 2b 3d  |buff%?l%=&A:l%+=|
00007900  31 3a f4 20 41 64 64 20  4c 46 20 6f 6e 20 65 6e  |1:. Add LF on en|
00007910  64 0d 2c d8 0e 20 20 20  20 20 20 20 20 20 cb 0d  |d.,..         ..|
00007920  2c e2 0b 20 20 20 20 20  20 cc 0d 2c ec 35 20 20  |,..      ..,.5  |
00007930  20 20 20 20 20 20 20 73  63 72 61 74 63 68 25 3d  |       scratch%=|
00007940  a4 65 78 69 73 74 73 28  70 61 74 68 24 2b 22 2e  |.exists(path$+".|
00007950  21 53 70 72 69 74 65 73  22 2c 26 46 46 39 29 0d  |!Sprites",&FF9).|
00007960  2c f6 0b 20 20 20 20 20  20 cd 0d 2d 00 11 20 20  |,..      ..-..  |
00007970  20 fd 20 66 6f 72 63 65  25 3d a3 0d 2d 0a 05 cc  | . force%=..-...|
00007980  0d 2d 14 11 20 20 20 64  6f 69 6e 6e 6f 63 25 3d  |.-..   doinnoc%=|
00007990  a3 0d 2d 1e 38 20 20 20  f2 69 6e 66 65 63 74 5f  |..-.8   .infect_|
000079a0  6c 6f 67 28 70 61 74 68  24 2c 22 21 42 6f 6f 74  |log(path$,"!Boot|
000079b0  20 63 6f 75 6c 64 20 6e  6f 74 20 62 65 20 6c 6f  | could not be lo|
000079c0  61 64 65 64 22 2c 22 22  29 0d 2d 28 05 cd 0d 2d  |aded","").-(...-|
000079d0  32 10 e7 20 64 6f 69 6e  6e 6f 63 25 20 8c 0d 2d  |2.. doinnoc% ..-|
000079e0  3c 21 20 20 20 e7 20 6c  25 2b 70 72 6f 74 6c 65  |<!   . l%+protle|
000079f0  6e 25 2b 31 3e 6d 61 78  62 6f 6f 74 25 20 8c 0d  |n%+1>maxboot% ..|
00007a00  2d 46 55 20 20 20 20 20  20 f2 69 6e 66 65 63 74  |-FU      .infect|
00007a10  5f 6c 6f 67 28 70 61 74  68 24 2c 22 21 42 6f 6f  |_log(path$,"!Boo|
00007a20  74 20 74 6f 6f 20 62 69  67 20 2d 20 6e 6f 74 20  |t too big - not |
00007a30  69 6e 6e 6f 63 75 6c 61  74 65 64 22 2c 22 61 67  |innoculated","ag|
00007a40  61 69 6e 73 74 20 45 78  74 65 6e 64 20 56 69 72  |ainst Extend Vir|
00007a50  75 73 22 29 0d 2d 50 08  20 20 20 cc 0d 2d 5a 38  |us").-P.   ..-Z8|
00007a60  20 20 20 20 20 20 e7 20  a4 65 78 74 65 6e 64 5f  |      . .extend_|
00007a70  69 6e 6e 6f 63 62 6f 6f  74 28 70 61 74 68 24 2c  |innocboot(path$,|
00007a80  62 75 66 66 25 2c 6c 25  2c 73 63 72 61 74 63 68  |buff%,l%,scratch|
00007a90  25 29 20 8c 0d 2d 64 51  20 20 20 20 20 20 20 20  |%) ..-dQ        |
00007aa0  20 f2 73 74 61 74 75 73  5f 6c 6f 67 28 70 61 74  | .status_log(pat|
00007ab0  68 24 2c 22 21 42 6f 6f  74 20 69 73 20 6e 6f 77  |h$,"!Boot is now|
00007ac0  20 69 6e 6e 6f 63 75 6c  61 74 65 64 22 2c 22 61  | innoculated","a|
00007ad0  67 61 69 6e 73 74 20 45  78 74 65 6e 64 20 56 69  |gainst Extend Vi|
00007ae0  72 75 73 22 29 0d 2d 6e  0b 20 20 20 20 20 20 cd  |rus").-n.      .|
00007af0  0d 2d 78 08 20 20 20 cd  0d 2d 82 05 cd 0d 2d 8c  |.-x.   ..-....-.|
00007b00  05 e1 0d 2d 96 05 3a 0d  2d a0 2d dd a4 65 78 74  |...-..:.-.-..ext|
00007b10  65 6e 64 5f 69 6e 6e 6f  63 62 6f 6f 74 28 64 69  |end_innocboot(di|
00007b20  72 24 2c 61 25 2c 6c 65  6e 25 2c 61 64 64 69 63  |r$,a%,len%,addic|
00007b30  6f 6e 25 29 0d 2d aa 27  ea 20 67 6f 6f 64 25 2c  |on%).-.'. good%,|
00007b40  6e 24 3a 67 6f 6f 64 25  3d a3 3a 6e 24 3d 64 69  |n$:good%=.:n$=di|
00007b50  72 24 2b 22 2e 21 42 6f  6f 74 22 0d 2d b4 2e e7  |r$+".!Boot".-...|
00007b60  20 61 64 64 69 63 6f 6e  25 3a 24 28 61 25 2b 6c  | addicon%:$(a%+l|
00007b70  65 6e 25 29 3d 69 63 6f  6e 24 3a 6c 65 6e 25 2b  |en%)=icon$:len%+|
00007b80  3d 69 63 6f 6e 6c 65 6e  25 0d 2d be 17 24 28 61  |=iconlen%.-..$(a|
00007b90  25 2b 6c 65 6e 25 29 3d  70 72 6f 74 65 63 74 24  |%+len%)=protect$|
00007ba0  0d 2d c8 37 e7 20 a4 6f  73 63 6c 69 28 22 53 61  |.-.7. .oscli("Sa|
00007bb0  76 65 22 2c 6e 24 2c c3  7e 61 25 2b 22 20 22 2b  |ve",n$,.~a%+" "+|
00007bc0  c3 7e 28 61 25 2b 6c 65  6e 25 2b 70 72 6f 74 6c  |.~(a%+len%+protl|
00007bd0  65 6e 25 29 29 20 8c 0d  2d d2 36 20 20 20 e7 20  |en%)) ..-.6   . |
00007be0  a4 6f 73 63 6c 69 28 22  53 65 74 54 79 70 65 22  |.oscli("SetType"|
00007bf0  2c 6e 24 2c 22 4f 62 65  79 22 29 3a 67 6f 6f 64  |,n$,"Obey"):good|
00007c00  25 3d b9 3a f2 6e 65 77  69 6e 6e 6f 63 0d 2d dc  |%=.:.newinnoc.-.|
00007c10  05 cd 0d 2d e6 43 e7 20  67 6f 6f 64 25 3d a3 3a  |...-.C. good%=.:|
00007c20  f2 69 6e 66 65 63 74 5f  6c 6f 67 28 64 69 72 24  |.infect_log(dir$|
00007c30  2c 22 21 42 6f 6f 74 20  63 6f 75 6c 64 20 6e 6f  |,"!Boot could no|
00007c40  74 20 62 65 20 69 6e 6e  6f 63 75 6c 61 74 65 64  |t be innoculated|
00007c50  22 2c 22 22 29 0d 2d f0  0a 3d 67 6f 6f 64 25 0d  |","").-..=good%.|
00007c60  2d fa 05 3a 0d 2e 04 27  dd f2 63 68 65 63 6b 5f  |-..:...'..check_|
00007c70  66 6f 72 5f 61 62 73 5f  76 69 72 75 73 28 64 69  |for_abs_virus(di|
00007c80  72 24 2c 6e 24 2c f8 20  6c 25 29 0d 2e 0e 39 ea  |r$,n$,. l%)...9.|
00007c90  20 64 6f 69 6e 6e 6f 63  25 2c 68 61 6e 64 6c 65  | doinnoc%,handle|
00007ca0  25 2c 66 6c 61 67 73 25  2c 63 61 6e 63 65 6c 25  |%,flags%,cancel%|
00007cb0  2c 72 65 70 6c 61 63 65  25 2c 65 6e 64 24 2c 6e  |,replace%,end$,n|
00007cc0  61 6d 65 24 0d 2e 18 15  6e 61 6d 65 24 3d 64 69  |ame$....name$=di|
00007cd0  72 24 2b 22 2e 22 2b 6e  24 0d 2e 22 0e 72 65 70  |r$+"."+n$..".rep|
00007ce0  6c 61 63 65 25 3d a3 0d  2e 2c 13 68 61 6e 64 6c  |lace%=...,.handl|
00007cf0  65 25 3d 8e 20 6e 61 6d  65 24 0d 2e 36 0f e7 20  |e%=. name$..6.. |
00007d00  68 61 6e 64 6c 65 25 20  8c 0d 2e 40 16 20 20 20  |handle% ...@.   |
00007d10  64 6f 69 6e 6e 6f 63 25  3d 69 6e 6e 6f 63 25 0d  |doinnoc%=innoc%.|
00007d20  2e 4a 36 20 20 20 e7 20  a4 61 62 73 5f 72 65 61  |.J6   . .abs_rea|
00007d30  64 70 74 72 28 68 61 6e  64 6c 65 25 2c 6c 25 2d  |dptr(handle%,l%-|
00007d40  31 36 2c 31 36 2c 65 6e  64 24 2c 64 69 72 24 2c  |16,16,end$,dir$,|
00007d50  6e 24 29 20 8c 0d 2e 54  21 20 20 20 20 20 20 e7  |n$) ...T!      .|
00007d60  20 c2 65 6e 64 24 2c 38  29 3d 22 48 79 70 6f 31  | .end$,8)="Hypo1|
00007d70  32 31 30 22 20 8c 0d 2e  5e 17 20 20 20 20 20 20  |210" ...^.      |
00007d80  20 20 20 64 6f 69 6e 6e  6f 63 25 3d a3 0d 2e 68  |   doinnoc%=...h|
00007d90  4e 20 20 20 20 20 20 20  20 20 f2 73 74 61 74 75  |N         .statu|
00007da0  73 5f 6c 6f 67 28 64 69  72 24 2c 6e 24 2b 22 20  |s_log(dir$,n$+" |
00007db0  61 6c 72 65 61 64 79 20  69 6e 6e 6f 63 75 6c 61  |already innocula|
00007dc0  74 65 64 22 2c 22 61 67  61 69 6e 73 74 20 41 72  |ted","against Ar|
00007dd0  63 68 69 65 56 69 72 75  73 22 29 0d 2e 72 0b 20  |chieVirus")..r. |
00007de0  20 20 20 20 20 cc 0d 2e  7c 20 20 20 20 20 20 20  |     ...|       |
00007df0  20 20 20 e7 20 c2 65 6e  64 24 2c 34 29 3d 22 31  |   . .end$,4)="1|
00007e00  32 31 30 22 20 8c 0d 2e  86 5e 20 20 20 20 20 20  |210" ....^      |
00007e10  20 20 20 20 20 20 f2 6e  6f 74 69 66 79 76 69 72  |      .notifyvir|
00007e20  75 73 28 22 41 72 63 68  69 65 56 69 72 75 73 20  |us("ArchieVirus |
00007e30  69 6e 20 22 2b a4 61 70  70 6e 61 6d 65 28 64 69  |in "+.appname(di|
00007e40  72 24 29 2b 22 2e 22 2b  6e 24 2c 22 44 65 63 72  |r$)+"."+n$,"Decr|
00007e50  65 6d 65 6e 74 22 2c 21  73 65 65 6b 62 75 66 66  |ement",!seekbuff|
00007e60  25 2c a3 29 0d 2e 90 25  20 20 20 20 20 20 20 20  |%,.)...%        |
00007e70  20 20 20 20 64 6f 69 6e  6e 6f 63 25 3d b9 3a 72  |    doinnoc%=.:r|
00007e80  65 70 6c 61 63 65 25 3d  b9 0d 2e 9a 0e 20 20 20  |eplace%=.....   |
00007e90  20 20 20 20 20 20 cd 0d  2e a4 0b 20 20 20 20 20  |      .....     |
00007ea0  20 cd 0d 2e ae 08 20 20  20 cc 0d 2e b8 14 20 20  | .....   .....  |
00007eb0  20 20 20 20 64 6f 69 6e  6e 6f 63 25 3d a3 0d 2e  |    doinnoc%=...|
00007ec0  c2 08 20 20 20 cd 0d 2e  cc 2b 20 20 20 c8 99 20  |..   ....+   .. |
00007ed0  22 58 4f 53 5f 46 69 6e  64 22 2c 30 2c 68 61 6e  |"XOS_Find",0,han|
00007ee0  64 6c 65 25 3a f4 20 43  6c 6f 73 65 20 66 69 6c  |dle%:. Close fil|
00007ef0  65 0d 2e d6 05 cc 0d 2e  e0 11 20 20 20 64 6f 69  |e.........   doi|
00007f00  6e 6e 6f 63 25 3d a3 0d  2e ea 05 cd 0d 2e f4 10  |nnoc%=..........|
00007f10  e7 20 64 6f 69 6e 6e 6f  63 25 20 8c 0d 2e fe 10  |. doinnoc% .....|
00007f20  20 20 20 68 61 6e 64 6c  65 25 3d 30 0d 2f 08 44  |   handle%=0./.D|
00007f30  20 20 20 f4 20 59 65 73  2c 20 32 20 2a 41 63 63  |   . Yes, 2 *Acc|
00007f40  65 73 73 27 73 20 6e 65  65 64 65 64 20 28 6e 6f  |ess's needed (no|
00007f50  20 49 2f 4f 20 69 66 20  61 6c 72 65 61 64 79 20  | I/O if already |
00007f60  73 65 74 20 74 6f 2c 20  73 61 79 2c 20 57 52 29  |set to, say, WR)|
00007f70  0d 2f 12 26 20 20 20 e7  20 a4 6f 73 63 6c 69 28  |./.&   . .oscli(|
00007f80  22 41 63 63 65 73 73 22  2c 6e 61 6d 65 24 2c 22  |"Access",name$,"|
00007f90  52 4c 22 29 20 8c 0d 2f  1c 29 20 20 20 20 20 20  |RL") ../.)      |
00007fa0  e7 20 a4 6f 73 63 6c 69  28 22 41 63 63 65 73 73  |. .oscli("Access|
00007fb0  22 2c 6e 61 6d 65 24 2c  22 57 52 22 29 20 8c 0d  |",name$,"WR") ..|
00007fc0  2f 26 1c 20 20 20 20 20  20 20 20 20 68 61 6e 64  |/&.         hand|
00007fd0  6c 65 25 3d ad 20 6e 61  6d 65 24 0d 2f 30 18 20  |le%=. name$./0. |
00007fe0  20 20 20 20 20 20 20 20  e7 20 68 61 6e 64 6c 65  |        . handle|
00007ff0  25 20 8c 0d 2f 3a 1c 20  20 20 20 20 20 20 20 20  |% ../:.         |
00008000  20 20 20 e7 20 72 65 70  6c 61 63 65 25 20 8c 0d  |   . replace% ..|
00008010  2f 44 47 20 20 20 20 20  20 20 20 20 20 20 20 20  |/DG             |
00008020  20 20 64 6f 69 6e 6e 6f  63 25 3d a4 61 62 73 5f  |  doinnoc%=.abs_|
00008030  77 72 69 74 65 70 74 72  28 68 61 6e 64 6c 65 25  |writeptr(handle%|
00008040  2c 30 2c c1 65 6e 64 24  2c 35 2c 34 29 2c 64 69  |,0,.end$,5,4),di|
00008050  72 24 2c 6e 24 29 0d 2f  4e 42 20 20 20 20 20 20  |r$,n$)./NB      |
00008060  20 20 20 20 20 20 20 20  20 e7 20 64 6f 69 6e 6e  |         . doinn|
00008070  6f 63 25 3a 6c 25 3d 6c  25 2d 61 72 63 68 73 69  |oc%:l%=l%-archsi|
00008080  7a 65 25 3a f4 20 53 68  72 69 6e 6b 20 66 69 6c  |ze%:. Shrink fil|
00008090  65 20 6c 65 6e 67 74 68  0d 2f 58 11 20 20 20 20  |e length./X.    |
000080a0  20 20 20 20 20 20 20 20  cd 0d 2f 62 1c 20 20 20  |        ../b.   |
000080b0  20 20 20 20 20 20 20 20  20 e7 20 64 6f 69 6e 6e  |         . doinn|
000080c0  6f 63 25 20 8c 0d 2f 6c  43 20 20 20 20 20 20 20  |oc% ../lC       |
000080d0  20 20 20 20 20 20 20 20  e7 20 a4 61 62 73 5f 77  |        . .abs_w|
000080e0  72 69 74 65 70 74 72 28  68 61 6e 64 6c 65 25 2c  |riteptr(handle%,|
000080f0  6c 25 2c 22 48 79 70 6f  31 32 31 30 22 2c 64 69  |l%,"Hypo1210",di|
00008100  72 24 2c 6e 24 29 20 8c  0d 2f 76 45 20 20 20 20  |r$,n$) ../vE    |
00008110  20 20 20 20 20 20 20 20  20 20 20 20 20 20 6c 25  |              l%|
00008120  2b 3d 38 3a a2 23 68 61  6e 64 6c 65 25 3d 6c 25  |+=8:.#handle%=l%|
00008130  3a f4 20 54 72 75 6e 63  61 74 65 20 28 61 6c 6c  |:. Truncate (all|
00008140  6f 77 20 66 6f 72 20 69  6e 6e 6f 63 29 0d 2f 80  |ow for innoc)./.|
00008150  1f 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |.               |
00008160  20 20 20 f2 6e 65 77 69  6e 6e 6f 63 0d 2f 8a 58  |   .newinnoc./.X|
00008170  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00008180  20 20 f2 73 74 61 74 75  73 5f 6c 6f 67 28 64 69  |  .status_log(di|
00008190  72 24 2c 6e 24 2b 22 20  68 61 73 20 62 65 65 6e  |r$,n$+" has been|
000081a0  20 69 6e 6e 6f 63 75 6c  61 74 65 64 22 2c 22 61  | innoculated","a|
000081b0  67 61 69 6e 73 74 20 41  72 63 68 69 65 56 69 72  |gainst ArchieVir|
000081c0  75 73 22 29 0d 2f 94 14  20 20 20 20 20 20 20 20  |us")./..        |
000081d0  20 20 20 20 20 20 20 cd  0d 2f 9e 11 20 20 20 20  |       ../..    |
000081e0  20 20 20 20 20 20 20 20  cd 0d 2f a8 34 20 20 20  |        ../.4   |
000081f0  20 20 20 20 20 20 20 20  20 c8 99 20 22 58 4f 53  |         .. "XOS|
00008200  5f 46 69 6e 64 22 2c 30  2c 68 61 6e 64 6c 65 25  |_Find",0,handle%|
00008210  3a f4 20 43 6c 6f 73 65  20 66 69 6c 65 0d 2f b2  |:. Close file./.|
00008220  0e 20 20 20 20 20 20 20  20 20 cd 0d 2f bc 0b 20  |.         ../.. |
00008230  20 20 20 20 20 cd 0d 2f  c6 08 20 20 20 cd 0d 2f  |     ../..   ../|
00008240  d0 05 cd 0d 2f da 11 e7  20 68 61 6e 64 6c 65 25  |..../... handle%|
00008250  3d 30 20 8c 0d 2f e4 35  20 20 20 f2 69 6e 66 65  |=0 ../.5   .infe|
00008260  63 74 5f 6c 6f 67 28 64  69 72 24 2c 6e 24 2b 22  |ct_log(dir$,n$+"|
00008270  20 63 6f 75 6c 64 20 6e  6f 74 20 62 65 20 6f 70  | could not be op|
00008280  65 6e 65 64 22 2c 22 22  29 0d 2f ee 05 cd 0d 2f  |ened","")./..../|
00008290  f8 05 e1 0d 30 02 05 3a  0d 30 0c 27 dd f2 63 68  |....0..:.0.'..ch|
000082a0  65 63 6b 5f 66 6f 72 5f  42 41 53 49 43 5f 76 69  |eck_for_BASIC_vi|
000082b0  72 75 73 28 64 69 72 24  2c 6e 61 6d 65 24 29 0d  |rus(dir$,name$).|
000082c0  30 16 16 c8 8e 20 a4 6c  6f 77 65 72 28 6e 61 6d  |0.... .lower(nam|
000082d0  65 24 29 20 ca 0d 30 20  3b c9 20 22 64 61 74 61  |e$) ..0 ;. "data|
000082e0  64 71 6d 22 3a e7 20 6c  65 6e 25 3d 32 33 31 31  |dqm":. len%=2311|
000082f0  3a f2 66 69 6c 65 5f 76  69 72 75 73 28 64 69 72  |:.file_virus(dir|
00008300  24 2c 6e 61 6d 65 24 2c  22 56 69 67 61 79 22 29  |$,name$,"Vigay")|
00008310  0d 30 2a 05 cb 0d 30 34  05 e1 0d 30 3e 05 3a 0d  |.0*...04...0>.:.|
00008320  30 48 1d dd f2 66 69 6c  65 5f 76 69 72 75 73 28  |0H...file_virus(|
00008330  64 24 2c 6e 24 2c 6e 61  6d 65 24 29 0d 30 52 13  |d$,n$,name$).0R.|
00008340  6e 61 6d 65 24 2b 3d 22  20 56 69 72 75 73 22 0d  |name$+=" Virus".|
00008350  30 5c 39 f2 6e 6f 74 69  66 79 76 69 72 75 73 28  |0\9.notifyvirus(|
00008360  6e 61 6d 65 24 2b 22 20  69 6e 20 22 2b a4 61 70  |name$+" in "+.ap|
00008370  70 6e 61 6d 65 28 64 24  29 2b 22 2e 22 2b 6e 24  |pname(d$)+"."+n$|
00008380  2c 22 22 2c 30 2c a3 29  0d 30 66 1d f2 64 65 6c  |,"",0,.).0f..del|
00008390  66 69 6c 65 28 64 24 2b  22 2e 22 2b 6e 24 2c 6e  |file(d$+"."+n$,n|
000083a0  61 6d 65 24 29 0d 30 70  05 e1 0d 30 7a 05 3a 0d  |ame$).0p...0z.:.|
000083b0  30 84 22 dd f2 6b 69 6c  6c 5f 76 69 72 75 73 5f  |0."..kill_virus_|
000083c0  74 61 73 6b 28 68 61 6e  64 25 2c 6e 61 6d 65 24  |task(hand%,name$|
000083d0  29 0d 30 8e 13 6e 61 6d  65 24 2b 3d 22 20 56 69  |).0..name$+=" Vi|
000083e0  72 75 73 22 0d 30 98 1e  f2 6e 6f 74 69 66 79 76  |rus".0...notifyv|
000083f0  69 72 75 73 28 6e 61 6d  65 24 2c 22 22 2c 30 2c  |irus(name$,"",0,|
00008400  b9 29 0d 30 a2 0d e7 20  68 61 6e 64 25 20 8c 0d  |.).0... hand% ..|
00008410  30 ac 26 20 20 20 21 70  6f 6c 6c 25 3d 32 30 3a  |0.&   !poll%=20:|
00008420  70 6f 6c 6c 25 21 31 32  3d 30 3a 70 6f 6c 6c 25  |poll%!12=0:poll%|
00008430  21 31 36 3d 30 0d 30 b6  2c 20 20 20 c8 99 20 22  |!16=0.0.,   .. "|
00008440  58 57 69 6d 70 5f 53 65  6e 64 4d 65 73 73 61 67  |XWimp_SendMessag|
00008450  65 22 2c 31 37 2c 70 6f  6c 6c 25 2c 68 61 6e 64  |e",17,poll%,hand|
00008460  25 0d 30 c0 05 cd 0d 30  ca 26 f2 73 74 61 74 75  |%.0....0.&.statu|
00008470  73 5f 6c 6f 67 28 22 22  2c 6e 61 6d 65 24 2b 22  |s_log("",name$+"|
00008480  20 6b 69 6c 6c 65 64 22  2c 22 22 29 0d 30 d4 05  | killed","").0..|
00008490  e1 0d 30 de 05 3a 0d 30  e8 1a dd f2 76 69 67 61  |..0..:.0....viga|
000084a0  79 5f 72 75 6e 6e 69 6e  67 28 68 61 6e 64 25 29  |y_running(hand%)|
000084b0  0d 30 f2 3a e7 20 a4 67  65 74 66 72 6f 6d 74 61  |.0.:. .getfromta|
000084c0  73 6b 28 68 61 6e 64 25  2c 62 61 73 5f 73 74 61  |sk(hand%,bas_sta|
000084d0  72 74 25 2b 26 31 43 2c  31 30 29 3d 22 50 41 55  |rt%+&1C,10)="PAU|
000084e0  4c 20 56 49 47 41 59 22  20 8c 0d 30 fc 26 20 20  |L VIGAY" ..0.&  |
000084f0  20 f2 6b 69 6c 6c 5f 76  69 72 75 73 5f 74 61 73  | .kill_virus_tas|
00008500  6b 28 68 61 6e 64 25 2c  22 56 69 67 61 79 22 29  |k(hand%,"Vigay")|
00008510  0d 31 06 05 cd 0d 31 10  05 e1 0d 31 1a 05 3a 0d  |.1....1....1..:.|
00008520  31 24 19 dd f2 69 63 6f  6e 5f 72 75 6e 6e 69 6e  |1$...icon_runnin|
00008530  67 28 68 61 6e 64 25 29  0d 31 2e 2d c8 8e 20 a4  |g(hand%).1.-.. .|
00008540  67 65 74 66 72 6f 6d 74  61 73 6b 28 68 61 6e 64  |getfromtask(hand|
00008550  25 2c 62 61 73 5f 73 74  61 72 74 25 2b 26 45 36  |%,bas_start%+&E6|
00008560  2c 36 29 20 ca 0d 31 38  32 c9 20 22 72 61 6e 64  |,6) ..182. "rand|
00008570  6f 6d 22 3a f2 6d 6f 64  69 66 79 5f 6b 69 6c 6c  |om":.modify_kill|
00008580  28 68 61 6e 64 25 2c 26  31 41 35 2c 22 22 2c 22  |(hand%,&1A5,"","|
00008590  49 63 6f 6e 31 22 29 0d  31 42 32 c9 20 22 65 20  |Icon1").1B2. "e |
000085a0  61 73 20 70 22 3a f2 6d  6f 64 69 66 79 5f 6b 69  |as p":.modify_ki|
000085b0  6c 6c 28 68 61 6e 64 25  2c 26 34 33 44 2c 22 22  |ll(hand%,&43D,""|
000085c0  2c 22 49 63 6f 6e 32 22  29 0d 31 4c 05 cb 0d 31  |,"Icon2").1L...1|
000085d0  56 05 e1 0d 31 60 05 3a  0d 31 6a 19 dd f2 74 68  |V...1`.:.1j...th|
000085e0  61 6e 5f 72 75 6e 6e 69  6e 67 28 68 61 6e 64 25  |an_running(hand%|
000085f0  29 0d 31 6b 0b ea 20 61  64 64 72 25 0d 31 74 36  |).1k.. addr%.1t6|
00008600  e7 20 a4 67 65 74 66 72  6f 6d 74 61 73 6b 28 68  |. .getfromtask(h|
00008610  61 6e 64 25 2c 62 61 73  5f 73 74 61 72 74 25 2b  |and%,bas_start%+|
00008620  26 41 2c 38 29 3d 22 53  79 73 24 50 61 74 68 22  |&A,8)="Sys$Path"|
00008630  20 8c 0d 31 75 4e 20 20  20 e7 20 a4 67 65 74 66  | ..1uN   . .getf|
00008640  72 6f 6d 74 61 73 6b 28  68 61 6e 64 25 2c 62 61  |romtask(hand%,ba|
00008650  73 5f 73 74 61 72 74 25  2b 26 33 31 35 2c 35 29  |s_start%+&315,5)|
00008660  3d 22 2a 64 62 67 2a 22  3a 61 64 64 72 25 3d 26  |="*dbg*":addr%=&|
00008670  32 46 31 20 8b 20 61 64  64 72 25 3d 26 32 41 33  |2F1 . addr%=&2A3|
00008680  0d 31 92 32 20 20 20 f2  6d 6f 64 69 66 79 5f 6b  |.1.2   .modify_k|
00008690  69 6c 6c 28 68 61 6e 64  25 2c 61 64 64 72 25 2c  |ill(hand%,addr%,|
000086a0  22 20 20 20 20 22 2c 22  54 68 61 6e 61 74 6f 73  |"    ","Thanatos|
000086b0  22 29 0d 31 9c 05 cd 0d  31 a6 05 e1 0d 31 b0 05  |").1....1....1..|
000086c0  3a 0d 31 ba 29 dd f2 6d  6f 64 69 66 79 5f 6b 69  |:.1.)..modify_ki|
000086d0  6c 6c 28 68 61 6e 64 25  2c 6f 66 66 25 2c 68 61  |ll(hand%,off%,ha|
000086e0  63 6b 24 2c 6e 61 6d 65  24 29 0d 31 c4 0b ea 20  |ck$,name$).1... |
000086f0  73 24 2c 74 24 0d 31 ce  25 73 24 3d 68 61 63 6b  |s$,t$.1.%s$=hack|
00008700  24 2b bd 28 26 42 39 29  2b bd 28 26 44 29 2b bd  |$+.(&B9)+.(&D)+.|
00008710  28 26 34 30 29 2b bd 28  30 29 0d 31 d8 55 74 24  |(&40)+.(0).1.Ut$|
00008720  3d bd 28 26 43 38 29 2b  bd 28 26 39 39 29 2b 22  |=.(&C8)+.(&99)+"|
00008730  26 36 30 30 44 44 2c 26  22 2b c3 7e 68 61 6e 64  |&600DD,&"+.~hand|
00008740  25 2b 22 2c 26 34 42 35  33 34 31 35 34 3a 22 2b  |%+",&4B534154:"+|
00008750  bd 28 26 43 38 29 2b bd  28 26 39 39 29 2b 22 31  |.(&C8)+.(&99)+"1|
00008760  37 22 2b bd 28 26 44 29  2b bd 28 26 46 46 29 0d  |7"+.(&D)+.(&FF).|
00008770  31 e2 37 f2 73 65 6e 64  74 6f 74 61 73 6b 28 68  |1.7.sendtotask(h|
00008780  61 6e 64 25 2c 62 61 73  5f 73 74 61 72 74 25 2b  |and%,bas_start%+|
00008790  6f 66 66 25 2c 73 24 2b  bd 28 a9 28 74 24 29 2b  |off%,s$+.(.(t$)+|
000087a0  32 29 2b 74 24 29 0d 31  ec 2f f2 6b 69 6c 6c 5f  |2)+t$).1./.kill_|
000087b0  76 69 72 75 73 5f 74 61  73 6b 28 2d 28 a9 28 68  |virus_task(-(.(h|
000087c0  61 63 6b 24 29 3e 31 29  2a 68 61 6e 64 25 2c 6e  |ack$)>1)*hand%,n|
000087d0  61 6d 65 24 29 0d 31 f6  05 e1 0d 32 00 05 3a 0d  |ame$).1....2..:.|
000087e0  32 0a 2f dd a4 61 62 73  5f 77 72 69 74 65 70 74  |2./..abs_writept|
000087f0  72 28 66 69 6c 65 25 2c  70 6f 73 25 2c 6d 65 73  |r(file%,pos%,mes|
00008800  73 24 2c 64 69 72 24 2c  6e 61 6d 65 24 29 0d 32  |s$,dir$,name$).2|
00008810  14 0f ea 20 66 6c 61 67  73 25 2c 70 25 0d 32 1e  |... flags%,p%.2.|
00008820  14 24 73 65 65 6b 62 75  66 66 25 3d 6d 65 73 73  |.$seekbuff%=mess|
00008830  24 0d 32 28 3d c8 99 20  22 58 4f 53 5f 47 42 50  |$.2(=.. "XOS_GBP|
00008840  42 22 2c 31 2c 66 69 6c  65 25 2c 73 65 65 6b 62  |B",1,file%,seekb|
00008850  75 66 66 25 2c a9 28 6d  65 73 73 24 29 2c 70 6f  |uff%,.(mess$),po|
00008860  73 25 20 b8 20 70 25 3b  66 6c 61 67 73 25 0d 32  |s% . p%;flags%.2|
00008870  32 34 3d a4 61 62 73 5f  63 68 65 63 6b 65 72 72  |24=.abs_checkerr|
00008880  6f 72 28 66 6c 61 67 73  25 2c 64 69 72 24 2c 6e  |or(flags%,dir$,n|
00008890  61 6d 65 24 2c 22 77 72  69 74 69 6e 67 22 2c 70  |ame$,"writing",p|
000088a0  25 29 0d 32 3c 05 3a 0d  32 46 2f dd a4 61 62 73  |%).2<.:.2F/..abs|
000088b0  5f 72 65 61 64 70 74 72  28 66 69 6c 65 25 2c 70  |_readptr(file%,p|
000088c0  6f 73 25 2c 6c 65 6e 25  2c f8 20 73 24 2c 64 69  |os%,len%,. s$,di|
000088d0  72 24 2c 6e 24 29 0d 32  50 0f ea 20 66 6c 61 67  |r$,n$).2P.. flag|
000088e0  73 25 2c 70 25 0d 32 5a  39 c8 99 20 22 58 4f 53  |s%,p%.2Z9.. "XOS|
000088f0  5f 47 42 50 42 22 2c 33  2c 66 69 6c 65 25 2c 73  |_GBPB",3,file%,s|
00008900  65 65 6b 62 75 66 66 25  2c 6c 65 6e 25 2c 70 6f  |eekbuff%,len%,po|
00008910  73 25 20 b8 20 70 25 3b  66 6c 61 67 73 25 0d 32  |s% . p%;flags%.2|
00008920  64 22 73 24 3d a4 6d 61  6b 65 73 74 72 69 6e 67  |d"s$=.makestring|
00008930  28 73 65 65 6b 62 75 66  66 25 2c 6c 65 6e 25 29  |(seekbuff%,len%)|
00008940  0d 32 6e 31 3d a4 61 62  73 5f 63 68 65 63 6b 65  |.2n1=.abs_checke|
00008950  72 72 6f 72 28 66 6c 61  67 73 25 2c 64 69 72 24  |rror(flags%,dir$|
00008960  2c 6e 24 2c 22 72 65 61  64 69 6e 67 22 2c 70 25  |,n$,"reading",p%|
00008970  29 0d 32 78 05 3a 0d 32  82 27 dd a4 61 62 73 5f  |).2x.:.2.'..abs_|
00008980  63 68 65 63 6b 65 72 72  6f 72 28 66 25 2c 64 69  |checkerror(f%,di|
00008990  72 24 2c 6e 24 2c 6f 70  24 2c 70 25 29 0d 32 8c  |r$,n$,op$,p%).2.|
000089a0  0e e7 20 66 25 20 80 20  31 20 8c 0d 32 96 5d 20  |.. f% . 1 ..2.] |
000089b0  20 20 f2 69 6e 66 65 63  74 5f 6c 6f 67 28 64 69  |  .infect_log(di|
000089c0  72 24 2c 6e 24 2b 22 20  63 6f 75 6c 64 20 6e 6f  |r$,n$+" could no|
000089d0  74 20 62 65 20 61 63 63  65 73 73 65 64 22 2c 22  |t be accessed","|
000089e0  28 66 6f 72 20 22 2b 6f  70 24 2b 22 2c 20 72 65  |(for "+op$+", re|
000089f0  61 73 6f 6e 3a 20 22 2b  a4 72 74 6f 7a 28 70 25  |ason: "+.rtoz(p%|
00008a00  2b 34 29 2b 22 29 22 29  0d 32 a0 11 20 20 20 64  |+4)+")").2..   d|
00008a10  6f 69 6e 6e 6f 63 25 3d  a3 0d 32 aa 05 cd 0d 32  |oinnoc%=..2....2|
00008a20  b4 11 3d 28 28 66 25 20  80 20 31 29 3d 30 29 0d  |..=((f% . 1)=0).|
00008a30  32 be 04 0d 32 c8 17 dd  a4 63 6c 61 69 6d 52 4d  |2...2....claimRM|
00008a40  41 28 61 6d 6f 75 6e 74  25 29 0d 32 d2 12 ea 20  |A(amount%).2... |
00008a50  61 64 64 72 25 2c 66 6c  61 67 73 25 0d 32 dc 3f  |addr%,flags%.2.?|
00008a60  e7 20 61 6d 6f 75 6e 74  25 3a c8 99 20 22 58 4f  |. amount%:.. "XO|
00008a70  53 5f 4d 6f 64 75 6c 65  22 2c 36 2c 2c 2c 61 6d  |S_Module",6,,,am|
00008a80  6f 75 6e 74 25 20 b8 20  2c 2c 61 64 64 72 25 3b  |ount% . ,,addr%;|
00008a90  66 6c 61 67 73 25 20 8b  20 3d 30 0d 32 e6 1c e7  |flags% . =0.2...|
00008aa0  20 66 6c 61 67 73 25 20  80 20 31 3a 3d 30 20 8b  | flags% . 1:=0 .|
00008ab0  20 3d 61 64 64 72 25 0d  32 f0 04 0d 32 fa 17 dd  | =addr%.2...2...|
00008ac0  f2 72 65 6c 65 61 73 65  52 4d 41 28 61 64 64 72  |.releaseRMA(addr|
00008ad0  25 29 0d 33 04 24 e7 20  61 64 64 72 25 3a c8 99  |%).3.$. addr%:..|
00008ae0  20 22 58 4f 53 5f 4d 6f  64 75 6c 65 22 2c 37 2c  | "XOS_Module",7,|
00008af0  2c 61 64 64 72 25 0d 33  0e 05 e1 0d 33 18 04 0d  |,addr%.3....3...|
00008b00  33 22 23 dd a4 67 65 74  66 72 6f 6d 74 61 73 6b  |3"#..getfromtask|
00008b10  28 68 61 6e 64 25 2c 61  64 64 72 25 2c 6c 65 6e  |(hand%,addr%,len|
00008b20  25 29 0d 33 2c 0c ea 20  66 6c 61 67 73 25 0d 33  |%).3,.. flags%.3|
00008b30  36 47 c8 99 20 22 58 57  69 6d 70 5f 54 72 61 6e  |6G.. "XWimp_Tran|
00008b40  73 66 65 72 42 6c 6f 63  6b 22 2c 68 61 6e 64 25  |sferBlock",hand%|
00008b50  2c 61 64 64 72 25 2c 74  61 73 6b 25 2c 73 65 65  |,addr%,task%,see|
00008b60  6b 62 75 66 66 25 2c 6c  65 6e 25 20 b8 20 3b 66  |kbuff%,len% . ;f|
00008b70  6c 61 67 73 25 0d 33 40  33 e7 20 66 6c 61 67 73  |lags%.3@3. flags|
00008b80  25 20 80 20 31 3a 3d 22  22 20 8b 20 3d a4 6d 61  |% . 1:="" . =.ma|
00008b90  6b 65 73 74 72 69 6e 67  28 73 65 65 6b 62 75 66  |kestring(seekbuf|
00008ba0  66 25 2c 6c 65 6e 25 29  0d 33 4a 04 0d 33 54 22  |f%,len%).3J..3T"|
00008bb0  dd f2 73 65 6e 64 74 6f  74 61 73 6b 28 68 61 6e  |..sendtotask(han|
00008bc0  64 25 2c 61 64 64 72 25  2c 73 74 72 24 29 0d 33  |d%,addr%,str$).3|
00008bd0  5e 13 24 73 65 65 6b 62  75 66 66 25 3d 73 74 72  |^.$seekbuff%=str|
00008be0  24 0d 33 68 40 c8 99 20  22 58 57 69 6d 70 5f 54  |$.3h@.. "XWimp_T|
00008bf0  72 61 6e 73 66 65 72 42  6c 6f 63 6b 22 2c 74 61  |ransferBlock",ta|
00008c00  73 6b 25 2c 73 65 65 6b  62 75 66 66 25 2c 68 61  |sk%,seekbuff%,ha|
00008c10  6e 64 25 2c 61 64 64 72  25 2c a9 28 73 74 72 24  |nd%,addr%,.(str$|
00008c20  29 0d 33 72 05 e1 0d 33  7c 04 0d 33 86 24 dd a4  |).3r...3|..3.$..|
00008c30  76 65 63 74 6f 72 5f 73  63 61 6e 28 76 65 63 74  |vector_scan(vect|
00008c40  25 2c 6f 66 66 25 2c 69  6e 73 74 72 25 29 0d 33  |%,off%,instr%).3|
00008c50  90 18 ea 20 63 68 61 69  6e 25 2c 74 72 61 70 25  |... chain%,trap%|
00008c60  2c 61 64 64 72 25 0d 33  9a 23 63 68 61 69 6e 25  |,addr%.3.#chain%|
00008c70  3d 76 62 61 73 65 25 21  28 76 65 63 74 25 2a 34  |=vbase%!(vect%*4|
00008c80  29 3a 61 64 64 72 25 3d  30 0d 33 a4 1a c8 95 20  |):addr%=0.3.... |
00008c90  63 68 61 69 6e 25 3c 3e  30 20 80 20 61 64 64 72  |chain%<>0 . addr|
00008ca0  25 3d 30 0d 33 ae 3a 20  20 20 74 72 61 70 25 3d  |%=0.3.:   trap%=|
00008cb0  63 68 61 69 6e 25 21 38  3a e7 20 74 72 61 70 25  |chain%!8:. trap%|
00008cc0  21 6f 66 66 25 3d 69 6e  73 74 72 25 3a 61 64 64  |!off%=instr%:add|
00008cd0  72 25 3d 74 72 61 70 25  2b 6f 66 66 25 0d 33 b8  |r%=trap%+off%.3.|
00008ce0  15 20 20 20 63 68 61 69  6e 25 3d 21 63 68 61 69  |.   chain%=!chai|
00008cf0  6e 25 0d 33 c2 05 ce 0d  33 cc 0a 3d 61 64 64 72  |n%.3....3..=addr|
00008d00  25 0d ff                                          |%..|
00008d03