Home » Archimedes archive » Acorn User » AU 1995-04.adf » !Internet_StarterPak » !SLIPdial/!RunimageS
!SLIPdial/!RunimageS
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 » Acorn User » AU 1995-04.adf » !Internet_StarterPak |
| Filename: | !SLIPdial/!RunimageS |
| Read OK: | ✔ |
| File size: | 11531 bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM >!Runimage
20ONERROR REPORT:PRINT" at ";ERL:END
30END=HIMEM+&2000
40PROCinit
50PROCloadcode
60PROCstartmsgtrans
70PROCgetenv
80PROCinitwimp
90ONERRORPROCerrorbox:END
100PROCloadconfig
110WHILEFNlomem(txtx%DIV2*txty%):END=HIMEM+&2000:ENDWHILE
120PROCinit_txt
130SYS"XOS_File",17,file$TOA%,,,,S%
140WHILEFNlomem(S%):END=HIMEM+&2000:ENDWHILE
150PROCinitscript(file$)
160A%=FNmodemdrv("")
170REPEAT
180 stage%=0
190 REPEAT
200 IFFNlomem(0)THENPROCwarn_txt(FNmsg0("MoreMem")):END=HIMEM+&2000
210 IFFNtestevent THENA$=FNgetevent ELSEA$=FNline(stage%):stage%+=1
220 return%=FNcommand(A$)
230 UNTILstage%>=count% ORrun%=FALSE
240 run%=FALSE:IFstage%>=count%THENPROCprint("",FNmsg0("Idle"),"")
250 PROCpaused
260UNTIL0
270END
280
290REM set up universal variables
300DEFPROCinit
310DIM tmp% 256,driver 4096
320SYS"OS_Byte",129,0,&FF TO,osver%
330sprsz%=&1B00
340redial%=FALSE
350fileno%=1:total%=0:pause%=FALSE:stop%=FALSE:run%=FALSE:taskstart%=0:highest%=-1
360device%=FALSE:oldline%=0:debug%=FALSE:errC%=0:fh1%=0:fh2%=0:online$="":stage%=0
370submax%=20:DIMcall_ret%(submax%),call_lock%(submax%)
380casmax%=10:DIMcase$(casmax%),casmatch% casmax%,aline$(3),aline%(3)
390menumax%=30:DIMumenu$(menumax%,1),usermenu$(1),logmenu$(1)
400jtmax%=50:DIMjt%(jtmax%),jt$(jtmax%):jtl%=0:return$=""
410vmax%=150:DIMvar$(vmax%,1),s4$(3),tget$(3),ihist$(10):ihist%=0
420almax%=10:DIMalarm$(almax%,1),alarmtime%(almax%),alarmid$(almax%)
430imax%=8:DIMifile$(imax%),ibar$(imax%),imenu$(imax%,1)
440DIMibarid$(imax%),ibar%(imax%)
450taskmax%=8:DIMtaskex$(taskmax%),taskn$(taskmax%),taskh%(taskmax%)
460twmax%=8:DIMtwexit$(twmax%),twname$(twmax%),twcom$(twmax%)
470DIMtwh%(twmax%),twf%(twmax%),tdata$(twmax%),tww%(twmax%)
480DIMtwy%(twmax%),two%(twmax%),twk%(twmax%),twt%(twmax%)
490tget%=-1:tww%()=0:two%()=0:twwmax%=29:txtx%=80:txty%=24
500maxev%=10:DIMevent$(maxev%),event%(maxev%),evtype%(maxev%):event%()=TRUE
510fmax%=10:DIMfileh%(fmax%),fileid$(fmax%),filewr%(fmax%),filen$(fmax%)
520msgmax%=25:msg_cs$="":msg_ce$="":msg_cm%=0:msg_cs%=0:msgc%=TRUE:msgt%=0
530sddir$=FNvarval("Slipdial$dir")
540sdres$=FNvarval("Slipdial$resources")
550sdlang$=sdres$+".UK":ch$="":autowinpos%=1:num$="none"
560ENDPROC
570
580REM set up wimp and related variables
590DEFPROCinitwimp
600DIM sprites% sprsz%:!sprites%=sprsz%:sprites%!8=0
610SYS "OS_SpriteOp",&109,sprites%
620IFFNmergesprites(sdres$+".Sprites")=0THENERROR0,"Couldn't load sprites"
630DIM taskid%4:$taskid%="TASK":Task$="SLIPdial"
640DIM msglist%4:!msglist%=0
650SYS "Wimp_Initialise",310,!taskid%,Task$,msglist% TO version%,task%
660IFversion%<310 THENERROR1,"Window Manager too old"
670stwx%=0:stwy%=0
680fh1%=FNopenin(sdres$+".!windows")
690IFfh1%>0THEN
700 stwx%=VALGET$#fh1%:stwy%=VALGET$#fh1%
710ENDIF
720PROCcf(fh1%)
730DIM q% &400,menudata% &200,icons% &100,buffer% &100
740SYS "Wimp_OpenTemplate",,sdlang$+".Templates"
750info%=FNloadtemp("Info")
760status%=FNloadtemp("Status")
770txt%=FNloadtemp("txtwin")
780config%=FNloadtemp("config")
790mess%=FNloadtemp("message")
800input%=FNloadtemp("input")
810yesno%=FNloadtemp("yesno")
820SYS "Wimp_CloseTemplate"
830PROCseticonstring(info%,4,"0.33 (17-Feb-1995)"):PROCsetv("$ver","33")
840sdic$="nodev":icon0%=FNic(sdic$,-1)
850IFicon0%=0THENERROR0,"Couldn't create icon"
860M%=%10000001100000110000:slice%=-20
870SYS"OS_ReadMonotonicTime"TOlastpoll%:time%=lastpoll%
880checkalarm%=time%:checkline%=time%:PROCcheckicon:PROCusericon("")
890ENDPROC
900
910DEFFNloadtemp(A$)
920LOCALb%,i%,s%,scr%,icon%,h%
930SYS"Wimp_LoadTemplate",,-1,0,0,-1,A$,0TO,b%,i%
940s%=FNclaimmem(scr%,b%,"TBUF"):DIMicon% i%
950SYS"Wimp_LoadTemplate",,scr%,icon%,icon%+i%,-1,A$,0
960IFA$="message"THENmsgttl%=scr%!72
970IFA$="Status"THENPROCsetwpos(scr%,stwx%,stwy%)
980scr%!64=sprites%:SYS"Wimp_CreateWindow",,scr% TOh%:PROCreleasemem(s%)
990=h%
1000
1010DEFPROCsetwpos(q%,x%,y%)
1020LOCALw%,h%
1030IFx%>0THEN
1040w%=q%!8-!q%:h%=q%!12-q%!4
1050!q%=x%:q%!8=x%+w%
1060q%!4=y%:q%!12=y%+h%
1070ENDIF
1080ENDPROC
1090
1100REM merge sprite file into slipdial sprite area
1110DEFFNmergesprites(A$)
1120LOCALs%,f%,n%,r%:r%=0
1130SYS"XOS_File",17,A$TOA%,,,,S%
1140SYS"XOS_SpriteOp",&108,sprites%TO,,s%,n%,,f%
1150IFA%=1ANDS%<=(s%-f%) THEN
1160SYS"XOS_SpriteOp",&10B+(n%=0),sprites%,A$TO;F%
1170IF(F%AND1)=0 THENr%=s%-f%-S%
1180ENDIF
1190=r%
1200
1210DEFFNsfree
1220LOCALs%,f%:SYS"XOS_SpriteOp",&108,sprites%TO,,s%,,,f%
1230=s%-f%
1240
1250REM places an icon on the iconbar, n%<0 is main icon, others are user icons
1260DEFFNic(A$,n%)
1270LOCALZ%,next%,w%,h%
1280SYS"OS_SpriteOp",&100+40,sprites%,A$TO,,,w%,h%:IFw%>200ORh%>70THEN=0
1290IFn%<0THEN
1300 !icons%=-1:next%=0
1310 REM dimension memory in known location & store name
1320 DIMibarname%12:$ibarname%=A$:icons%!24=ibarname%
1330ELSE
1340 next%=icon0%
1350 FORZ%=0TOn%:IFibar%(Z%)>0 THENnext%=ibar%(Z%)
1360 NEXT:!icons%=-3
1370 REM dimension some memory & store name
1380 DIMicons%!24 12:$(icons%!24)=A$
1390ENDIF
1400icons%!4=0:icons%!8=0:icons%!12=w%*2:icons%!16=100:icons%!20=&3102
1410icons%!28=sprites%:icons%!32=11
1420SYS "Wimp_CreateIcon",next%,icons%TOic%
1430=ic%
1440
1450REM update the main icon
1460DEFPROCcheckicon
1470LOCALname$
1480IFdevice%=FALSE THEN
1490 name$="nodev"
1500 ELSE
1510 IF (FNd(9,port%,0,0)AND8)=0 THEN
1520 name$="dev"
1530 ELSE
1540 IFsdic$="online1" THENname$="online2"ELSEname$="online1"
1550 ENDIF
1560ENDIF
1570checkline%=time%
1580IFibarname%>0ANDname$<>sdic$ THEN
1590 PROCcall_log(sdic$,name$)
1600 sdic$=name$
1610 SYS "XOS_SpriteOp",&118,sprites%,name$TO,,src%;F%
1620 IF(F%AND1)=0THEN
1630 $ibarname%=name$:!q%=-1:q%!4=icon0%:q%!8=0:q%!12=0
1640 SYS"Wimp_SetIconState",,q%
1650 ENDIF
1660ENDIF
1670ENDPROC
1680
1690REM update call log on online-offline transitions
1700DEFPROCcall_log(A$,B$)
1710CASEB$ OF
1720 WHEN"nodev":IFA$="online1"ORA$="online2"ORA$="dev"THENPROCwclog(TIME$+": offline after "+online$)
1730 WHEN"online1":IFA$<>"online2"THENPROCwclog(TIME$+": online to "+num$):ontime%=time%:ELSEPROCupd_time
1740 WHEN"online2":PROCupd_time
1750ENDCASE
1760ENDPROC
1770
1780REM update timer icon in status window
1790DEFPROCupd_time
1800LOCALT%
1810T%=ABS(time%-ontime%)DIV100
1820online$=RIGHT$("0"+STR$(T%DIV3600),2)+":"
1830online$+=RIGHT$("0"+STR$((T%DIV60)MOD60),2)+":"
1840online$+=RIGHT$("0"+STR$(T%MOD60),2)
1850PROCupd_icon(status%,8,online$)
1860ENDPROC
1870
1880REM write a line to the logfile
1890DEFPROCwclog(A$)
1900fh1%=FNopenup(sddir$+".logfile")
1910IFfh1%<>0THENPTR#fh1%=EXT#fh1%:BPUT#fh1%,A$:PROCcf(fh1%)
1920ENDPROC
1930
1940DEFPROCpoll(idle%)
1950REM idle%=pollidle time (+) or time before polling (-)
1960SYS"OS_ReadMonotonicTime" TOtime%
1970IFidle%>=0 OR lastpoll%-time%<idle% THEN
1980 lastpoll%=time%
1990 REPEAT
2000 SYS "Wimp_PollIdle",M%,q%,time%+idle% TO R%
2010 IFdevice% THEN J%=FNd(19,port%,0,0):REM line to fix II dual serial card
2020 CASE R% OF
2030 WHEN 1 :PROCredraww(!q%)
2040 WHEN 2 :PROCopenw(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28)
2050 WHEN 3 :PROCclosew(!q%)
2060 WHEN 6 :PROCclick(!q%,q%!4,q%!8,q%!12,q%!16)
2070 WHEN 8 :PROCkeypress(!q%,q%!4,q%!24)
2080 WHEN 9 :PROCgetpointer:PROCmenuselect(q%)
2090 WHEN 17,18:PROCreceive(q%)
2100 ENDCASE
2110 UNTILR%=0
2120 IFtime%>checkline%+100 THENPROCcheckicon:PROClinealarm:PROCsettime
2130 IFtime%>checkalarm%+500 THENPROCtimealarm:PROCsetdate
2140 IFmsg_cs%>0ANDtime%>msgt%+500 THENPROCaddmessage("")
2150ENDIF
2160ENDPROC
2170
2180DEFPROCkeypress(w%,i%,k%)
2190LOCALl%
2200IFw%=txt%ANDi%=inic%THEN
2210 CASEk%OF
2220 WHEN13:FORl%=10TO1STEP-1:ihist$(l%)=ihist$(l%-1):NEXT
2230 ihist$(0)=FNic_str(w%,i%):PROCaddevent(ihist$(0),0):ihist%=-1
2240 PROCupd_icon(w%,i%,""):SYS"Wimp_SetCaretPosition",w%,i%,,,-1,0
2250 WHEN&18F:IFihist%<10ANDihist$(ihist%+1)>""THEN
2260 ihist%+=1:PROCupd_icon(w%,i%,ihist$(ihist%))
2270 SYS"Wimp_SetCaretPosition",w%,i%,,,-1,LENihist$(ihist%)
2280 ENDIF
2290 WHEN&18E:IFihist%>0THEN
2300 ihist%-=1:PROCupd_icon(w%,i%,ihist$(ihist%))
2310 SYS"Wimp_SetCaretPosition",w%,i%,,,-1,LENihist$(ihist%)
2320 ELSE
2330 ihist%=-1:PROCupd_icon(w%,i%,""):SYS"Wimp_SetCaretPosition",w%,i%,,,-1,0
2340 ENDIF
2350 OTHERWISE:SYS"Wimp_ProcessKey",q%!24
2360 ENDCASE
2370ELSE
2380IFw%=input%ANDi%=1ANDk%=13THEN
2390input$=FNic_str(w%,i%):IFinput$=""THENinput$=" "
2400ELSE
2410SYS"Wimp_ProcessKey",q%!24
2420ENDIF
2430ENDIF
2440ENDPROC
2450
2460DEFPROCreceive(q%)
2470LOCALZ%,h%,i%,t%,f$,tw%,a%,A$
2480CASE q%!16 OF
2490WHEN 0:PROCfinish:END
2500WHEN 1:q%!16=2:q%!36=-1:$(q%+44)="<Wimp$Scrap>"+CHR$0
2510 q%!12=q%!8:SYS"Wimp_SendMessage",17,q%,q%!4
2520WHEN 3:i%=q%!24:h%=q%!20:t%=q%!40:f$=FNstr(q%+44)
2530 q%!16=4:SYS"Wimp_SendMessage",17,q%,q%!4
2540 CASEh%OF
2550 WHENconfig%:IFt%=&FFF THEN
2560 IFi%=4PROCupd_icon(config%,4,f$)
2570 ELSE
2580 PROCinitscript(f$)
2590 ENDIF
2600 WHENstatus%:IFt%=&FFF THENPROCinitscript(f$)
2610 WHEN-1,-2:IFt%=&FFF ANDi%=icon0% THEN
2620 PROCinitscript(f$)
2630 ELSE
2640 FORZ%=0TOimax%
2650 IFi%=ibar%(Z%)ANDifile$(Z%)>""THENPROCifile(Z%,f$,t%)
2660 NEXT
2670 ENDIF
2680 ENDCASE
2690 Z%=FNdelfile("<Wimp$Scrap>")
2700WHEN 11:IFdevice% ANDq%!4<>task% THENPROCrefusedevice
2710WHEN 12:IFq%!4<>task% THEN
2720 PROCprint("Device claim failed",FNstr(q%+28),"")
2730 PROCfront(status%):device%=FALSE
2740 ENDIF
2750WHEN &502:A$=FNsendhelp(q%!32,q%!36)
2760 IFA$>""THEN
2770 q%!16=&503:q%!12=q%!8:$(q%+20)=A$:q%?(20+LENA$)=0:!q%=256
2780 SYS"Wimp_SendMessage",17,q%,q%!4
2790 ENDIF
2800WHEN &400C2:IF taskstart%<>0 THEN
2810 IFtaskh%(taskstart%)=0 THEN
2820 taskh%(taskstart%)=q%!4:PROClog(FNmsg1("TaskStart2",taskn$(taskstart%)))
2830 ENDIF
2840 taskstart%=0
2850 ENDIF
2860WHEN &400C3:REM TaskClosedown
2870 FORl%=0TOtaskmax%
2880 IFtaskh%(l%)=q%!4 THEN
2890 taskh%(l%)=0:IFtaskex$(l%)>""THENPROCaddevent(taskex$(l%),3)
2900 ENDIF
2910 NEXT
2920 PROCsorttasks
2930WHEN &808C1:REM TaskWindow_Output
2940 tw%=0:twlen%=q%!20-1
2950 WHILEtwh%(tw%)<>q%!4ANDtw%<twmax%:tw%+=1:ENDWHILE
2960 IFtwf%(tw%)=0 THEN
2970 FORZ%=0TOtwlen%STEP4:tmp%!Z%=q%!(24+Z%):NEXT
2980 PROCtw_data(tw%,tmp%,twlen%)
2990 ELSE
3000 FORZ%=0TOtwlen%:BPUT#twf%(tw%),q%!(24+Z%):NEXT
3010 ENDIF
3020WHEN &808C2:REM TaskWindow_Ego
3030 IFq%!20>=task%ANDq%!20<=(task%+twmax%)THEN
3040 twh%(q%!20-task%)=q%!4:PROClog("Task started: "+twname$(q%!20-task%))
3050 ENDIF
3060WHEN &808C3:REM TaskWindow_Morio, task finished
3070 tw%=0:WHILEq%!4<>twh%(tw%)ANDtw%<twmax%:tw%+=1:ENDWHILE
3080 IFq%!4=twh%(tw%)THEN
3090 PROClog(FNmsg1("TaskEnd",twname$(tw%)))
3100 IFtwk%(tw%)=0 THEN
3110 twh%(tw%)=0:PROCclosew(tww%(tw%))
3120 ELSE
3130 twh%(tw%)=-1:$twt%(tw%)=twname$(tw%)+FNmsg0("TaskFin")
3140 PROCdotitle(tww%(tw%))
3150 ENDIF
3160 twname$(tw%)="":PROCcf(twf%(tw%)):twf%(tw%)=0
3170 IFtwexit$(tw%)>""THENPROCaddevent(twexit$(tw%),4)
3180 ENDIF
3190ENDCASE
3200ENDPROC
3210
3220DEFFNsendhelp(w%,i%)
3230LOCALA$,l%
3240A$="Hgeneric":CASEw%OF
3250 WHENtxt%:A$="Htext"
3260 WHENstatus%:A$="Hstatus":CASEi%OF
3270 WHEN1,2:A$="Haction"
3280 WHEN3:A$="Hip"
3290 WHEN4:A$="Hstop"
3300 WHEN5:A$="Hpause"
3310 WHEN6,7:A$="Hmenus"
3320 WHEN8:A$="Htime"
3330 WHEN10:A$="Hmodem"
3340 ENDCASE
3350 WHENmess%:A$="Hmess":IFpause%THENA$="Hmess2"
3360 WHENinput%:A$="Henter"
3370 WHENyesno%:A$="Hyesno"
3380 WHENinfo%:A$="Hinfo"
3390 WHENconfig%:A$="Hconfig"
3400 OTHERWISE:FORl%=0TOtwmax%:IFw%=tww%(l%)THENA$="Htask"
3410 NEXT
3420ENDCASE
3430=FNmsg0(A$)
3440
3450DEFPROCfinish
3460LOCALl%
3470IFdevice%<>0THEN
3480 J%=FNd(8,port%,0,0)
3490 J%=FNd(18,port%,0,0)
3500ENDIF
3510PROCopenlog("")
3520PROCcf(fh1%):PROCcf(fh2%)
3530FORl%=0TOtwmax%:PROCcf(twf%(l%)):NEXT
3540FORl%=0TOfmax%:PROCcf(fileh%(l%)):NEXT
3550PROCendmsgtrans
3560ENDPROC
3570
3580DEFPROCcf(RETURN C%)
3590IFC%<>0THENSYS"XOS_Find",0,C%:C%=0
3600ENDPROC
3610
3620DEFPROCgetpointer
3630SYS"Wimp_GetPointerInfo",,buffer%
3640mx%=!buffer%:my%=buffer%!4:b%=buffer%!8:handle%=buffer%!12
3650icon%=buffer%!16:ob%=buffer%!20
3660ENDPROC
3670
3680DEFPROCclick(mx%,my%,b%,w%,i%)
3690LOCALZ%
3700CASEb% OF
3710WHEN 2
3720 CASEw% OF
3730 WHEN -2:IFi%=icon0%THEN
3740 PROCdefmenu(TRUE)
3750 ELSE
3760 FORZ%=0TOimax%
3770 IFi%=ibar%(Z%)ANDimenu$(Z%,0)>""THENPROCdomenu(102,FNmakemenu(imenu$(Z%,0),imenu$(Z%,1)),ibarid$(Z%),TRUE)
3780 NEXT
3790 ENDIF
3800 WHEN txt%:SYS"OS_Byte",121,(1EOR&80)TO,Z%
3810 IFZ%=0THEN
3820 PROCdomenu(101,"Alarm list,Menu list,Var list,Task list,|Script list,Quit","Control",0)
3830 ELSE
3840 PROCdomenu(101,"DbgLev 0,DbgLev 1,DbgLev 2,DbgLev 3","Debug",0)
3850 ENDIF
3860 WHEN status%
3870 CASEi% OF
3880 WHEN7:IFusermenu$(0)>""THENPROCdomenu(102,FNmakemenu(usermenu$(0),usermenu$(1)),"User menu",FALSE)
3890 OTHERWISE:PROCdefmenu(0)
3900 ENDCASE
3910 OTHERWISE:PROCdefmenu(0)
3920 ENDCASE
3930WHEN1,4:
3940 CASE w% OF
3950 WHEN status%:
3960 CASEi% OF
3970 WHEN5:
3980 IFNOTpause% THEN
3990 PROCprint("",FNmsg0("PauseP"),"")
4000 pause%=TRUE:PROCaddevent("pause",0)
4010 ELSE
4020 PROCunpause
4030 ENDIF
4040 WHEN4:
4050 stop%=TRUE:PROCprint("",FNmsg0("StopP"),""):PROCstop
4060 WHEN6:IFusermenu$(0)>""THENPROCdomenu(102,FNmakemenu(usermenu$(0),usermenu$(1)),"User menu",FALSE)
4070 WHEN11:IFFNic_str(status%,i%)="Redial"THENredial%=TRUE:PROCprint("",FNmsg0("RedialP"),"")
4080 ENDCASE
4090 WHEN config%:
4100 IF i%=6 THENPROCsaveconfig:PROCclosew(config%)
4110 WHEN yesno%:
4120 IF i%=0 THENyesnoans%=2
4130 IF i%=1 THENyesnoans%=1
4140 WHEN txt%:
4150 SYS"Wimp_SetCaretPosition",w%,inic%,,,-1,LENFNic_str(w%,inic%)
4160 WHEN -2:
4170 IFi%=icon0%THEN
4180 IFb%=4THENPROCfront(status%)ELSEPROCfront(txt%)
4190 ELSE
4200 FORZ%=0TOimax%
4210 IFi%=ibar%(Z%)ANDibar$(Z%)>""THENPROCaddevent(ibar$(Z%),6)
4220 NEXT
4230 ENDIF
4240 ENDCASE
4250ENDCASE
4260ENDPROC
4270
4280DEFPROCdefmenu(i%)
4290PROCdomenu(101,">Info,Choices...,|Control...,Quit","SLIPdial",i%)
4300ENDPROC
4310
4320DEFPROChalt(mess$)
4330call_lev%=0:call_lock%()=0:event$()="":event%()=TRUE
4340IFerror$>""THENPROCaddevent(error$,0):error$="":ENDPROC
4350PROCmessage(""""+FNmsg2("Escript",STR$stage%,mess$)+""""):VDU7
4360PROCprint("",FNmsg0("StopE"),"")
4370stage%=0:run%=FALSE:PROCpaused
4380ENDPROC
4390
4400DEFPROCinput(A$)
4410LOCALv$,p$:p$="Input:"
4420REPEATB$=FNparam(A$):input$=""
4430IFLEFT$(B$,1)="/"THEN
4440C$=FNvalue(B$):CASELEFT$(B$,2)OF
4450 WHEN"pr":p$=LEFT$(C$,40)
4460 ENDCASE
4470ELSE
4480 v$=B$:PROCupd_icon(input%,1,""):PROCupd_icon(input%,0,p$)
4490 PROCfront(input%):SYS"Wimp_SetCaretPosition",input%,1,,,-1,0
4500 REPEATPROCpoll(50):UNTILinput$>"":p$="Input:"
4510 IFinput$=" "THENinput$=""
4520 PROCsetv(v$,input$)
4530ENDIF
4540UNTILA$=""
4550PROCclosew(input%)
4560ENDPROC
4570
4580DEFPROCmessage(A$)
4590LOCALw%,n%,t$
4600t$=FNmsg0("Message"):msgc%=FALSE
4610w%=0:n%=0
4620REPEATB$=FNparam(A$)
4630IFLEFT$(B$,1)="/"THEN
4640C$=FNvalue(B$):CASELEFT$(B$,2)OF
4650 WHEN"cl":PROCclosew(mess%)
4660 WHEN"wa":w%=TRUE
4670 WHEN"ti":t$=C$
4680 WHEN"ca":msg_cs$=C$:msg_ce$=""
4690 msg_cm%=msgmax%:msg_cs%=1:msgt%=time%:IFn%=0THENmsg$()=""
4700 WHEN"ce":msgc%=TRUE
4710 WHEN"en":msg_ce$=C$
4720 WHEN"ma":msg_cm%=VALC$
4730 WHEN"ad":n%+=1
4740 WHEN"na","id":
4750 ENDCASE
4760ELSE
4770 IFB$>""ANDn%=0THENmsg$()=""
4780 IFB$>""THENPROCaddmessage(B$):n%+=1
4790ENDIF
4800UNTILB$=""ORn%>msgmax%
4810$msgttl%=t$:PROCdotitle(mess%)
4820IFn%>0THEN
4830PROCaddmessage("")
4840ENDIF
4850IFw%THENPROCaddevent("pause",0)
4860ENDPROC
4870
4880DEFPROCaddmessage(A$)
4890LOCALl%,w%,t$:l%=-1:w%=0
4900REPEATl%+=1:t$=msg$(l%):IFLENt$>w%THENw%=LENt$
4910UNTILt$=""ORl%=msgmax%:msgt%=time%
4920IFA$>""THEN
4930 IFl%=msgmax%THENFORl%=1TOmsgmax%:msg$(l%-1)=msg$(l%):NEXT
4940 msg$(l%)=A$
4950 ELSE
4960 IFl%>0THENPROCopenmess(l%,w%)
4970ENDIF
4980ENDPROC
4990
5000DEFPROCopenmess(y%,x%)
5010LOCALo%
5020!tmp%=0:tmp%!4=-y%*32-32:tmp%!8=x%*16+10:tmp%!12=0
5030SYS"Wimp_SetExtent",mess%,tmp%
5040!q%=mess%:SYS"Wimp_GetWindowState",,q%:o%=(q%!32)AND(1<<16)
5050q%!12=q%!4+x%*16+10:q%!16=q%!8+y%*32+32
5060q%!20=0:q%!24=0:q%!28=-1:SYS"Wimp_OpenWindow",,q%
5070IFo%=0THENPROCcfront(mess%,0,150) ELSEPROCfront(mess%)
5080!q%=mess%:SYS"Wimp_GetWindowState",,q%:msgw%=q%!12-q%!4
5090PROCupdate_msg(0,-y%*32-32,msgw%,0)
5100ENDPROC
5110
5120DEFPROCmsgfilt(A$)
5130IFmsg_cs%=1 ANDINSTR(A$,msg_cs$)>0 THENmsg_cs%=2
5140IFmsg_cs%=2 THEN
5150 msg_cm%-=1:PROCaddmessage(A$)
5160 IFmsg_cm%<1OR(msg_ce$>""ANDINSTR(A$,msg_ce$)>0) THENmsg_cs%=0:PROCaddmessage("")
5170ENDIF
5180ENDPROC
5190
5200DEFPROCpaused
5210pause%=TRUE:PROCupd_icon(status%,5,FNmsg0("Resume"))
5220PROCprint("",FNmsg0("Paused"),"")
5230REPEATPROCpoll(30):UNTILpause%=FALSE
5240ENDPROC
5250
5260DEFPROCunpause
5270pause%=FALSE:stop%=FALSE:run%=TRUE:PROCupd_icon(status%,5,FNmsg0("Pause"))
5280PROCprint(""," ","")
5290ENDPROC
5300
5310DEFPROCstop
5320call_lev%=0:call_lock%()=0:event$()="":event%()=TRUE:msg_cs%=0
5330IFstage%>0ANDstop$<>""THENPROCaddevent(stop$,0):stop$="":ELSEPROCaddevent("pause",0):stage%=0:PROCrelease
5340ENDPROC
5350
5360DEFPROCdomenu(handle%,menu$,menutitle$,I%)
5370LOCALi%,item$,menuItems%,menuptr%
5380IFmenu$=""THENENDPROC
5390menuItems% = 0
5400menuhandle%=handle%
5410menuptr%=menudata%
5420i%=0
5430menuptr%!20=44
5440$menuptr%=menutitle$
5450menuptr%?12=7:menuptr%?13=2:menuptr%?14=&7:menuptr%?15=0
5460menuptr%!16=230-24:menuptr%!24=0
5470menuptr%+=28
5480REPEAT
5490 item$=FNpar(menu$,",",i%):PROCmenuitem(item$):menuItems%+=1
5500UNTILitem$=""
5510menuptr%!-24=(menuptr%!-24)OR&80
5520IFI%<>0 THENY%=120+(menuItems%-1)*44 ELSEY%=my%
5530SYS "Wimp_CreateMenu",,menudata%,mx%-64,Y%
5540ENDPROC
5550
5560DEFPROCmenuitem(text$)
5570LOCALleft$
5580IF text$>""THEN
5590 !menuptr%=0
5600 IFLEFT$(text$,1)="|"THENtext$=MID$(text$,2):!menuptr%=2
5610 left$ = LEFT$(text$,1):menuptr%!4=-1
5620 IF left$=">" THENmenuptr%!4=info%
5630 menuptr%!8=&07000021
5640 IF left$=">" OR left$="<" THEN $(menuptr%+12)=MID$(text$,2) ELSE $(menuptr%+12)=text$
5650 menuptr%+=24
5660ENDIF
5670ENDPROC
5680
5690DEFFNpar(menu$,sep$,RETURN i%)
5700LOCALi1%
5710i1%=i%+1:i%=INSTR(menu$+sep$,sep$,i1%)
5720=MID$(menu$,i1%,i%-i1%)
5730
5740DEFPROCmenuselect(menus%)
5750LOCALA$
5760LOCALl%:SYS"Wimp_DecodeMenu",,menudata%,menus%,STRING$(20," ")TO,,,A$
5770CASE A$ OF
5780 WHEN"Choices...":PROCfront(config%)
5790 WHEN"Control...":PROCfront(txt%)
5800 WHEN"Quit":PROCfinish:END
5810 WHEN"Alarm list":PROClistalarms
5820 WHEN"Menu list":PROClistmenu
5830 WHEN"Task list":PROClisttasks
5840 WHEN"Var list":PROClistvars
5850 WHEN"Script list":PROClistscript("")
5860 WHEN"DbgLev 0":debug%=0
5870 WHEN"DbgLev 1":debug%=1
5880 WHEN"DbgLev 2":debug%=2
5890 WHEN"DbgLev 3":debug%=3
5900 OTHERWISE:IFumenu%>0 THEN
5910 FORl%=1TOumenu%
5920 IFA$=umenu$(l%,0) THEN
5930 PROCupd_icon(status%,7,umenu$(l%,0))
5940 PROCaddevent(umenu$(l%,1),8)
5950 ENDIF
5960 NEXT
5970 ENDIF
5980ENDCASE
5990ENDPROC
6000
6010DEFPROCerrorbox
6020!buffer%=ERR:$(buffer%+4)=REPORT$+" (internal code "+STR$ERL+")."+CHR$0
6030SYS "Wimp_ReportError",buffer%,1,Task$:PROCfinish
6040ENDPROC
6050
6060DEFPROCfront(h%)
6070!q%=h%:SYS"Wimp_GetWindowState",,q%
6080q%!28=-1:SYS"Wimp_OpenWindow",,q%
6090IFh%=txt%THENSYS"Wimp_SetCaretPosition",h%,inic%,,,-1,LENFNic_str(h%,inic%)
6100ENDPROC
6110
6120DEFPROCcfront(h%,xoff%,yoff%)
6130LOCALx%,y%,wx%,wy%,xe%,ye%
6140IFautowinpos%=0ANDh%=status%THEN
6150 PROCfront(h%)
6160 ELSE
6170 SYS"OS_ReadModeVariable",-1,4TO,,xe%:SYS"OS_ReadModeVariable",-1,11TO,,x%
6180 SYS"OS_ReadModeVariable",-1,5TO,,ye%:SYS"OS_ReadModeVariable",-1,12TO,,y%
6190 !q%=h%:SYS"Wimp_GetWindowState",,q%
6200 x%=x%<<xe%:y%=y%<<ye%:wx%=q%!12-q%!4:wy%=q%!16-q%!8
6210 q%!4=(x%-wx%)DIV2-xoff%:q%!12=q%!4+wx%:q%!8=(y%-wy%)DIV2-yoff%:q%!16=q%!8+wy%
6220 q%!20=0:q%!24=0:q%!28=-1:SYS"Wimp_OpenWindow",,q%
6230ENDIF
6240ENDPROC
6250
6260DEFPROCdotitle(h%)
6270!q%=h%:SYS"Wimp_GetWindowOutline",,q%
6280SYS"Wimp_ForceRedraw",-1,q%!4,q%!16-44,q%!12,q%!16
6290ENDPROC
6300
6310DEFFNic_str(H%,I%)
6320!q%=H%:q%!4=I%:SYS"Wimp_GetIconState",,q%
6330=FNstr(q%!28)
6340
6350DEFPROCseticonstring(H%,I%,A$)
6360!q%=H%:q%!4=I%:SYS"XWimp_GetIconState",,q%TO;F%
6370IFFNtf10(F%)ANDq%!28>&8800 THEN$(q%!28)=A$+CHR$0
6380ENDPROC
6390
6400DEFPROCupd_icon(H%,I%,A$)
6410PROCseticonstring(H%,I%,A$):!q%=H%:q%!4=I%:q%!8=0:q%!12=0
6420SYS"Wimp_SetIconState",,q%
6430ENDPROC
6440
6450DEFPROCsetinv(H%,I%,S%)
6460S%=ABS(S%=0):!q%=H%:q%!4=I%:q%!8=((1)<<21)*S%:q%!12=(1<<21)
6470SYS"Wimp_SetIconState",,q%
6480ENDPROC
6490
6500DEFFNrdinv(H%,I%)
6510!q%=H%:q%!4=I%:SYS"Wimp_GetIconState",,q%
6520=NOT(((q%!24)AND(1<<21))DIV2097152<>0)
6530
6540DEFPROCsetshaded(H%,I%,S%)
6550!q%=H%:q%!4=I%:q%!8=((1)<<22)*ABSS%:q%!12=(1<<22)
6560SYS"Wimp_SetIconState",,q%
6570ENDPROC
6580
6590DEFPROCprint(a$,b$,c$)
6600IFa$>""THENPROCupd_icon(status%,1,RIGHT$(a$,34)):IFLENa$>1THENPROClog("Action: "+a$)
6610IFb$>""THENPROCupd_icon(status%,2,RIGHT$(b$,34)):IFLENb$>1THENPROClog("Status: "+b$)
6620IFc$>""THENPROCupd_icon(status%,3,RIGHT$(c$,34)):IFLENc$>1THENPROClog("IP add: "+c$)
6630ENDPROC
6640
6650DEFPROCopenw(handle%,x0%,y0%,x1%,y1%,scx%,scy%,bhandle%)
6660IFhandle%>-1THEN
6670 q%!0=handle%:q%!28=bhandle%
6680 q%!4=x0%:q%!8=y0%:q%!12=x1%:q%!16=y1%
6690 q%!20=scx%:q%!24=scy%
6700 SYS"Wimp_OpenWindow",,q%
6710ENDIF
6720ENDPROC
6730
6740DEFPROCclosew(h%)
6750LOCALL%
6760CASEh%OF
6770 WHENmess%:IFpause% THENPROCunpause
6780 WHENinput%:input$=" "
6790 OTHERWISE:
6800 FORL%=0TOtwmax%
6810 IFh%=tww%(L%)ANDtwh%(L%)>0THEN
6820 VDU7:IFFNyesno(FNmsg0("TaskKill"),3)=2 THEN
6830 PROCmesstw(twname$(L%),&808C4)
6840 ELSE
6850 h%=0
6860 ENDIF
6870 L%=twmax%
6880 ENDIF
6890 NEXT
6900ENDCASE
6910IFh%>0THEN!q%=h%:SYS"Wimp_CloseWindow",,q%
6920ENDPROC
6930
6940DEFFNask(A$)
6950LOCALd%,r%,def%:d%=60:r%=0:def%=1
6960REPEATB$=FNparam(A$)
6970 IFLEFT$(B$,1)="/"THEN
6980 C$=FNvalue(B$):CASELEFT$(B$,3)OF
6990 WHEN"del":d%=VALC$:IFd%<5THENd%=5
7000 WHEN"def":C$=FNlower(C$):IFLEFT$(C$,1)="y"THENdef%=2
7010 ENDCASE
7020 ELSE
7030 r%=FNyesno(B$,d%)
7040 ENDIF
7050UNTILA$=""
7060IFr%=0THENr%=def%
7070=-(r%=2)
7080
7090REM ***
7100
7110DEFFNyesno(A$,wait%)
7120REM returns 0=timeout 1=no 2=yes
7130LOCALst%:st%=time%:wait%=wait%*100:PROCupd_icon(yesno%,2,LEFT$(A$,57))
7140PROCcfront(yesno%,0,0):IFwait%=0THENwait%=60000
7150yesnoans%=0:REPEAT:PROCpoll(50):UNTILyesnoans%>0ORtime%-st%>wait%
7160PROCclosew(yesno%)
7170=yesnoans%
7180
7190DEFFNvarval(A$)
7200LOCALL%,F%
7210SYS"XOS_ReadVarVal",A$,tmp%,256,0,3 TO,,L%;F%
7220IF(F%AND1) ORL%>256 THEN:=""
7230tmp%?L%=13:=$tmp%
7240
7250DEFPROCinfo(q%)
7260x0%=!q%:y0%=q%!4:x1%=q%!8:y1%=q%!12:scx%=q%!16:scy%=q%!20
7270bx%=x0%-scx%:by%=y1%-scy%:gy0%=q%!28:gy1%=q%!36
7280ENDPROC
7290
7300DEFPROCredraww(h%)
7310LOCALtw%:!q%=h%:CASEh%OF
7320WHENtxt%:
7330 SYS "Wimp_RedrawWindow",,q% TO more%
7340 PROCdraw_txt(more%)
7350WHENmess%:
7360 SYS "Wimp_RedrawWindow",,q% TO more%
7370 PROCdraw_msg(more%)
7380OTHERWISE:
7390 FORtw%=0TOtwmax%:IFh%=tww%(tw%)THEN
7400 SYS "Wimp_RedrawWindow",,q% TO more%
7410 PROCdraw_tw(tw%,more%)
7420 ENDIF
7430 NEXT
7440ENDCASE
7450ENDPROC
7460
7470DEFPROCinit_txt
7480txto%=0
7490log_y%=1:DIMtxtl$(txty%),txtc% txty%,msg$(msgmax%):msgw%=0
7500txtl$()=STRING$(txtx%DIV2," "):ioff%=40
7510!tmp%=0:tmp%!4=-txty%*32-ioff%-8:tmp%!8=txtx%*16:tmp%!12=0
7520SYS"Wimp_SetExtent",txt%,tmp%
7530FORi%=0TO1:!tmp%=txt%:tmp%!4=i%:SYS"Wimp_GetIconState",,tmp%
7540tmp%!12=tmp%!12-txty%*32:tmp%!20=tmp%!20-txty%*32:tmp%!4=txt%
7550!q%=txt%:q%!4=i%:SYS"Wimp_DeleteIcon",,q%
7560SYS"Wimp_CreateIcon",,tmp%+4 TOinic%:NEXT
7570ptr%=0:lt%=0:data$="":tdata$=""
7580PROCprint("Starting SLIPdial","Idle"," ")
7590IFquiet%=0ANDFNrdinv(config%,2)=0 THENPROCfront(txt%)
7600ENDPROC
7610
7620DEFPROCinit_tww(tw%,out%,T$)
7630LOCALoff%:off%=(tw%MOD4)*40
7640IFtww%(tw%)=0THEN
7650 SYS "Wimp_OpenTemplate",,sdlang$+".Templates"
7660 SYS "Wimp_LoadTemplate",,q%,ind%,sp%+size%,-1,"task",0 TO,,ind%
7670 twt%(tw%)=q%!72:q%!44=-twwmax%*32
7680 !q%=!q%+off%:q%!8=q%!8+off%:q%!4=q%!4-off%:q%!12=q%!12-off%
7690 SYS "Wimp_CreateWindow",,q% TO tww%(tw%)
7700 SYS "Wimp_CloseTemplate"
7710 CASEtw%OF
7720 WHEN0:DIMtwbuf0$(twwmax%)
7730 WHEN1:DIMtwbuf1$(twwmax%)
7740 WHEN2:DIMtwbuf2$(twwmax%)
7750 WHEN3:DIMtwbuf3$(twwmax%)
7760 WHEN4:DIMtwbuf4$(twwmax%)
7770 WHEN5:DIMtwbuf5$(twwmax%)
7780 WHEN6:DIMtwbuf6$(twwmax%)
7790 OTHERWISE:PROChalt(FNmsg0("Etask1")):ENDPROC
7800 ENDCASE
7810 ELSE
7820 CASEtw%OF
7830 WHEN0:twbuf0$()=""
7840 WHEN1:twbuf1$()=""
7850 WHEN2:twbuf2$()=""
7860 WHEN3:twbuf3$()=""
7870 WHEN4:twbuf4$()=""
7880 WHEN5:twbuf5$()=""
7890 WHEN6:twbuf6$()=""
7900 ENDCASE
7910ENDIF
7920$twt%(tw%)=FNmsg1("TaskRun",T$):tdata$(tw%)="":twy%(tw%)=0:two%(tw%)=0
7930IFout%THENPROCfront(tww%(tw%))
7940ENDPROC
7950
7960DEFPROCupdate_txt(ux0%,uy0%,ux1%,uy1%)
7970!q%=txt%:q%!4=ux0%:q%!8=uy0%:q%!12=ux1%:q%!16=uy1%
7980SYS"Wimp_UpdateWindow",,q% TO more%
7990PROCdraw_txt(more%)
8000ENDPROC
8010
8020DEFPROCupdate_msg(ux0%,uy0%,ux1%,uy1%)
8030!q%=mess%:q%!4=ux0%:q%!8=uy0%:q%!12=ux1%:q%!16=uy1%
8040SYS"Wimp_UpdateWindow",,q% TO more%
8050PROCdraw_msg(more%)
8060ENDPROC
8070
8080DEFPROCupdate_tw(tw%,ux0%,uy0%,ux1%,uy1%)
8090!q%=tww%(tw%):q%!4=ux0%:q%!8=uy0%:q%!12=ux1%:q%!16=uy1%
8100SYS"Wimp_UpdateWindow",,q% TO more%
8110PROCdraw_tw(tw%,more%)
8120ENDPROC
8130
8140DEFPROCdraw_msg(more%)
8150WHILE more%
8160 PROCinfo(q%+4):CLG
8170 top%=ABS(gy1%-by%+16)DIV32:bot%=ABS(gy0%-by%+16)DIV32
8180 IFbot%>msgmax% THENbot%=msgmax%:IFtop%>bot% THENtop%=bot%
8190 SYS"Wimp_SetColour",7:FORL%=top%TObot%
8200 MOVEbx%+4-msgc%*(msgw%DIV2-LENmsg$(L%)*8),by%-L%*32-16
8210 PRINTmsg$(L%):NEXT
8220 SYS"Wimp_GetRectangle",,q%TOmore%
8230ENDWHILE
8240ENDPROC
8250
8260DEFPROCdraw_tw(tw%,more%)
8270LOCALL%,y%,top%,bot%:WHILE more%
8280 PROCinfo(q%+4):CLG
8290 top%=ABS(gy1%-by%)DIV32:bot%=ABS(gy0%-by%)DIV32
8300 IFbot%>twwmax% THENbot%=twwmax%:IFtop%>bot% THENtop%=bot%
8310 SYS"Wimp_SetColour",7:FORL%=top%TObot%
8320 y%=(L%+two%(tw%))MODtwwmax%
8330 MOVEbx%+4,by%-L%*32-4
8340 CASEtw%OF
8350 WHEN0:PRINTtwbuf0$(y%)
8360 WHEN1:PRINTtwbuf1$(y%)
8370 WHEN2:PRINTtwbuf2$(y%)
8380 WHEN3:PRINTtwbuf3$(y%)
8390 WHEN4:PRINTtwbuf4$(y%)
8400 WHEN5:PRINTtwbuf5$(y%)
8410 WHEN6:PRINTtwbuf6$(y%)
8420 ENDCASE
8430 NEXT
8440 SYS"Wimp_GetRectangle",,q%TOmore%
8450ENDWHILE
8460ENDPROC
8470
8480DEFPROCdraw_txt(more%)
8490LOCALL%,y%,top%,bot%:WHILE more%
8500 PROCinfo(q%+4):CLG
8510 top%=ABS(gy1%-by%)DIV32:bot%=ABS(gy0%-by%)DIV32
8520 IFbot%>txty% THENbot%=txty%:IFtop%>bot% THENtop%=bot%
8530 FORL%=top%TObot%:y%=(L%+txto%)MODtxty%
8540 MOVEbx%,by%-L%*32:SYS"Wimp_SetColour",txtc%?y%:PRINTtxtl$(y%):NEXT
8550 SYS"Wimp_GetRectangle",,q% TO more%
8560ENDWHILE
8570ENDPROC
8580
8590DEFPROCstr_txt(A$)
8600IFdata$>""THENPROCflush
8610PROCline_txt(A$,7)
8620ENDPROC
8630
8640DEFPROCwarn_txt(A$)
8650PROCline_txt(A$,11)
8660ENDPROC
8670
8680DEFPROCflush
8690IFdata$>""THEN
8700 IF(debug%AND2)<>0ANDerrC%<>0 THENBPUT#errC%,data$
8710 IFmsg_cs%>0THENPROCmsgfilt(data$)
8720 PROCline_txt(data$,5):data$=""
8730ENDIF
8740ENDPROC
8750
8760DEFFNrec:IFdevice%=0THEN=-1
8770Z%=FNd(1,port%,0,0)
8780IFZ%>0AND(debug%AND2)>0ORmsg_cs%>0 THEN
8790 IFZ%>31 ANDZ%<128 THENdata$+=CHR$Z%
8800 IFZ%=13ORZ%=10ORLENdata$>=txtx% THENPROCflush
8810ENDIF
8820=Z%
8830
8840DEFPROCtw_data(tw%,buf%,len%)
8850LOCALl%
8860FORl%=0TOlen%:C%=buf%?l%
8870 IFC%>31 ANDC%<128 THENtdata$(tw%)+=CHR$C%
8880 IFC%=13ORC%=10ORLENtdata$(tw%)>78 THEN
8890 PROCtw_txt(tw%,tdata$(tw%))
8900 IFtget%=tw%ANDtget$(0)>""THENPROCtget(tdata$(tw%))
8910 tdata$(tw%)=""
8920 ENDIF
8930NEXT
8940IFtget%=tw%ANDtget$(0)>""THENPROCtget(tdata$(tw%))
8950ENDPROC
8960
8970DEFPROCtw_txt(tw%,A$)
8980LOCALt%,B$
8990IF(debug%AND4)<>0ANDerrC%<>0 THENBPUT#errC%,"TW"+STR$tw%+">"+A$
9000WHILEA$>""
9010 t%=(twy%(tw%)+two%(tw%))MODtwwmax%
9020 B$=LEFT$(A$,79):A$=MID$(A$,79)
9030 CASEtw%OF
9040 WHEN0:twbuf0$(t%)=B$
9050 WHEN1:twbuf1$(t%)=B$
9060 WHEN2:twbuf2$(t%)=B$
9070 WHEN3:twbuf3$(t%)=B$
9080 WHEN4:twbuf4$(t%)=B$
9090 WHEN5:twbuf5$(t%)=B$
9100 WHEN6:twbuf6$(t%)=B$
9110 ENDCASE
9120 IFtwy%(tw%)<twwmax% THEN
9130 !q%=tww%(tw%):SYS"Wimp_GetWindowState",,q%:f%=(q%!32)AND(1<<16)
9140 IFtwy%(tw%)>=ABS(q%!8-q%!16)DIV32 THENq%!24=-(twy%(tw%)*32-ABS(q%!8-q%!16))-32:SYS"Wimp_OpenWindow",,q%
9150 PROCupdate_tw(tw%,0,-twy%(tw%)*32-32,1280,-twy%(tw%)*32+4)
9160 twy%(tw%)+=1
9170 ELSE
9180 two%(tw%)=(two%(tw%)+1)MODtwwmax%
9190 SYS"Wimp_BlockCopy",tww%(tw%),0,-32*twwmax%,1280,0,0,-32*(twwmax%-1)
9200 PROCupdate_tw(tw%,0,-32*twwmax%,1280,-32*(twwmax%-1)+4)
9210 ENDIF
9220ENDWHILE
9230ENDPROC
9240
9250DEFPROCline_txt(A$,col%)
9260LOCALt%:PROCpoll(slice%)
9270WHILEA$>""
9280 t%=(log_y%+txto%)MODtxty%
9290 txtl$(t%)=LEFT$(A$,txtx%):A$=MID$(A$,txtx%)
9300 txtc%?t%=col%:IFlog_y%<txty% THEN
9310 !q%=txt%:SYS"Wimp_GetWindowState",,q%:f%=(q%!32)AND(1<<16)
9320 IFf%<>0ANDlog_y%>=ABS(q%!8-q%!16)DIV32 THENq%!24=-(log_y%*32-ABS(q%!8-q%!16))-32:SYS"Wimp_OpenWindow",,q%
9330 PROCupdate_txt(0,-log_y%*32-32,1280,-log_y%*32+4)
9340 log_y%+=1
9350 ELSE
9360 txto%=(txto%+1)MODtxty%
9370 SYS"Wimp_BlockCopy",txt%,0,-32*txty%,1280,0,0,-32*(txty%-1)
9380 PROCupdate_txt(0,-32*txty%,1280,-32*(txty%-1)+4)
9390 ENDIF
9400ENDWHILE
9410ENDPROC
9420
9430DEFPROCclr_txt
9440txtl$()="":log_y%=0:txto%=0:data$=""
9450PROCupdate_txt(0,-txty%*32-ioff%-8,16*txtx%,0)
9460ENDPROC
9470
9480DEFPROClog(m$)
9490IF(debug%AND1) THEN
9500 PROCstr_txt(m$)
9510 IFerrC%<>0 THENBPUT#errC%,m$
9520ENDIF
9530ENDPROC
9540
9550DEFPROCopenlog(A$)
9560B$=FNparam(A$)
9570IFB$="" THEN
9580 PROCflush:PROCcf(errC%)
9590ELSE
9600 B$=FNcanon(B$)
9610 SYS"XOS_Find",&CF,B$TOerrC%;F%
9620 IF(F%AND1)THENSYS"XOS_Find",&8F,B$TOerrC%;F%
9630 IF(F%AND1)THENerrC%=0:PROChalt(FNmsg0("Etrace")):ENDPROC
9640 SYS"XOS_File",18,B$,&FFF
9650 IFerrC%<>0 THENPTR#errC%=EXT#errC%
9660ENDIF
9670ENDPROC
9680
9690DEFPROCclaimdevice
9700IFdriverno%>-1THEN
9710 !q%=256:q%!12=0:q%!16=11:q%!20=2:q%!24=driverno%+port%
9720 $(q%+28)="SLIPdial"+CHR$0
9730 SYS"Wimp_SendMessage",18,q%,0
9740 device%=TRUE:FORL%=1TO5:PROCpoll(0):NEXT
9750ENDIF
9760ENDPROC
9770
9780DEFPROCrefusedevice
9790IFdriverno%>-1THEN
9800 IF q%!20=2 AND q%!24=driverno%+port% THEN
9810 !q%=256:q%!12=q%!8:q%!16=12
9820 $(q%+28)=FNmsg0("DevMine")+CHR$0
9830 SYS"Wimp_SendMessage",17,q%,q%!4
9840 ENDIF
9850ENDIF
9860ENDPROC
9870
9880DEFFNloaddriver(A$)
9890A%=INSTR(A$," "):IFA%>=0 THEN
9900 driver$=LEFT$(A$,A%-1)
9910 port%=VAL(MID$(A$,A%+1))
9920 ELSE
9930 driver$="internal"
9940 port%=0
9950ENDIF
9960
9970PROCsetv("port",driver$+" "+STR$port%)
9980PROCprint(FNmsg1("DevLoad",driver$)," ","")
9990SYS"XOS_File",16,"SerialDev:modules."+driver$+".driver",driver,0TO;F%
10000IF(F%AND1) THENPROChalt(FNmsg1("Edev",driver$)):=0
10010PROCprint("",FNmsg0("DevOK"),"")
10020driverno%=driver!&C8
10030=port%
10040
10050DEFPROCsetspeed(B$)
10060speed%=VALB$:IFspeed%=0 THENspeed%=19200
10070PROCsetv("speed",STR$speed%)
10080ENDPROC
10090
10100DEFPROCaddevent(A$,t%)
10110REM event types are: 0 system, 1 time-alarm, 2 line-alarm, 3 task-end,
10120REM 4 taskwindow-end, 5 command-input, 6 icon-click, 7 icon-filedrop,
10130REM 8 user-menu, 9 user-eof
10140PROClog(FNmsg1("Qadd",A$))
10150L%=0:WHILEevent$(L%)>""ANDL%<maxev%
10160L%+=1:ENDWHILE
10170event$(L%)=A$:evtype%(L%)=t%:ENDPROC
10180
10190DEFFNgetevent
10200LOCALt%,l%,A$,n%:l%=0:A$="":n%=0
10210REPEATIFevent$(l%)>""ANDevent%(evtype%(l%))=TRUE THENA$=event$(l%):n%=l%
10220l%+=1:UNTILA$>""ORevent$(l%)=""ORl%=maxev%
10230IFA$>""THEN
10240 FORl%=n%TOmaxev%-1:event$(l%)=event$(l%+1):evtype%(l%)=evtype%(l%+1):NEXT
10250 event$(maxev%)=""
10260ENDIF
10270=A$
10280
10290DEFFNtestevent
10300LOCALt%,l%,r%:l%=0:r%=0
10310REPEATIFevent$(l%)>""ANDevent%(evtype%(l%))=TRUE THENr%=TRUE
10320l%+=1:UNTILr%<>0ORevent$(l%)=""ORl%=maxev%
10330=r%
10340
10350DEFFNcommand(com$)
10360WHILEcom$>""ANDstop%=0:A$=FNmulticom(com$)
10370PROCpoll(slice%)
10380PROClog(STR$stage%+": "+A$)
10390B$=FNparam(A$):B$=FNlower(B$):lc$=B$:REM store last command for help
10400IFLEFT$(B$,1)<>":" THEN
10410 CASEB$ OF
10420 WHEN "if" :return%=FNif(A$,com$)
10430 WHEN "ask" :return%=FNask(A$)
10440 WHEN "case" :return%=FNcase(A$)
10450 WHEN "when" :return%=FNwhen(A$,com$)
10460 WHEN "otherwise":PROCotherwise(com$)
10470 WHEN "endcase":return%=FNendcase
10480 WHEN "claim":return%=FNclaim(A$)
10490 WHEN "debug":debug%=FNdebug(A$)
10500 WHEN "driver":return%=FNmodemdrv(A$)
10510 WHEN "source":return%=FNsource(A$)
10520 WHEN "library":return%=FNlibrary(A$)
10530 WHEN "chain":PROCchain(A$)
10540 WHEN "port" :port%=FNloaddriver(A$)
10550 WHEN "speed":PROCsetspeed(A$)
10560 WHEN "release":PROCrelease
10570 WHEN "init" :return%=FNinitmodem(A$)
10580 WHEN "reinit":PROCreinit
10590 WHEN "dial" :return%=FNdial(A$)
10600 WHEN "wait" :return%=FNwait(A$)
10610 WHEN "trace":PROCopenlog(A$)
10620 WHEN "send" :PROCsend(A$)
10630 WHEN "ipget":return%=FNipget(A$)
10640 WHEN "make" :PROCmakefile(A$)
10650 WHEN "task" :return%=FNtask(A$)
10660 WHEN "taskwindow":return%=FNtaskw(A$)
10670 WHEN "sleep","pause":PROCpause(VAL(A$))
10680 WHEN "alarm":PROCalarm(A$)
10690 WHEN "set" :PROCset(A$)
10700 WHEN "unset":PROCunset(A$)
10710 WHEN "?eq","?ne","?lt","?le","?gt","?ge":return%=FNtesteq(B$,A$)
10720 WHEN "string":return%=FNstring(A$)
10730 WHEN "eval" :return%=FNeval(A$)
10740 WHEN "label":REM ignore labels
10750 WHEN "goto" :PROCgoto(A$,stage%)
10760 WHEN "call" :PROCgosub(A$,stage%)
10770 WHEN "return":return%=FNreturn(A$,stage%)
10780 WHEN "echo" :PROCecho(A$)
10790 WHEN "?file":return%=FNfile(A$)
10800 WHEN "?line":return%=FNtestline(A$)
10810 WHEN "?free":return%=FNfree(A$)
10820 WHEN "retry":PROCsetretry(A$)
10830 WHEN "open" :return%=FNopen(A$)
10840 WHEN "close":return%=FNclose(A$)
10850 WHEN "read" :return%=FNread(A$)
10860 WHEN "write" :return%=FNwrite(A$)
10870 WHEN "ptr" :return%=FNptr(A$)
10880 WHEN "move" :return%=FNmovefile(A$)
10890 WHEN "copy" :return%=FNcopyfile(A$)
10900 WHEN "append":return%=FNappend(A$)
10910 WHEN "delete":return%=FNdelete(A$)
10920 WHEN "newsrate":return%=FNnewsrate(A$)
10930 WHEN "?task":return%=FNtesttask(A$)
10940 WHEN "dopen","dataopen":return%=FNdataopen(A$)
10950 WHEN "stamp":PROClog("("+STR$(TIME DIV100)+") "+A$)
10960 WHEN "error":PROChalt(A$)
10970 WHEN "message":PROCmessage(A$)
10980 WHEN "menu" :PROCmenudef(A$)
10990 WHEN "list" :PROClist(A$)
11000 WHEN "icon":return%=FNiconbar(A$)
11010 WHEN "analyse","analyze":PROCanalyse(A$)
11020 WHEN "help" :PROChelp(A$)
11030 WHEN "event":PROCeventonoff(A$)
11040 WHEN "stop" :PROCstop
11050 WHEN "quit" :PROCquit(FNmsg0("Quit"))
11060 WHEN "exit" :PROCexit
11070 WHEN "input":PROCinput(A$)
11080 WHEN "oscli":return%=FNoscli(A$)
11090 OTHERWISE:PROClog(FNmsg0("BadCom"))
11100 ENDCASE
11110ENDIF
11120IFreturn%<0THENPROCsetv("$status",return$)ELSEPROCsetv("$status",STR$return%)
11130ENDWHILE
11140=return%
11150
11160DEFPROCecho(A$)
11170LOCALB$,s%:s%=0
11180REPEAT
11190 B$=FNparam(A$)
11200 IFLEFT$(B$,1)="/"THEN
11210 CASELEFT$(B$,3)OF
11220 WHEN"/st":s%=TRUE
11230 WHEN"/lo":s%=0
11240 WHEN"/da":A$=""""+TIME$+""" "+A$
11250 ENDCASE
11260 ELSE
11270 IFs%THEN
11280 PROCprint("",B$,"")
11290 ELSE
11300 PROCstr_txt(B$)
11310 IF(debug%AND3)<>0ANDerrC%<>0 THENBPUT#errC%,B$
11320 ENDIF
11330 ENDIF
11340UNTILA$=""
11350ENDPROC
11360
11370DEFFNclaim(A$)
11380LOCALJ%,t%,d%,try%
11390PROCprint(FNmsg0("DevClaim")," ","")
11400t%=VALFNparam(A$):IFt%<0 THENt%=retry%
11410d%=VALFNparam(A$):IFd%<2 THENd%=delay%
11420try%=1
11430REPEAT
11440PROCclaimdevice
11450IFdevice%<>0 THEN
11460 J%=FNd(17,port%,0,0)
11470 J%=FNd(13,port%,speed%,0):IFJ%<>speed%THENspeed%=J%
11480 J%=FNd(14,port%,speed%,0):IFJ%<>speed%THENspeed%=J%
11490 J%=FNd(15,port%,0,0)
11500 J%=FNd(16,port%,1,0)
11510 J%=FNd(6,port%,0,0)
11520 J%=FNd(7,port%,0,0)
11530ELSE
11540 PROCpause(d%):IFt%>0 THENtry%+=1
11550ENDIF
11560UNTILdevice%<>0 ORtry%>t% ORstop%<>0
11570=device%
11580
11590DEFPROCrelease
11600LOCALJ%
11610IF device% THEN
11620 PROCprint(FNmsg0("DevRel"),FNmsg0("DevDrop"),"")
11630 J%=FNd(8,port%,0,0)
11640 J%=FNd(18,port%,0,0)
11650 device%=FALSE
11660ENDIF
11670ENDPROC
11680
11690DEFFNinitmodem(A$)
11700LOCALB$,h%:h%=0
11710IFFNdroplines<>0 THEN
11720 PROCprint(FNmsg0("DevInit"),"","")
11730 IFA$=""THENA$=FNvv("$init")
11740 REPEAT
11750 B$=FNparam(A$)
11760 PROCprint("",FNmsg1("Sending",B$),"")
11770 PROCsend(B$):h%=FNget4s("OK","","","",5)
11780 UNTILA$=""ORh%=0
11790ENDIF
11800=h%
11810
11820DEFPROCreinit
11830LOCALJ%
11840J%=FNd(13,port%,speed%,0):IFJ%<>speed%THENspeed%=J%
11850J%=FNd(14,port%,speed%,0):IFJ%<>speed%THENspeed%=J%
11860J%=FNd(15,port%,0,0)
11870J%=FNd(16,port%,1,0)
11880J%=FNd(8,port%,3,0)
11890ENDPROC
11900
11910DEFPROCsetretry(A$)
11920LOCALB$
11930B$=FNparam(A$)
11940IFVALB$>0 THENretry%=VALB$
11950IFVALA$>2 THENdelay%=VALA$
11960ENDPROC
11970
11980DEFPROCusericon(A$)
11990PROCupd_icon(status%,11,A$)
12000PROCsetshaded(status%,11,(A$=""))
12010ENDPROC
12020
12030DEFFNdial(numlist$)
12040LOCALflag%,r%,d%,nod%,noc%,bus%,dc$,B$,C$
12050flag%=0:dc$="ATDT"
12060r%=retry%:d%=delay%:nod%=d%:noc%=d%:bus%=d%
12070PROCusericon(FNmsg0("Redial"))
12080REPEAT
12090 B$=FNparam(numlist$)
12100 IFLEFT$(B$,1)="/"THEN
12110 C$=FNvalue(B$):CASELEFT$(B$,3)OF
12120 WHEN"ret":r%=VALC$:IFr%<1 THENr%=1
12130 WHEN"del":d%=VALC$:IFd%<2 THENd%=2
12140 nod%=d%:noc%=d%:bus%=d%
12150 WHEN"noc":noc%=VALC$
12160 WHEN"nod":nod%=VALC$
12170 WHEN"not","pul":dc$="ATDP"
12180 WHEN"ton","nop":dc$="ATDT"
12190 WHEN"bus":bus%=VALC$
12200 ENDCASE
12210 ELSE
12220 attempt%=1:flag%=0:num$=B$
12230 REPEAT
12240 PROCprint(FNmsg1("Dialling",num$),FNmsg2("Dattempt",STR$attempt%,STR$r%),"")
12250 PROCsend(dc$+num$):attempt%+=1
12260 return%=FNget4s(FNvv("$conn"),FNvv("$busy"),FNvv("$nocarr"),FNvv("$nodial"),120)
12270 IFstop%=0 THEN
12280 IFredial%=TRUE THEN
12290 A%=FNdroplines:WHILE FNd(5,port%,0,0)>0:J%=FNrec:ENDWHILE:redial%=FALSE
12300 ELSE
12310 CASEreturn% OF
12320 WHEN 1:PROCprint("",FNmsg0("Dconnect"),""):flag%=1
12330 WHEN 2:PROCprint("",FNmsg0("Dbusy"),""):PROCpause(bus%)
12340 WHEN 3:PROCprint("",FNmsg0("Dnc"),""):PROCpause(noc%)
12350 WHEN 4:PROCprint("",FNmsg0("Dnd"),""):PROCpause(nod%)
12360 WHEN 2,3,4:WHILE FNd(5,port%,0,0)>0:J%=FNrec:ENDWHILE
12370 OTHERWISEPROCprint("",FNmsg0("Dnr"),""):PROCpause(d%)
12380 ENDCASE
12390 ENDIF
12400 ELSE
12410 A%=FNdroplines:REM cancel a dial if stop active
12420 ENDIF
12430 UNTIL attempt%>r% ORstop%<>0 ORflag%>0 ORdevice%=0
12440 IFflag%=0 ANDnumlist$>"" THENPROCprint(FNmsg0("Dnext"),"",""):PROCpause(1)
12450 ENDIF
12460UNTIL numlist$="" ORstop%<>0 OR flag%>0 ORdevice%=0
12470PROCusericon("")
12480=flag%
12490
12500DEFFNwait(A$)
12510LOCALl%,m%,d%,s%,return%,B$,C$,qual%
12520d%=600:tget%=-1:return%=0
12530REPEATB$=FNparam(A$):qual%=FALSE
12540IFLEFT$(B$,1)="/"THEN
12550 C$=FNvalue(B$):qual%=TRUE
12560 CASELEFT$(B$,2)OF
12570 WHEN"ev":return%=FNwaitevent
12580 WHEN"de","del":d%=VALC$
12590 WHEN"na","id":FORl%=0TOtwmax%:IFC$=twname$(l%)THENtget%=l%:l%=twmax%
12600 NEXT:IFtget%<0 THENPROChalt(FNmsg0("Ebadtask")):=0
12610 OTHERWISE:PROChalt(FNmsg0("Ebadwait")):=0
12620 ENDCASE
12630ENDIF
12640UNTILqual%=FALSE
12650IFreturn%=0 THEN
12660 IFd%=0THENPROChalt(FNmsg1("Ebaddel",A$)):=0
12670 s4$()="":l%=0:C$="":REPEAT
12680 s4$(l%)=B$:C$+=B$+"/":l%+=1:B$=FNparam(A$)
12690 UNTILB$=""ORl%=4:C$=LEFT$(C$,LENC$-1)
12700 PROCprint(FNmsg1("Wait",C$),FNmsg1("Timeout",STR$d%),"")
12710 IFtget%<0 THEN
12720 return%=FNget4s(s4$(0),s4$(1),s4$(2),s4$(3),d%)
12730 ELSE
12740 return%=FNgettw(s4$(0),s4$(1),s4$(2),s4$(3),d%)
12750 ENDIF
12760 IF return%>0 THENPROCprint("",FNmsg1("Received",s4$(return%-1)),"")ELSEPROCprint("",FNmsg0("TimedOut"),"")
12770ENDIF
12780=return%
12790
12800DEFFNwaitevent
12810PROCupd_icon(status%,7,FNmsg0("Select"))
12820PROCprint(FNmsg0("Waiting")," ","")
12830REPEATPROCpoll(50):UNTILFNtestevent
12840=1
12850
12860DEFPROCeventonoff(A$)
12870LOCALa%,B$:a%=TRUE
12880REPEATB$=FNparam(A$)
12890CASELEFT$(B$,2)OF
12900WHEN"/e":a%=TRUE
12910WHEN"/d":a%=FALSE
12920WHEN"ti":event%(1)=a%
12930WHEN"li":event%(2)=a%
12940WHEN"ta":event%(3)=a%
12950WHEN"tw":event%(4)=a%
12960WHEN"in":event%(5)=a%
12970WHEN"ic":event%(6)=a%
12980WHEN"fi":event%(7)=a%
12990WHEN"me":event%(8)=a%
13000WHEN"eo":event%(9)=a%
13010WHEN"al":event%()=a%
13020ENDCASE
13030UNTILA$="":event%(0)=TRUE
13040ENDPROC
13050
13060DEFFNgettw(tget$(0),tget$(1),tget$(2),tget$(3),wait%)
13070LOCALst%,r%
13080r%=0:twgflag%=0:wait%=wait%*100:st%=time%
13090PROCtget(tdata$(tget%))
13100REPEATPROCpoll(50):UNTILtwgflag%>0 ORABS(time%-st%)>wait% ORstop%<>0
13110IFtwgflag%>0 THENr%=twgflag%
13120=r%
13130
13140DEFPROCtget(A$)
13150LOCALL%
13160FORL%=0TO3
13170 IFtget$(L%)>""ANDINSTR(A$,tget$(L%))>0 THENtwgflag%=L%+1:L%=3
13180NEXT
13190tget%=-1
13200ENDPROC
13210
13220DEFFNget4s(s1$,s2$,s3$,s4$,wait%)
13230LOCALflag%,st%,J%
13240wait%=wait%*100:st%=time%
13250n1%=ASCs1$:n2%=ASCs2$:n3%=ASCs3$:n4%=ASCs4$
13260p1%=1:p2%=1:p3%=1:p4%=1:flag%=0
13270REPEAT
13280 J%=FNrec
13290 IFJ%>-1 THEN
13300 IFJ%=n1% THENp1%+=1:n1%=ASC(MID$(s1$,p1%)) ELSEn1%=ASCs1$:p1%=1
13310 IFJ%=n2% THENp2%+=1:n2%=ASC(MID$(s2$,p2%)) ELSEn2%=ASCs2$:p2%=1
13320 IFJ%=n3% THENp3%+=1:n3%=ASC(MID$(s3$,p3%)) ELSEn3%=ASCs3$:p3%=1
13330 IFJ%=n4% THENp4%+=1:n4%=ASC(MID$(s4$,p4%)) ELSEn4%=ASCs4$:p4%=1
13340 ELSE
13350 PROCpoll(10)
13360 ENDIF
13370 IFp1%>LENs1$ ANDs1$>"":flag%=1
13380 IFp2%>LENs2$ ANDs2$>"":flag%=2
13390 IFp3%>LENs3$ ANDs3$>"":flag%=3
13400 IFp4%>LENs4$ ANDs4$>"":flag%=4
13410UNTILflag%>0 ORABS(time%-st%)>wait% ORstop%<>0 ORredial%<>0
13420IFflag%>0 THEN:=flag%
13430=0
13440
13450DEFPROCsend(A$)
13460LOCALA%,J%,R%,t$,tw%,B$,C$:t$="":R%=0
13470REPEATB$=FNparam(A$)
13480 IFLEFT$(B$,1)="/"THEN
13490 C$=FNvalue(B$):CASELEFT$(B$,2)OF
13500 WHEN"ra":R%=TRUE
13510 WHEN"no":R%=FALSE
13520 WHEN"na","id":t$=C$
13530 ENDCASE
13540 ELSE
13550 IFt$=""THEN
13560 IFdevice%=0THENPROChalt(FNmsg0("Enodev")):ENDPROC
13570 FORA%=1TOLENB$:J%=FNd(0,port%,ASCMID$(B$,A%,1),0):NEXT
13580 IFR%=0 THENJ%=FNd(0,port%,13,0)
13590 ELSE
13600 tw%=0:WHILEtwname$(tw%)<>t$ANDtw%<twmax%:tw%+=1:ENDWHILE
13610 IFtw%<twmax%ANDtwh%(tw%)<>0THEN
13620 !q%=256:q%!12=0:q%!16=&808C0:q%!20=LENB$-(R%=0):$(q%+24)=B$
13630 SYS"Wimp_SendMessage",17,q%,twh%(tw%)
13640 PROClog(FNmsg2("TaskSend",LEFT$(B$,100),twname$(tw%)))
13650 ENDIF
13660 ENDIF
13670 ENDIF
13680UNTILA$=""
13690ENDPROC
13700
13710DEFFNipget(A$)
13720LOCALr%,start$,d%,a%,loc%,tlim%,B$,C$,J%
13730r%=0:d%=60:a%=0
13740REPEATB$=FNparam(A$)
13750IFLEFT$(B$,1)="/"THEN
13760 C$=FNvalue(B$):CASELEFT$(B$,2)OF
13770 WHEN"de":d%=VALC$:IFd%<10THENd%=10
13780 WHEN"au":a%=TRUE
13790 ENDCASE
13800 ELSE
13810 start$=B$
13820ENDIF
13830UNTILA$=""
13840IFa%=0THEN
13850 r%=FNget4s(start$,"","","",d%)
13860 ELSE
13870 start$="":loc%=0:r%=0:tlim%=time%+d%*100
13880 REPEAT
13890 J%=FNrec
13900 IFJ%>0THEN
13910 CASEloc%OF
13920 WHEN0,1,2:IFJ%>47ANDJ%<57THENstart$+=CHR$J%:loc%+=1:ELSEstart$="":loc%=0
13930 WHEN3:IFJ%=46THENstart$+=".":loc%+=1:ELSEstart$="":loc%=0
13940 ENDCASE
13950 ELSE
13960 PROCpoll(slice%)
13970 ENDIF
13980 UNTILloc%=4ORtime%>tlim%:IFloc%=4THENr%=1
13990ENDIF
14000IFr%=1 THEN
14010 ipnumber$=start$
14020 J%=FNrec
14030 REM terminates on space or control char
14040 WHILE (J%>32 OR J%=0) ANDLENipnumber$<20
14050 IFJ%>31 THENipnumber$=ipnumber$+CHR$J%:PROCpoll(slice%):ELSEPROCpoll(10)
14060 J%=FNrec
14070 ENDWHILE
14080 C%=ASC(RIGHT$(ipnumber$,1))
14090 WHILE (C%<48 OR C%>57) ANDLENipnumber$>5
14100 ipnumber$=LEFT$(ipnumber$,LEN(ipnumber$)-1)
14110 C%=ASC(RIGHT$(ipnumber$,1))
14120 ENDWHILE
14130 PROCsetv("ipaddress",ipnumber$)
14140 PROCsetv("route",FNsubst("%ip1.%ip2.%ip3.254"))
14150 return$=ipnumber$:r%=-1:A$=""
14160ENDIF
14170=r%
14180
14190DEFPROCupdateip(A$)
14200LOCALl%,m%
14210l%=INSTR(A$,"."):PROCsetv("ip1",LEFT$(A$,l%-1))
14220m%=INSTR(A$,".",l%+1):PROCsetv("ip2",MID$(A$,l%+1,m%-l%-1))
14230l%=INSTR(A$,".",m%+1):PROCsetv("ip3",MID$(A$,m%+1,l%-m%-1))
14240PROCsetv("ip4",MID$(A$,l%+1))
14250PROCprint("","",A$)
14260ENDPROC
14270
14280DEFPROCmakefile(name$)
14290A%=INSTR(name$," ")
14300IFA%<=1 THEN PROCquit(FNmsg1("Ebadmake",name$))
14310source$=LEFT$(name$,A%-1):dest$=MID$(name$,A%+1)
14320PROCprint(FNmsg1("Make",dest$),"","")
14330IFsource$="-"THENsource$="null:"
14340fh1%=FNopenin(source$)
14350IFfh1%=0 THENPROChalt(FNmsg1("Enotfound",source$)):ENDPROC
14360fh2%=FNopenout(dest$)
14370IFfh2%=0 THENPROChalt(FNmsg1("Ebadfile",dest$)):ENDPROC
14380WHILE (EOF#fh1%=FALSE ORLEFT$(FNline(stage%+1),1)="+")
14390 IF EOF#fh1% THEN
14400 stage%+=1:A$=MID$(FNline(stage%),2)
14410 ELSE
14420 A$=GET$#fh1%
14430 ENDIF
14440 A$=FNsubst(A$)
14450 IFLEFT$(A$,1)<>"#" THENBPUT#fh2%,A$
14460 PROCpoll(slice%)
14470ENDWHILE
14480PROCcf(fh1%):PROCcf(fh2%)
14490ENDPROC
14500
14510DEFFNopenin(f$)
14520=FNfopen(f$,&4F)
14530
14540DEFFNopenout(f$)
14550=FNfopen(f$,&8F):PROCsettype(f$,&FFF)
14560
14570DEFFNopenup(f$)
14580LOCALh%
14590h%=FNfopen(f$,&CF)
14600IFh%=0THENh%=FNfopen(f$,&8F):PROCsettype(f$,&FFF)
14610=h%
14620
14630DEFFNfopen(f$,r%)
14640LOCALh%,F%
14650SYS"XOS_Find",r%,f$TOh%;F%
14660IF(F%AND1)THENh%=0
14670=h%
14680
14690DEFFNdelfile(f$)
14700LOCALF%:SYS"XOS_File",6,f$TO;F%
14710=(F%AND1)
14720
14730DEFPROCsettype(f$,t%)
14740SYS"XOS_File",18,f$,t%
14750ENDPROC
14760
14770DEFPROCpause(wait%)
14780LOCALendtime%
14790IFwait%=0 THEN
14800 PROCpaused
14810 ELSE
14820 PROClog(FNmsg1("Wait",STR$wait%+"s"))
14830 PROCpoll(0):st%=time%:wait%=wait%*100
14840 REPEAT
14850 PROCpoll(50)
14860 UNTILABS(st%-time%)>wait%
14870 ENDIF
14880ENDPROC
14890
14900DEFPROCsettime
14910LOCALl%,m%
14920?q%=3:SYS"OS_Word",14,q%
14930SYS"OS_ConvertDateAndTime",q%,tmp%,256,"%24%MI%SE"TOl%,m%:now$=FNstr(l%)
14940PROCsetv("$time",now$):PROCsetv("$mtime",STR$(time%DIV100))
14950ENDPROC
14960
14970DEFPROCsetdate
14980LOCALl%,m%
14990?q%=3:SYS"OS_Word",14,q%
15000SYS"OS_ConvertDateAndTime",q%,tmp%,256,"%YR%MN%DY"TOl%,m%:now$=FNstr(l%)
15010PROCsetv("$date",now$)
15020ENDPROC
15030
15040DEFPROCalarm(A$)
15050LOCALal%,a$,an%,at%,ai%,B$,C$
15060an%=-1:al%=-1:ai%=-1:a$=A$
15070REPEATB$=FNparam(A$)
15080IFLEFT$(B$,1)="/"THEN
15090 C$=FNvalue(B$)
15100 CASELEFT$(B$,2)OF
15110 WHEN"st":stop$=C$
15120 WHEN"er":error$=C$
15130 WHEN"dt","cts":aline%(0)=FNtf10(VALC$):al%=0
15140 WHEN"ds":aline%(1)=FNtf10(VALC$):al%=1
15150 WHEN"rn":aline%(2)=FNtf10(VALC$):al%=2
15160 WHEN"dc":aline%(3)=FNtf10(VALC$):al%=3
15170 WHEN"ti":at%=FNdecodetime(C$)
15180 WHEN"ic":ai%=FNiconid(C$)
15190 WHEN"na","id":an%=FNalarmno(C$):alarmid$(an%)=C$
15200 WHEN"ca","de":PROCcancelalarm(C$)
15210 ENDCASE
15220ENDIF
15230UNTILA$=""
15240IFat%>0 THEN
15250 IFan%<0THENan%=FNalarmno("~")
15260 alarm$(an%,0)=B$:alarm$(an%,1)=a$:alarmtime%(an%)=at%
15270ELSE
15280 IFal%>=0 THENaline$(al%)=B$
15290 IFai%>=0 THENifile$(ai%)=B$
15300ENDIF
15310ENDPROC
15320
15330DEFFNalarmno(A$)
15340LOCALa%:a%=0
15350REPEATa%+=1:UNTILalarm$(a%,0)=""ORalarmid$(a%)=A$ORa%=almax%
15360IFa%=almax%THENPROChalt(FNmsg0("Ealarm")):=0
15370=a%
15380
15390DEFFNtf10(A%):=-(A%<>0)
15400
15410DEFPROCcancelalarm(C$)
15420LOCALa%:a%=0
15430REPEATa%+=1:UNTILalarmid$(a%)=C$ORa%=almax%
15440IFalarmid$(a%)=C$ THENalarm$(a%,0)="":PROClog(FNmsg1("Acancel",C$))
15450ENDPROC
15460
15470DEFFNdecodetime(C$)
15480LOCALl%,m%,hr%,mi%,sc%,add%,r%,now%,nhr%,nmi%,nse%,wait%,tnow%
15490IFLEFT$(C$,1)="+"THENadd%=TRUE:C$=MID$(C$,2) ELSEadd%=FALSE
15500l%=INSTR(C$,":"):IFl%>0 THEN
15510 m%=INSTR(C$,":",l%+1):IFm%>0 THEN
15520 hr%=VALLEFT$(C$,l%-1)
15530 mi%=VALMID$(C$,l%+1,m%-1)
15540 sc%=VALMID$(C$,m%+1,m%+3)
15550 ELSE
15560 IFadd% THEN
15570 hr%=0:mi%=VALLEFT$(C$,l%-1):sc%=VALMID$(C$,l%+1,l%+3)
15580 ELSE
15590 sc%=0:hr%=VALLEFT$(C$,l%-1):mi%=VALMID$(C$,l%+1,l%+3)
15600 ENDIF
15610 ENDIF
15620 ELSE
15630 IFadd% THENhr%=0:mi%=0:sc%=VALLEFT$(C$,2) ELSEsc%=0:mi%=0:hr%=VALLEFT$(C$,2)
15640ENDIF
15650SYS"OS_ReadMonotonicTime"TOnow%
15660IFadd% THEN
15670 r%=now%+100*sc%+6000*mi%+360000*hr%
15680 ELSE
15690 ?q%=3:SYS"OS_Word",14,q%
15700 SYS"OS_ConvertDateAndTime",q%,tmp%,256,"%24%MI%SE"TOl%,m%:now$=FNstr(l%)
15710 nhr%=VALLEFT$(now$,2):nmi%=VALMID$(now$,3,2):nse%=VALRIGHT$(now$,2)
15720 tnow%=nse%+nmi%*60+nhr%*3600
15730 wait%=(sc%+mi%*60+hr%*3600)-tnow%:WHILEwait%<0:wait%+=24*3600:ENDWHILE
15740 r%=now%+wait%*100
15750ENDIF
15760=r%
15770
15780DEFPROCtimealarm
15790LOCALc%:c%=0
15800REPEATc%+=1
15810 IFalarm$(c%,0)>"" ANDtime%>alarmtime%(c%) THEN
15820 com$=alarm$(c%,0):alarm$(c%,0)=""
15830 IFINSTR(alarm$(c%,1),"/repeat")>0 THENPROCalarm(alarm$(c%,1))
15840 PROCaddevent(com$,1)
15850 ENDIF
15860UNTILc%=almax%
15870checkalarm%=time%
15880ENDPROC
15890
15900DEFPROClinealarm
15910LOCALl1%,J%
15920IFdevice%THEN
15930 J%=FNd(9,port%,0,0)
15940 IFJ%<>oldline%THEN
15950 oldline%=J%:IF(J%AND1)THENt$="�"ELSEt$=" "
15960 IF(J%AND2)THENt$+="�"ELSEt$+=" "
15970 IF(J%AND8)THENt$+="�"ELSEt$+=" "
15980 PROCupd_icon(status%,10,t$)
15990 ENDIF
16000 FORl1%=0TO3
16010 IFaline$(l1%)>""AND(J%AND(1<<l1%))=aline%(l1%)THENPROCaddevent(aline$(l1%),2):aline$(l1%)=""
16020 NEXTl1%
16030 ELSE
16040 IFoldline%>0THENoldline%=0:PROCupd_icon(status%,15,"")
16050ENDIF
16060ENDPROC
16070
16080DEFPROClist(A$)
16090LOCALB$,C$
16100B$=FNparam(A$):C$=FNvalue(B$)
16110CASELEFT$(B$,2)OF
16120 WHEN"al":PROClistalarms
16130 WHEN"me":PROClistmenu
16140 WHEN"ta":PROClisttasks
16150 WHEN"va":PROClistvars
16160 WHEN"sc":PROClistscript(A$)
16170 WHEN"fi":PROClistfiles
16180 WHEN"ju":PROClistjt
16190ENDCASE
16200ENDPROC
16210
16220DEFPROClistalarms
16230LOCALc%,A%,A$
16240PROCwarn_txt(FNmsg0("Condition")+" "+FNmsg0("Action"))
16250FORc%=0TOalmax%
16260 IFalarm$(c%,0)>"" THEN
16270 A%=(alarmtime%(c%)-time%)DIV100
16280 A$="t+"+RIGHT$("00"+STR$(A%DIV3600),2)+":"
16290 A$+=RIGHT$("00"+STR$((A%MOD3600)DIV60),2)+":"
16300 A$+=RIGHT$("00"+STR$(A%MOD60),2)
16310 PROCf_list(A$,alarm$(c%,1)+" ("+alarmid$(c%)+")")
16320 ENDIF
16330NEXT
16340FORc%=0TOimax%
16350 IFibar$(c%)>""THENPROCf_list(FNmsg0("Iclick"),ibar$(c%)+" ("+ibarid$(c%)+")")
16360 IFifile$(c%)>""THENPROCf_list(FNmsg0("Ifile"),ifile$(c%)+" ("+ibarid$(c%)+")")
16370NEXT
16380PROCf_list("stop",stop$)
16390IFaline$(0)>""THENPROCf_list("DTR"+" ("+STR$aline%(0)+")",aline$(0))
16400IFaline$(1)>""THENPROCf_list("DSR"+" ("+STR$aline%(1)+")",aline$(1))
16410IFaline$(2)>""THENPROCf_list("RNG"+" ("+STR$aline%(2)+")",aline$(2))
16420IFaline$(3)>""THENPROCf_list("DCD"+" ("+STR$aline%(3)+")",aline$(3))
16430ENDPROC
16440
16450DEFPROCf_list(A$,B$)
16460IFB$>""THENPROCwarn_txt(" "+A$+STRING$(13-LENA$," ")+B$)
16470ENDPROC
16480
16490DEFFNiconbar(A$)
16500LOCALr%,id$,act$,s$,B$,C$
16510id$="":act$="":s$=""
16520REPEAT
16530 B$=FNparam(A$)
16540 IFLEFT$(B$,1)="/"THEN
16550 C$=FNvalue(B$)
16560 CASELEFT$(B$,2)OF
16570 WHEN"fi":r%=FNmergesprites(C$)
16580 WHEN"id","name":id$=C$
16590 WHEN"ac":act$=C$
16600 WHEN"ca","de":r%=FNcancelicon(C$)
16610 WHEN"fr":r%=FNsfree
16620 ENDCASE
16630 ELSE
16640 s$=B$
16650 ENDIF
16660UNTILA$=""
16670 IFid$>""ANDs$>""THENr%=FNaddicon(s$,id$,act$)
16680=r%
16690
16700DEFFNiconid(A$)
16710LOCALa%:a%=0
16720REPEATa%+=1:UNTILibarid$(a%)=A$ORa%=imax%
16730IFa%=imax%ORA$=""THENPROClog(FNmsg0("Eicon1")):=-1
16740=a%
16750
16760DEFFNnewiconid(A$)
16770LOCALa%:a%=0
16780REPEATa%+=1:UNTILibarid$(a%)=A$ORibar%(a%)=0ORa%=imax%
16790IFa%=imax%ORA$=""THENPROClog(FNmsg0("Eicon1")):=-1
16800=a%
16810
16820DEFFNaddicon(A$,id$,act$)
16830LOCALa%,Z%
16840a%=FNnewiconid(id$)
16850IFa%<0THEN=0
16860IFA$>""THEN
16870 IFibarid$(a%)=id$ THENZ%=FNcancelicon(id$)
16880 PROClog("Adding icon "+A$)
16890 ibar%(a%)=FNic(A$,a%):ibarid$(a%)=id$
16900ENDIF
16910ibar$(a%)=act$
16920=FNtf10(ibar%(a%))
16930
16940DEFFNcancelicon(A$)
16950LOCALa%
16960a%=FNiconid(A$)
16970IFa%<0THENPROClog(FNmsg0("Eicon1")):=0
16980IFibar%(a%)<1THENPROClog(FNmsg0("Eicon2")):=0
16990!icons%=-2:icons%!4=ibar%(a%):SYS"XWimp_DeleteIcon",,icons%TO;F%
17000ibar%(a%)=0:ibarid$(a%)=""
17010=FNtf10(F%)
17020
17030DEFPROCifile(Z%,f$,ty%)
17040PROCsetv("$type",STR$~ty%):PROCsetv("$file",+f$)
17050PROCaddevent(ifile$(Z%),7)
17060ENDPROC
17070
17080DEFPROCset(A$)
17090LOCALl%,m%,B$,C$
17100B$=FNparam(A$):C$=FNparam(A$)
17110PROCsetv(B$,C$)
17120ENDPROC
17130
17140DEFPROCsetv(B$,C$)
17150LOCALl%,p%:p%=-1:FORl%=0TOvmax%
17160 IFvar$(l%,0)=B$ORvar$(l%,0)=""THENvar$(l%,0)=B$:var$(l%,1)=C$:p%=l%:l%=vmax%+1
17170NEXT
17180IFB$="ipaddress"THENPROCupdateip(C$)
17190IFp%=-1THENPROChalt(FNmsg0("Evar"))
17200ENDPROC
17210
17220DEFPROCunset(A$)
17230LOCALl%,B$
17240B$=FNparam(A$)
17250FORl%=0TOvmax%
17260 IFvar$(l%,0)=B$ THENvar$(l%,0)="":var$(l%,1)=""
17270NEXT
17280IFB$="ipaddress"THENPROCprint("",""," ")
17290ENDPROC
17300
17310DEFFNvv(A$)
17320LOCALl%,t$,B$:t$=""
17330B$=FNparam(A$)
17340FORl%=0TOvmax%
17350 IFvar$(l%,0)=B$ THENt$=var$(l%,1):l%=vmax%
17360NEXT
17370=t$
17380
17390DEFPROClistvars
17400LOCALc%
17410PROCwarn_txt(FNmsg0("Variable")+" "+FNmsg0("Value"))
17420FORc%=0TOvmax%
17430 IFvar$(c%,0)>""THENPROCf_list(var$(c%,0),var$(c%,1))
17440NEXT
17450ENDPROC
17460
17470DEFFNdroplines
17480LOCALJ%
17490IFdevice%=0THEN=0
17500PROCprint("",FNmsg0("DevDrop"),"")
17510J%=FNd(8,port%,0,0)
17520PROCpoll(100)
17530J%=FNd(8,port%,3,0)
17540=1
17550
17560DEFPROCgoto(A$,RETURN stage%)
17570LOCALl%,flag%,dest$
17580l%=0:flag%=-1:dest$=FNparam(A$)
17590REPEAT
17600IFjt$(l%)=dest$THENflag%=jt%(l%):l%=jtl%
17610l%+=1:UNTILl%>=jtl%
17620IFflag%<0THENPROChalt(FNmsg1("Elabel",dest$)):ENDPROC
17630stage%=flag%
17640ENDPROC
17650
17660DEFPROCgosub(A$,RETURN stage%)
17670LOCALB$,p%,old%,lock%
17680IFcall_lev%=submax% THENPROChalt(FNmsg0("Elevel")):ENDPROC
17690dest$=FNparam(A$)
17700lock%=FALSE:IFdest$="/lock"THENlock%=TRUE:dest$=FNparam(A$)
17710p%=0:IFA$>""THEN
17720 REPEATp%+=1:B$=FNparam(A$):PROCsetv("p"+STR$p%,B$):UNTILA$=""
17730ENDIF
17740old%=stage%:PROCgoto(dest$,stage%)
17750IFlock%THEN
17760 FORp%=0TOcall_lev%:IFcall_lock%(p%)=stage% THENstage%=old%:PROCwarn_txt(FNmsg1("Elock",dest$))
17770 NEXT
17780ENDIF
17790IFstage%<>old% THEN
17800 call_lev%+=1:call_ret%(call_lev%)=old%
17810 IFlock% THENcall_lock%(call_lev%)=stage%
17820ENDIF
17830ENDPROC
17840
17850DEFFNreturn(A$,RETURN stage%)
17860IFcall_lev%=0 THENPROChalt(FNmsg0("Ereturn")):=0
17870stage%=call_ret%(call_lev%):call_lev%-=1
17880return$=A$
17890=-1
17900
17910DEFFNtestfile(A$)
17920LOCALr%
17930SYS"XOS_File",17,A$TOr%
17940=r%
17950
17960DEFFNfile(A$)
17970LOCALr%,n%,l%,B$,C$
17980r%=0:B$=FNparam(A$):C$=FNparam(A$)
17990CASELEFT$(B$,3)OF
18000 WHEN"/si":SYS"XOS_File",23,C$TOn%,,,,r%
18010 WHEN"/at":SYS"XOS_File",23,C$TOn%,,,,,r%
18020 WHEN"/ty":SYS"XOS_File",23,C$TOn%,,,,,,r%:return$=STR$~r%:r%=-1
18030 WHEN"/ex":return$=FNcanon(C$):IFreturn$>""THENr%=-1:n%=1
18040 WHEN"/le":return$=FNcanon(C$):n%=LENreturn$
18050 WHILEn%>0ANDMID$(return$,n%,1)<>".":n%-=1:ENDWHILE
18060 IFn%>1THENreturn$=MID$(return$,n%+1):r%=-1
18070 WHEN"/pa":return$=FNcanon(C$):n%=LENreturn$
18080 WHILEn%>0ANDMID$(return$,n%,1)<>".":n%-=1:ENDWHILE
18090 IFn%>1THENreturn$=LEFT$(return$,n%-1):r%=-1
18100 OTHERWISE:SYS"XOS_File",23,B$TOr%:n%=r%
18110ENDCASE
18120IFn%=0THENr%=0
18130=r%
18140
18150DEFFNcanon(A$)
18160LOCALr$:r$=""
18170SYS"XOS_FSControl",37,A$,tmp%,,,256TO,,,,,r%;F%
18180IFr%>0AND(F%AND1)=0THENr$=FNstr(tmp%)
18190=r$
18200
18210DEFFNtestline(A$)
18220LOCAL return%,J%,B$:return%=0
18230J%=FNd(9,port%,0,0)
18240REPEATB$=FNparam(A$)
18250 CASEB$OF
18260 WHEN "/cts","/dtr":return%+=(J%AND1)
18270 WHEN "/dsr":return%+=(J%AND2)
18280 WHEN "/rng":return%+=(J%AND4)
18290 WHEN "/dcd":return%+=(J%AND8)
18300 OTHERWISE:PROChalt(FNmsg0("Eparam")):=0
18310 ENDCASE
18320UNTILA$=""
18330=return%
18340
18350DEFFNfree(A$)
18360LOCALn%,f%,r%,B$,C$
18370SYS"Wimp_SlotSize",-1,-1TO,n%,f%
18380REPEATB$=FNparam(A$)
18390 IFLEFT$(B$,1)="/"THEN
18400 C$=FNvalue(B$)
18410 CASELEFT$(B$,2)OF
18420 WHEN"me":r%=n%+f%
18430 WHEN"ne":r%=n%
18440 WHEN"fr":r%=f%
18450 WHEN"in":r%=HIMEM-END
18460 WHEN"de":SYS"XOS_FSControl",49,C$TOr%;F%:IFFNtf10(F%)=0THENr%=0
18470 ENDCASE
18480 ELSE
18490 IFB$>""THENPROCsetv(B$,STR$r%)
18500 ENDIF
18510UNTILA$=""
18520=r%
18530
18540DEFFNif(A$,RETURNcom$)
18550LOCAL test$,if$,not%,return%,l%,m%,n%
18560l%=INSTR(A$,"("):m%=INSTR(A$,")",l%):n%=INSTR(A$," ",m%)
18570IF l%*m%*n%=0 THENPROClog(FNmsg0("Eif")):=0
18580not%=FALSE:test$=MID$(A$,l%+1,m%-l%-1):if$=MID$(A$,n%+1)
18590IFLEFT$(test$,1)="!" THENnot%=TRUE:test$=MID$(test$,2)
18600return%=FNcommand(test$):IFnot% THENreturn%=-(return%=0)
18610IF return%<>0ANDstop%=0THENreturn%=FNcommand(if$) ELSEcom$=""
18620=return%
18630
18640DEFFNcase(A$)
18650caslev%+=1:IFcaslev%>casmax%THENPROChalt(FNmsg0("Ecase")):=0
18660case$(caslev%)=FNparam(A$):casmatch%?caslev%=0:=1
18670
18680DEFFNwhen(A$,RETURNcom$)
18690LOCALm%,B$:m%=FALSE
18700IFcaslev%=0 THENPROChalt(FNmsg0("Ewhen")):=0
18710REPEATB$=FNparam(A$)
18720 IFB$=case$(caslev%)THENm%=TRUE:casmatch%?caslev%=1
18730UNTILA$=""
18740IFm%=FALSE THENcom$=""
18750=0
18760
18770DEFPROCotherwise(RETURNcom$)
18780IFcaslev%=0 THENPROChalt(FNmsg0("Ewhen")):ENDPROC
18790IFcasmatch%?caslev%=1 THENcom$=""
18800ENDPROC
18810
18820DEFFNendcase
18830IFcaslev%=0 THENPROChalt(FNmsg0("Ewhen")):=0
18840caslev%-=1:=1
18850
18860DEFFNtesteq(c$,A$)
18870LOCALr%,n%,l%,c%,b$,B$,C$:r%=0
18880B$=FNparam(A$):C$=FNparam(A$)
18890b$=B$+C$:n%=TRUE:FORl%=1TOLENb$:c%=ASCMID$(b$,l%,1)
18900 IFc%<46ORc%>57ORc%=47THENn%=FALSE:l%=LENb$
18910NEXT
18920LOCALERROR
18930ONERRORLOCAL:PROClog(FNmsg1("Ecomp",c$)):ENDPROC
18940CASEc$OF
18950 WHEN"?eq":IFn%THENr%=(VALB$=VALC$)ELSEr%=(B$=C$)
18960 WHEN"?ne":IFn%THENr%=(VALB$<>VALC$)ELSEr%=(B$<>C$)
18970 WHEN"?lt":IFn%THENr%=(VALB$<VALC$)ELSEr%=(B$<C$)
18980 WHEN"?gt":IFn%THENr%=(VALB$>VALC$)ELSEr%=(B$>C$)
18990 WHEN"?le":IFn%THENr%=(VALB$<=VALC$)ELSEr%=(B$<=C$)
19000 WHEN"?ge":IFn%THENr%=(VALB$>=VALC$)ELSEr%=(B$>=C$)
19010ENDCASE
19020=-(r%<>0)
19030
19040DEFFNeval(A$)
19050LOCALB$
19060return$=""
19070B$=FNparam(A$)
19080LOCAL ERROR
19090ON ERROR LOCAL:PROClog(FNmsg1("Eeval",B$)):=0
19100return$=STR$(EVALB$)
19110=-1
19120
19130DEFFNstring(A$)
19140LOCALa%,s%,l%,s$,b$,B$,C$:a%=0:s%=0:l%=0
19150REPEATB$=FNparam(A$)
19160 IFLEFT$(B$,1)="/"THEN
19170 C$=FNvalue(B$):CASELEFT$(B$,3)OF
19180 WHEN"siz":a%=1
19190 WHEN"low":a%=2
19200 WHEN"lef":a%=3:s%=VALC$
19210 WHEN"rig":a%=4:s%=VALC$
19220 WHEN"sta":a%=5:s%=VALC$
19230 WHEN"len":l%=VALC$
19240 WHEN"ins":a%=6:b$=C$
19250 WHEN"upp":a%=7
19260 ENDCASE
19270 ELSE
19280 s$=B$
19290 ENDIF
19300UNTILA$=""
19310CASEa%OF
19320 WHEN1:return$=STR$LENs$
19330 WHEN2:return$=FNlower(s$)
19340 WHEN3:return$=LEFT$(s$,s%)
19350 WHEN4:return$=RIGHT$(s$,s%)
19360 WHEN5:IFl%<1THENreturn$=MID$(s$,s%)ELSEreturn$=MID$(s$,s%,l%)
19370 WHEN6:return$=STR$(INSTR(s$,b$))
19380 WHEN7:return$=FNupper(s$)
19390 OTHERWISE:return$=s$
19400ENDCASE
19410=-1
19420
19430DEFFNmovefile(A$)
19440LOCALl%,B$
19450PROCprint(FNmsg0("Fmove1")," ","")
19460B$=FNparam(A$)
19470IFA$=""THENPROCprint("",FNmsg0("Fbad"),""):=0
19480l%=INSTR(A$,"*")
19490IFl%>0 THEN
19500 REPEATA$=LEFT$(A$,l%-1)+RIGHT$(STR$(TIME),4)+MID$(A$,l%+1)
19510 PROCpoll(slice%)
19520 UNTILFNtestfile(A$)<>1
19530ENDIF
19540PROCprint("",FNmsg2("Fto",B$,A$),"")
19550SYS"XOS_FSControl",25,B$,A$ TO;F%
19560IF (F%AND1) THEN
19570 SYS"XOS_FSControl",26,B$,A$,%10000010 TO;F%
19580ENDIF
19590PROCsetv("$dest",A$)
19600=-((F%AND1)=0)
19610
19620DEFFNcopyfile(A$)
19630LOCALl%,act%,s$,d$,n%,B$,C$
19640act%=0:s$="":d$=""
19650PROCprint(FNmsg0("Fcopy")," ","")
19660REPEATB$=FNparam(A$)
19670 IFLEFT$(B$,1)="/"THEN
19680 C$=FNvalue(B$):CASELEFT$(B$,2)OF
19690 WHEN"ta":act%=1:n%=VALC$:IFn%=0THENn%=50
19700 WHEN"he":act%=2:n%=VALC$:IFn%=0THENn%=50
19710 ENDCASE
19720 ELSE
19730 IFs$=""THENs$=B$:ELSEd$=B$
19740ENDIF
19750UNTILA$=""
19760IFd$=""THENPROCprint("",FNmsg0("Fbad"),""):=0
19770l%=INSTR(d$,"*"):IFl%>0 THEN
19780 REPEATd$=LEFT$(d$,l%-1)+RIGHT$(STR$(TIME),4)+MID$(d$,l%+1)
19790 UNTILFNtestfile(d$)<>1
19800ENDIF
19810PROCprint("",FNmsg2("Fto",B$,A$),"")
19820l%=0:CASEact%OF
19830 WHEN0:SYS"XOS_FSControl",26,s$,d$TO;F%:l%=-((F%AND1)=0)
19840 WHEN1:PROCprint(FNmsg0("Ftail"),"",""):l%=FNtail(s$,d$,n%)
19850 WHEN2:PROCprint(FNmsg0("Fhead"),"",""):l%=FNhead(s$,d$,n%)
19860ENDCASE
19870PROCsetv("$dest",A$)
19880=l%
19890
19900DEFFNappend(A$)
19910LOCALS%,r%,ff%,tf%,f$,t$,F%
19920PROCprint(FNmsg0("Fapp")," ","")
19930f$=FNparam(A$):t$=FNparam(A$)
19940IFt$=""THENPROCprint("",FNmsg0("Fbad"),""):=0
19950PROCprint("",FNmsg2("Fto",f$,t$),"")
19960ff%=FNopenin(f$):IFff%=0THENPROClog(FNmsg1("Fsource",f$)):=0
19970tf%=FNopenup(t$):IFtf%=0THENSYS"XOS_File",11,t$,&FFF,,0,0:tf%=FNopenout(t$)
19980IFtf%>0 ANDEXT#ff%>0THEN
19990 PTR#tf%=EXT#tf%:S%=0:REPEATSYS"XOS_GBPB",4,ff%,tmp%,256TO,,,r%;F%
20000 IFr%<>256AND(F%AND1)=0THENSYS"XOS_GBPB",2,tf%,tmp%,256-r%TO;F%:PROCpoll(slice%)
20010 S%+=256-r%
20020UNTILS%>=EXT#ff%OR(F%AND1)<>0
20030ENDIF
20040PROCcf(ff%):PROCcf(tf%)
20050=1
20060
20070DEFFNtail(s$,d$,l%)
20080LOCALn%,m%,A$
20090ff%=FNopenin(s$):IFff%=0THENPROClog(FNmsg1("Fsource",s$)):=0
20100SYS"XOS_File",11,d$,&FFF,,0,0:tf%=FNopenout(d$)
20110IFtf%>0 ANDEXT#ff%>0THEN
20120 n%=0:REPEAT
20130 A$=GET$#ff%:n%+=1:PROCpoll(slice%*2)
20140 UNTILEOF#ff%:PTR#ff%=0
20150 m%=n%-l%:IFm%<0THENm%=0
20160 n%=0:REPEAT
20170 A$=GET$#ff%:n%+=1:PROCpoll(slice%*2)
20180 UNTILn%>=m%
20190 REPEAT
20200 A$=GET$#ff%:BPUT#tf%,A$:PROCpoll(slice%*2)
20210 UNTILEOF#ff%
20220ENDIF
20230PROCcf(ff%):PROCcf(tf%)
20240=1
20250
20260DEFFNhead(s$,d$,l%)
20270LOCALn%,m%,A$
20280ff%=FNopenin(s$):IFff%=0THENPROClog(FNmsg1("Fsource",s$)):=0
20290SYS"XOS_File",11,d$,&FFF,,0,0:tf%=FNopenout(d$)
20300IFtf%>0 ANDEXT#ff%>0THEN
20310 n%=0:REPEAT
20320 A$=GET$#ff%:BPUT#tf%,A$:n%+=1:PROCpoll(slice%*2)
20330 UNTILEOF#ff%ORn%>=l%
20340ENDIF
20350PROCcf(ff%):PROCcf(tf%)
20360=1
20370
20380DEFFNdelete(A$)
20390LOCALw%,B$
20400w%=0
20410REPEATB$=FNparam(A$)
20420IFLEFT$(B$,3)="/wi"THEN
20430 w%=TRUE
20440 ELSE
20450 IFw%=0THENSYS"XOS_File",6,B$TO;F%ELSESYS"XOS_FSControl",27,B$,,2TO;F%
20460ENDIF
20470UNTILA$=""
20480=-((F%AND1)=0)
20490
20500DEFFNdataopen(A$)
20510LOCALl%,h%,type%,B$
20520B$=FNparam(A$)
20530IFA$=""THENPROChalt(FNmsg0("Edata")):=0
20540PROCprint(FNmsg0("DataOpen")," ","")
20550h%=FNtaskhand(B$)
20560SYS"XOS_File",23,A$ TO l%,,,,,,type%
20570IFh%<>0 ANDl%=1 THEN
20580 return%=1
20590 PROCprint("",A$+" (type &"+STR$~type%+") to "+B$,"")
20600 q%!12=0:q%!16=5:q%!20=0:q%!24=0:q%!28=0:q%!32=0:q%!36=0
20610 q%!40=type%:$(q%+44)=A$+CHR$0:!q%=47+LENA$+1ANDNOT3
20620 SYS"Wimp_SendMessage",18,q%,h%
20630ELSE
20640 return%=0
20650 IFh%=0THENPROCprint("",FNmsg1("Enotask",B$),"")
20660 IFl%<>1THENPROCprint("",FNmsg1("Enofile",A$),"")
20670ENDIF
20680=return%
20690
20700DEFPROClisttasks
20710LOCALl%
20720PROCwarn_txt(FNmsg0("TaskList1"))
20730FORl%=0TOtaskmax%
20740IFtaskh%(l%)>0 THEN
20750 PROCf_list(STR$~taskh%(l%),FNtaskname(taskh%(l%))+" ("+taskn$(l%)+")")
20760 IFtaskex$(l%)>""THENPROCf_list(""," exit: "+taskex$(l%))
20770ENDIF
20780NEXT
20790PROCwarn_txt(FNmsg0("TaskList2"))
20800FORl%=0TOtwmax%
20810IFtwh%(l%)>0 THEN
20820 PROCf_list(STR$~twh%(l%),twcom$(l%)+" ("+twname$(l%)+")")
20830 IFtwexit$(l%)>""THENPROCf_list(""," exit: "+twexit$(l%))
20840ENDIF
20850NEXT
20860ENDPROC
20870
20880DEFFNoscli(A$)
20890LOCALB$
20900REPEATB$=FNparam(A$)
20910 SYS"XWimp_StartTask",B$ TO;F%
20920UNTILA$=""
20930=(F%AND1)
20940
20950DEFFNtask(A$)
20960LOCALa%,w%,h%,ts%,B$,C$
20970wait%=0:a%=0
20980REPEATa%+=1:UNTILtaskh%(a%)=0ORa%=taskmax%
20990IFtaskh%(a%)<>0 THENPROChalt(FNmsg0("Etask2")):ENDPROC
21000taskn$(a%)="task"+STR$a%:taskex$(a%)="":h%=0
21010REPEATB$=FNparam(A$)
21020IFLEFT$(B$,1)="/"THEN
21030 C$=FNvalue(B$)
21040 CASELEFT$(B$,2)OF
21050 WHEN"ki","de":h%=FNkilltask(C$):B$="":A$=""
21060 WHEN"na","id":taskn$(a%)=C$
21070 WHEN"ex":taskex$(a%)=C$
21080 WHEN"wa":wait%=TRUE
21090 ENDCASE
21100ENDIF
21110UNTILA$=""
21120IFB$>""THEN
21130 PROCprint(FNmsg1("TaskStart1",B$),"","")
21140 SYS"XWimp_StartTask",B$ TO;F%
21150 IF(F%AND1)=0 THEN
21160 taskstart%=a%:ts%=0
21170 REPEATts%+=1:PROCpoll(0):UNTILtaskstart%=0ORts%>10:taskstart%=0
21180 ENDIF
21190 IFtaskh%(a%)<>0ANDwait%<>0THEN
21200 REPEAT:PROCpoll(50):UNTILtaskh%(a%)=0
21210 ENDIF
21220 h%=-((F%AND1)=0)
21230ENDIF
21240=h%
21250
21260DEFFNkilltask(A$)
21270LOCALl%,h%
21280IFA$=""THEN
21290 l%=taskmax%:WHILEtaskh%(l%)=0ANDl%>0:l%-=1:ENDWHILE
21300 IF taskh%(l%)>0 THENh%=taskh%(l%)
21310ELSE
21320 FORl%=0TOtaskmax%
21330 IFtaskh%(l%)>0THEN
21340 IFFNtaskname(taskh%(l%))=A$ ORtaskn$(l%)=A$ THENh%=taskh%(l%)
21350 ENDIF
21360 NEXT
21370ENDIF
21380IFh%<>0 THEN
21390 PROClog("Killing task: "+A$)
21400 !q%=256:q%!12=0:q%!16=0:SYS"Wimp_SendMessage",17,q%,h%:PROCpoll(0)
21410ENDIF
21420=-(h%<>0)
21430
21440DEFFNtesttask(A$)
21450=FNtaskhand(A$)
21460
21470DEFFNtaskname(h%)
21480LOCALf$,n%
21490f$="":SYS"XTaskManager_TaskNameFromHandle",h% TOh%;F%
21500IF(F%AND1)=0 THEN
21510 n%=0:WHILEh%?n%>31:f$+=CHR$(h%?n%):n%+=1:ENDWHILE
21520ENDIF
21530=f$
21540
21550DEFFNtaskhand(A$)
21560LOCALA%,r%,l%,h%,B$
21570r%=0:A%=0:A$=FNlower(A$)
21580REPEAT
21590 SYS"TaskManager_EnumerateTasks",A%,buffer%,&100 TO A%,l%
21600 ptr%=0
21610 WHILE(A%>=0 ANDr%=0 AND(ptr%+buffer%)<=l%)
21620 h%=buffer%!ptr%:B$=FNstr(buffer%!(ptr%+4)):ptr%+=16
21630 IFA$=FNlower(B$) THENr%=h%
21640 ENDWHILE
21650UNTIL A%<0 OR r%<>0
21660=r%
21670
21680DEFPROCsorttasks
21690LOCALl%
21700FORl%=0TOtaskmax%-1
21710 IFtaskh%(l%)=0ANDtaskh%(l%+1)<>0 THEN
21720 SWAPtaskh%(l%),taskh%(l%+1)
21730 SWAPtaskn$(l%),taskn$(l%+1)
21740 SWAPtaskex$(l%),taskex$(l%+1)
21750 ENDIF
21760NEXT
21770ENDPROC
21780
21790DEFFNtaskw(A$)
21800LOCALtw%,w%,ts%,n%,F%,out%,B$,C$,S$
21810tw%=0:wait%=0:F%=0:out%=TRUE
21820WHILEtwh%(tw%)<>0ANDtw%<twmax%:tw%+=1:ENDWHILE
21830IFtw%=twmax%THENPROChalt(FNmsg0("Etask2")):=0
21840SYS"Wimp_SlotSize",-1,-1TO,n%:n%=n%DIV1024
21850S$=STR$n%+"k":twname$(tw%)="SDtask"+STR$tw%:twexit$(tw%)="":twk%(tw%)=0
21860REPEATB$=FNparam(A$)
21870IFLEFT$(B$,1)="/"THEN
21880 C$=FNvalue(B$)
21890 CASELEFT$(B$,2)OF
21900 WHEN"si":S$=C$
21910 WHEN"na","id":twname$(tw%)=C$
21920 WHEN"ex":twexit$(tw%)=C$
21930 WHEN"ou":PROCcf(twf%(tw%)):twf%(tw%)=FNopenout(C$)
21940 WHEN"wa":wait%=TRUE
21950 WHEN"ke":twk%(tw%)=TRUE
21960 WHEN"ki":PROCmesstw(C$,&808C4)
21970 WHEN"su":PROCmesstw(C$,&808C6)
21980 WHEN"re":PROCmesstw(C$,&808C7)
21990 WHEN"no":out%=FALSE
22000 ENDCASE
22010 B$=""
22020ENDIF
22030UNTILA$=""
22040IFB$>""THEN
22050 PROCprint(FNmsg1("TaskStart1",twname$(tw%)),"",""):twcom$(tw%)=B$
22060 IFtwf%(tw%)=0THENPROCinit_tww(tw%,out%,twname$(tw%))
22070 SYS"XWimp_StartTask","TaskWindow """+B$+""" -quit -wimpslot "+S$+" -name """+twname$(tw%)+""" -task &"+STR$~task%+" -txt &"+STR$~(task%+tw%) TO;F%
22080 ts%=0:REPEATts%+=1:PROCpoll(0):UNTILtwh%(tw%)<>0ORts%>10
22090 IFtwh%(tw%)=0THENPROCcf(twf%(tw%)):twname$(tw%)="":PROCclosew(tww%(tw%))
22100 IFwait%<>0ANDtwh%(tw%)<>0THEN
22110 REPEAT:PROCpoll(50):UNTILtwh%(tw%)=0
22120 ENDIF
22130ENDIF
22140=ABS((F%AND1)=0)
22150
22160DEFPROCmesstw(A$,m%)
22170A$=FNlower(A$)
22180LOCALtw%:FORtw%=0TOtwmax%
22190IFA$=FNlower(twname$(tw%))ANDtwh%(tw%)>0THEN
22200 !q%=20:q%!4=0:q%!8=0:q%!12=0:q%!16=m%
22210 SYS"Wimp_SendMessage",17,q%,twh%(tw%)
22220 CASEm%OF
22230 WHEN&808C6:$twt%(tw%)=FNmsg1("TaskSusp",twname$(tw%)):PROCdotitle(tww%(tw%))
22240 WHEN&808C7:$twt%(tw%)=FNmsg1("TaskRun",twname$(tw%)):PROCdotitle(tww%(tw%))
22250 ENDCASE
22260 tw%=twmax%
22270ENDIF
22280NEXT
22290ENDPROC
22300
22310DEFFNopen(A$)
22320LOCALf%,r%,err$,B$,C$
22330err$="":f%=0:WHILEfileh%(f%)<>0ANDf%<fmax%:f%+=1:ENDWHILE
22340IFf%=fmax%THENPROChalt(FNmsg0("Efullfile")):=0
22350fileid$(f%)="":filewr%(f%)=1:r%=&4F
22360REPEATB$=FNparam(A$)
22370IFLEFT$(B$,1)="/"THEN
22380 C$=FNvalue(B$)
22390 CASELEFT$(B$,2)OF
22400 WHEN"na","id":fileid$(f%)=C$
22410 WHEN"re":filewr%(f%)=1:r%=&4F
22420 WHEN"wr":filewr%(f%)=2:r%=&8F
22430 WHEN"rw":filewr%(f%)=3:r%=&CF
22440 WHEN"er":err$=C$
22450 ENDCASE
22460 ELSE
22470 filen$(f%)=B$
22480ENDIF
22490UNTILA$=""
22500IFfileid$(f%)>""THENSYS"XOS_Find",r%,filen$(f%)TOfileh%(f%);F%
22510IF(F%AND1)<>0THEN
22520 fileh%(f%)=0:fileid$(f%)=""
22530 IFerr$=""THENPROChalt(FNmsg0("Efilefail")):ELSEPROCaddevent(err$,9)
22540 ELSE
22550 IFfilewr%(f%)=2THENSYS"XOS_File",18,filen$(f%),&FFF
22560ENDIF
22570=fileh%(f%)
22580
22590DEFFNclose(A$)
22600LOCALn%,r%,B$,C$
22610r%=0
22620REPEATB$=FNparam(A$)
22630 IFLEFT$(B$,1)="/"THEN
22640 C$=FNvalue(B$)
22650 CASELEFT$(B$,2)OF
22660 WHEN"na","id":FORn%=0TOfmax%
22670 IFfileid$(n%)=C$THENPROCcf(fileh%(n%)):fileid$(n%)="":n%=fmax%:r%=1
22680 NEXT
22690 ENDCASE
22700 ENDIF
22710UNTILA$=""
22720=r%
22730
22740DEFFNread(A$)
22750LOCALf%,r%,eof$,B$,C$
22760f%=-1:r%=0:eof$=""
22770REPEATB$=FNparam(A$)
22780 IFLEFT$(B$,1)="/"THEN
22790 C$=FNvalue(B$)
22800 CASELEFT$(B$,2)OF
22810 WHEN"na","id":f%=FNfileidtoh(C$)
22820 WHEN"eof":eof$=C$
22830 ENDCASE
22840 ELSE
22850 IFf%>-1ANDf%<fmax%THEN
22860 IF(filewr%(f%)AND1)=0THENPROChalt(FNmsg0("Enoread")):=0
22870 IFNOTEOF#fileh%(f%)THENPROCsetv(B$,GET$#fileh%(f%)):r%=1
22880 IFEOF#fileh%(f%)ANDeof$>""THENPROCaddevent(eof$,9)
22890 ENDIF
22900 ENDIF
22910UNTILA$=""
22920=r%
22930
22940DEFFNwrite(A$)
22950LOCALf%,r%,B$,C$
22960f%=-1:r%=0
22970REPEATB$=FNparam(A$)
22980 IFLEFT$(B$,1)="/"THEN
22990 C$=FNvalue(B$)
23000 CASELEFT$(B$,2)OF
23010 WHEN"na","id":f%=FNfileidtoh(C$)
23020 ENDCASE
23030 ELSE
23040 IFf%>-1ANDf%<fmax%THEN
23050 IF(filewr%(f%)AND2)=0THENPROChalt(FNmsg0("Enowrite")):=0
23060 BPUT#fileh%(f%),B$
23070 ENDIF
23080 ENDIF
23090UNTILA$=""
23100=r%
23110
23120DEFFNptr(A$)
23130LOCALf%,r%,s%,B$,C$
23140f%=-1:s%=-1
23150REPEATB$=FNparam(A$)
23160 IFLEFT$(B$,1)="/"THEN
23170 C$=FNvalue(B$)
23180 CASELEFT$(B$,2)OF
23190 WHEN"na","id":f%=FNfileidtoh(C$)
23200 WHEN"se":IFFNlower(C$)="eof"THENs%=-2:ELSEs%=VALC$
23210 ENDCASE
23220 ENDIF
23230UNTILA$=""
23240r%=0
23250IFf%>-1ANDfileh%(f%)<>0 THEN
23260 IFs%=-2THENPTR#fileh%(f%)=EXT#fileh%(f%):ELSEIFs%>=0THENPTR#fileh%(f%)=s%
23270 r%=PTR#fileh%(f%)
23280ENDIF
23290=r%
23300
23310DEFPROClistfiles
23320PROCf_list("Identifier","Filename")
23330LOCALf%:FORf%=0TOfmax%
23340IFfileh%(f%)>0THENPROCf_list(fileid$(f%),filen$(f%))
23350NEXT
23360ENDPROC
23370
23380DEFFNfileidtoh(A$)
23390LOCALf%:f%=0:WHILEfileid$(f%)<>C$ANDf%<fmax%:f%+=1:ENDWHILE
23400IFf%=fmax%THENPROChalt(FNmsg0("Efileid")):=0
23410=f%
23420
23430DEFPROCmenudef(A$)
23440LOCALn%,l%,m$,n$,a$,b$,B$,C$:n%=-1:m$="":n$=""
23450REPEATB$=FNparam(A$)
23460 IFLEFT$(B$,1)="/"THEN
23470 C$=FNvalue(B$)
23480 CASELEFT$(B$,2)OF
23490 WHEN"co":n%=-2
23500 WHEN"ic":n%=0:REPEATn%+=1:UNTILibarid$(n%)=C$ORibar%(n%)=0ORn%=imax%
23510 IFn%=imax%ORC$=""THENPROClog(FNmsg0("Eicon1")):n%=-5
23520 ENDCASE
23530 ELSE
23540 l%=INSTR(B$,":")
23550 IFl%>0THEN
23560 a$=LEFT$(B$,l%-1):b$=MID$(B$,l%+1)
23570 ELSE
23580 a$=B$:b$=""
23590 ENDIF
23600 IFa$=""ORb$=""THENPROChalt(FNmsg1("Emenu",B$)):A$=""
23610 IFLENm$+LENa$<252ANDLENn$+LENb$<252THEN
23620 m$+=a$+CHR$0:n$+=b$+CHR$0
23630 ELSE
23640 PROChalt(FNmsg0("Ebigmenu")):A$=""
23650 ENDIF
23660 ENDIF
23670UNTILA$=""
23680IFRIGHT$(m$,1)=" "THENm$=LEFT$(m$,LENm$-1)
23690CASEn%OF
23700 WHEN-1:usermenu$(0)=m$:usermenu$(1)=n$
23710 WHEN-2:logmenu$(0)=m$:logmenu$(1)=n$
23720 OTHERWISE:IFn%>=0ANDn%<=imax%THENimenu$(n%,0)=m$:imenu$(n%,1)=n$:
23730ENDCASE
23740ENDPROC
23750
23760DEFFNmakemenu(A$,B$)
23770LOCALu$,a$,b$:umenu%=0:u$=""
23780REPEAT
23790 umenu%+=1
23800 a$=FNgetpar(A$,CHR$0):b$=FNgetpar(B$,CHR$0)
23810 u$+=","+a$:umenu$(umenu%,0)=a$:umenu$(umenu%,1)=b$
23820UNTILA$=""ORumenu%=menumax%:u$=MID$(u$,2)
23830=u$
23840
23850DEFPROClistmenu
23860LOCALC$
23870IFusermenu$(0)>""THENC$=FNmakemenu(usermenu$(0),usermenu$(1)):PROClmenu("user")
23880IFlogmenu$(0)>""THENC$=FNmakemenu(logmenu$(0),logmenu$(1)):PROClmenu("debug")
23890FORZ%=0TOimax%
23900 IFimenu$(Z%,0)>""THENC$=FNmakemenu(imenu$(Z%,0),imenu$(Z%,1)):PROClmenu("icon: "+ibarid$(Z%))
23910NEXT
23920ENDPROC
23930
23940DEFPROClmenu(t$)
23950LOCALl%
23960PROCwarn_txt("Label Action ("+t$+")")
23970FORl%=1TOumenu%
23980 PROCf_list(umenu$(l%,0),umenu$(l%,1))
23990NEXT
24000ENDPROC
24010
24020DEFPROCanalyse(A$)
24030LOCALB$,C$
24040REPEATB$=FNparam(A$)
24050 CASELEFT$(B$,1)OF
24060 WHEN"/":C$=FNvalue(B$):PROClog("Qualifier /"+B$+" value="+C$)
24070 OTHERWISE:PROClog("Parameter "+B$)
24080 ENDCASE
24090UNTILA$=""
24100ENDPROC
24110
24120DEFFNmulticom(RETURN str$):REM split on ; (ASCII 59)
24130LOCALB$,A%,B%,F%,qc%,bc%,cc%,esc%,l%
24140B$="":B%=0:qc%=0:bc%=0:cc%=0:esc%=0:F%=0:l%=LENstr$
24150IFstr$=""THEN=""
24160REPEAT:B%+=1:A%=ASCMID$(str$,B%,1)
24170IFesc%=92 THEN
24180 B$+=CHR$A%:esc%=0
24190 ELSE
24200 IFA%=34ANDbc%=0 THENqc%+=1
24210 IFqc%MOD2=0 THEN
24220 IFA%=40 THENbc%+=1
24230 IFA%=41 THENbc%-=1
24240 IFA%=123 THENcc%+=1
24250 IFA%=125 THENcc%-=1
24260 IFbc%=0AND(qc%MOD2)=0 THEN
24270 IFA%=59ANDB%>1 THENF%=TRUE
24280 ENDIF
24290 ENDIF
24300 esc%=A%:IFF%=0ANDA%<>92THENB$+=CHR$A%
24310ENDIF
24320UNTILF%<>0ORB%=l%:IFB%=l% THENB%+=1
24330str$=FNtrim(MID$(str$,B%+1))
24340B$=FNsubst(B$)
24350=FNtrim(B$)
24360
24370DEFFNsubst(A$)
24380LOCALl%,f%,c%,a$,l$,B$:l$=""
24390c%=INSTR(A$,"%"):IFc%=0THEN:=A$
24400c%=c%-2:IFc%<0THENc%=0
24410B$=LEFT$(A$,c%)
24420REPEATc%+=1:a$=MID$(A$,c%,1)
24430 IFl$="\"THEN
24440 B$+=a$:l$=""
24450 ELSE
24460 IFa$="%"THEN
24470 FORl%=0TOvmax%
24480 IFvar$(l%,0)>""ANDvar$(l%,0)=MID$(A$,c%+1,LENvar$(l%,0)) THENB$+=var$(l%,1):c%+=LENvar$(l%,0):l%=vmax%+1
24490 NEXT
24500 IFl%=vmax% THENB$+="%"
24510 ELSE
24520 B$+=a$:l$=a$
24530 ENDIF
24540 ENDIF
24550UNTILc%>=LENA$
24560=B$
24570
24580DEFFNparam(RETURN str$):REM split a param or qual from line
24590LOCALB$,A%,B%,F%,qc%,bc%,cc%,esc%,l%
24600B$="":B%=0:qc%=0:bc%=0:cc%=0:esc%=0:F%=0:l%=LENstr$
24610IFstr$=""THEN=""
24620REPEAT:B%+=1:A%=ASCMID$(str$,B%,1)
24630IFesc%=92THEN
24640 B$+=CHR$A%:esc%=0
24650 ELSE
24660 IFA%=34ANDbc%=0 THENqc%+=1
24670 IFqc%MOD2=0 THEN
24680 IFA%=40 THENbc%+=1
24690 IFA%=41 THENbc%-=1
24700 IFA%=123 THENcc%+=1
24710 IFA%=125 THENcc%-=1
24720 IFbc%=0ANDcc%=0 THEN
24730 IF(A%=32ORA%=47)ANDB%>1 THENF%=TRUE
24740 ENDIF
24750 ENDIF
24760 esc%=A%:IFF%=0ANDA%<>92THENB$+=CHR$A%
24770ENDIF
24780UNTILF%<>0ORB%=l%:IFB%=l% THENB%+=1
24790B$=FNtrim(B$)
24800str$=FNcline(FNtrim(MID$(str$,B%)))
24810=FNstq(B$)
24820
24830DEFFNstq(B$)
24840LOCALl%,r%
24850l%=ASCB$:r%=ASCRIGHT$(B$,1):REM strip quotes from around a string
24860IFl%=34ANDr%=34 THENB$=MID$(B$,2,LENB$-2)
24870IFl%=123ANDr%=125 THEN
24880r%=FNcommand(MID$(B$,2,LENB$-2)):B$=FNvv("$status")
24890ENDIF
24900=B$
24910
24920DEFFNupper(A$)
24930LOCALB$,l%,c%:B$=""
24940FORl%=1TOLENA$:c%=ASCMID$(A$,l%,1):IFc%>96ANDc%<123THENc%-=32
24950B$+=CHR$c%:NEXT:=B$
24960
24970DEFFNcline(A$)
24980IFA$="-"THENA$=FNsubst(FNline(stage%)):PROClog("Continuation line:"+A$):stage%+=1
24990=A$
25000
25010DEFFNvalue(RETURN A$):REM split value assignment from qual
25020LOCALB$,A%,B%:WHILELEFT$(A$,1)="/":A$=MID$(A$,2):ENDWHILE
25030A%=INSTR(A$,"="):IFA%=0THENA$=FNlower(A$):=""
25040B$=MID$(A$,A%+1):A$=FNlower(LEFT$(A$,A%-1))
25050=FNstq(B$)
25060
25070DEFPROCexit
25080PROCprint("",FNmsg0("Exit"),"")
25090run%=FALSE:ENDPROC
25100
25110DEFFNdebug(A$)
25120IFA$=""THEN=1
25130=VAL(A$)
25140
25150DEFFNd(A%,B%,C%,D%)
25160=USR(driver)
25170
25180DEFPROCgetenv
25190LOCALA$,B$
25200SYS"OS_GetEnv"TOA$
25210A$=MID$(A$,INSTR(FNlower(A$),"!runi")):quiet%=0:file$="":spar$=""
25220A$=MID$(A$,INSTR(A$," ")+1):REM discard !Runimage part
25230REPEAT
25240 B$=FNparam(A$)
25250 CASELEFT$(B$,2) OF
25260 WHEN"-f":file$=FNparam(A$)
25270 WHEN"-a":file$="SLIPdial:default"
25280 WHEN"-q":quiet%=TRUE
25290 WHEN"-s":sprsz%=VALFNparam(A$):IFsprsz%<&1B00 THENsprsz%=&1B00
25300 OTHERWISE:spar$=spar$+B$+" "
25310 ENDCASE
25320UNTILB$=""
25330ENDPROC
25340
25350DEFFNnextsp(RETURN A$)
25360LOCALB$,a%:a%=INSTR(A$," ")
25370IFa%>0THEN
25380 B$=FNtrim(LEFT$(A$,a%-1)):A$=FNtrim(MID$(A$,a%+1))
25390 ELSE
25400 B$=A$:A$=""
25410ENDIF
25420=B$
25430
25440DEFPROCchain(N$)
25450PROCsetv("$caller",scriptname$):run%=0:PROCinitscript(N$)
25460ENDPROC
25470
25480DEFPROCinitscript(N$)
25490REM must be stopped to load...
25500IFrun%<>0THENPROClog(FNmsg0("Eload1")):ENDPROC
25510PROCcleanup
25520p%=0:IFspar$>""THEN
25530 REPEAT:p%+=1:B$=FNparam(spar$):PROCsetv("p"+STR$p%,B$):UNTILspar$=""
25540ENDIF
25550IFN$>""ANDFNloadscript(N$,0) THEN
25560 PROCprint(FNmsg0("Sload2")," "," "):scriptname$=N$:PROCsetv("$script",N$)
25570 run%=TRUE:stage%=0:PROCunpause
25580ENDIF
25590ENDPROC
25600
25610DEFPROCcleanup
25620driverno%=0:port%=0:speed%=19200:PROCclr_txt
25630retry%=1:delay%=30:debug%=FALSE:count%=0:stop$="":error$=""
25640call_lev%=0:caslev%=0:usermenu$()="":logmenu$()="":umenu%=0:alarm$()="":
25650FORn%=0TOvmax%:IFLEFT$(var$(n%,0),1)<>"$"THENvar$(n%,0)=""
25660NEXT
25670FORn%=0TOimax%:IFibar%(n%)>0THEN!icons%=-2:icons%!4=ibar%(n%):SYS"XWimp_DeleteIcon",,icons%TO;F%
25680NEXT:ibarid$()="":ibar%()=0:imenu$()="":alarm$()="":alarmtime%()=0
25690twh%()=0:twname$()="":twexit$()="":taskh%()=0:taskn$()=""
25700taskex$()="":event$()="":umenu$()=""
25710aline$()="":aline%()=0
25720ENDPROC
25730
25740DEFFNloadscript(N$,lib%)
25750LOCALA$,r%,fh1%
25760SYS"XOS_File",23,N$TOr%:IFr%<>1THEN=0
25770r%=0:fh1%=FNopenin(N$)
25780IFfh1%=0 THENPROClog("File not found: "+N$):=0
25790IFlib%=0THENcount%=0:jtl%=1
25800A$=GET$#fh1%
25810IFINSTR(A$,"slipdial")>0 THEN
25820 REPEATA$=GET$#fh1%
25830 IFLEFT$(A$,1)<>"#"ANDA$>"" THEN
25840 PROCaddline(A$,count%)
25850 IFLEFT$(A$,1)=":"THEN
25860 A$=MID$(A$,2):B$=FNparam(A$)
25870 IFB$="autoexec"THENjt%(0)=count%:jt$(0)=B$ ELSEjt%(jtl%)=count%:jt$(jtl%)=B$:jtl%+=1
25880 ENDIF
25890 count%+=1
25900 ENDIF
25910 UNTILEOF#fh1%
25920 IF count%>2000 THEN
25930 PROCcf(fh1%):PROChalt(FNmsg0("Elong")):=0
25940 ELSE
25950 r%=1
25960 ENDIF
25970ELSE
25980 PROChalt(FNmsg0("Eload2")):=0
25990ENDIF
26000PROCcf(fh1%)
26010=r%
26020
26030DEFPROCaddline(A$,n%)
26040IFn%>highest% THEN
26050 CASEn%OF
26060 WHEN0:DIMbuf0$(199)
26070 WHEN200:DIMbuf1$(199)
26080 WHEN400:DIMbuf2$(199)
26090 WHEN600:DIMbuf3$(199)
26100 WHEN800:DIMbuf4$(199)
26110 WHEN1000:DIMbuf5$(199)
26120 WHEN1200:DIMbuf6$(199)
26130 WHEN1400:DIMbuf7$(199)
26140 WHEN1600:DIMbuf8$(199)
26150 WHEN1800:DIMbuf9$(199)
26160 WHEN2000:DIMbufA$(199)
26170 ENDCASE
26180 highest%=n%
26190ENDIF
26200CASE(n%DIV200)OF
26210WHEN0:buf0$(n%)=A$
26220WHEN1:buf1$(n%-200)=A$
26230WHEN2:buf2$(n%-400)=A$
26240WHEN3:buf3$(n%-600)=A$
26250WHEN4:buf4$(n%-800)=A$
26260WHEN5:buf5$(n%-1000)=A$
26270WHEN6:buf6$(n%-1200)=A$
26280WHEN7:buf7$(n%-1400)=A$
26290WHEN8:buf8$(n%-1600)=A$
26300WHEN9:buf9$(n%-1800)=A$
26310WHEN10:bufA$(n%-2000)=A$
26320ENDCASE
26330ENDPROC
26340
26350DEFFNline(n%)
26360IFn%>highest%THEN=""
26370LOCALA$:CASE(n%DIV200)OF
26380WHEN0:A$=buf0$(n%)
26390WHEN1:A$=buf1$(n%-200)
26400WHEN2:A$=buf2$(n%-400)
26410WHEN3:A$=buf3$(n%-600)
26420WHEN4:A$=buf4$(n%-800)
26430WHEN5:A$=buf5$(n%-1000)
26440WHEN6:A$=buf6$(n%-1200)
26450WHEN7:A$=buf7$(n%-1400)
26460WHEN8:A$=buf8$(n%-1600)
26470WHEN9:A$=buf9$(n%-1800)
26480WHEN10:A$=bufA$(n%-2000)
26490OTHERWISE:A$=""
26500ENDCASE
26510=A$
26520
26530DEFFNlibrary(lib_p$)
26540LOCALr%,ae%,B$
26550B$=FNparam(lib_p$):PROClog(FNmsg1("Slib",B$))
26560ae%=jt%(0)
26570r%=FNloadscript(B$,1)
26580IFae%<>jt%(0)ANDr%<>0THENPROCaddevent("call auto "+lib_p$,0)
26590=r%
26600
26610DEFPROClistscript(A$)
26620LOCALst%,fn%
26630PROCwarn_txt(FNmsg0("Slist"))
26640st%=VALFNparam(A$):fn%=VALA$
26650IFst%<0 THENst%=0
26660IFfn%=0ORfn%>count% THENfn%=count%
26670FORc%=st%TOfn%
26680 A$=STR$c%:IFc%=stage% THENA$="*"+A$
26690 A$=RIGHT$(" "+A$,4)+" "
26700 PROCwarn_txt(A$+FNline(c%))
26710NEXT
26720ENDPROC
26730
26740DEFPROClistjt
26750PROCf_list("Label","Line")
26760LOCALn%:FORn%=0TOjtl%-1:PROCf_list(jt$(n%),STR$jt%(n%)):NEXT
26770ENDPROC
26780
26790DEFFNmodemdrv(A$)
26800LOCALr%:r%=0
26810PROCsetv("$init","ATZQ0V1")
26820PROCsetv("$busy","BUSY")
26830PROCsetv("$conn","CONNECT")
26840PROCsetv("$nocarr","NO CARRIER")
26850PROCsetv("$nodial","NO DIALTONE")
26860IFA$>""THEN
26870 IFINSTR(A$,".")=0 THENA$="SlipDialDrv:"+A$
26880 r%=FNsource(A$)
26890ENDIF
26900=r%
26910
26920DEFFNsource(file$)
26930LOCALr%,fh1%,B$,C$
26940r%=0
26950REPEATB$=FNparam(file$)
26960 fh1%=FNopenin(B$)
26970 IFfh1%=0THEN
26980 PROClog(FNmsg1("Fsource",B$)):=0
26990 ELSE
27000 REPEATC$=GET$#fh1%
27010 IFLEFT$(C$,1)<>"#"ANDC$>"" THEN
27020 r%=FNcommand(C$)
27030 ENDIF
27040 UNTILEOF#fh1%
27050 PROCcf(fh1%)
27060 ENDIF
27070UNTILfile$=""
27080=r%
27090
27100DEFPROChelp(A$)
27110LOCALfh1%,n%,r%,B$,C$:msgc%=FALSE:msg$()=""
27120IFA$=""THEN
27130 PROCaddmessage(FNmsg0("Hannounce"))
27140 n%=0:C$=""
27150 REPEATB$=""
27160 REPEAT
27170 SYS"XOS_GBPB",9,sdlang$+".help",tmp%,1,n%,255,"*"TO,,,r%,n%
27180 C$=FNstr(tmp%):B$+=C$+STRING$(15-LENC$," ")
27190 UNTILn%=-1ORLENB$>60
27200 PROCaddmessage(B$)
27210 UNTILn%=-1:PROCaddmessage("")
27220 ELSE
27230 fh1%=FNopenin(sdlang$+".Help."+A$+"*")
27240 IFfh1%>0THEN
27250 PROCaddmessage("Help on "+A$+":")
27260 n%=0
27270 REPEAT
27280 B$=GET$#fh1%:IFB$>""THENn%+=1:PROCaddmessage(B$)
27290 UNTILEOF#fh1%ORn%>msgmax%
27300 PROCaddmessage(""):PROCcf(fh1%)
27310 ELSE
27320 PROChelp("")
27330 ENDIF
27340ENDIF
27350ENDPROC
27360
27370DEFPROCquit(mess$)
27380PROCprint(FNmsg0("Quit2"),mess$,"")
27390PROCfinish
27400END
27410ENDPROC
27420
27430DEFPROCloadconfig
27440fh1%=FNopenin(sdres$+".!Config"):IFfh1%=0 THENERROR0,"No config!":ENDPROC
27450PROCsetinv(config%,1,BGET#fh1%)
27460PROCsetinv(config%,2,BGET#fh1%)
27470PROCsetinv(config%,3,BGET#fh1%)
27480PROCupd_icon(config%,4,GET$#fh1%)
27490IFNOTEOF#fh1%THENPROCupd_icon(config%,7,GET$#fh1%)
27500IFNOTEOF#fh1%THENPROCupd_icon(config%,8,GET$#fh1%)
27510IFNOTEOF#fh1%THENPROCupd_icon(config%,12,GET$#fh1%)
27520IFNOTEOF#fh1%THENPROCsetinv(config%,13,BGET#fh1%)
27530IFNOTEOF#fh1%THENPROCsetinv(config%,14,BGET#fh1%)
27540PROCcf(fh1%)
27550txty%=VALFNic_str(config%,7):IFtxty%<24 THENtxty%=24
27560txtx%=VALFNic_str(config%,8)
27570autowinpos%=FNrdinv(config%,13)
27580 IFtxtx%<40 THENtxtx%=40ELSEIFtxtx%>240THENtxtx%=240
27590twwmax%=VALFNic_str(config%,12)
27600 IFtwwmax%<10 THENtwwmax%=10ELSEIFtwwmax%>100THENtwwmax%=100
27610SYS"OS_Byte",121,(2EOR&80)TO,A%
27620IFfile$=""ANDFNrdinv(config%,3)=0 ANDA%<>&FF THENfile$=FNic_str(config%,4)
27630IFquiet%=0ANDFNrdinv(config%,1)=0 THENPROCcfront(status%,0,-200)
27640ENDPROC
27650
27660DEFPROCsaveconfig
27670fh1%=FNopenout(sdres$+".!Config"):IFfh1%=0 THENENDPROC
27680BPUT#fh1%,FNrdinv(config%,1)
27690BPUT#fh1%,FNrdinv(config%,2)
27700BPUT#fh1%,FNrdinv(config%,3)
27710BPUT#fh1%,FNic_str(config%,4)
27720BPUT#fh1%,FNic_str(config%,7)
27730BPUT#fh1%,FNic_str(config%,8)
27740BPUT#fh1%,FNic_str(config%,12)
27750BPUT#fh1%,FNrdinv(config%,13):autowinpos%=FNrdinv(config%,13)
27760BPUT#fh1%,FNrdinv(config%,14)
27770PROCcf(fh1%)
27780IFFNrdinv(config%,14)=0 THEN
27790 fh1%=FNopenout(sdres$+".!windows"):IFfh1%=0 THENENDPROC
27800 !q%=status%:SYS"Wimp_GetWindowState",,q%
27810 BPUT#fh1%,STR$(q%!4)
27820 BPUT#fh1%,STR$(q%!8)
27830 PROCcf(fh1%)
27840ENDIF
27850ENDPROC
27860
27870DEFFNlomem(A%)
27880IFHIMEM-END<(A%+&2000) THEN=TRUE
27890=FALSE
27900
27910DEFFNnewsrate(A$)
27920LOCALf$,tim,cps%:cps%=0
27930f$=FNparam(A$):IFf$>""THEN
27940 tim=FNfile_age("<Mail$Dir>.folder."+f$+"News")-FNfile_age("<Mail$Dir>.folder."+f$+"NG"):PROClog("Time "+STR$tim)
27950 IFtim>0THENcps%=100*FNfile_size("<Mail$Dir>.folder."+f$+"News")/tim
27960ENDIF
27970=cps%
27980
27990DEFFNfile_age(f$)
28000LOCALfound%,load%,exec%
28010SYS"XOS_File",17,f$TOfound%,,load%,exec%;F%
28020IFfound%=0 OR(F%AND1)<>0 THENPROClog(FNmsg1("Enofile",f$)):=0
28030=(load%AND&FF)*2^32+exec%
28040
28050DEFFNfile_size(f$)
28060LOCALsize%,found%
28070SYS"XOS_File",17,f$TOfound%,,,,size%;F%
28080IFfound%=0 OR(F%AND1)<>0 THENPROClog(FNmsg1("Enofile",f$)):=0
28090=size%
28100
28110DEFFNtrim(A$)
28120REM strips leading & trailing spaces
28130LOCALB$:IFA$>""THENCALLtrimstr%,A$,B$
28140=B$
28150
28160DEFFNlower(A$)
28170IFA$>""THENCALLmklcase%,A$
28180=A$
28190
28200DEFFNstr(a%)
28210LOCALdummy%,B$
28220CALLgetline%,dummy%,a%,B$
28230=B$
28240
28250DEFPROCloadcode
28260LOCALo%,l%,F%
28270SYS"XOS_File",17,sdres$+".code"TOo%,,,,l%;F%
28280IFo%=1ANDl%>0AND(F%AND1)=0THEN
28290 DIMmcode% l%
28300 cpylcase%=mcode%+4:getpath%=mcode%+8:getline%=mcode%+12
28310 getlinez%=mcode%+16:getstr%=mcode%+20:mklcase%=mcode%+24
28320 trimstr%=mcode%+28:chkdelart%=mcode%+32:headerno%=mcode%+36
28330 smatch%=mcode%+40
28340 SYS"XOS_File",16,sdres$+".code",mcode%,0TO;F%
28350 IF(F%AND1)THENERROR0,"Help! I can't find my Code file!"
28360 ELSE
28370 ERROR0,"Help! I can't find my Code file!"
28380ENDIF
28390ENDPROC
28400
28410DEFFNclaimmem(RETURN var%,size%,A$)
28420LOCALF%,ret%
28430IFosver%<&A5 THEN
28440 SYS"XOS_Module",6,,,size%TO,,var%;F%
28450 IF(F%AND1)THENvar%=0
28460 ret%=var%
28470 ELSE
28480 SYS&20066,0,-1,size%,-1,0,-1,0,0,Task$+"_"+A$TO,ret%,,var%;F%
28490 IF(F%AND1)THENvar%=0:ret%=0
28500ENDIF
28510=ret%
28520
28530DEFPROCreleasemem(RETURN var%)
28540LOCALF%
28550IFvar%>0THEN
28560 IFosver%<&A5 THEN
28570 SYS"XOS_Module",7,,var%TO;F%:var%=0
28580 SYS"XOS_ChangeDynamicArea",1,(-16*1024*1024)
28590 ELSE
28600 SYS&20066,1,var%TO;F%:var%=0
28610 ENDIF
28620ENDIF
28630ENDPROC
28640
28650DEFPROCtidydynareas
28660LOCALA%,N%,P%
28670IFosver%>&A4 THEN
28680 SYS&66,3,-1TO,A%
28690 WHILEA%<>-1
28700 SYS&66,2,A%TO,,,,,,,,P%
28710 SYS&66,3,A%TO,N%
28720 IFLEFT$(FNstr(P%),1+LENTask$)=Task$+"_"THENSYS&66,1,A%
28730 A%=N%
28740 ENDWHILE
28750ENDIF
28760ENDPROC
28770
28780DEFFNgetpar(RETURN A$,s$)
28790LOCALB$,l%
28800l%=INSTR(A$,s$)
28810IFl%>0THEN
28820 B$=LEFT$(A$,l%-1):A$=MID$(A$,l%+1)
28830 ELSE
28840 B$=A$:A$=""
28850ENDIF
28860=B$
28870
28880DEFPROCstartmsgtrans
28890SYS"XMessageTrans_FileInfo",,sdlang$+".messages"TO,,buf%;F%
28900IF(F%AND1)THENERROR0,"Couldn't load Messages file!"
28910DIMmsgdesc%16,msgbuf% buf%
28920SYS"MessageTrans_OpenFile",msgdesc%,sdlang$+".messages",msgbuf%
28930ENDPROC
28940
28950DEFPROCendmsgtrans
28960IFmsgdesc%>0THENSYS"MessageTrans_CloseFile",msgdesc%
28970ENDPROC
28980
28990DEFFNmsg0(t$)
29000LOCALs%
29010SYS"MessageTrans_Lookup",msgdesc%,t$TO,,s%
29020=FNstr(s%)
29030DEFFNmsg1(t$,a$)
29040LOCALs%
29050SYS"MessageTrans_Lookup",msgdesc%,t$,tmp%,255,a$TO,,s%
29060=FNstr(s%)
29070DEFFNmsg2(t$,a$,b$)
29080LOCALs%
29090SYS"MessageTrans_Lookup",msgdesc%,t$,tmp%,255,a$,b$TO,,s%
29100=FNstr(s%)
29110DEFFNmsg3(t$,a$,b$,c$)
29120LOCALs%
29130SYS"MessageTrans_Lookup",msgdesc%,t$,tmp%,255,a$,b$,c$TO,,s%
29140=FNstr(s%)
� >!Runimage
� �:�" at ";�:�
�=�+&2000
( �init
2
�loadcode
<�startmsgtrans
F�getenv
P
�initwimp
Z��errorbox:�
d�loadconfig
n'ȕ�lomem(txtx%�2*txty%):�=�+&2000:�
x
�init_txt
�"ș"XOS_File",17,file$�A%,,,,S%
�ȕ�lomem(S%):�=�+&2000:�
��initscript(file$)
�A%=�modemdrv("")
��
� stage%=0
� �
�8 �lomem(0)��warn_txt(�msg0("MoreMem")):�=�+&2000
�= �testevent �A$=�getevent �A$=�line(stage%):stage%+=1
� return%=�command(A$)
� �stage%>=count% �run%=�
�8 run%=�:�stage%>=count%��print("",�msg0("Idle"),"")
�
�paused
�0
�
" � set up universal variables
,
��init
6� tmp% 256,driver 4096
@"ș"OS_Byte",129,0,&FF �,osver%
Jsprsz%=&1B00
T
redial%=�
^Gfileno%=1:total%=0:pause%=�:stop%=�:run%=�:taskstart%=0:highest%=-1
hKdevice%=�:oldline%=0:debug%=�:errC%=0:fh1%=0:fh2%=0:online$="":stage%=0
r6submax%=20:�call_ret%(submax%),call_lock%(submax%)
|Dcasmax%=10:�case$(casmax%),casmatch% casmax%,aline$(3),aline%(3)
�<menumax%=30:�umenu$(menumax%,1),usermenu$(1),logmenu$(1)
�8jtmax%=50:�jt%(jtmax%),jt$(jtmax%):jtl%=0:return$=""
�@vmax%=150:�var$(vmax%,1),s4$(3),tget$(3),ihist$(10):ihist%=0
�Calmax%=10:�alarm$(almax%,1),alarmtime%(almax%),alarmid$(almax%)
�7imax%=8:�ifile$(imax%),ibar$(imax%),imenu$(imax%,1)
� �ibarid$(imax%),ibar%(imax%)
�Ctaskmax%=8:�taskex$(taskmax%),taskn$(taskmax%),taskh%(taskmax%)
�<twmax%=8:�twexit$(twmax%),twname$(twmax%),twcom$(twmax%)
�:�twh%(twmax%),twf%(twmax%),tdata$(twmax%),tww%(twmax%)
�8�twy%(twmax%),two%(twmax%),twk%(twmax%),twt%(twmax%)
�;tget%=-1:tww%()=0:two%()=0:twwmax%=29:txtx%=80:txty%=24
�Gmaxev%=10:�event$(maxev%),event%(maxev%),evtype%(maxev%):event%()=�
�Gfmax%=10:�fileh%(fmax%),fileid$(fmax%),filewr%(fmax%),filen$(fmax%)
Hmsgmax%=25:msg_cs$="":msg_ce$="":msg_cm%=0:msg_cs%=0:msgc%=�:msgt%=0
"sddir$=�varval("Slipdial$dir")
(sdres$=�varval("Slipdial$resources")
&9sdlang$=sdres$+".UK":ch$="":autowinpos%=1:num$="none"
0�
:
D'� set up wimp and related variables
N��initwimp
X3� sprites% sprsz%:!sprites%=sprsz%:sprites%!8=0
b"È™ "OS_SpriteOp",&109,sprites%
lB�mergesprites(sdres$+".Sprites")=0��0,"Couldn't load sprites"
v/� taskid%4:$taskid%="TASK":Task$="SLIPdial"
�� msglist%4:!msglist%=0
�Eș "Wimp_Initialise",310,!taskid%,Task$,msglist% � version%,task%
�.�version%<310 ��1,"Window Manager too old"
�stwx%=0:stwy%=0
�$fh1%=�openin(sdres$+".!windows")
��fh1%>0�
�! stwx%=��#fh1%:stwy%=��#fh1%
��
�
�cf(fh1%)
�5� q% &400,menudata% &200,icons% &100,buffer% &100
�0ș "Wimp_OpenTemplate",,sdlang$+".Templates"
�info%=�loadtemp("Info")
�status%=�loadtemp("Status")
txt%=�loadtemp("txtwin")
config%=�loadtemp("config")
mess%=�loadtemp("message")
input%=�loadtemp("input")
*yesno%=�loadtemp("yesno")
4È™ "Wimp_CloseTemplate"
>C�seticonstring(info%,4,"0.33 (17-Feb-1995)"):�setv("$ver","33")
H&sdic$="nodev":icon0%=�ic(sdic$,-1)
R'�icon0%=0��0,"Couldn't create icon"
\'M%=%10000001100000110000:slice%=-20
f6ș"OS_ReadMonotonicTime"�lastpoll%:time%=lastpoll%
p?checkalarm%=time%:checkline%=time%:�checkicon:�usericon("")
z�
�
�ݤloadtemp(A$)
��b%,i%,s%,scr%,icon%,h%
�0ș"Wimp_LoadTemplate",,-1,0,0,-1,A$,0�,b%,i%
�*s%=�claimmem(scr%,b%,"TBUF"):�icon% i%
�6ș"Wimp_LoadTemplate",,scr%,icon%,icon%+i%,-1,A$,0
�!�A$="message"�msgttl%=scr%!72
�+�A$="Status"��setwpos(scr%,stwx%,stwy%)
�Dscr%!64=sprites%:ș"Wimp_CreateWindow",,scr% �h%:�releasemem(s%)
�=h%
�
���setwpos(q%,x%,y%)
�
�w%,h%
�x%>0�
w%=q%!8-!q%:h%=q%!12-q%!4
!q%=x%:q%!8=x%+w%
$q%!4=y%:q%!12=y%+h%
.�
8�
B
L1� merge sprite file into slipdial sprite area
Vݤmergesprites(A$)
`�s%,f%,n%,r%:r%=0
jș"XOS_File",17,A$�A%,,,,S%
t.ș"XOS_SpriteOp",&108,sprites%�,,s%,n%,,f%
~�A%=1�S%<=(s%-f%) �
�0ș"XOS_SpriteOp",&10B+(n%=0),sprites%,A$�;F%
��(F%�1)=0 �r%=s%-f%-S%
��
�=r%
�
�ݤsfree
�3�s%,f%:ș"XOS_SpriteOp",&108,sprites%�,,s%,,,f%
�
=s%-f%
�
�M� places an icon on the iconbar, n%<0 is main icon, others are user icons
�ݤic(A$,n%)
��Z%,next%,w%,h%
Aș"OS_SpriteOp",&100+40,sprites%,A$�,,,w%,h%:�w%>200�h%>70�=0
�n%<0�
!icons%=-1:next%=0
7 � dimension memory in known location & store name
(4 �ibarname%12:$ibarname%=A$:icons%!24=ibarname%
2�
< next%=icon0%
F, �Z%=0�n%:�ibar%(Z%)>0 �next%=ibar%(Z%)
P �:!icons%=-3
Z* � dimension some memory & store name
d# �icons%!24 12:$(icons%!24)=A$
n�
xFicons%!4=0:icons%!8=0:icons%!12=w%*2:icons%!16=100:icons%!20=&3102
�#icons%!28=sprites%:icons%!32=11
�)ș "Wimp_CreateIcon",next%,icons%�ic%
�=ic%
�
�� update the main icon
���checkicon
�
�name$
��device%=� �
� name$="nodev"
� �
� � (�d(9,port%,0,0)�8)=0 �
� name$="dev"
� �
9 �sdic$="online1" �name$="online2"�name$="online1"
�
�
"checkline%=time%
,�ibarname%>0�name$<>sdic$ �
6 �call_log(sdic$,name$)
@ sdic$=name$
J5 ș "XOS_SpriteOp",&118,sprites%,name$�,,src%;F%
T �(F%�1)=0�
^: $ibarname%=name$:!q%=-1:q%!4=icon0%:q%!8=0:q%!12=0
h! È™"Wimp_SetIconState",,q%
r �
|�
��
�
�3� update call log on online-offline transitions
���call_log(A$,B$)
�
ȎB$ �
�X �"nodev":�A$="online1"�A$="online2"�A$="dev"��wclog(�$+": offline after "+online$)
�W �"online1":�A$<>"online2"��wclog(�$+": online to "+num$):ontime%=time%:��upd_time
� �"online2":�upd_time
��
��
�
�(� update timer icon in status window
���upd_time
�T%
T%=�(time%-ontime%)�100
"online$=�"0"+�(T%�3600),2)+":"
&&online$+=�"0"+�((T%�60)�60),2)+":"
0online$+=�"0"+�(T%�60),2)
: �upd_icon(status%,8,online$)
D�
N
X!� write a line to the logfile
b��wclog(A$)
l#fh1%=�openup(sddir$+".logfile")
v.�fh1%<>0��#fh1%=�#fh1%:�#fh1%,A$:�cf(fh1%)
��
�
���poll(idle%)
�8� idle%=pollidle time (+) or time before polling (-)
�#ș"OS_ReadMonotonicTime" �time%
�'�idle%>=0 � lastpoll%-time%<idle% �
� lastpoll%=time%
� �
�1 ș "Wimp_PollIdle",M%,q%,time%+idle% � R%
�H �device% � J%=�d(19,port%,0,0):� line to fix II dual serial card
� Ȏ R% �
� � 1 :�redraww(!q%)
�@ � 2 :�openw(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28)
� 3 :�closew(!q%)
. � 6 :�click(!q%,q%!4,q%!8,q%!12,q%!16)
& � 8 :�keypress(!q%,q%!4,q%!24)
( � 9 :�getpointer:�menuselect(q%)
* � 17,18:�receive(q%)
4 �
> �R%=0
H; �time%>checkline%+100 ��checkicon:�linealarm:�settime
R1 �time%>checkalarm%+500 ��timealarm:�setdate
\1 �msg_cs%>0�time%>msgt%+500 ��addmessage("")
f�
p�
z
���keypress(w%,i%,k%)
��l%
��w%=txt%�i%=inic%�
� Ȏk%�
�1 �13:�l%=10�1�-1:ihist$(l%)=ihist$(l%-1):�
�C ihist$(0)=�ic_str(w%,i%):�addevent(ihist$(0),0):ihist%=-1
�D �upd_icon(w%,i%,""):ș"Wimp_SetCaretPosition",w%,i%,,,-1,0
�- �&18F:�ihist%<10�ihist$(ihist%+1)>""�
�3 ihist%+=1:�upd_icon(w%,i%,ihist$(ihist%))
�> ș"Wimp_SetCaretPosition",w%,i%,,,-1,�ihist$(ihist%)
� �
� �&18E:�ihist%>0�
�3 ihist%-=1:�upd_icon(w%,i%,ihist$(ihist%))
> ș"Wimp_SetCaretPosition",w%,i%,,,-1,�ihist$(ihist%)
�
N ihist%=-1:�upd_icon(w%,i%,""):ș"Wimp_SetCaretPosition",w%,i%,,,-1,0
$ �
.# :È™"Wimp_ProcessKey",q%!24
8 �
B�
L�w%=input%�i%=1�k%=13�
V/input$=�ic_str(w%,i%):�input$=""�input$=" "
`�
jÈ™"Wimp_ProcessKey",q%!24
t�
~�
��
�
���receive(q%)
��Z%,h%,i%,t%,f$,tw%,a%,A$
�Ȏ q%!16 �
�� 0:�finish:�
�3� 1:q%!16=2:q%!36=-1:$(q%+44)="<Wimp$Scrap>"+�0
�0 q%!12=q%!8:ș"Wimp_SendMessage",17,q%,q%!4
�1� 3:i%=q%!24:h%=q%!20:t%=q%!40:f$=�str(q%+44)
�- q%!16=4:ș"Wimp_SendMessage",17,q%,q%!4
� Ȏh%�
� �config%:�t%=&FFF �
( �i%=4�upd_icon(config%,4,f$)
�
�initscript(f$)
�
(* �status%:�t%=&FFF ��initscript(f$)
2$ �-1,-2:�t%=&FFF �i%=icon0% �
< �initscript(f$)
F �
P �Z%=0�imax%
Z8 �i%=ibar%(Z%)�ifile$(Z%)>""��ifile(Z%,f$,t%)
d �
n �
x �
�! Z%=�delfile("<Wimp$Scrap>")
�-� 11:�device% �q%!4<>task% ��refusedevice
�� 12:�q%!4<>task% �
�2 �print("Device claim failed",�str(q%+28),"")
� �front(status%):device%=�
� �
�$� &502:A$=�sendhelp(q%!32,q%!36)
�
�A$>""�
�? q%!16=&503:q%!12=q%!8:$(q%+20)=A$:q%?(20+�A$)=0:!q%=256
�' ș"Wimp_SendMessage",17,q%,q%!4
� �
�� &400C2:� taskstart%<>0 �
� �taskh%(taskstart%)=0 �
L taskh%(taskstart%)=q%!4:�log(�msg1("TaskStart2",taskn$(taskstart%)))
�
taskstart%=0
" �
,� &400C3:� TaskClosedown
6 �l%=0�taskmax%
@ �taskh%(l%)=q%!4 �
J? taskh%(l%)=0:�taskex$(l%)>""��addevent(taskex$(l%),3)
T �
^ �
h �sorttasks
r � &808C1:� TaskWindow_Output
| tw%=0:twlen%=q%!20-1
�+ ȕtwh%(tw%)<>q%!4�tw%<twmax%:tw%+=1:�
� �twf%(tw%)=0 �
�+ �Z%=0�twlen%�4:tmp%!Z%=q%!(24+Z%):�
�! �tw_data(tw%,tmp%,twlen%)
� �
�- �Z%=0�twlen%:�#twf%(tw%),q%!(24+Z%):�
� �
�� &808C2:� TaskWindow_Ego
�* �q%!20>=task%�q%!20<=(task%+twmax%)�
�J twh%(q%!20-task%)=q%!4:�log("Task started: "+twname$(q%!20-task%))
� �
�.� &808C3:� TaskWindow_Morio, task finished
�1 tw%=0:ȕq%!4<>twh%(tw%)�tw%<twmax%:tw%+=1:�
�q%!4=twh%(tw%)�
+ �log(�msg1("TaskEnd",twname$(tw%)))
�twk%(tw%)=0 �
&( twh%(tw%)=0:�closew(tww%(tw%))
0 �
:? twh%(tw%)=-1:$twt%(tw%)=twname$(tw%)+�msg0("TaskFin")
D �dotitle(tww%(tw%))
N �
X2 twname$(tw%)="":�cf(twf%(tw%)):twf%(tw%)=0
b2 �twexit$(tw%)>""��addevent(twexit$(tw%),4)
l �
v�
��
�
�ݤsendhelp(w%,i%)
�
�A$,l%
�A$="Hgeneric":Ȏw%�
� �txt%:A$="Htext"
�! �status%:A$="Hstatus":Ȏi%�
� �1,2:A$="Haction"
� �3:A$="Hip"
� �4:A$="Hstop"
� �5:A$="Hpause"
� �6,7:A$="Hmenus"
� �8:A$="Htime"
�10:A$="Hmodem"
�
+ �mess%:A$="Hmess":�pause%�A$="Hmess2"
�input%:A$="Henter"
* �yesno%:A$="Hyesno"
4 �info%:A$="Hinfo"
> �config%:A$="Hconfig"
H, :�l%=0�twmax%:�w%=tww%(l%)�A$="Htask"
R �
\�
f=�msg0(A$)
p
z��finish
��l%
��device%<>0�
� J%=�d(8,port%,0,0)
� J%=�d(18,port%,0,0)
��
��openlog("")
��cf(fh1%):�cf(fh2%)
� �l%=0�twmax%:�cf(twf%(l%)):�
�!�l%=0�fmax%:�cf(fileh%(l%)):�
��endmsgtrans
��
�
���cf(� C%)
!�C%<>0�ș"XOS_Find",0,C%:C%=0
�
$��getpointer
.$È™"Wimp_GetPointerInfo",,buffer%
8>mx%=!buffer%:my%=buffer%!4:b%=buffer%!8:handle%=buffer%!12
B#icon%=buffer%!16:ob%=buffer%!20
L�
V
`��click(mx%,my%,b%,w%,i%)
j�Z%
t
Ȏb% �
~� 2
� Ȏw% �
� � -2:�i%=icon0%�
� �defmenu(�)
� �
� �Z%=0�imax%
�k �i%=ibar%(Z%)�imenu$(Z%,0)>""��domenu(102,�makemenu(imenu$(Z%,0),imenu$(Z%,1)),ibarid$(Z%),�)
�
�
� �
�* � txt%:ș"OS_Byte",121,(1�&80)�,Z%
� �Z%=0�
�` �domenu(101,"Alarm list,Menu list,Var list,Task list,|Script list,Quit","Control",0)
�
�
H �domenu(101,"DbgLev 0,DbgLev 1,DbgLev 2,DbgLev 3","Debug",0)
�
� status%
Ȏi% �
(_ �7:�usermenu$(0)>""��domenu(102,�makemenu(usermenu$(0),usermenu$(1)),"User menu",�)
2 :�defmenu(0)
< �
F :�defmenu(0)
P �
Z �1,4:
d
Ȏ w% �
n � status%:
x Ȏi% �
� �5:
� �pause% �
�+ �print("",�msg0("PauseP"),"")
�+ pause%=�:�addevent("pause",0)
� �
� �unpause
�
�
� �4:
�8 stop%=�:�print("",�msg0("StopP"),""):�stop
�_ �6:�usermenu$(0)>""��domenu(102,�makemenu(usermenu$(0),usermenu$(1)),"User menu",�)
�V �11:�ic_str(status%,i%)="Redial"�redial%=�:�print("",�msg0("RedialP"),"")
� �
� � config%:
. � i%=6 ��saveconfig:�closew(config%)
� yesno%:
� i%=0 �yesnoans%=2
" � i%=1 �yesnoans%=1
, � txt%:
6D ș"Wimp_SetCaretPosition",w%,inic%,,,-1,��ic_str(w%,inic%)
@
� -2:
J �i%=icon0%�
T. �b%=4��front(status%)��front(txt%)
^ �
h �Z%=0�imax%
r? �i%=ibar%(Z%)�ibar$(Z%)>""��addevent(ibar$(Z%),6)
|
�
� �
� �
��
��
�
���defmenu(i%)
�B�domenu(101,">Info,Choices...,|Control...,Quit","SLIPdial",i%)
��
�
���halt(mess$)
�5call_lev%=0:call_lock%()=0:event$()="":event%()=�
�.�error$>""��addevent(error$,0):error$="":�
�9�message(""""+�msg2("Escript",�stage%,mess$)+""""):�7
�print("",�msg0("StopE"),"")
stage%=0:run%=�:�paused
�
&
0��input(A$)
:�v$,p$:p$="Input:"
D�B$=�param(A$):input$=""
N�B$,1)="/"�
XC$=�value(B$):Ȏ�B$,2)�
b �"pr":p$=�C$,40)
l �
v�
�9 v$=B$:�upd_icon(input%,1,""):�upd_icon(input%,0,p$)
�> �front(input%):ș"Wimp_SetCaretPosition",input%,1,,,-1,0
�' ��poll(50):�input$>"":p$="Input:"
� �input$=" "�input$=""
� �setv(v$,input$)
��
�
�A$=""
��closew(input%)
��
�
���message(A$)
�
�w%,n%,t$
�t$=�msg0("Message"):msgc%=�
w%=0:n%=0
�B$=�param(A$)
�B$,1)="/"�
C$=�value(B$):Ȏ�B$,2)�
* �"cl":�closew(mess%)
4 �"wa":w%=�
> �"ti":t$=C$
H! �"ca":msg_cs$=C$:msg_ce$=""
RA msg_cm%=msgmax%:msg_cs%=1:msgt%=time%:�n%=0�msg$()=""
\ �"ce":msgc%=�
f �"en":msg_ce$=C$
p �"ma":msg_cm%=�C$
z �"ad":n%+=1
� �"na","id":
� �
��
� �B$>""�n%=0�msg$()=""
�" �B$>""��addmessage(B$):n%+=1
��
��B$=""�n%>msgmax%
�$msgttl%=t$:�dotitle(mess%)
�
�n%>0�
��addmessage("")
��
��w%��addevent("pause",0)
��
��addmessage(A$)
�l%,w%,t$:l%=-1:w%=0
$%�l%+=1:t$=msg$(l%):�t$>w%�w%=�t$
.!�t$=""�l%=msgmax%:msgt%=time%
8�A$>""�
B5 �l%=msgmax%��l%=1�msgmax%:msg$(l%-1)=msg$(l%):�
L msg$(l%)=A$
V �
` �l%>0��openmess(l%,w%)
j�
t�
~
���openmess(y%,x%)
��o%
�6!tmp%=0:tmp%!4=-y%*32-32:tmp%!8=x%*16+10:tmp%!12=0
�!ș"Wimp_SetExtent",mess%,tmp%
�<!q%=mess%:ș"Wimp_GetWindowState",,q%:o%=(q%!32)�(1<<16)
�+q%!12=q%!4+x%*16+10:q%!16=q%!8+y%*32+32
�4q%!20=0:q%!24=0:q%!28=-1:ș"Wimp_OpenWindow",,q%
�-�o%=0��cfront(mess%,0,150) ��front(mess%)
�:!q%=mess%:ș"Wimp_GetWindowState",,q%:msgw%=q%!12-q%!4
�$�update_msg(0,-y%*32-32,msgw%,0)
��
�
��msgfilt(A$)
)�msg_cs%=1 ��A$,msg_cs$)>0 �msg_cs%=2
�msg_cs%=2 �
msg_cm%-=1:�addmessage(A$)
(G �msg_cm%<1�(msg_ce$>""��A$,msg_ce$)>0) �msg_cs%=0:�addmessage("")
2�
<�
F
P��paused
Z1pause%=�:�upd_icon(status%,5,�msg0("Resume"))
d!�print("",�msg0("Paused"),"")
n��poll(30):�pause%=�
x�
�
�
��unpause
�?pause%=�:stop%=�:run%=�:�upd_icon(status%,5,�msg0("Pause"))
��print(""," ","")
��
�
�
��stop
�?call_lev%=0:call_lock%()=0:event$()="":event%()=�:msg_cs%=0
�[�stage%>0�stop$<>""��addevent(stop$,0):stop$="":��addevent("pause",0):stage%=0:�release
��
�
�)��domenu(handle%,menu$,menutitle$,I%)
�!�i%,item$,menuItems%,menuptr%
�menu$=""��
menuItems% = 0
menuhandle%=handle%
"menuptr%=menudata%
,i%=0
6menuptr%!20=44
@$menuptr%=menutitle$
J<menuptr%?12=7:menuptr%?13=2:menuptr%?14=&7:menuptr%?15=0
T$menuptr%!16=230-24:menuptr%!24=0
^menuptr%+=28
h�
r= item$=�par(menu$,",",i%):�menuitem(item$):menuItems%+=1
|
�item$=""
�#menuptr%!-24=(menuptr%!-24)�&80
�,�I%<>0 �Y%=120+(menuItems%-1)*44 �Y%=my%
�-ș "Wimp_CreateMenu",,menudata%,mx%-64,Y%
��
�
���menuitem(text$)
�
�left$
�� text$>""�
� !menuptr%=0
�0 �text$,1)="|"�text$=�text$,2):!menuptr%=2
�% left$ = �text$,1):menuptr%!4=-1
�# � left$=">" �menuptr%!4=info%
� menuptr%!8=&07000021
O � left$=">" � left$="<" � $(menuptr%+12)=�text$,2) � $(menuptr%+12)=text$
menuptr%+=24
�
&�
0
:ݤpar(menu$,sep$,� i%)
D�i1%
N%i1%=i%+1:i%=�menu$+sep$,sep$,i1%)
X=�menu$,i1%,i%-i1%)
b
l��menuselect(menus%)
v�A$
�<�l%:ș"Wimp_DecodeMenu",,menudata%,menus%,�20," ")�,,,A$
�Ȏ A$ �
�# �"Choices...":�front(config%)
� �"Control...":�front(txt%)
� �"Quit":�finish:�
� �"Alarm list":�listalarms
� �"Menu list":�listmenu
� �"Task list":�listtasks
� �"Var list":�listvars
�$ �"Script list":�listscript("")
� �"DbgLev 0":debug%=0
� �"DbgLev 1":debug%=1
� �"DbgLev 2":debug%=2
�"DbgLev 3":debug%=3
:�umenu%>0 �
�l%=1�umenu%
�A$=umenu$(l%,0) �
*/ �upd_icon(status%,7,umenu$(l%,0))
4' �addevent(umenu$(l%,1),8)
>
�
H �
R �
\�
f�
p
z��errorbox
�<!buffer%=�:$(buffer%+4)=�$+" (internal code "+Þ+")."+�0
�1ș "Wimp_ReportError",buffer%,1,Task$:�finish
��
�
���front(h%)
�&!q%=h%:ș"Wimp_GetWindowState",,q%
�$q%!28=-1:ș"Wimp_OpenWindow",,q%
�G�h%=txt%�ș"Wimp_SetCaretPosition",h%,inic%,,,-1,��ic_str(h%,inic%)
��
�
���cfront(h%,xoff%,yoff%)
��x%,y%,wx%,wy%,xe%,ye%
��autowinpos%=0�h%=status%�
�front(h%)
�
K ș"OS_ReadModeVariable",-1,4�,,xe%:ș"OS_ReadModeVariable",-1,11�,,x%
$K ș"OS_ReadModeVariable",-1,5�,,ye%:ș"OS_ReadModeVariable",-1,12�,,y%
.( !q%=h%:È™"Wimp_GetWindowState",,q%
89 x%=x%<<xe%:y%=y%<<ye%:wx%=q%!12-q%!4:wy%=q%!16-q%!8
BO q%!4=(x%-wx%)�2-xoff%:q%!12=q%!4+wx%:q%!8=(y%-wy%)�2-yoff%:q%!16=q%!8+wy%
L6 q%!20=0:q%!24=0:q%!28=-1:È™"Wimp_OpenWindow",,q%
V�
`�
j
t��dotitle(h%)
~(!q%=h%:È™"Wimp_GetWindowOutline",,q%
�5ș"Wimp_ForceRedraw",-1,q%!4,q%!16-44,q%!12,q%!16
��
�
�ݤic_str(H%,I%)
�,!q%=H%:q%!4=I%:ș"Wimp_GetIconState",,q%
�=�str(q%!28)
�
���seticonstring(H%,I%,A$)
�1!q%=H%:q%!4=I%:ș"XWimp_GetIconState",,q%�;F%
�*�tf10(F%)�q%!28>&8800 �$(q%!28)=A$+�0
��
�
��upd_icon(H%,I%,A$)
:�seticonstring(H%,I%,A$):!q%=H%:q%!4=I%:q%!8=0:q%!12=0
È™"Wimp_SetIconState",,q%
�
(
2��setinv(H%,I%,S%)
<=S%=�(S%=0):!q%=H%:q%!4=I%:q%!8=((1)<<21)*S%:q%!12=(1<<21)
FÈ™"Wimp_SetIconState",,q%
P�
Z
dݤrdinv(H%,I%)
n,!q%=H%:q%!4=I%:È™"Wimp_GetIconState",,q%
x$=�(((q%!24)�(1<<21))�2097152<>0)
�
���setshaded(H%,I%,S%)
�3!q%=H%:q%!4=I%:q%!8=((1)<<22)*�S%:q%!12=(1<<22)
�ș"Wimp_SetIconState",,q%
��
�
���print(a$,b$,c$)
�B�a$>""��upd_icon(status%,1,�a$,34)):�a$>1��log("Action: "+a$)
�B�b$>""��upd_icon(status%,2,�b$,34)):�b$>1��log("Status: "+b$)
�B�c$>""��upd_icon(status%,3,�c$,34)):�c$>1��log("IP add: "+c$)
��
�
�7��openw(handle%,x0%,y0%,x1%,y1%,scx%,scy%,bhandle%)
�handle%>-1�
! q%!0=handle%:q%!28=bhandle%
+ q%!4=x0%:q%!8=y0%:q%!12=x1%:q%!16=y1%
" q%!20=scx%:q%!24=scy%
, È™"Wimp_OpenWindow",,q%
6�
@�
J
T��closew(h%)
^�L%
h Ȏh%�
r �mess%:�pause% ��unpause
| �input%:input$=" "
� :
� �L%=0�twmax%
�" �h%=tww%(L%)�twh%(L%)>0�
�/ �7:�yesno(�msg0("TaskKill"),3)=2 �
�) �messtw(twname$(L%),&808C4)
� �
� h%=0
�
�
� L%=twmax%
� �
� �
��
�)�h%>0�!q%=h%:ș"Wimp_CloseWindow",,q%
�
ݤask(A$)
&!�d%,r%,def%:d%=60:r%=0:def%=1
0�B$=�param(A$)
: �B$,1)="/"�
D C$=�value(B$):Ȏ�B$,3)�
N" �"del":d%=�C$:�d%<5�d%=5
X1 �"def":C$=�lower(C$):�C$,1)="y"�def%=2
b �
l �
v r%=�yesno(B$,d%)
� �
�
�A$=""
��r%=0�r%=def%
�=-(r%=2)
�
� � ***
�
�ݤyesno(A$,wait%)
�"� returns 0=timeout 1=no 2=yes
�>�st%:st%=time%:wait%=wait%*100:�upd_icon(yesno%,2,�A$,57))
�,�cfront(yesno%,0,0):�wait%=0�wait%=60000
�8yesnoans%=0:�:�poll(50):�yesnoans%>0�time%-st%>wait%
��closew(yesno%)
=yesnoans%
ݤvarval(A$)
�L%,F%
*/ș"XOS_ReadVarVal",A$,tmp%,256,0,3 �,,L%;F%
4�(F%�1) �L%>256 �:=""
>tmp%?L%=13:=$tmp%
H
R��info(q%)
\=x0%=!q%:y0%=q%!4:x1%=q%!8:y1%=q%!12:scx%=q%!16:scy%=q%!20
f3bx%=x0%-scx%:by%=y1%-scy%:gy0%=q%!28:gy1%=q%!36
p�
z
���redraww(h%)
��tw%:!q%=h%:Ȏh%�
�
�txt%:
�( ș "Wimp_RedrawWindow",,q% � more%
� �draw_txt(more%)
��mess%:
�( ș "Wimp_RedrawWindow",,q% � more%
� �draw_msg(more%)
�:
�" �tw%=0�twmax%:�h%=tww%(tw%)�
�* ș "Wimp_RedrawWindow",,q% � more%
� �draw_tw(tw%,more%)
� �
�
�
�
$
.��init_txt
8txto%=0
B<log_y%=1:�txtl$(txty%),txtc% txty%,msg$(msgmax%):msgw%=0
L"txtl$()=�txtx%�2," "):ioff%=40
V>!tmp%=0:tmp%!4=-txty%*32-ioff%-8:tmp%!8=txtx%*16:tmp%!12=0
` È™"Wimp_SetExtent",txt%,tmp%
j<�i%=0�1:!tmp%=txt%:tmp%!4=i%:ș"Wimp_GetIconState",,tmp%
tAtmp%!12=tmp%!12-txty%*32:tmp%!20=tmp%!20-txty%*32:tmp%!4=txt%
~,!q%=txt%:q%!4=i%:È™"Wimp_DeleteIcon",,q%
�(ș"Wimp_CreateIcon",,tmp%+4 �inic%:�
�#ptr%=0:lt%=0:data$="":tdata$=""
�*�print("Starting SLIPdial","Idle"," ")
�/�quiet%=0��rdinv(config%,2)=0 ��front(txt%)
��
�
���init_tww(tw%,out%,T$)
��off%:off%=(tw%�4)*40
��tww%(tw%)=0�
�2 ș "Wimp_OpenTemplate",,sdlang$+".Templates"
�C ș "Wimp_LoadTemplate",,q%,ind%,sp%+size%,-1,"task",0 �,,ind%
�' twt%(tw%)=q%!72:q%!44=-twwmax%*32
A !q%=!q%+off%:q%!8=q%!8+off%:q%!4=q%!4-off%:q%!12=q%!12-off%
, ș "Wimp_CreateWindow",,q% � tww%(tw%)
È™ "Wimp_CloseTemplate"
Ȏtw%�
( �0:�twbuf0$(twwmax%)
2 �1:�twbuf1$(twwmax%)
< �2:�twbuf2$(twwmax%)
F �3:�twbuf3$(twwmax%)
P �4:�twbuf4$(twwmax%)
Z �5:�twbuf5$(twwmax%)
d �6:�twbuf6$(twwmax%)
n" :�halt(�msg0("Etask1")):�
x �
� �
� Ȏtw%�
� �0:twbuf0$()=""
� �1:twbuf1$()=""
� �2:twbuf2$()=""
� �3:twbuf3$()=""
� �4:twbuf4$()=""
� �5:twbuf5$()=""
� �6:twbuf6$()=""
� �
��
�I$twt%(tw%)=�msg1("TaskRun",T$):tdata$(tw%)="":twy%(tw%)=0:two%(tw%)=0
��out%��front(tww%(tw%))
�
%��update_txt(ux0%,uy0%,ux1%,uy1%)
"6!q%=txt%:q%!4=ux0%:q%!8=uy0%:q%!12=ux1%:q%!16=uy1%
,%ș"Wimp_UpdateWindow",,q% � more%
6�draw_txt(more%)
@�
J
T%��update_msg(ux0%,uy0%,ux1%,uy1%)
^7!q%=mess%:q%!4=ux0%:q%!8=uy0%:q%!12=ux1%:q%!16=uy1%
h%ș"Wimp_UpdateWindow",,q% � more%
r�draw_msg(more%)
|�
�
�(��update_tw(tw%,ux0%,uy0%,ux1%,uy1%)
�;!q%=tww%(tw%):q%!4=ux0%:q%!8=uy0%:q%!12=ux1%:q%!16=uy1%
�%ș"Wimp_UpdateWindow",,q% � more%
��draw_tw(tw%,more%)
��
�
���draw_msg(more%)
�ȕ more%
� �info(q%+4):�
�3 top%=�(gy1%-by%+16)�32:bot%=�(gy0%-by%+16)�32
�7 �bot%>msgmax% �bot%=msgmax%:�top%>bot% �top%=bot%
�( ș"Wimp_SetColour",7:�L%=top%�bot%
5 �bx%+4-msgc%*(msgw%�2-�msg$(L%)*8),by%-L%*32-16
�msg$(L%):�
% ș"Wimp_GetRectangle",,q%�more%
&�
0�
:
D��draw_tw(tw%,more%)
N�L%,y%,top%,bot%:ȕ more%
X �info(q%+4):�
b- top%=�(gy1%-by%)�32:bot%=�(gy0%-by%)�32
l7 �bot%>twwmax% �bot%=twwmax%:�top%>bot% �top%=bot%
v( ș"Wimp_SetColour",7:�L%=top%�bot%
� y%=(L%+two%(tw%))�twwmax%
� �bx%+4,by%-L%*32-4
� Ȏtw%�
� �0:�twbuf0$(y%)
� �1:�twbuf1$(y%)
� �2:�twbuf2$(y%)
� �3:�twbuf3$(y%)
� �4:�twbuf4$(y%)
� �5:�twbuf5$(y%)
� �6:�twbuf6$(y%)
� �
� �
�% ș"Wimp_GetRectangle",,q%�more%
!�
!�
!
! ��draw_txt(more%)
!*�L%,y%,top%,bot%:ȕ more%
!4 �info(q%+4):�
!>- top%=�(gy1%-by%)�32:bot%=�(gy0%-by%)�32
!H3 �bot%>txty% �bot%=txty%:�top%>bot% �top%=bot%
!R' �L%=top%�bot%:y%=(L%+txto%)�txty%
!\= �bx%,by%-L%*32:ș"Wimp_SetColour",txtc%?y%:�txtl$(y%):�
!f' ș"Wimp_GetRectangle",,q% � more%
!p�
!z�
!�
!���str_txt(A$)
!��data$>""��flush
!��line_txt(A$,7)
!��
!�
!���warn_txt(A$)
!��line_txt(A$,11)
!��
!�
!���flush
!��data$>""�
!�, �(debug%�2)<>0�errC%<>0 ��#errC%,data$
" �msg_cs%>0��msgfilt(data$)
"! �line_txt(data$,5):data$=""
"�
"$�
".
"8ݤrec:�device%=0�=-1
"BZ%=�d(1,port%,0,0)
"L"�Z%>0�(debug%�2)>0�msg_cs%>0 �
"V �Z%>31 �Z%<128 �data$+=�Z%
"`( �Z%=13�Z%=10��data$>=txtx% ��flush
"j�
"t=Z%
"~
"���tw_data(tw%,buf%,len%)
"��l%
"��l%=0�len%:C%=buf%?l%
"�& �C%>31 �C%<128 �tdata$(tw%)+=�C%
"�$ �C%=13�C%=10��tdata$(tw%)>78 �
"� �tw_txt(tw%,tdata$(tw%))
"�1 �tget%=tw%�tget$(0)>""��tget(tdata$(tw%))
"� tdata$(tw%)=""
"� �
"��
"�-�tget%=tw%�tget$(0)>""��tget(tdata$(tw%))
"��
#
#
��tw_txt(tw%,A$)
#
�t%,B$
#5�(debug%�4)<>0�errC%<>0 ��#errC%,"TW"+�tw%+">"+A$
#(ȕA$>""
#2& t%=(twy%(tw%)+two%(tw%))�twwmax%
#< B$=�A$,79):A$=�A$,79)
#F Ȏtw%�
#P �0:twbuf0$(t%)=B$
#Z �1:twbuf1$(t%)=B$
#d �2:twbuf2$(t%)=B$
#n �3:twbuf3$(t%)=B$
#x �4:twbuf4$(t%)=B$
#� �5:twbuf5$(t%)=B$
#� �6:twbuf6$(t%)=B$
#� �
#� �twy%(tw%)<twwmax% �
#�D !q%=tww%(tw%):ș"Wimp_GetWindowState",,q%:f%=(q%!32)�(1<<16)
#�d �twy%(tw%)>=�(q%!8-q%!16)�32 �q%!24=-(twy%(tw%)*32-�(q%!8-q%!16))-32:ș"Wimp_OpenWindow",,q%
#�? �update_tw(tw%,0,-twy%(tw%)*32-32,1280,-twy%(tw%)*32+4)
#� twy%(tw%)+=1
#� �
#�' two%(tw%)=(two%(tw%)+1)�twwmax%
#�K ș"Wimp_BlockCopy",tww%(tw%),0,-32*twwmax%,1280,0,0,-32*(twwmax%-1)
#�< �update_tw(tw%,0,-32*twwmax%,1280,-32*(twwmax%-1)+4)
#� �
$�
$�
$
$"��line_txt(A$,col%)
$,�t%:�poll(slice%)
$6ȕA$>""
$@ t%=(log_y%+txto%)�txty%
$J( txtl$(t%)=�A$,txtx%):A$=�A$,txtx%)
$T# txtc%?t%=col%:�log_y%<txty% �
$^? !q%=txt%:ș"Wimp_GetWindowState",,q%:f%=(q%!32)�(1<<16)
$hd �f%<>0�log_y%>=�(q%!8-q%!16)�32 �q%!24=-(log_y%*32-�(q%!8-q%!16))-32:ș"Wimp_OpenWindow",,q%
$r6 �update_txt(0,-log_y%*32-32,1280,-log_y%*32+4)
$| log_y%+=1
$� �
$� txto%=(txto%+1)�txty%
$�B ș"Wimp_BlockCopy",txt%,0,-32*txty%,1280,0,0,-32*(txty%-1)
$�5 �update_txt(0,-32*txty%,1280,-32*(txty%-1)+4)
$� �
$��
$��
$�
$�
��clr_txt
$�(txtl$()="":log_y%=0:txto%=0:data$=""
$�/�update_txt(0,-txty%*32-ioff%-8,16*txtx%,0)
$��
$�
%
��log(m$)
%�(debug%�1) �
% �str_txt(m$)
%& �errC%<>0 ��#errC%,m$
%0�
%:�
%D
%N��openlog(A$)
%XB$=�param(A$)
%b�B$="" �
%l �flush:�cf(errC%)
%v�
%� B$=�canon(B$)
%�" ș"XOS_Find",&CF,B$�errC%;F%
%�* �(F%�1)�ș"XOS_Find",&8F,B$�errC%;F%
%�. �(F%�1)�errC%=0:�halt(�msg0("Etrace")):�
%� ș"XOS_File",18,B$,&FFF
%� �errC%<>0 ��#errC%=�#errC%
%��
%��
%�
%���claimdevice
%��driverno%>-1�
%�< !q%=256:q%!12=0:q%!16=11:q%!20=2:q%!24=driverno%+port%
%� $(q%+28)="SLIPdial"+�0
&" È™"Wimp_SendMessage",18,q%,0
&" device%=�:�L%=1�5:�poll(0):�
&�
& �
&*
&4��refusedevice
&>�driverno%>-1�
&H) � q%!20=2 � q%!24=driverno%+port% �
&R# !q%=256:q%!12=q%!8:q%!16=12
&\$ $(q%+28)=�msg0("DevMine")+�0
&f' È™"Wimp_SendMessage",17,q%,q%!4
&p �
&z�
&��
&�
&�ݤloaddriver(A$)
&�A%=�A$," "):�A%>=0 �
&� driver$=�A$,A%-1)
&� port%=�(�A$,A%+1))
&� �
&� driver$="internal"
&�
port%=0
&��
&�
&�$�setv("port",driver$+" "+�port%)
&�+�print(�msg1("DevLoad",driver$)," ","")
'Gș"XOS_File",16,"SerialDev:modules."+driver$+".driver",driver,0�;F%
',�(F%�1) ��halt(�msg1("Edev",driver$)):=0
' �print("",�msg0("DevOK"),"")
'$driverno%=driver!&C8
'.
=port%
'8
'B��setspeed(B$)
'L&speed%=�B$:�speed%=0 �speed%=19200
'V�setv("speed",�speed%)
'`�
'j
't��addevent(A$,t%)
'~H� event types are: 0 system, 1 time-alarm, 2 line-alarm, 3 task-end,
'�G� 4 taskwindow-end, 5 command-input, 6 icon-click, 7 icon-filedrop,
'�� 8 user-menu, 9 user-eof
'��log(�msg1("Qadd",A$))
'�"L%=0:ȕevent$(L%)>""�L%<maxev%
'�L%+=1:�
'�"event$(L%)=A$:evtype%(L%)=t%:�
'�
'�ݤgetevent
'� �t%,l%,A$,n%:l%=0:A$="":n%=0
'�>��event$(l%)>""�event%(evtype%(l%))=� �A$=event$(l%):n%=l%
'�(l%+=1:�A$>""�event$(l%)=""�l%=maxev%
'��A$>""�
( I �l%=n%�maxev%-1:event$(l%)=event$(l%+1):evtype%(l%)=evtype%(l%+1):�
(
event$(maxev%)=""
(�
(=A$
((
(2ݤtestevent
(<�t%,l%,r%:l%=0:r%=0
(F/��event$(l%)>""�event%(evtype%(l%))=� �r%=�
(P(l%+=1:�r%<>0�event$(l%)=""�l%=maxev%
(Z=r%
(d
(nݤcommand(com$)
(x(ȕcom$>""�stop%=0:A$=�multicom(com$)
(��poll(slice%)
(��log(�stage%+": "+A$)
(�DB$=�param(A$):B$=�lower(B$):lc$=B$:� store last command for help
(��B$,1)<>":" �
(� ȎB$ �
(�& � "if" :return%=�if(A$,com$)
(�" � "ask" :return%=�ask(A$)
(�# � "case" :return%=�case(A$)
(�( � "when" :return%=�when(A$,com$)
(�& � "otherwise":�otherwise(com$)
(�$ � "endcase":return%=�endcase
(�$ � "claim":return%=�claim(A$)
(�# � "debug":debug%=�debug(A$)
)( � "driver":return%=�modemdrv(A$)
)& � "source":return%=�source(A$)
)( � "library":return%=�library(A$)
)" � "chain":�chain(A$)
),' � "port" :port%=�loaddriver(A$)
)6 � "speed":�setspeed(A$)
)@ � "release":�release
)J( � "init" :return%=�initmodem(A$)
)T � "reinit":�reinit
)^# � "dial" :return%=�dial(A$)
)h# � "wait" :return%=�wait(A$)
)r � "trace":�openlog(A$)
)| � "send" :�send(A$)
)�$ � "ipget":return%=�ipget(A$)
)� � "make" :�makefile(A$)
)�# � "task" :return%=�task(A$)
)�) � "taskwindow":return%=�taskw(A$)
)�' � "sleep","pause":�pause(�(A$))
)� � "alarm":�alarm(A$)
)� � "set" :�set(A$)
)� � "unset":�unset(A$)
)�D � "?eq","?ne","?lt","?le","?gt","?ge":return%=�testeq(B$,A$)
)�& � "string":return%=�string(A$)
)�# � "eval" :return%=�eval(A$)
)�! � "label":� ignore labels
)�" � "goto" :�goto(A$,stage%)
*# � "call" :�gosub(A$,stage%)
*- � "return":return%=�return(A$,stage%)
* � "echo" :�echo(A$)
*&# � "?file":return%=�file(A$)
*0' � "?line":return%=�testline(A$)
*:# � "?free":return%=�free(A$)
*D � "retry":�setretry(A$)
*N# � "open" :return%=�open(A$)
*X$ � "close":return%=�close(A$)
*b# � "read" :return%=�read(A$)
*l% � "write" :return%=�write(A$)
*v! � "ptr" :return%=�ptr(A$)
*�' � "move" :return%=�movefile(A$)
*�' � "copy" :return%=�copyfile(A$)
*�& � "append":return%=�append(A$)
*�& � "delete":return%=�delete(A$)
*�* � "newsrate":return%=�newsrate(A$)
*�' � "?task":return%=�testtask(A$)
*�2 � "dopen","dataopen":return%=�dataopen(A$)
*�- � "stamp":�log("("+�(� �100)+") "+A$)
*� � "error":�halt(A$)
*� � "message":�message(A$)
*� � "menu" :�menudef(A$)
*� � "list" :�list(A$)
*�% � "icon":return%=�iconbar(A$)
+* � "analyse","analyze":�analyse(A$)
+ � "help" :�help(A$)
+! � "event":�eventonoff(A$)
+ � "stop" :�stop
+*& � "quit" :�quit(�msg0("Quit"))
+4 � "exit" :�exit
+> � "input":�input(A$)
+H$ � "oscli":return%=�oscli(A$)
+R :�log(�msg0("BadCom"))
+\ �
+f�
+pA�return%<0��setv("$status",return$)��setv("$status",�return%)
+z�
+�=return%
+�
+���echo(A$)
+��B$,s%:s%=0
+��
+� B$=�param(A$)
+� �B$,1)="/"�
+� Ȏ�B$,3)�
+� �"/st":s%=�
+� �"/lo":s%=0
+�$ �"/da":A$=""""+�$+""" "+A$
+� �
+� �
, �s%�
, �print("",B$,"")
, �
,$ �str_txt(B$)
,.- �(debug%�3)<>0�errC%<>0 ��#errC%,B$
,8 �
,B �
,L
�A$=""
,V�
,`
,jݤclaim(A$)
,t�J%,t%,d%,try%
,~$�print(�msg0("DevClaim")," ","")
,�#t%=��param(A$):�t%<0 �t%=retry%
,�#d%=��param(A$):�d%<2 �d%=delay%
,�
try%=1
,��
,��claimdevice
,��device%<>0 �
,� J%=�d(17,port%,0,0)
,�4 J%=�d(13,port%,speed%,0):�J%<>speed%�speed%=J%
,�4 J%=�d(14,port%,speed%,0):�J%<>speed%�speed%=J%
,� J%=�d(15,port%,0,0)
,� J%=�d(16,port%,1,0)
,� J%=�d(6,port%,0,0)
- J%=�d(7,port%,0,0)
-
�
- �pause(d%):�t%>0 �try%+=1
-�
-("�device%<>0 �try%>t% �stop%<>0
-2=device%
-<
-F
��release
-P�J%
-Z� device% �
-d1 �print(�msg0("DevRel"),�msg0("DevDrop"),"")
-n J%=�d(8,port%,0,0)
-x J%=�d(18,port%,0,0)
-� device%=�
-��
-��
-�
-�ݤinitmodem(A$)
-��B$,h%:h%=0
-��droplines<>0 �
-�$ �print(�msg0("DevInit"),"","")
-� �A$=""�A$=�vv("$init")
-� �
-� B$=�param(A$)
-�) �print("",�msg1("Sending",B$),"")
-�, �send(B$):h%=�get4s("OK","","","",5)
. �A$=""�h%=0
.�
.=h%
."
.,��reinit
.6�J%
.@2J%=�d(13,port%,speed%,0):�J%<>speed%�speed%=J%
.J2J%=�d(14,port%,speed%,0):�J%<>speed%�speed%=J%
.TJ%=�d(15,port%,0,0)
.^J%=�d(16,port%,1,0)
.hJ%=�d(8,port%,3,0)
.r�
.|
.���setretry(A$)
.��B$
.�B$=�param(A$)
.��B$>0 �retry%=�B$
.��A$>2 �delay%=�A$
.��
.�
.���usericon(A$)
.��upd_icon(status%,11,A$)
.�"�setshaded(status%,11,(A$=""))
.��
.�
.�ݤdial(numlist$)
/)�flag%,r%,d%,nod%,noc%,bus%,dc$,B$,C$
/flag%=0:dc$="ATDT"
//r%=retry%:d%=delay%:nod%=d%:noc%=d%:bus%=d%
/&�usericon(�msg0("Redial"))
/0�
/: B$=�param(numlist$)
/D �B$,1)="/"�
/N! C$=�value(B$):Ȏ�B$,3)�
/X% �"ret":r%=�C$:�r%<1 �r%=1
/b% �"del":d%=�C$:�d%<2 �d%=2
/l% nod%=d%:noc%=d%:bus%=d%
/v �"noc":noc%=�C$
/� �"nod":nod%=�C$
/�# �"not","pul":dc$="ATDP"
/�# �"ton","nop":dc$="ATDT"
/� �"bus":bus%=�C$
/� �
/� �
/�" attempt%=1:flag%=0:num$=B$
/� �
/�K �print(�msg1("Dialling",num$),�msg2("Dattempt",�attempt%,�r%),"")
/�% �send(dc$+num$):attempt%+=1
/�U return%=�get4s(�vv("$conn"),�vv("$busy"),�vv("$nocarr"),�vv("$nodial"),120)
/� �stop%=0 �
/� �redial%=� �
0B A%=�droplines:ȕ �d(5,port%,0,0)>0:J%=�rec:�:redial%=�
0
�
0 Ȏreturn% �
0 9 � 1:�print("",�msg0("Dconnect"),""):flag%=1
0*; � 2:�print("",�msg0("Dbusy"),""):�pause(bus%)
049 � 3:�print("",�msg0("Dnc"),""):�pause(noc%)
0>9 � 4:�print("",�msg0("Dnd"),""):�pause(nod%)
0H4 � 2,3,4:ȕ �d(5,port%,0,0)>0:J%=�rec:�
0R4 �print("",�msg0("Dnr"),""):�pause(d%)
0\
�
0f �
0p �
0z6 A%=�droplines:� cancel a dial if stop active
0� �
0�1 � attempt%>r% �stop%<>0 �flag%>0 �device%=0
0�C �flag%=0 �numlist$>"" ��print(�msg0("Dnext"),"",""):�pause(1)
0� �
0�0� numlist$="" �stop%<>0 � flag%>0 �device%=0
0��usericon("")
0�
=flag%
0�
0�ݤwait(A$)
0�$�l%,m%,d%,s%,return%,B$,C$,qual%
0�d%=600:tget%=-1:return%=0
0��B$=�param(A$):qual%=�
0��B$,1)="/"�
1 C$=�value(B$):qual%=�
1 Ȏ�B$,2)�
1 �"ev":return%=�waitevent
1$ �"de","del":d%=�C$
1.@ �"na","id":�l%=0�twmax%:�C$=twname$(l%)�tget%=l%:l%=twmax%
18/ �:�tget%<0 ��halt(�msg0("Ebadtask")):=0
1B# :�halt(�msg0("Ebadwait")):=0
1L �
1V�
1`�qual%=�
1j�return%=0 �
1t) �d%=0��halt(�msg1("Ebaddel",A$)):=0
1~ s4$()="":l%=0:C$="":�
1�1 s4$(l%)=B$:C$+=B$+"/":l%+=1:B$=�param(A$)
1� �B$=""�l%=4:C$=�C$,�C$-1)
1�6 �print(�msg1("Wait",C$),�msg1("Timeout",�d%),"")
1� �tget%<0 �
1�6 return%=�get4s(s4$(0),s4$(1),s4$(2),s4$(3),d%)
1� �
1�6 return%=�gettw(s4$(0),s4$(1),s4$(2),s4$(3),d%)
1� �
1�a � return%>0 ��print("",�msg1("Received",s4$(return%-1)),"")��print("",�msg0("TimedOut"),"")
1��
1�=return%
1�
2 ݤwaitevent
2
(�upd_icon(status%,7,�msg0("Select"))
2#�print(�msg0("Waiting")," ","")
2��poll(50):��testevent
2(=1
22
2<��eventonoff(A$)
2F�a%,B$:a%=�
2P�B$=�param(A$)
2Z
Ȏ�B$,2)�
2d�"/e":a%=�
2n�"/d":a%=�
2x�"ti":event%(1)=a%
2��"li":event%(2)=a%
2��"ta":event%(3)=a%
2��"tw":event%(4)=a%
2��"in":event%(5)=a%
2��"ic":event%(6)=a%
2��"fi":event%(7)=a%
2��"me":event%(8)=a%
2��"eo":event%(9)=a%
2��"al":event%()=a%
2��
2��A$="":event%(0)=�
2��
2�
36ݤgettw(tget$(0),tget$(1),tget$(2),tget$(3),wait%)
3�st%,r%
3-r%=0:twgflag%=0:wait%=wait%*100:st%=time%
3"�tget(tdata$(tget%))
3,8��poll(50):�twgflag%>0 ��(time%-st%)>wait% �stop%<>0
36�twgflag%>0 �r%=twgflag%
3@=r%
3J
3T��tget(A$)
3^�L%
3h�L%=0�3
3r8 �tget$(L%)>""��A$,tget$(L%))>0 �twgflag%=L%+1:L%=3
3|�
3�tget%=-1
3��
3�
3�"ݤget4s(s1$,s2$,s3$,s4$,wait%)
3��flag%,st%,J%
3�wait%=wait%*100:st%=time%
3�'n1%=�s1$:n2%=�s2$:n3%=�s3$:n4%=�s4$
3�#p1%=1:p2%=1:p3%=1:p4%=1:flag%=0
3��
3�
J%=�rec
3� �J%>-1 �
3�8 �J%=n1% �p1%+=1:n1%=�(�s1$,p1%)) �n1%=�s1$:p1%=1
3�8 �J%=n2% �p2%+=1:n2%=�(�s2$,p2%)) �n2%=�s2$:p2%=1
48 �J%=n3% �p3%+=1:n3%=�(�s3$,p3%)) �n3%=�s3$:p3%=1
48 �J%=n4% �p4%+=1:n4%=�(�s4$,p4%)) �n4%=�s4$:p4%=1
4 �
4& �poll(10)
40 �
4: �p1%>�s1$ �s1$>"":flag%=1
4D �p2%>�s2$ �s2$>"":flag%=2
4N �p3%>�s3$ �s3$>"":flag%=3
4X �p4%>�s4$ �s4$>"":flag%=4
4b6�flag%>0 ��(time%-st%)>wait% �stop%<>0 �redial%<>0
4l�flag%>0 �:=flag%
4v=0
4�
4���send(A$)
4�%�A%,J%,R%,t$,tw%,B$,C$:t$="":R%=0
4��B$=�param(A$)
4� �B$,1)="/"�
4� C$=�value(B$):Ȏ�B$,2)�
4� �"ra":R%=�
4� �"no":R%=�
4� �"na","id":t$=C$
4� �
4� �
4� �t$=""�
4�- �device%=0��halt(�msg0("Enodev")):�
51 �A%=1��B$:J%=�d(0,port%,��B$,A%,1),0):�
5$ �R%=0 �J%=�d(0,port%,13,0)
5 �
5 6 tw%=0:ȕtwname$(tw%)<>t$�tw%<twmax%:tw%+=1:�
5*# �tw%<twmax%�twh%(tw%)<>0�
54E !q%=256:q%!12=0:q%!16=&808C0:q%!20=�B$-(R%=0):$(q%+24)=B$
5>0 È™"Wimp_SendMessage",17,q%,twh%(tw%)
5H9 �log(�msg2("TaskSend",�B$,100),twname$(tw%)))
5R �
5\ �
5f �
5p
�A$=""
5z�
5�
5�ݤipget(A$)
5�(�r%,start$,d%,a%,loc%,tlim%,B$,C$,J%
5�r%=0:d%=60:a%=0
5��B$=�param(A$)
5��B$,1)="/"�
5� C$=�value(B$):Ȏ�B$,2)�
5�! �"de":d%=�C$:�d%<10�d%=10
5� �"au":a%=�
5� �
5� �
5� start$=B$
5��
6
�A$=""
6
�a%=0�
6# r%=�get4s(start$,"","","",d%)
6$ �
6.. start$="":loc%=0:r%=0:tlim%=time%+d%*100
68 �
6B J%=�rec
6L �J%>0�
6V Ȏloc%�
6`C �0,1,2:�J%>47�J%<57�start$+=�J%:loc%+=1:�start$="":loc%=0
6j9 �3:�J%=46�start$+=".":loc%+=1:�start$="":loc%=0
6t �
6~ �
6� �poll(slice%)
6� �
6�& �loc%=4�time%>tlim%:�loc%=4�r%=1
6��
6��r%=1 �
6� ipnumber$=start$
6�
J%=�rec
6�+ � terminates on space or control char
6�& ȕ (J%>32 � J%=0) ��ipnumber$<20
6�@ �J%>31 �ipnumber$=ipnumber$+�J%:�poll(slice%):��poll(10)
6� J%=�rec
6� �
7 C%=�(�ipnumber$,1))
7
& ȕ (C%<48 � C%>57) ��ipnumber$>5
7* ipnumber$=�ipnumber$,�(ipnumber$)-1)
7 C%=�(�ipnumber$,1))
7( �
72" �setv("ipaddress",ipnumber$)
7<1 �setv("route",�subst("%ip1.%ip2.%ip3.254"))
7F# return$=ipnumber$:r%=-1:A$=""
7P�
7Z=r%
7d
7n��updateip(A$)
7x
�l%,m%
7�&l%=�A$,"."):�setv("ip1",�A$,l%-1))
7�3m%=�A$,".",l%+1):�setv("ip2",�A$,l%+1,m%-l%-1))
7�3l%=�A$,".",m%+1):�setv("ip3",�A$,m%+1,l%-m%-1))
7��setv("ip4",�A$,l%+1))
7��print("","",A$)
7��
7�
7���makefile(name$)
7�A%=�name$," ")
7�+�A%<=1 � �quit(�msg1("Ebadmake",name$))
7�+source$=�name$,A%-1):dest$=�name$,A%+1)
7�%�print(�msg1("Make",dest$),"","")
7� �source$="-"�source$="null:"
8fh1%=�openin(source$)
80�fh1%=0 ��halt(�msg1("Enotfound",source$)):�
8fh2%=�openout(dest$)
8"-�fh2%=0 ��halt(�msg1("Ebadfile",dest$)):�
8,*ȕ (�#fh1%=� ���line(stage%+1),1)="+")
86 � �#fh1% �
8@& stage%+=1:A$=��line(stage%),2)
8J �
8T A$=�#fh1%
8^ �
8h A$=�subst(A$)
8r �A$,1)<>"#" ��#fh2%,A$
8| �poll(slice%)
8��
8��cf(fh1%):�cf(fh2%)
8��
8�
8�ݤopenin(f$)
8�=�fopen(f$,&4F)
8�
8�ݤopenout(f$)
8�%=�fopen(f$,&8F):�settype(f$,&FFF)
8�
8�ݤopenup(f$)
8��h%
8�h%=�fopen(f$,&CF)
9-�h%=0�h%=�fopen(f$,&8F):�settype(f$,&FFF)
9=h%
9
9&ݤfopen(f$,r%)
90
�h%,F%
9:ș"XOS_Find",r%,f$�h%;F%
9D�(F%�1)�h%=0
9N=h%
9X
9bݤdelfile(f$)
9l�F%:ș"XOS_File",6,f$�;F%
9v=(F%�1)
9�
9���settype(f$,t%)
9�ș"XOS_File",18,f$,t%
9��
9�
9���pause(wait%)
9�
�endtime%
9��wait%=0 �
9�
�paused
9� �
9�$ �log(�msg1("Wait",�wait%+"s"))
9�( �poll(0):st%=time%:wait%=wait%*100
9� �
: �poll(50)
: ��(st%-time%)>wait%
: �
: �
:*
:4
��settime
:>
�l%,m%
:H?q%=3:È™"OS_Word",14,q%
:RIș"OS_ConvertDateAndTime",q%,tmp%,256,"%24%MI%SE"�l%,m%:now$=�str(l%)
:\4�setv("$time",now$):�setv("$mtime",�(time%�100))
:f�
:p
:z
��setdate
:�
�l%,m%
:�?q%=3:ș"OS_Word",14,q%
:�Iș"OS_ConvertDateAndTime",q%,tmp%,256,"%YR%MN%DY"�l%,m%:now$=�str(l%)
:��setv("$date",now$)
:��
:�
:���alarm(A$)
:��al%,a$,an%,at%,ai%,B$,C$
:�an%=-1:al%=-1:ai%=-1:a$=A$
:��B$=�param(A$)
:��B$,1)="/"�
:� C$=�value(B$)
:� Ȏ�B$,2)�
; �"st":stop$=C$
; �"er":error$=C$
;. �"dt","cts":aline%(0)=�tf10(�C$):al%=0
;$( �"ds":aline%(1)=�tf10(�C$):al%=1
;.( �"rn":aline%(2)=�tf10(�C$):al%=2
;8( �"dc":aline%(3)=�tf10(�C$):al%=3
;B! �"ti":at%=�decodetime(C$)
;L �"ic":ai%=�iconid(C$)
;V4 �"na","id":an%=�alarmno(C$):alarmid$(an%)=C$
;`# �"ca","de":�cancelalarm(C$)
;j �
;t�
;~
�A$=""
;��at%>0 �
;� �an%<0�an%=�alarmno("~")
;�; alarm$(an%,0)=B$:alarm$(an%,1)=a$:alarmtime%(an%)=at%
;��
;� �al%>=0 �aline$(al%)=B$
;� �ai%>=0 �ifile$(ai%)=B$
;��
;��
;�
;�ݤalarmno(A$)
;��a%:a%=0
;�5�a%+=1:�alarm$(a%,0)=""�alarmid$(a%)=A$�a%=almax%
<