Home » Archimedes archive » Acorn User » AU 1995-01.adf » !Squisher_Squish » !Squish/!RunImage
!Squish/!RunImage
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
| Tape/disk: | Home » Archimedes archive » Acorn User » AU 1995-01.adf » !Squisher_Squish |
| Filename: | !Squish/!RunImage |
| Read OK: | ✔ |
| File size: | 86E0 bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM > <Squish$Dir>.!RunImage
20PROCinitiate
30ON ERROR PROCerror(REPORT$)
40
50WHILE NOTexit
60PROCpoll(1+dragging%)
70ENDWHILE
80PROCclosedown
90
100DEF PROCinitiate
110PROCwimpinit("Squish","!squish","Squish",3,2000)
120dragging%=FALSE
130x=0:y=1
140tags%=7
150DIM tag(tags%,1),redotag%(tags%),tagon%(tags%),min(1),max(1),s%(1),len%(3)
160tagsize%=12:option%=0
170osprite%=-1:isprite%=-1
180zoom1%=1:zoom2%=1:zoom=1
190DIM quad% 32,magkeys% 3
200?magkeys%=0:magkeys%?1=3:magkeys%?2=-1
210tagon%()=-1
220linear%=TRUE
230PROCmc
240PROCinitheap
250ENDPROC
260
270DEF PROCinitwindows
280DIM spritemenu% 4000
290info%=FNinfowindow("Squish","Sprite Stretcher","Barry Wickett","1.33 (18-Jan-1994)")
300PROCiconbarmenu("Squish,Info>,w%(info%),Quit")
310save%=FNsavebox(sft%,"SpriteFile")
320options%=FNmenu("Update,When told/,End of drag,Whilst dragging")
330magnifier%=FNwindow("magnifier","magnifier",0,0)
340DIM angle% 4
350$angle%="90"
360rotate%=FNmenu("Angle,4!,a0-9,angle%")
370main%=FNwindow("standard","main",FNmenu("Squish,Save>,w%(save%),Select Sprite>,spritemenu%,Linear/,Update>-,options%,Rotate>,rotate%,Zoom>-,w%(magnifier%),Do it"),%110)
380ENDPROC
390
400DEF FNdropmain
410dragging%=FALSE
420IF option%=1 THEN PROCdoit
430=0
440
450DEF PROCnull
460PROCmouseinfo
470IF dragging% THEN
480 nx=(mx%-wx%+mix%)/zoom
490 ny=(my%-wy%+miy%)/zoom
500 IF nx<>tag(dragtag%,x) OR ny<>tag(dragtag%,y) THEN
510 IF option%<2 THEN
520 FOR time%=1 TO 2
530 PROCupdatewindow(w%(main%))
540 WHILE more%
550 redotag%(dragtag%)=TRUE
560 IF dragtag%>=4 THEN
570 redotag%(dragtag%-4)=TRUE
580 redotag%(FNtag(dragtag%-4,1))=TRUE
590 redotag%(FNtag(dragtag%,1))=TRUE
600 redotag%(FNtag(dragtag%,-1))=TRUE
610 ELSE
620 redotag%(dragtag%+4)=TRUE
630 redotag%(FNtag(dragtag%+4,-1))=TRUE
640 IF linear% THEN
650 opptag%=FNtag(dragtag%,2)
660 redotag%(opptag%)=TRUE
670 redotag%(opptag%+4)=TRUE
680 redotag%(FNtag(opptag%+4,-1))=TRUE
690 ENDIF
700 ENDIF
710 PROCredotags
720 SYS"Wimp_GetRectangle",,blk% TO more%
730 ENDWHILE
740 IF time%=1 THEN PROCnewtagpos
750 NEXT time%
760 ELSE
770 PROCnewtagpos
780 PROCdoit
790 ENDIF
800 ENDIF
810ENDIF
820ENDPROC
830
840DEF FNclickmagnifier
850IF FNincicon(0,2,1,1,999) OR FNincicon(3,6,5,1,999) THEN PROCsetzoom
860=0
870
880DEF FNkeymagnifier
890taken=FNiconkeys(magkeys%)
900IF taken=-2 THEN
910 PROCclosemenu
920 PROCsetzoom
930ENDIF
940=taken
950
960DEF PROCsetzoom
970oldzoom=zoom1%/zoom2%
980zoom1%=FNiconval(w%(magnifier%),0)
990zoom2%=FNiconval(w%(magnifier%),3)
1000zoom=zoom1%/zoom2%
1010IF oldzoom<>zoom THEN
1020 PROCwindowinfo(w%(main%))
1030 PROCsetwindowsize
1040 blk%!20=(blk%!20+ww%/2)*zoom/oldzoom-ww%/2
1050 blk%!24=(blk%!24-wh%/2)*zoom/oldzoom+wh%/2
1060 PROCopenwindow
1070 PROCforceredraw(w%(main%))
1080ENDIF
1090ENDPROC
1100
1110DEF PROCsetwindowsize
1120PROCsetwindowextent(w%(main%),-rw%*zoom*2,-rh%*zoom*2,rw%*zoom*2,rh%*zoom*2)
1130ENDPROC
1140
1150DEF PROCnewtagpos
1160IF dragtag%>=4 THEN
1170 tag(dragtag%-4,x)=nx+ix
1180 tag(dragtag%-4,y)=ny+iy
1190 tag(FNtag(dragtag%-4,1),x)=nx-ix
1200 tag(FNtag(dragtag%-4,1),y)=ny-iy
1210ELSE
1220 tag(dragtag%,x)=nx
1230 tag(dragtag%,y)=ny
1240 IF linear% THEN
1250 FOR ord%=x TO y
1260 tag(FNtag(dragtag%,2),ord%)=tag(FNtag(dragtag%,-1),ord%)+tag(FNtag(dragtag%,1),ord%)-tag(dragtag%,ord%)
1270 NEXT ord%
1280 ENDIF
1290ENDIF
1300PROCfindintertags
1310ENDPROC
1320
1330DEF FNredrawmain
1340PROCputsprite(osprite%,sprite$,wx%+spritex*zoom,wy%+spritey*zoom,zoom1%,zoom2%)
1350redotag%()=TRUE
1360PROCredotags
1370=0
1380
1390DEF PROCredotags
1400SYS"Wimp_SetColour",8+3*16
1410FOR tag%=0 TO 3
1420 IF redotag%(tag%) OR redotag%((tag%+1)AND3) THEN
1430 LINE wx%+zoom*tag(tag%,x),wy%+zoom*tag(tag%,y),wx%+zoom*tag((tag%+1)AND3,x),wy%+zoom*tag((tag%+1)AND3,y)
1440 ENDIF
1450NEXT tag%
1460SYS"Wimp_SetColour",11+3*16
1470FOR tag%=0 TO tags%
1480 IF redotag%(tag%) AND tagon%(tag%) THEN
1490 RECTANGLE wx%+zoom*tag(tag%,x)-tagsize%,wy%+zoom*tag(tag%,y)-tagsize%,tagsize%*2,tagsize%*2
1500 redotag%(tag%)=FALSE
1510 ENDIF
1520NEXT tag%
1530ENDPROC
1540
1550DEF FNclickmain
1560PROCwindowinfo(w%(main%))
1570mx%-=wx%:my%-=wy%
1580tag%=-1
1590FOR t%=0 TO tags%
1600 IF mx%>=zoom*tag(t%,x)-tagsize% AND mx%<=zoom*tag(t%,x)+tagsize% AND my%>=zoom*tag(t%,y)-tagsize% AND my%<=zoom*tag(t%,y)+tagsize% AND tagon%(t%) THEN tag%=t%
1610NEXT t%
1620IF tag%>=0 THEN
1630 PROCstartdragbox(0,7,0,0,0,0,wx%+blk%!44,wy%+blk%!48,wx%+blk%!52,wy%+blk%!56)
1640 dragging%=TRUE
1650 dragid%=main%
1660 dragtag%=tag%
1670 IF dragtag%>=4 THEN
1680 ix=tag(dragtag%-4,x)-tag(dragtag%,x)
1690 iy=tag(dragtag%-4,y)-tag(dragtag%,y)
1700 ENDIF
1710 mix%=zoom*tag(dragtag%,x)-mx%
1720 miy%=zoom*tag(dragtag%,y)-my%
1730ENDIF
1740=0
1750
1760DEF FNclosemain
1770PROCloseblock(isprite%)
1780PROCloseblock(osprite%)
1790=TRUE
1800
1810DEF FNopensave
1820PROCseticontext(w%(save%),2,FNstandardfilename(w%(save%)))
1830=0
1840
1850DEF FNmenumain
1860CASE !blk% OF
1870 WHEN 1 : IF blk%!4>-1 THEN PROCnewsprite(blk%!4+1)
1880 WHEN 2
1890 linear%=NOTlinear%
1900 PROCtickmenu(menu%(main%),2,linear%)
1910 IF linear% THEN
1920 FOR ord%=x TO y
1930 tag(2,ord%)=tag(3,ord%)+tag(1,ord%)-tag(0,ord%)
1940 NEXT ord%
1950 ENDIF
1960 PROCfindintertags
1970 PROCforceredraw(w%(main%))
1980 WHEN 3
1990 IF blk%!4>-1 THEN
2000 PROCtickmenu(options%,option%,FALSE)
2010 option%=blk%!4
2020 PROCtickmenu(options%,option%,TRUE)
2030 ENDIF
2040 WHEN 4
2050 ang=RAD(VAL($angle%))
2060 FOR tag%=0 TO tags%
2070 tx=COS(ang)*tag(tag%,x)-SIN(ang)*tag(tag%,y)
2080 tag(tag%,y)=SIN(ang)*tag(tag%,x)+COS(ang)*tag(tag%,y)
2090 tag(tag%,x)=tx
2100 NEXT tag%
2110 PROCforceredraw(w%(main%))
2120 WHEN 6 : PROCdoit
2130ENDCASE
2140=0
2150
2160DEF FNpremenumain
2170d%=FNopensave
2180PROCseticonval(w%(magnifier%),0,zoom1%)
2190PROCseticonval(w%(magnifier%),3,zoom2%)
2200=0
2210
2220DEF FNmenuiconbar
2230IF !blk%=1 THEN PROCclosedown
2240=0
2250
2260DEF FNclickiconbar
2270IF active%(main%) THEN
2280 PROCopenup(w%(main%))
2290ELSE
2300 PROCreport("Drag a spritefile here to start application.")
2310ENDIF
2320=0
2330
2340DEF FNprepareFF9
2350savebuff%=osprite%+4
2360filesize%=osprite%!12-4
2370=-1
2380
2390DEF FNtransblockFF9
2400PROCloseblock(osprite%)
2410PROCnewspritearea(isprite%,size%-12)
2420=isprite%+4
2430
2440DEF FNsavedFF9
2450PROCclosemenu
2460=0
2470
2480DEF FNloadFF9(file$)
2490PROCfileinfo(file$)
2500PROCloseblock(osprite%)
2510PROCnewspritearea(isprite%,filesize%-12)
2520IF isprite%=-1 THEN
2530 IF active%(main%) THEN PROCclosewindow(w%(main%))
2540 PROCreport("Out of room.")
2550ELSE
2560 SYS"OS_SpriteOp",10+256,isprite%,file$
2570ENDIF
2580=-1
2590
2600DEF FNloadedFF9
2610menuptr%=spritemenu%
2620PROCmenutitle("Sprites",menuptr%)
2630FOR s%=1 TO isprite%!4
2640 sname$=FNspritename(isprite%,s%)
2650 PROCmenuitem(sname$,menuptr%)
2660NEXT s%
2670PROCendmenu(menuptr%)
2680chosen%=1
2690PROCnewsprite(chosen%)
2700=0
2710
2720DEF PROCnewsprite(c%)
2730PROCtickmenu(spritemenu%,chosen%-1,FALSE)
2740chosen%=c%
2750PROCtickmenu(spritemenu%,chosen%-1,TRUE)
2760sprite$=FNspritename(isprite%,chosen%)
2770SYS"OS_SpriteOp",24+256,isprite%,sprite$ TO ,,saddr%
2780IF saddr%!32=44 THEN palette%=0 ELSE palette%=1
2790PROCnewspritearea(osprite%,!saddr%)
2800SYS"OS_SpriteOp",40+256,isprite%,sprite$ TO ,,,sx%,sy%,mask%,spmode%
2810osprite%!4=1
2820osprite%!12+=!saddr%
2830SYS"Wimp_TransferBlock",mytask%,saddr%,mytask%,osprite%+16,!saddr%
2840rw%=sx%<<FNmodevar(spmode%,4)
2850rh%=sy%<<FNmodevar(spmode%,5)
2860tag(0,x)=-rw%/2
2870tag(1,x)=rw%/2
2880tag(0,y)=rh%/2
2890tag(2,y)=-rh%/2
2900tag(2,x)=tag(1,x):tag(3,x)=tag(0,x)
2910tag(1,y)=tag(0,y):tag(3,y)=tag(2,y)
2920spritex=tag(0,x)
2930spritey=tag(2,y)
2940PROCfindintertags
2950PROCsetwindowsize
2960!blk%=w%(main%)
2970IF active%(main%) THEN PROCforceredraw(w%(main%))
2980PROCopenup(w%(main%))
2990!blk%=w%(main%)
3000SYS"Wimp_GetWindowState",,blk%
3010blk%!20=-(blk%!12-blk%!4)/2
3020blk%!24=(blk%!16-blk%!8)/2
3030PROCopenwindow
3040ENDPROC
3050
3060DEF PROCfindintertags
3070FOR tag%=0 TO 3
3080 FOR ord=x TO y
3090 tag(tag%+4,ord)=(tag(tag%,ord)+tag((tag%+1)AND3,ord))/2
3100 NEXT ord
3110NEXT tag%
3120ENDPROC
3130
3140DEF FNtag(tag%,inc%)
3150IF tag%<=3 THEN tag%=(tag%+inc%)AND3 ELSE tag%=((tag%-4+inc%)AND3)+4
3160=tag%
3170
3180DEF FNfileokay(filetype%)
3190ok%=TRUE
3200CASE filetype% OF
3210 WHEN sft% : IF message%=5 THEN ok%=FALSE
3220OTHERWISE
3230 ok%=FALSE
3240ENDCASE
3250=ok%
3260
3270DEF PROCdoit
3280SYS"Hourglass_On"
3290FOR ord%=x TO y
3300 min(ord%)=tag(0,ord%)
3310 max(ord%)=tag(0,ord%)
3320 FOR t%=1 TO 3
3330 IF tag(t%,ord%)<min(ord%) THEN min(ord%)=tag(t%,ord%)
3340 IF tag(t%,ord%)>max(ord%) THEN max(ord%)=tag(t%,ord%)
3350 NEXT t%
3360 min(ord%)-=1<<FNmodevar(spmode%,4+ord%)
3370 s%(ord%)=(INT(max(ord%)-min(ord%))>>FNmodevar(spmode%,4+ord%))+1
3380NEXT ord%
3390ssize%=(s%(x)+32)*s%(y)*(1<<FNmodevar(spmode%,9))/4+1000
3400PROCnewspritearea(osprite%,ssize%)
3410IF osprite%=-1 THEN
3420PROCreport("Out of room.")
3430PROCnewsprite(chosen%)
3440ELSE
3450SYS"OS_SpriteOp",15+256,osprite%,sprite$,palette%,s%(x),s%(y),spmode%
3460SYS"OS_SpriteOp",24+256,isprite%,sprite$ TO ,,iaddr%
3470SYS"OS_SpriteOp",24+256,osprite%,sprite$ TO ,,oaddr%
3480IF palette% THEN PROCcopypalette(isprite%,sprite$,osprite%,sprite$)
3490SYS"OS_SpriteOp",29+256,osprite%,sprite$
3500FOR t%=0 TO 3
3510 FOR ord%=x TO y
3520 !(quad%+((t%*2+ord%)<<2))=(tag(t%,ord%)-min(ord%))*256
3530 NEXT ord%
3540NEXT t%
3550IF linear% THEN
3560quad%!24=quad%!16-(quad%!8-!quad%)
3570quad%!28=quad%!20-(quad%!12-quad%!4)
3580SYS"OS_SpriteOp",60+512,osprite%,oaddr% TO r0%,r1%,r2%,r3%
3590SYS"OS_SpriteOp",56+512,isprite%,iaddr%,1,,,quad%
3600SYS"OS_SpriteOp",r0%,r1%,r2%,r3%
3610SYS"OS_SpriteOp",61+512,osprite%,oaddr% TO r0%,r1%,r2%,r3%
3620GCOL 0,0 TINT 0
3630RECTANGLE FILL 0,0,s%(x)<<FNmodevar(spmode%,4),s%(y)<<FNmodevar(spmode%,5)
3640IF mask% THEN
3650 GCOL 8,128+FNmodevar(spmode%,3) TINT 255
3660 SYS"OS_SpriteOp",55+512,isprite%,iaddr%,1,,,quad%
3670ELSE
3680 GCOL 0,FNmodevar(spmode%,3) TINT 255
3690 MOVE quad%!24>>8,quad%!28>>8
3700 MOVE !quad%>>8,quad%!4>>8
3710 PLOT &75,quad%!8>>8,quad%!12>>8
3720ENDIF
3730SYS"OS_SpriteOp",r0%,r1%,r2%,r3%
3740ELSE
3750SYS"OS_SpriteOp",61+512,osprite%,oaddr% TO r0%,r1%,r2%,r3%
3760GCOL 0,0 TINT 0
3770RECTANGLE FILL 0,0,s%(x)<<FNmodevar(spmode%,4),s%(y)<<FNmodevar(spmode%,5)
3780SYS"OS_SpriteOp",r0%,r1%,r2%,r3%
3790FOR t%=0 TO 3
3800 xdiff%=(!(quad%+(t%<<3))-!(quad%+(((t%+1)AND3)<<3)))>>8
3810 ydiff%=(!(quad%+4+(t%<<3))-!(quad%+4+(((t%+1)AND3)<<3)))>>8
3820 len%(t%)=SQR(xdiff%^2+ydiff%^2)
3830NEXT t%
3840IF len%(0)>len%(2) THEN max1%=len%(0) ELSE max1%=len%(2)*1.1
3850IF len%(1)>len%(3) THEN max2%=len%(1) ELSE max2%=len%(3)*1.1
3860!isprite=isprite%
3870!osprite=osprite%
3880!iaddr=iaddr%
3890!oaddr=oaddr%
3900mv4%=FNmodevar(spmode%,4):mv5%=FNmodevar(spmode%,5)
3910!xd1=(quad%!16-quad%!24)>>(mv4%+8)
3920!xd2=(!quad%-quad%!24)>>mv4%
3930!xd3=(quad%!8-!quad%)>>(mv4%+8)
3940!ox=(quad%!24)<<(8-mv4%)
3950!yd1=(quad%!20-quad%!28)>>(mv5%+8)
3960!yd2=(quad%!4-quad%!28)>>mv5%
3970!yd3=(quad%!12-quad%!4)>>(mv5%+8)
3980!oy=(quad%!28)<<(8-mv5%)
3990!step1=(1<<(16+mv4%))/max1%
4000!step2=(1<<(16+mv4%))/max2%
4010!sx=sx%
4020!sy=sy%
4030CALL code%
4040ENDIF
4050spritex=min(x)
4060spritey=min(y)
4070PROCforceredraw(w%(main%))
4080ENDIF
4090SYS"Hourglass_Off"
4100ENDPROC
4110
4120DEF PROCmc
4130DIM code% 2000
4140FOR pass=0 TO 2 STEP 2
4150P%=code%
4160one16=1<<16
4170sarea=1:spointer=2:spritex=3:spritey=4:col=5:tint=6:t1=7:t2=8:temp1=9:temp2=10:temp3=11:temp4=12
4180[OPT pass
4190MOV t1,#0
4200.loop1
4210MOV R1,#100
4220MUL R0,t1,R1
4230MOV R0,R0,ASR#16
4240SWI "Hourglass_Percentage"
4250LDR temp1,xd1
4260MUL temp2,t1,temp1
4270STR temp2,xf1
4280LDR temp1,xd3
4290MUL temp3,temp1,t1
4300SUB temp1,temp3,temp2
4310MOV temp1,temp1,ASR#8
4320LDR temp2,xd2
4330ADD temp1,temp1,temp2
4340STR temp1,xf2
4350LDR temp1,yd1
4360MUL temp2,t1,temp1
4370STR temp2,yf1
4380LDR temp1,yd3
4390MUL temp3,temp1,t1
4400SUB temp1,temp3,temp2
4410MOV temp1,temp1,ASR#8
4420LDR temp2,yd2
4430ADD temp1,temp1,temp2
4440STR temp1,yf2
4450LDR temp1,sx
4460MUL temp2,temp1,t1
4470MOV temp2,temp2,ASR#16
4480STR temp2,spx
4490MOV t2,#0
4500.loop2
4510LDR temp1,xf2
4520MOV R0,t2,ASR#4
4530MUL temp2,temp1,R0
4540MOV temp2,temp2,ASR#4
4550LDR temp1,xf1
4560ADD temp2,temp2,temp1
4570LDR temp1,ox
4580ADD temp2,temp2,temp1
4590MOV temp3,temp2,ASR#16
4600LDR temp1,yf2
4610MUL temp2,temp1,R0
4620MOV temp2,temp2,ASR#4
4630LDR temp1,yf1
4640ADD temp2,temp2,temp1
4650LDR temp1,oy
4660ADD temp2,temp2,temp1
4670MOV temp4,temp2,ASR#16
4680LDR temp1,sy
4690MUL temp2,temp1,t2
4700MOV spritey,temp2,ASR#16
4710LDR spritex,spx
4720MOV R0,#512
4730ADD R0,R0,#43
4740LDR sarea,isprite
4750LDR spointer,iaddr
4760SWI "OS_SpriteOp"
4770CMP R5,#0
4780BEQ endloop
4790MOV R0,#512
4800ADD R0,R0,#41
4810SWI "OS_SpriteOp"
4820MOV R0,#512
4830ADD R0,R0,#42
4840LDR sarea,osprite
4850LDR spointer,oaddr
4860MOV spritex,temp3
4870MOV spritey,temp4
4880SWI "OS_SpriteOp"
4890MOV R0,#512
4900ADD R0,R0,#44
4910MOV R5,#1
4920SWI "OS_SpriteOp"
4930.endloop
4940LDR temp2,step2
4950ADD t2,t2,temp2
4960CMP t2,#one16
4970BLT loop2
4980LDR temp1,step1
4990ADD t1,t1,temp1
5000CMP t1,#one16
5010BLT loop1
5020MOV PC,R14
5030.xd1:EQUD 0
5040.xd2:EQUD 0
5050.xd3:EQUD 0
5060.ox:EQUD 0
5070.yd1:EQUD 0
5080.yd2:EQUD 0
5090.yd3:EQUD 0
5100.oy:EQUD 0
5110.step1:EQUD 0
5120.step2:EQUD 0
5130.mask:EQUD 0
5140.xf1:EQUD 0
5150.xf2:EQUD 0
5160.yf1:EQUD 0
5170.yf2:EQUD 0
5180.spx:EQUD 0
5190.spy:EQUD 0
5200.sx:EQUD 0
5210.sy:EQUD 0
5220.isprite:EQUD 0
5230.osprite:EQUD 0
5240.iaddr:EQUD 0
5250.oaddr:EQUD 0
5260]
5270NEXT pass
5280ENDPROC
5290
5300REM ----WIMP Library routines----
5310
5320DEF PROCnewspritearea(RETURN sprite%,size%)
5330IF sprite%>-1 THEN PROCloseblock(sprite%)
5340sprite%=FNgetblock(size%+16)
5350IF sprite%>-1 THEN
5360!sprite%=size%+16
5370sprite%!4=0
5380sprite%!8=16
5390sprite%!12=16
5400ENDIF
5410ENDPROC
5420
5430REM ==== message routines ====
5440
5450DEF PROCpoll(pollflags%)
5460SYS"Wimp_Poll",pollflags%,blk% TO reason%
5470CASE reason% OF
5480 WHEN 0:PROCnull
5490 WHEN 1:PROCredraw
5500 WHEN 2:PROCopenwindow
5510 WHEN 3:PROCclosewindow(!blk%)
5520 WHEN 4:REM pointer leaving
5530 WHEN 5:REM pointer entering
5540 WHEN 6:PROCclick(!blk%,blk%!4,blk%!8,blk%!12,blk%!16)
5550 WHEN 7:PROCenddrag
5560 WHEN 8:PROCkey(!blk%,blk%!4,blk%!8,blk%!24)
5570 WHEN 9:PROCmenuselect
5580 WHEN 10:REM scroll request
5590 WHEN 11:mycaret%=FALSE
5600 WHEN 12:mycaret%=TRUE
5610 WHEN 17,18:PROCmessage(blk%!4,blk%!8,blk%!16)
5620ENDCASE
5630ENDPROC
5640
5650DEF PROCmessage(task%,ref%,message%)
5660IF status%>0 AND message%>=1 AND message%<=7 THEN message%=-1
5670CASE message% OF
5680 WHEN 0 : PROCquit
5690 WHEN 1
5700 filetype%=blk%!40
5710 IF FNfileokay(filetype%) THEN
5720 itrans%=0
5730 size%=blk%!36
5740 file$=FNstring(blk%+44)
5750 blk%!20=EVAL("FNtransblock"+STR$~(filetype%))
5760 blk%!24=size%
5770 PROCreply(18,6)
5780 ENDIF
5790 WHEN 2
5800 PROCsave(dragid%,FNstring(blk%+44),prepared%)
5810 IF saved% THEN PROCtelltoload ELSE PROCreport("Could not save file")
5820 WHEN 3 : PROCload(FNstring(blk%+44),blk%!40)
5830 WHEN 5 : PROCload(FNstring(blk%+44),blk%!40)
5840 WHEN 6
5850 togo%=filesize%-otrans%
5860 IF togo%>blk%!24 THEN togo%=blk%!24
5870 IF togo%+otrans%>filesize% THEN togo%=filesize%-otrans%
5880 SYS"Wimp_TransferBlock",mytask%,savebuff%+otrans%,task%,blk%!20,togo%
5890 blk%!24=togo%
5900 PROCreply(18,7)
5910 otrans%+=togo%
5920 IF otrans%=filesize% THEN d%=EVAL("FNsaved"+STR$~(misc%(id%)))
5930 WHEN 7
5940 itrans%+=blk%!24
5950 IF itrans%>=size%-16 THEN
5960 d%=EVAL("FNloaded"+STR$~(filetype%))
5970 ELSE
5980 blk%!20+=blk%!24
5990 blk%!24=size%-itrans%
6000 PROCreply(18,6)
6010 ENDIF
6020 WHEN 8 : PROCprequit
6030 WHEN 10: PROCaddtobootfile(blk%!20)
6040 WHEN &400C1 : PROCnewmode
6050ENDCASE
6060ENDPROC
6070
6080DEF PROCreply(type%,blk%!16)
6090blk%!12=ref%
6100SYS"Wimp_SendMessage",type%,blk%,task%
6110ENDPROC
6120
6130DEF PROCnewmode
6140!q%=11:q%!4=12:q%!8=4:q%!12=5:q%!16=3:q%!20=-1
6150SYS"OS_ReadVduVariables",q%,q%
6160scx%=(!q%+1)<<(q%!8)
6170scy%=(q%!4+1)<<(q%!12)
6180pixelw%=1<<q%!8:pixelh%=1<<q%!12
6190cols%=q%!16
6200SYS"Wimp_ReadPalette",,pal%
6210ENDPROC
6220
6230DEF PROCprequit
6240IF changed% THEN
6250 PROCreply(17,8)
6260 PROCclosewindow(w%(main%))
6270ENDIF
6280ENDPROC
6290
6300DEF PROCaddtobootfile(handle%)
6310BPUT#file,"Run "+dir$
6320ENDPROC
6330
6340DEF PROCtelltoload
6350PROCmouseinfo
6360blk%!20=wind%
6370blk%!24=icon%
6380blk%!28=mx%
6390blk%!32=my%
6400blk%!36=filesize%
6410blk%!40=filetype%
6420$(blk%+44)=filename$+CHR$0
6430!blk%=(LEN$(blk%+44)+48)ANDNOT3
6440PROCreply(17,3)
6450ENDPROC
6460
6470DEF PROCdropfile(filename$,filetype%,filesize%)
6480PROCmouseinfo
6490blk%!12=0
6500blk%!16=1
6510blk%!20=wind%
6520blk%!24=icon%
6530blk%!28=mx%
6540blk%!32=my%
6550blk%!36=filesize%
6560blk%!40=filetype%
6570$(blk%+44)=FNlastbit(filename$)+CHR$0
6580!blk%=(LEN$(blk%+44)+48)ANDNOT3
6590SYS"Wimp_SendMessage",17,blk%,blk%!20,blk%!24
6600otrans%=0
6610ENDPROC
6620
6630REM - Sprite routines -
6640
6650DEF PROCloadsprites
6660spritefile$=dir$+".Sprites"
6670PROCfileinfo(spritefile$)
6680IF exist%=1 THEN
6690ssize%=filesize%+16
6700DIM sprites% ssize%
6710!sprites%=ssize%
6720sprites%!4=0
6730sprites%!8=16
6740sprites%!12=16
6750SYS"OS_SpriteOp",10+256,sprites%,spritefile$
6760ELSE
6770sprites%=-1
6780ENDIF
6790ENDPROC
6800DEF PROCputsprite(sprite%,sprite$,x%,y%,z1%,z2%)
6810SYS"OS_SpriteOp",24+256,sprite%,sprite$ TO ,,saddr%
6820SYS"OS_SpriteOp",40+256,sprite%,sprite$ TO ,,,,,,spmode%
6830PROCtables
6840GCOL 8,0
6850SYS"OS_SpriteOp",52+256,sprite%,sprite$,x%,y%,8,scale%,gcol%
6860ENDPROC
6870
6880DEF PROCtables
6890dmode%=MODE
6900dpal%=FNwpal(dmode%)
6910!scale%=(1<<FNmodevar(spmode%,4))*z1%
6920scale%!4=(1<<FNmodevar(spmode%,5))*z1%
6930scale%!8=pixelw%*z2%
6940scale%!12=pixelh%*z2%
6950IF saddr%!32<>44 THEN spal%=FNspritepalette ELSE spal%=FNwpal(spmode%)
6960SYS"ColourTrans_SelectTable",spmode%,spal%,dmode%,dpal%,gcol%
6970ENDPROC
6980
6990DEF FNspritepalette
7000cols%=FNmodevar(spmode%,3)
7010IF cols%>15 THEN cols%=15
7020FOR c%=0 TO cols%
7030sppal%!(c%<<2)=saddr%!(44+(c%<<3))
7040NEXT c%
7050=sppal%
7060
7070DEF PROCcopypalette(fsprite%,fsprite$,tsprite%,tsprite$)
7080SYS"OS_SpriteOp",24+256,fsprite%,fsprite$ TO ,,faddr%
7090SYS"OS_SpriteOp",24+256,tsprite%,tsprite$ TO ,,taddr%
7100FOR a%=44 TO faddr%!32-4 STEP 4
7110 taddr%!a%=faddr%!a%
7120NEXT a%
7130ENDPROC
7140
7150REM - file handling -
7160
7170DEF PROCfileinfo(file$)
7180SYS"OS_File",5,file$ TO exist%,,,,filesize%
7190ENDPROC
7200
7210DEF FNfilesize(file$)
7220LOCAL exist%,filesize%
7230PROCfileinfo(file$)
7240=filesize%
7250
7260DEF FNfileexist(file$)
7270LOCAL exist%,filesize%
7280PROCfileinfo(file$)
7290=exist%
7300
7310DEF FNloadtemplate(title$)
7320SYS"Wimp_LoadTemplate",,blk%,ind%,indend%,fonttable%,title$ TO ,,ind%
7330IF sprites%<>-1 THEN blk%!64=sprites%
7340SYS"Wimp_CreateWindow",,blk% TO wind%
7350=wind%
7360
7370DEF FNnameok(file$)
7380result%=TRUE
7390IF INSTR(file$,":")+INSTR(file$,".")=0 AND file$<>"<Wimp$Scrap>" THEN
7400PROCreport("To save, drag icon to a directory viewer.")
7410result%=FALSE
7420ENDIF
7430=result%
7440
7450REM - menus -
7460
7470DEF PROCtickmenu(menu%,item%,tick%)
7480p%=menu%+28+item%*24
7490IF tick% THEN !p%=!p% OR1 ELSE !p%=!p% ANDNOT1
7500ENDPROC
7510
7520DEF PROCmenutitle(title$,RETURN menuptr%)
7530oldptr%=menuptr%
7540$menuptr%=title$
7550max%=LENtitle$
7560menuptr%!12=&70207
7570menuptr%!20=44
7580menuptr%!24=0
7590menuptr%+=4
7600ENDPROC
7610
7620DEF PROCmenuitem(RETURN text$,RETURN menuptr%)
7630menuptr%+=24
7640!menuptr%=0
7650menuptr%!4=0
7660word$=FNnextword(text$)
7670token$=FNtoken(word$)
7680i1%=-1
7690WHILE token$<>""
7700CASE token$ OF
7710WHEN ">" : menuptr%!4=EVAL(FNnextword(text$))
7720WHEN "/" : !menuptr%=!menuptr% OR 1
7730WHEN "-" : !menuptr%=!menuptr% OR 2
7740WHEN "!"
7750 !menuptr%=!menuptr% OR 4
7760 valid$=FNnextword(text$)
7770 IF LENvalid$ THEN
7780 DIM i1% LENvalid$+1
7790 $i1%=valid$
7800 ENDIF
7810ENDCASE
7820token$=FNtoken(word$)
7830ENDWHILE
7840menuptr%!8=(7<<24) OR %10001
7850IF !menuptr% AND 4 OR token$="#" THEN
7860PROCinditem(EVAL(FNnextword(text$)),i1%,EVAL(word$))
7870ELSE
7880IF LENword$<=12 THEN
7890$(menuptr%+12)=word$
7900ELSE
7910DIM i0% LENword$+1
7920$i0%=word$
7930PROCinditem(i0%,-1,LENword$+1)
7940ENDIF
7950IF LENword$>max% THEN max%=LENword$
7960ENDIF
7970ENDPROC
7980
7990DEF PROCendmenu(RETURN menuptr%)
8000!menuptr%=!menuptr% OR &80
8010menuptr%+=24
8020oldptr%!16=max%*16+12
8030ENDPROC
8040
8050DEF FNmenu(text$)
8060stext$=text$
8070items%=0
8080text$+=","
8090title$=FNnextword(text$)
8100PROCmenutitle(title$,menuptr%)
8110WHILE text$<>""
8120items%+=1
8130PROCmenuitem(text$,menuptr%)
8140ENDWHILE
8150PROCendmenu(menuptr%)
8160=oldptr%
8170
8180DEF PROCinditem(i0%,i1%,i2%)
8190menuptr%!8=menuptr%!8 OR 1<<8
8200menuptr%!12=i0%
8210menuptr%!16=i1%
8220menuptr%!20=i2%
8230IF i2%-1>max% AND (!menuptr% AND 4)=0 THEN max%=i2%-1
8240ENDPROC
8250
8260DEF FNtoken(RETURN word$)
8270token$=""
8280IF INSTR(">/!#-",RIGHT$(word$)) THEN
8290token$=RIGHT$(word$,1)
8300word$=LEFT$(word$,LENword$-1)
8310ENDIF
8320=token$
8330
8340DEF FNnextword(RETURN text$)
8350LOCAL word$,pos%
8360pos%=INSTR(text$,",")
8370word$=LEFT$(text$,pos%-1)
8380text$=MID$(text$,pos%+1)
8390=word$
8400
8410DEF PROCclosemenu
8420SYS"Wimp_CreateMenu",,-1
8430ENDPROC
8440
8450REM - icons -
8460
8470DEF PROCshadeicon(!q%,q%!4,shade%)
8480IF shade% THEN q%!8=1<<22 ELSE q%!8=0
8490q%!12=1<<22
8500SYS"Wimp_SetIconState",,q%
8510ENDPROC
8520
8530DEF FNicontext(!q%,q%!4)
8540SYS"Wimp_GetIconState",,q%
8550IF q%!24AND(1<<8) THEN text$=$(q%!28) ELSE text$=$(q%+28)
8560=text$
8570
8580DEF FNiconval(!q%,q%!4)
8590=VAL(FNicontext(!q%,q%!4))
8600
8610DEF PROCredoicon(!q%,q%!4)
8620SYS"Wimp_GetIconState",,q%
8630SYS"Wimp_ForceRedraw",!q%,q%!8,q%!12,q%!16,q%!20
8640ENDPROC
8650
8660DEF PROCdeleteicon(!q%,q%!4)
8670SYS"Wimp_DeleteIcon",,q%
8680ENDPROC
8690
8700DEF PROCiconinfo(wind%,icon%)
8710!blk%=wind%
8720blk%!4=icon%
8730SYS"Wimp_GetIconState",,blk%
8740ENDPROC
8750
8760DEF FNselected(!q%,q%!4)
8770SYS"Wimp_GetIconState",,q%
8780=(((q%!24)AND(1<<21))>0)
8790
8800DEF FNcricon(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,$(q%+24))
8810SYS"Wimp_CreateIcon",,q% TO icon%
8820=icon%
8830
8840DEF FNbuttype(!q%,q%!4)
8850IF q%!4>=0 THEN SYS"Wimp_GetIconState",,q% ELSE q%!24=0
8860=((q%!24)>>12)AND15
8870
8880DEF PROCselecticon(!q%,q%!4,select%)
8890SYS"Wimp_GetIconState",,q%
8900IF select% THEN q%!8=1<<21 ELSE q%!8=0
8910q%!12=1<<21
8920IF (q%!24 AND q%!12)<>q%!8 THEN SYS"Wimp_SetIconState",,q%
8930ENDPROC
8940
8950DEF PROCseticonfc(!q%,q%!4,col%)
8960SYS"Wimp_GetIconState",,q%
8970q%!8=col%<<24
8980q%!12=15<<24
8990IF (q%!24 AND q%!12)<>q%!8 THEN SYS"Wimp_SetIconState",,q%
9000ENDPROC
9010
9020DEF PROCseticonval(!q%,q%!4,val%)
9030PROCseticontext(!q%,q%!4,STR$(val%))
9040ENDPROC
9050
9060DEF PROCseticontext(!q%,q%!4,text$)
9070SYS"Wimp_GetIconState",,q%
9080text$=LEFT$(text$,q%!36-1)
9090IF $(q%!28)<>text$ THEN
9100$(q%!28)=text$
9110q%!8=0
9120q%!12=0
9130SYS"Wimp_SetIconState",,q%
9140ENDIF
9150ENDPROC
9160
9170DEF FNicontp(!q%,q%!4)
9180SYS"Wimp_GetIconState",,q%
9190=q%!28
9200
9210DEF PROCstartdrag(id%,icon%)
9220dragid%=id%
9230dragicon%=icon%
9240wind%=w%(dragid%)
9250PROCwindowinfo(wind%)
9260!blk%=wind%
9270blk%!4=icon%
9280SYS"Wimp_GetIconState",,blk%
9290!blk%=0
9300blk%!4=5
9310blk%!8+=wx%
9320blk%!12+=wy%
9330blk%!16+=wx%
9340blk%!20+=wy%
9350blk%!24=0
9360blk%!28=0
9370blk%!32=scx%
9380blk%!36=scy%
9390IF drag% THEN
9400SYS"DragASprite_Start",197,1,FNicontext(wind%,icon%),blk%+8,blk%+24
9410ELSE
9420SYS"Wimp_DragBox",,blk%
9430ENDIF
9440ENDPROC
9450
9460REM - user interogation -
9470
9480DEF FNcheck(message$)
9490SYS"Wimp_DragBox",,0
9500!q%=0
9510$(q%+4)=message$
9520SYS"Wimp_ReportError",q%,19,"Message from "+program$ TO ,answer%
9530IF answer%=1 THEN =TRUE ELSE =FALSE
9540
9550DEF PROCreport(message$)
9560d%=FNquestion(message$,"OK","","")
9570ENDPROC
9580
9590DEF FNquestion(ans$(0),ans$(1),ans$(2),ans$(3))
9600LOCAL status%
9610status%=2
9620PROCclosemenu
9630FOR i%=0 TO 3
9640 IF ans$(i%)="" THEN
9650 PROCremoveicon(w%(report%),i%)
9660 ELSE
9670 PROCreiniticon(w%(report%),i%)
9680 PROCseticontext(w%(report%),i%,ans$(i%))
9690 ENDIF
9700NEXT i%
9710PROClosecaret
9720PROCopenincentre(w%(report%))
9730IF beep% THEN VDU 7
9740answer%=0
9750REPEAT
9760 SYS"Wimp_Poll",1,blk% TO reason%
9770 CASE reason% OF
9780 WHEN 1:PROCredraw
9790 WHEN 6:IF blk%!12=w%(report%) AND blk%!16>-1 THEN answer%=blk%!16
9800 WHEN 17,18:PROCmessage(blk%!4,blk%!8,blk%!16)
9810 ENDCASE
9820UNTIL answer%
9830PROCclosewindow(w%(report%))
9840=answer%
9850
9860REM - misc -
9870
9880DEF PROCquit
9890PROCclosedown
9900ENDPROC
9910
9920DEF PROCclosedown
9930PROCresetslot
9940FOR i%=1 TO 255
9950WHILE fonttable%?i%
9960SYS"Font_LoseFont",i%
9970fonttable%?i%-=1
9980ENDWHILE
9990NEXT i%
10000SYS"Wimp_CloseDown",mytask%
10010END
10020ENDPROC
10030
10040DEF FNmodevar(mode%,var%)
10050SYS"OS_ReadModeVariable",mode%,var% TO ,,val%
10060=val%
10070
10080DEF PROCsetfontcolours
10090CASE cols% OF
10100 WHEN 1 : SYS"Font_SetFontColours",,0,1,0
10110 WHEN 3 : SYS"Font_SetFontColours",,0,1,2
10120 WHEN 15 : SYS"Font_SetFontColours",,0,1,6
10130 WHEN 15 : SYS"Font_SetFontColours",,0,1,14,!pal%,pal%!28
10140ENDCASE
10150ENDPROC
10160
10170DEF FNstring(b%)
10180LOCAL s$
10190s$=""
10200WHILE ?b%>31
10210s$+=CHR$(?b%)
10220b%+=1
10230ENDWHILE
10240=s$
10250
10260REM - windows -
10270
10280DEF PROCsetwindowextent(wind%,!q%,q%!4,q%!8,q%!12)
10290SYS"Wimp_SetExtent",wind%,q%
10300ENDPROC
10310
10320DEF PROCopenincentre(!blk%)
10330SYS"Wimp_GetWindowState",,blk%
10340m1%=blk%!12-blk%!4
10350m2%=blk%!16-blk%!8
10360blk%!4=(scx%-m1%)>>1
10370blk%!8=(scy%-m2%)>>1
10380blk%!12=(scx%+m1%)>>1
10390blk%!16=(scy%+m2%)>>1
10400blk%!28=-1
10410PROCopenwindow
10420ENDPROC
10430
10440DEF PROCnewtitle(!blk%,title$)
10450SYS"Wimp_GetWindowInfo",,blk%
10460IF $(blk%!76)<>title$ THEN
10470$(blk%!76)=title$
10480IF active%(FNid(!blk%)) THEN
10490 SYS"Wimp_GetWindowOutline",,blk%
10500 SYS"Wimp_ForceRedraw",-1,blk%!4,blk%!16-44,blk%!12,blk%!16
10510ENDIF
10520ENDIF
10530ENDPROC
10540
10550DEF PROCforceredraw(!blk%)
10560SYS"Wimp_GetWindowInfo",,blk%
10570SYS"Wimp_ForceRedraw",!blk%,blk%!44,blk%!48,blk%!52,blk%!56
10580ENDPROC
10590
10600DEF PROCupdatewindow(!blk%)
10610SYS"Wimp_GetWindowInfo",,blk%
10620blk%!4=blk%!44
10630blk%!8=blk%!48
10640blk%!12=blk%!52
10650blk%!16=blk%!56
10660SYS"Wimp_UpdateWindow",,blk% TO more%
10670ENDPROC
10680
10690DEF PROCopenfully(!blk%,top%)
10700SYS"Wimp_GetWindowInfo",,blk%
10710blk%!12=blk%!4+(blk%!52-blk%!44)
10720blk%!8=blk%!16-(blk%!56-blk%!48)
10730IF top% THEN blk%!28=-1
10740PROCopenwindow
10750ENDPROC
10760
10770DEF PROCclosewindow(wind%)
10780LOCAL cid%,close%
10790cid%=FNid(wind%)
10800IF sysflags%(cid%)AND2 THEN close%=EVAL("FNclose"+id$(cid%)) ELSE close%=TRUE
10810IF close% THEN
10820 active%(cid%)=FALSE
10830 PROCquickclosewindow(w%(cid%))
10840ENDIF
10850ENDPROC
10860
10870DEF PROCquickclosewindow(!q%)
10880SYS"Wimp_CloseWindow",,q%
10890ENDPROC
10900
10910DEF PROCreopen(!blk%)
10920SYS"Wimp_GetWindowState",,blk%
10930PROCopenwindow
10940PROCforceredraw(!blk%)
10950ENDPROC
10960
10970DEF PROCwindowinfo(wind%)
10980!blk%=wind%
10990SYS"Wimp_GetWindowInfo",,blk%
11000wx%=blk%!4-blk%!20
11010wy%=blk%!16-blk%!24
11020ww%=blk%!12-blk%!4
11030wh%=blk%!16-blk%!8
11040ENDPROC
11050
11060DEF FNsavebox(filetype%,standard$)
11070wind%=FNwindow("save","save",0,0)
11080PROCseticontext(w%(wind%),3,"file_"+RIGHT$("00"+STR$~(filetype%),3))
11090PROCseticontext(w%(wind%),1,standard$)
11100misc%(wind%)=filetype%
11110=wind%
11120
11130DEF FNlastbit(file$)
11140WHILE INSTR(file$,".")
11150file$=MID$(file$,INSTR(file$,".")+1)
11160ENDWHILE
11170=file$
11180
11190DEF PROCmouseinfo
11200SYS"Wimp_GetPointerInfo",,q%
11210mx%=!q%
11220my%=q%!4
11230but%=q%!8
11240wind%=q%!12
11250icon%=q%!16
11260ENDPROC
11270
11280DEF PROCsetfiletype(file$,filetype%)
11290SYS"OS_File",&12,file$,filetype%
11300ENDPROC
11310
11320DEF PROCshademenu(menu%,item%,shade%)
11330p%=menu%+36+item%*24
11340!p%=!p% ANDNOT(1<<22)
11350IF shade% THEN !p%=!p% OR(1<<22)
11360ENDPROC
11370
11380DEF PROCgetcaret
11390SYS"Wimp_GetCaretPosition",,q%
11400cwind%=!q%
11410cicon%=q%!4
11420cxoff%=q%!8
11430cyoff%=q%!12
11440cheight%=q%!16
11450cindex%=q%!20
11460ENDPROC
11470
11480DEF PROCputcaret(wind%,icon%,index%)
11490len%=LENFNicontext(wind%,icon%)
11500IF index%>len% THEN index%=len%
11510SYS"Wimp_SetCaretPosition",wind%,icon%,,,-1,index%
11520ENDPROC
11530
11540DEF PROCresetcaret(wind%,icon%)
11550SYS"Wimp_GetCaretPosition",,q%
11560IF (!q%=wind% AND q%!4=icon%) THEN
11570 index%=q%!20
11580 len%=LENFNicontext(wind%,icon%)
11590 IF index%>len% THEN index%=len%
11600 SYS"Wimp_SetCaretPosition",wind%,icon%,,,-1,index%
11610ENDIF
11620IF wind%=0 THEN SYS"Wimp_SetCaretPosition",!q%,q%!4,q%!8,q%!12,q%!16,q%!20
11630ENDPROC
11640
11650DEF PROClosecaret
11660IF mycaret% THEN SYS"Wimp_SetCaretPosition",-1
11670ENDPROC
11680
11690DEF PROCflashicon(!q%,q%!4)
11700FOR f%=1 TO 3
11710WAIT:WAIT
11720PROCselecticon(!q%,q%!4,FALSE)
11730WAIT:WAIT
11740PROCselecticon(!q%,q%!4,TRUE)
11750NEXT f%
11760ENDPROC
11770
11780DEF PROCopeniconmenu(!q%,q%!4,wind%)
11790openmenu%=wind%
11800SYS"Wimp_GetIconState",,q%
11810menux%=q%!16
11820menuy%=q%!20
11830PROCwindowinfo(!q%)
11840menux%+=wx%
11850menuy%+=wy%
11860SYS"Wimp_CreateMenu",,openmenu%,menux%,menuy%
11870ENDPROC
11880
11890DEF FNinfowindow(i1$,i2$,i3$,i4$)
11900wind%=FNwindow("info","",0,0)
11910PROCseticontext(w%(wind%),1,i1$)
11920PROCseticontext(w%(wind%),2,i2$)
11930PROCseticontext(w%(wind%),3,i3$)
11940PROCseticontext(w%(wind%),4,i4$)
11950=wind%
11960
11970DEF PROCwimpinit(name$,sprite$,work$,no%,isize%)
11980changed%=FALSE
11990SYS"OS_GetEnv" TO autoload$
12000autoload$=MID$(autoload$,INSTR(autoload$,CHR$34,INSTR(autoload$,CHR$34)+1)+2)
12010status%=0
12020mycaret%=FALSE
12030windows%=no%+3
12040program$=name$
12050DIM blk% 2000,q% 256,ind% isize%,pal% 256
12060indend%=ind%+isize%
12070$blk%="TASK"
12080SYS"Wimp_Initialise",200,!blk%,program$ TO ,mytask%
12090iconbar%=FNcricon(-1,0,0,68,68,&2002,sprite$)
12100$q%=work$+"$Dir"
12110SYS"OS_ReadVarVal",q%,blk%,256,0,3 TO ,,len%
12120blk%?len%=13
12130dir$=$blk%
12140SYS"XOS_SWINumberFromString",,"DragASprite_Start" TO ;drag%
12150drag%=(drag% AND 1)=0
12160SYS"OS_Byte",161,28 TO ,,bit%
12170IF (bit% AND 2)=0 THEN drag%=FALSE
12180SYS"Wimp_SlotSize",-1,-1 TO appsize%
12190PROCloadsprites
12200tft%=&FFF
12210dft%=&AFF
12220sft%=&FF9
12230exit=FALSE
12240DIM gcol% 256,pal% 80,pal2% 80,pal4% 80,sppal% 80,scale% 16
12250FOR i%=0 TO 1
12260 pal2%!(4*(1-i%))=(&F0F0F0*i%)<<8
12270NEXT i%
12280FOR i%=0 TO 3
12290 pal4%!(4*(3-i%))=(&505050*i%)<<8
12300NEXT i%
12310PROCnewmode
12320DIM menubuffer% 2000,fonttable% 256
12330twind%=0
12340DIM w%(windows%),menu%(windows%),id$(windows%),misc%(windows%),active%(windows%),default%(5,windows%),sysflags%(windows%)
12350menuptr%=menubuffer%
12360FOR i%=1 TO 255
12370fonttable%?i%=0
12380NEXT i%
12390w%(0)=-2:id$(0)="iconbar"
12400SYS"Wimp_OpenTemplate",,dir$+".Templates"
12410PROCinitwindows
12420report%=FNwindow("report","report",0,0)
12430SYS"Wimp_CloseTemplate"
12440DIM ans$(3)
12450beep%=TRUE
12460ENDPROC
12470
12480REM ==== memory management ====
12490
12500DEF FNspace(size%)
12510SYS"XWimp_SlotSize",appsize%+size%,-1 TO new%;noroom%
12520room%=((noroom%AND1)=0)
12530IF new%<appsize%+size% THEN room%=FALSE
12540IF room% THEN appinc%=new%-appsize%
12550=room%
12560
12570DEF PROCinitheap
12580heap%=HIMEM
12590heapsize%=8*1024
12600IF FNspace(heapsize%) THEN
12610 SYS"OS_Heap",0,heap%,,heapsize%
12620ELSE
12630 PROCerror("Out of room.")
12640ENDIF
12650ENDPROC
12660
12670DEF FNlargestblock
12680SYS"OS_Heap",1,heap% TO ,,largest%
12690=largest%
12700
12710DEF FNgetblock(size%)
12720LOCAL ok%
12730ok%=TRUE
12740WHILE ok% AND FNlargestblock<size%
12750 ok%=FNextendheap(8*1024)
12760ENDWHILE
12770IF ok% THEN
12780 SYS"OS_Heap",2,heap%,,size% TO ,,block%
12790ELSE
12800 block%=-1
12810ENDIF
12820=block%
12830
12840DEF PROCloseblock(RETURN block%)
12850IF block%>-1 THEN SYS"OS_Heap",3,heap%,block%
12860block%=-1
12870PROCshrinkheap
12880ENDPROC
12890
12900DEF PROCshrinkheap
12910LOCAL ok%,size%
12920ok%=TRUE
12930size%=-1024
12940WHILE ok%
12950 SYS"XOS_Heap",5,heap%,,size% TO ;ok%
12960 ok%=((ok%AND1)=0)
12970 IF ok% THEN
12980 heapsize%=heap%!12
12990 ok%=FNspace(heapsize%)
13000 ENDIF
13010ENDWHILE
13020ENDPROC
13030
13040DEF FNextendheap(size%)
13050LOCAL ok%
13060ok%=FNspace(heapsize%+size%)
13070IF ok% THEN
13080 SYS"OS_Heap",5,heap%,,size%
13090 heapsize%=heap%!12
13100ENDIF
13110=ok%
13120
13130DEF PROCresetslot
13140SYS"Wimp_SlotSize",appsize%,-1
13150appinc%=0
13160ENDPROC
13170
13180REM ==== filing system routines ====
13190
13200DEF FNstandardfilename(wind%)
13210=FNicontext(wind%,1)
13220
13230DEF PROCsave(id%,file$,prepared%)
13240filename$=file$
13250saved%=FALSE
13260IF FNnameok(filename$) THEN
13270IF prepared%=FALSE THEN prepared%=EVAL("FNprepare"+STR$~(misc%(id%)))
13280CASE prepared% OF
13290 WHEN -1
13300 SYS"OS_File",10,filename$,misc%(id%),,savebuff%,savebuff%+filesize%
13310 d%=EVAL("FNsaved"+STR$~(misc%(id%)))
13320 WHEN -2
13330 d%=EVAL("FNsave"+STR$~(misc%(id%)))
13340ENDCASE
13350PROCclosemenu
13360PROCseticontext(w%(id%),2,filename$)
13370saved%=TRUE
13380ENDIF
13390ENDIF
13400ENDPROC
13410
13420REM ==== menu routines ====
13430
13440DEF PROCopenwindowasmenu(window%)
13450PROCwindowinfo(window%)
13460PROCmouseinfo
13470menux%=mx%-ww%/2
13480menuy%=my%+wh%/2
13490openmenu%=window%
13500id%=FNid(window%)
13510PROCreopenmenu
13520ENDPROC
13530
13540DEF PROCiconbarmenu(text$)
13550menu%(0)=FNmenu(text$)
13560barheight%=items%*44+96
13570ENDPROC
13580
13590DEF PROCmenuselect
13600d%=EVAL("FNmenu"+id$(menuid%))
13610PROCmouseinfo
13620IF but%=1 THEN PROCreopenmenu
13630ENDPROC
13640
13650DEF PROCreopenmenu
13660IF sysflags%(id%)AND4 THEN d%=EVAL("FNpremenu"+id$(id%))
13670SYS"Wimp_CreateMenu",,openmenu%,menux%,menuy%
13680ENDPROC
13690
13700DEF PROCopenmenu(id%)
13710IF menu%(id%) THEN
13720menuid%=id%
13730openmenu%=menu%(id%)
13740IF id%=0 THEN menuy%=barheight% ELSE menuy%=my%
13750menux%=mx%-(openmenu%!16)/2-16
13760PROCreopenmenu
13770ENDIF
13780ENDPROC
13790
13800REM ==== window routines ====
13810
13820DEF FNwindow(wind$,name$,menu%,flags%)
13830twind%+=1
13840w%(twind%)=FNloadtemplate(wind$)
13850PROCwindowinfo(w%(twind%))
13860FOR d%=0 TO 5
13870default%(d%,twind%)=!(blk%+(d%<<2)+4)
13880NEXT d%
13890id$(twind%)=name$
13900menu%(twind%)=menu%
13910sysflags%(twind%)=flags%
13920=twind%
13930
13940DEF PROCredraw
13950id%=FNid(!blk%)
13960PROCwindowinfo(!blk%)
13970SYS"Wimp_RedrawWindow",,blk% TO more%
13980WHILE more%
13990x0%=blk%!28-wx%
14000y0%=blk%!32-wy%
14010x1%=blk%!36-wx%
14020y1%=blk%!40-wy%
14030d%=EVAL("FNredraw"+id$(id%))
14040SYS"Wimp_GetRectangle",,blk% TO more%
14050ENDWHILE
14060ENDPROC
14070
14080DEF FNid(find%)
14090found%=windows%
14100FOR i%=0 TO windows%
14110IF w%(i%)=find% THEN found%=i%
14120NEXT i%
14130=found%
14140
14150DEF PROCopenup(wind%)
14160!blk%=wind%
14170id%=FNid(wind%)
14180IF NOTactive%(id%) THEN
14190FOR d%=0 TO 5
14200!(blk%+(d%<<2)+4)=default%(d%,id%)
14210NEXT d%
14220ELSE
14230SYS"Wimp_GetWindowState",,blk%
14240ENDIF
14250blk%!28=-1
14260PROCopenwindow
14270ENDPROC
14280
14290DEF PROCopenwindow
14300id%=FNid(!blk%)
14310SYS"Wimp_OpenWindow",,blk%
14320active%(id%)=TRUE
14330IF sysflags%(id%)AND1 THEN d%=EVAL("FNopen"+id$(id%))
14340ENDPROC
14350
14360DEF PROCfrontopenwindow(!blk%)
14370SYS"Wimp_GetWindowState",,blk%
14380blk%!28=-1
14390PROCopenwindow
14400ENDPROC
14410
14420DEF PROCredobox(wind%,x0%,y0%,x1%,y1%)
14430IF x1%<x0% THEN SWAP x0%,x1%
14440IF y1%<y0% THEN SWAP y0%,y1%
14450SYS"Wimp_ForceRedraw",wind%,x0%,y0%,x1%,y1%
14460ENDPROC
14470
14480DEF PROCdeletewindow(RETURN !q%)
14490SYS"Wimp_DeleteWindow",,q%
14500!q%=0
14510ENDPROC
14520
14530REM ==== icon routines ====
14540
14550DEF PROCclick(mx%,my%,but%,wind%,icon%)
14560IF FNbuttype(wind%,icon%)=9 THEN PROCflashicon(wind%,icon%)
14570id%=FNid(wind%)
14580CASE but% OF
14590WHEN 64
14600 CASE FNbuttype(w%(id%),icon%) OF
14610 WHEN 6,7,8,10,14 : PROCstartdrag(id%,icon%)
14620 ENDCASE
14630WHEN 2 : PROCopenmenu(id%)
14640OTHERWISE
14650d%=EVAL("FNclick"+id$(id%))
14660ENDCASE
14670ENDPROC
14680
14690DEF PROCenddrag
14700PROCmouseinfo
14710IF drag% THEN SYS"DragASprite_Stop"
14720d%=EVAL("FNdrop"+id$(dragid%))
14730ENDPROC
14740
14750DEF PROCstartdragbox(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28,q%!32,q%!36)
14760SYS"Wimp_DragBox",,q%
14770ENDPROC
14780
14790DEF PROCkey(wind%,icon%,xpos%,key%)
14800taken=EVAL("FNkey"+id$(FNid(wind%)))
14810IF taken=FALSE THEN SYS"Wimp_ProcessKey",key%
14820ENDPROC
14830
14840DEF FNincicon(iicon%,dec%,inc%,lb%,ub%)
14850change%=FALSE
14860IF icon%=dec% OR icon%=inc% THEN
14870val%=VALFNicontext(wind%,iicon%)
14880val%+=(icon%=dec%)*2+1
14890IF val%>ub% THEN val%=ub% ELSE IF val%<lb% THEN val%=lb%
14900PROCseticontext(wind%,iicon%,STR$(val%))
14910PROCresetcaret(wind%,iicon%)
14920change%=TRUE
14930ENDIF
14940ENDIF
14950=change%
14960
14970DEF PROCremoveicon(!q%,q%!4)
14980q%!8=(1<<24)
14990q%!12=(1<<2)OR(1<<5)OR(15<<24)OR(15<<12)
15000SYS"Wimp_SetIconState",,q%
15010ENDPROC
15020
15030DEF PROCreiniticon(!q%,q%!4)
15040q%!8=(1<<2)OR(1<<5)OR(7<<24)OR(3<<12)
15050q%!12=(1<<2)OR(1<<5)OR(15<<12)OR(15<<24)
15060SYS"Wimp_SetIconState",,q%
15070ENDPROC
15080
15090DEF FNiconkeys(data%)
15100taken=TRUE
15110icons%=0
15120WHILE data%?icons%<255
15130 icons%+=1
15140ENDWHILE
15150icons%-=1
15160found%=-1
15170FOR p%=0 TO icons%
15180 IF data%?p%=icon% THEN found%=p%
15190NEXT p%
15200newicon%=-1
15210IF found%>=0 THEN
15220 CASE key% OF
15230 WHEN 13 : newicon%=found%+1
15240 WHEN &18E : IF found%<icons% THEN newicon%=found%+1
15250 WHEN &18F : IF found%>0 THEN newicon%=found%-1
15260 WHEN &19E,&1AE,&1BE : newicon%=icons%
15270 WHEN &19F,&1AF,&1BF : newicon%=0
15280 OTHERWISE
15290 taken=FALSE
15300 ENDCASE
15310ENDIF
15320IF newicon%>icons% THEN taken=-2:newicon%=-1
15330IF newicon%>=0 THEN
15340 PROCgetcaret
15350 PROCputcaret(wind%,data%?newicon%,cindex%)
15360ENDIF
15370=taken
15380
15390REM ==== and the rest ====
15400
15410DEF FNclick=0
15420
15430DEF FNredraw=0
15440
15450DEF FNkey=0
15460
15470DEF FNdrop=0
15480
15490DEF PROCtemp(st$)
15500FOR a%=1 TO LENst$
15510 PRINTASCMID$(st$,a%,1)
15520NEXT a%
15530ENDPROC
15540
15550DEF PROCerror(error$)
15560SYS"Hourglass_Smash"
15570CASE status% OF
15580 WHEN 1
15590 IF print THEN CLOSE#print
15600 report$="Print error, print cancelled"
15610OTHERWISE
15620 report$="An uncontrolable error has occured ("+error$+STR$(ERL)+"), shall I exit?"
15630ENDCASE
15640exit=FNcheck(report$)
15650status%=0
15660ENDPROC
15670
15680DEF FNwpal(mode%)
15690CASE FNmodevar(mode%,3) OF
15700 WHEN 63:p%=0
15710 WHEN 15:p%=pal%
15720 WHEN 3:p%=pal4%
15730 WHEN 1:p%=pal2%
15740ENDCASE
15750=p%
15760
15770DEF FNdropsave
15780filetype%=misc%(dragid%)
15790prepared%=EVAL("FNprepare"+STR$~(filetype%))
15800IF prepared% THEN PROCdropfile(FNicontext(w%(dragid%),2),filetype%,filesize%)
15810=0
15820
15830DEF FNclicksave
15840IF icon%=0 THEN PROCsave(id%,FNicontext(wind%,2),FALSE)
15850=0
15860
15870DEF FNkeysave
15880IF key%=13 THEN PROCsave(id%,FNicontext(wind%,2),FALSE):=TRUE
15890=0
15900
15910DEF FNspritename(sprite%,number%)
15920SYS"OS_SpriteOp",13+256,sprite%,q%,256,number% TO ,,,len%
15930q%?len%=13
15940=$q%
15950
15960DEF PROCload(file$,filetype%)
15970ok%=FNfileokay(filetype%)
15980IF ok% THEN ok%=FNfileexist(file$)
15990IF ok% THEN
16000 PROCreply(18,4)
16010 d%=EVAL("FNload"+STR$~(filetype%)+"(file$)")
16020 d%=EVAL("FNloaded"+STR$~(filetype%))
16030ELSE
16040 IF message%<>5 THEN
16050 PROCreply(18,4)
16060 PROCreport("Cannot load this file.")
16070 ENDIF
16080ENDIF
16090ENDPROC
� > <Squish$Dir>.!RunImage
�initiate
� � �error(�$)
(
2ȕ �exit
<�poll(1+dragging%)
F�
P�closedown
Z
d� �initiate
n1�wimpinit("Squish","!squish","Squish",3,2000)
xdragging%=�
�x=0:y=1
�tags%=7
�L� tag(tags%,1),redotag%(tags%),tagon%(tags%),min(1),max(1),s%(1),len%(3)
�tagsize%=12:option%=0
�osprite%=-1:isprite%=-1
�zoom1%=1:zoom2%=1:zoom=1
�� quad% 32,magkeys% 3
�*?magkeys%=0:magkeys%?1=3:magkeys%?2=-1
�tagon%()=-1
�
linear%=�
��mc
�
�initheap
��
� �initwindows
� spritemenu% 4000
"Winfo%=�infowindow("Squish","Sprite Stretcher","Barry Wickett","1.33 (18-Jan-1994)")
,/�iconbarmenu("Squish,Info>,w%(info%),Quit")
6%save%=�savebox(sft%,"SpriteFile")
@Coptions%=�menu("Update,When told/,End of drag,Whilst dragging")
J3magnifier%=�window("magnifier","magnifier",0,0)
T� angle% 4
^$angle%="90"
h)rotate%=�menu("Angle,4!,a0-9,angle%")
r�main%=�window("standard","main",�menu("Squish,Save>,w%(save%),Select Sprite>,spritemenu%,Linear/,Update>-,options%,Rotate>,rotate%,Zoom>-,w%(magnifier%),Do it"),%110)
|�
�
�� �dropmain
�dragging%=�
�� option%=1 � �doit
�=0
�
�� �null
��mouseinfo
�� dragging% �
� nx=(mx%-wx%+mix%)/zoom
� ny=(my%-wy%+miy%)/zoom
�3 � nx<>tag(dragtag%,x) � ny<>tag(dragtag%,y) �
� � option%<2 �
� time%=1 � 2
$ �updatewindow(w%(main%))
ȕ more%
&" redotag%(dragtag%)=�
0 � dragtag%>=4 �
:& redotag%(dragtag%-4)=�
D. redotag%(�tag(dragtag%-4,1))=�
N, redotag%(�tag(dragtag%,1))=�
X- redotag%(�tag(dragtag%,-1))=�
b �
l& redotag%(dragtag%+4)=�
v/ redotag%(�tag(dragtag%+4,-1))=�
� � linear% �
�* opptag%=�tag(dragtag%,2)
�% redotag%(opptag%)=�
�' redotag%(opptag%+4)=�
�0 redotag%(�tag(opptag%+4,-1))=�
� �
� �
� �redotags
�1 ș"Wimp_GetRectangle",,blk% � more%
�
�
�" � time%=1 � �newtagpos
� � time%
� �
�newtagpos
�doit
�
�
*�
4�
>
H� �clickmagnifier
R>� �incicon(0,2,1,1,999) � �incicon(3,6,5,1,999) � �setzoom
\=0
f
p� �keymagnifier
ztaken=�iconkeys(magkeys%)
�� taken=-2 �
� �closemenu
� �setzoom
��
�
=taken
�
�� �setzoom
�oldzoom=zoom1%/zoom2%
�%zoom1%=�iconval(w%(magnifier%),0)
�%zoom2%=�iconval(w%(magnifier%),3)
�zoom=zoom1%/zoom2%
�� oldzoom<>zoom �
� �windowinfo(w%(main%))
�setwindowsize
0 blk%!20=(blk%!20+ww%/2)*zoom/oldzoom-ww%/2
0 blk%!24=(blk%!24-wh%/2)*zoom/oldzoom+wh%/2
$ �openwindow
. �forceredraw(w%(main%))
8�
B�
L
V� �setwindowsize
`M�setwindowextent(w%(main%),-rw%*zoom*2,-rh%*zoom*2,rw%*zoom*2,rh%*zoom*2)
j�
t
~� �newtagpos
�� dragtag%>=4 �
� tag(dragtag%-4,x)=nx+ix
� tag(dragtag%-4,y)=ny+iy
�% tag(�tag(dragtag%-4,1),x)=nx-ix
�% tag(�tag(dragtag%-4,1),y)=ny-iy
��
� tag(dragtag%,x)=nx
� tag(dragtag%,y)=ny
� � linear% �
� � ord%=x � y
�n tag(�tag(dragtag%,2),ord%)=tag(�tag(dragtag%,-1),ord%)+tag(�tag(dragtag%,1),ord%)-tag(dragtag%,ord%)
� � ord%
�
�
�findintertags
�
(
2� �redrawmain
<P�putsprite(osprite%,sprite$,wx%+spritex*zoom,wy%+spritey*zoom,zoom1%,zoom2%)
Fredotag%()=�
P
�redotags
Z=0
d
n� �redotags
xș"Wimp_SetColour",8+3*16
�� tag%=0 � 3
�/ � redotag%(tag%) � redotag%((tag%+1)�3) �
�i � wx%+zoom*tag(tag%,x),wy%+zoom*tag(tag%,y),wx%+zoom*tag((tag%+1)�3,x),wy%+zoom*tag((tag%+1)�3,y)
� �
�
� tag%
�ș"Wimp_SetColour",11+3*16
�� tag%=0 � tags%
�' � redotag%(tag%) � tagon%(tag%) �
�\ ȓ wx%+zoom*tag(tag%,x)-tagsize%,wy%+zoom*tag(tag%,y)-tagsize%,tagsize%*2,tagsize%*2
� redotag%(tag%)=�
� �
�
� tag%
��
� �clickmain
�windowinfo(w%(main%))
"mx%-=wx%:my%-=wy%
,tag%=-1
6� t%=0 � tags%
@� � mx%>=zoom*tag(t%,x)-tagsize% � mx%<=zoom*tag(t%,x)+tagsize% � my%>=zoom*tag(t%,y)-tagsize% � my%<=zoom*tag(t%,y)+tagsize% � tagon%(t%) � tag%=t%
J� t%
T� tag%>=0 �
^P �startdragbox(0,7,0,0,0,0,wx%+blk%!44,wy%+blk%!48,wx%+blk%!52,wy%+blk%!56)
h dragging%=�
r dragid%=main%
| dragtag%=tag%
� � dragtag%>=4 �
�, ix=tag(dragtag%-4,x)-tag(dragtag%,x)
�, iy=tag(dragtag%-4,y)-tag(dragtag%,y)
� �
�# mix%=zoom*tag(dragtag%,x)-mx%
�# miy%=zoom*tag(dragtag%,y)-my%
��
�=0
�
�� �closemain
��loseblock(isprite%)
��loseblock(osprite%)
�=�
� �opensave
:�seticontext(w%(save%),2,�standardfilename(w%(save%)))
&=0
0
:� �menumain
DȎ !blk% �
N. � 1 : � blk%!4>-1 � �newsprite(blk%!4+1)
X � 2
b linear%=�linear%
l) �tickmenu(menu%(main%),2,linear%)
v � linear% �
� � ord%=x � y
�; tag(2,ord%)=tag(3,ord%)+tag(1,ord%)-tag(0,ord%)
� � ord%
� �
� �findintertags
� �forceredraw(w%(main%))
� � 3
� � blk%!4>-1 �
�' �tickmenu(options%,option%,�)
� option%=blk%!4
�' �tickmenu(options%,option%,�)
� �
� � 4
ang=�(�($angle%))
� tag%=0 � tags%
2 tx=�(ang)*tag(tag%,x)-�(ang)*tag(tag%,y)
; tag(tag%,y)=�(ang)*tag(tag%,x)+�(ang)*tag(tag%,y)
* tag(tag%,x)=tx
4 � tag%
> �forceredraw(w%(main%))
H � 6 : �doit
R�
\=0
f
p� �premenumain
zd%=�opensave
�(�seticonval(w%(magnifier%),0,zoom1%)
�(�seticonval(w%(magnifier%),3,zoom2%)
�=0
�
�� �menuiconbar
�� !blk%=1 � �closedown
�=0
�
�� �clickiconbar
�� active%(main%) �
� �openup(w%(main%))
��
�= �report("Drag a spritefile here to start application.")
�
=0
$� �prepareFF9
.savebuff%=osprite%+4
8filesize%=osprite%!12-4
B=-1
L
V� �transblockFF9
`�loseblock(osprite%)
j%�newspritearea(isprite%,size%-12)
t=isprite%+4
~
�� �savedFF9
��closemenu
�=0
�
�� �loadFF9(file$)
��fileinfo(file$)
��loseblock(osprite%)
�)�newspritearea(isprite%,filesize%-12)
�� isprite%=-1 �
�0 � active%(main%) � �closewindow(w%(main%))
� �report("Out of room.")
��
+ ș"OS_SpriteOp",10+256,isprite%,file$
�
=-1
(� �loadedFF9
2menuptr%=spritemenu%
<"�menutitle("Sprites",menuptr%)
F� s%=1 � isprite%!4
P% sname$=�spritename(isprite%,s%)
Z �menuitem(sname$,menuptr%)
d� s%
n�endmenu(menuptr%)
x
chosen%=1
��newsprite(chosen%)
�=0
�
�� �newsprite(c%)
�&�tickmenu(spritemenu%,chosen%-1,�)
�chosen%=c%
�&�tickmenu(spritemenu%,chosen%-1,�)
�)sprite$=�spritename(isprite%,chosen%)
�6ș"OS_SpriteOp",24+256,isprite%,sprite$ � ,,saddr%
�,� saddr%!32=44 � palette%=0 � palette%=1
�$�newspritearea(osprite%,!saddr%)
�Fș"OS_SpriteOp",40+256,isprite%,sprite$ � ,,,sx%,sy%,mask%,spmode%
�osprite%!4=1
osprite%!12+=!saddr%
Eș"Wimp_TransferBlock",mytask%,saddr%,mytask%,osprite%+16,!saddr%
rw%=sx%<<�modevar(spmode%,4)
" rh%=sy%<<�modevar(spmode%,5)
,tag(0,x)=-rw%/2
6tag(1,x)=rw%/2
@tag(0,y)=rh%/2
Jtag(2,y)=-rh%/2
T'tag(2,x)=tag(1,x):tag(3,x)=tag(0,x)
^'tag(1,y)=tag(0,y):tag(3,y)=tag(2,y)
hspritex=tag(0,x)
rspritey=tag(2,y)
|�findintertags
��setwindowsize
�!blk%=w%(main%)
�.� active%(main%) � �forceredraw(w%(main%))
��openup(w%(main%))
�!blk%=w%(main%)
�!ș"Wimp_GetWindowState",,blk%
�blk%!20=-(blk%!12-blk%!4)/2
�blk%!24=(blk%!16-blk%!8)/2
��openwindow
��
�
�� �findintertags
�� tag%=0 � 3
� ord=x � y
= tag(tag%+4,ord)=(tag(tag%,ord)+tag((tag%+1)�3,ord))/2
� ord
&
� tag%
0�
:
D� �tag(tag%,inc%)
N=� tag%<=3 � tag%=(tag%+inc%)�3 � tag%=((tag%-4+inc%)�3)+4
X =tag%
b
l� �fileokay(filetype%)
v ok%=�
�Ȏ filetype% �
�# � sft% : � message%=5 � ok%=�
�
� ok%=�
��
�=ok%
�
�� �doit
�ș"Hourglass_On"
�� ord%=x � y
� min(ord%)=tag(0,ord%)
� max(ord%)=tag(0,ord%)
� � t%=1 � 3
9 � tag(t%,ord%)<min(ord%) � min(ord%)=tag(t%,ord%)
9 � tag(t%,ord%)>max(ord%) � max(ord%)=tag(t%,ord%)
� t%
, min(ord%)-=1<<�modevar(spmode%,4+ord%)
*C s%(ord%)=(�(max(ord%)-min(ord%))>>�modevar(spmode%,4+ord%))+1
4
� ord%
>;ssize%=(s%(x)+32)*s%(y)*(1<<�modevar(spmode%,9))/4+1000
H#�newspritearea(osprite%,ssize%)
R� osprite%=-1 �
\�report("Out of room.")
f�newsprite(chosen%)
p�
zHș"OS_SpriteOp",15+256,osprite%,sprite$,palette%,s%(x),s%(y),spmode%
�6ș"OS_SpriteOp",24+256,isprite%,sprite$ � ,,iaddr%
�6ș"OS_SpriteOp",24+256,osprite%,sprite$ � ,,oaddr%
�@� palette% � �copypalette(isprite%,sprite$,osprite%,sprite$)
�+ș"OS_SpriteOp",29+256,osprite%,sprite$
�� t%=0 � 3
� � ord%=x � y
�> !(quad%+((t%*2+ord%)<<2))=(tag(t%,ord%)-min(ord%))*256
� � ord%
�� t%
�� linear% �
�&quad%!24=quad%!16-(quad%!8-!quad%)
�(quad%!28=quad%!20-(quad%!12-quad%!4)
�<ș"OS_SpriteOp",60+512,osprite%,oaddr% � r0%,r1%,r2%,r3%
4ș"OS_SpriteOp",56+512,isprite%,iaddr%,1,,,quad%
#ș"OS_SpriteOp",r0%,r1%,r2%,r3%
<ș"OS_SpriteOp",61+512,osprite%,oaddr% � r0%,r1%,r2%,r3%
$� 0,0 Ȝ 0
.Cȓ Ȑ 0,0,s%(x)<<�modevar(spmode%,4),s%(y)<<�modevar(spmode%,5)
8
� mask% �
B( � 8,128+�modevar(spmode%,3) Ȝ 255
L6 ș"OS_SpriteOp",55+512,isprite%,iaddr%,1,,,quad%
V�
`$ � 0,�modevar(spmode%,3) Ȝ 255
j � quad%!24>>8,quad%!28>>8
t � !quad%>>8,quad%!4>>8
~" � &75,quad%!8>>8,quad%!12>>8
��
�#ș"OS_SpriteOp",r0%,r1%,r2%,r3%
��
�<ș"OS_SpriteOp",61+512,osprite%,oaddr% � r0%,r1%,r2%,r3%
�� 0,0 Ȝ 0
�Cȓ Ȑ 0,0,s%(x)<<�modevar(spmode%,4),s%(y)<<�modevar(spmode%,5)
�#ș"OS_SpriteOp",r0%,r1%,r2%,r3%
�� t%=0 � 3
�; xdiff%=(!(quad%+(t%<<3))-!(quad%+(((t%+1)�3)<<3)))>>8
�? ydiff%=(!(quad%+4+(t%<<3))-!(quad%+4+(((t%+1)�3)<<3)))>>8
�# len%(t%)=�(xdiff%^2+ydiff%^2)
�� t%
9� len%(0)>len%(2) � max1%=len%(0) � max1%=len%(2)*1.1
9� len%(1)>len%(3) � max2%=len%(1) � max2%=len%(3)*1.1
!isprite=isprite%
!osprite=osprite%
(!iaddr=iaddr%
2!oaddr=oaddr%
<5mv4%=�modevar(spmode%,4):mv5%=�modevar(spmode%,5)
F&!xd1=(quad%!16-quad%!24)>>(mv4%+8)
P !xd2=(!quad%-quad%!24)>>mv4%
Z#!xd3=(quad%!8-!quad%)>>(mv4%+8)
d!ox=(quad%!24)<<(8-mv4%)
n&!yd1=(quad%!20-quad%!28)>>(mv5%+8)
x!!yd2=(quad%!4-quad%!28)>>mv5%
�%!yd3=(quad%!12-quad%!4)>>(mv5%+8)
�!oy=(quad%!28)<<(8-mv5%)
�!step1=(1<<(16+mv4%))/max1%
�!step2=(1<<(16+mv4%))/max2%
�!sx=sx%
�!sy=sy%
�� code%
��
�spritex=min(x)
�spritey=min(y)
��forceredraw(w%(main%))
��
�ș"Hourglass_Off"
�
� �mc
"� code% 2000
,� pass=0 � 2 � 2
6P%=code%
@one16=1<<16
Jdsarea=1:spointer=2:spritex=3:spritey=4:col=5:tint=6:t1=7:t2=8:temp1=9:temp2=10:temp3=11:temp4=12
T
[OPT pass
^
MOV t1,#0
h
.loop1
rMOV R1,#100
|MUL R0,t1,R1
�MOV R0,R0,ASR#16
�SWI "Hourglass_Percentage"
�LDR temp1,xd1
�MUL temp2,t1,temp1
�STR temp2,xf1
�LDR temp1,xd3
�MUL temp3,temp1,t1
�SUB temp1,temp3,temp2
�MOV temp1,temp1,ASR#8
�LDR temp2,xd2
�ADD temp1,temp1,temp2
�STR temp1,xf2
�LDR temp1,yd1
MUL temp2,t1,temp1
STR temp2,yf1
LDR temp1,yd3
&MUL temp3,temp1,t1
0SUB temp1,temp3,temp2
:MOV temp1,temp1,ASR#8
DLDR temp2,yd2
NADD temp1,temp1,temp2
XSTR temp1,yf2
bLDR temp1,sx
lMUL temp2,temp1,t1
vMOV temp2,temp2,ASR#16
�STR temp2,spx
�
MOV t2,#0
�
.loop2
�LDR temp1,xf2
�MOV R0,t2,ASR#4
�MUL temp2,temp1,R0
�MOV temp2,temp2,ASR#4
�LDR temp1,xf1
�ADD temp2,temp2,temp1
�LDR temp1,ox
�ADD temp2,temp2,temp1
�MOV temp3,temp2,ASR#16
�LDR temp1,yf2
MUL temp2,temp1,R0
MOV temp2,temp2,ASR#4
LDR temp1,yf1
ADD temp2,temp2,temp1
*LDR temp1,oy
4ADD temp2,temp2,temp1
>MOV temp4,temp2,ASR#16
HLDR temp1,sy
RMUL temp2,temp1,t2
\MOV spritey,temp2,ASR#16
fLDR spritex,spx
pMOV R0,#512
zADD R0,R0,#43
�LDR sarea,isprite
�LDR spointer,iaddr
�SWI "OS_SpriteOp"
�
CMP R5,#0
�BEQ endloop
�MOV R0,#512
�ADD R0,R0,#41
�SWI "OS_SpriteOp"
�MOV R0,#512
�ADD R0,R0,#42
�LDR sarea,osprite
�LDR spointer,oaddr
�MOV spritex,temp3
MOV spritey,temp4
SWI "OS_SpriteOp"
MOV R0,#512
$ADD R0,R0,#44
.
MOV R5,#1
8SWI "OS_SpriteOp"
B.endloop
LLDR temp2,step2
VADD t2,t2,temp2
`CMP t2,#one16
j
BLT loop2
tLDR temp1,step1
~ADD t1,t1,temp1
�CMP t1,#one16
�
BLT loop1
�MOV PC,R14
�.xd1:EQUD 0
�.xd2:EQUD 0
�.xd3:EQUD 0
�.ox:EQUD 0
�.yd1:EQUD 0
�.yd2:EQUD 0
�.yd3:EQUD 0
�.oy:EQUD 0
�.step1:EQUD 0
.step2:EQUD 0
.mask:EQUD 0
.xf1:EQUD 0
.xf2:EQUD 0
(.yf1:EQUD 0
2.yf2:EQUD 0
<.spx:EQUD 0
F.spy:EQUD 0
P.sx:EQUD 0
Z.sy:EQUD 0
d.isprite:EQUD 0
n.osprite:EQUD 0
x.iaddr:EQUD 0
�.oaddr:EQUD 0
�]
�
� pass
��
�
�#� ----WIMP Library routines----
�
�%� �newspritearea(� sprite%,size%)
�&� sprite%>-1 � �loseblock(sprite%)
�sprite%=�getblock(size%+16)
�� sprite%>-1 �
�!sprite%=size%+16
�sprite%!4=0
sprite%!8=16
sprite%!12=16
�
"�
,
6 � ==== message routines ====
@
J� �poll(pollflags%)
T+ș"Wimp_Poll",pollflags%,blk% � reason%
^Ȏ reason% �
h � 0:�null
r � 1:�redraw
| � 2:�openwindow
� � 3:�closewindow(!blk%)
� � 4:� pointer leaving
� � 5:� pointer entering
�5 � 6:�click(!blk%,blk%!4,blk%!8,blk%!12,blk%!16)
� � 7:�enddrag
�+ � 8:�key(!blk%,blk%!4,blk%!8,blk%!24)
� � 9:�menuselect
� � 10:� scroll request
� � 11:mycaret%=�
� � 12:mycaret%=�
�- � 17,18:�message(blk%!4,blk%!8,blk%!16)
��
��
#� �message(task%,ref%,message%)
9� status%>0 � message%>=1 � message%<=7 � message%=-1
&Ȏ message% �
0 � 0 : �quit
: � 1
D filetype%=blk%!40
N � �fileokay(filetype%) �
X itrans%=0
b size%=blk%!36
l file$=�string(blk%+44)
v1 blk%!20=�("FNtransblock"+�~(filetype%))
� blk%!24=size%
� �reply(18,6)
� �
� � 2
�1 �save(dragid%,�string(blk%+44),prepared%)
�? � saved% � �telltoload � �report("Could not save file")
�+ � 3 : �load(�string(blk%+44),blk%!40)
�+ � 5 : �load(�string(blk%+44),blk%!40)
� � 6
� togo%=filesize%-otrans%
�' � togo%>blk%!24 � togo%=blk%!24
�; � togo%+otrans%>filesize% � togo%=filesize%-otrans%
�L ș"Wimp_TransferBlock",mytask%,savebuff%+otrans%,task%,blk%!20,togo%
blk%!24=togo%
�reply(18,7)
otrans%+=togo%
< � otrans%=filesize% � d%=�("FNsaved"+�~(misc%(id%)))
* � 7
4 itrans%+=blk%!24
> � itrans%>=size%-16 �
H( d%=�("FNloaded"+�~(filetype%))
R �
\ blk%!20+=blk%!24
f blk%!24=size%-itrans%
p �reply(18,6)
z �
� � 8 : �prequit
�# � 10: �addtobootfile(blk%!20)
� � &400C1 : �newmode
��
��
�
�� �reply(type%,blk%!16)
�blk%!12=ref%
�)ș"Wimp_SendMessage",type%,blk%,task%
��
�
�� �newmode
�2!q%=11:q%!4=12:q%!8=4:q%!12=5:q%!16=3:q%!20=-1
!ș"OS_ReadVduVariables",q%,q%
scx%=(!q%+1)<<(q%!8)
scy%=(q%!4+1)<<(q%!12)
$$pixelw%=1<<q%!8:pixelh%=1<<q%!12
.cols%=q%!16
8ș"Wimp_ReadPalette",,pal%
B�
L
V� �prequit
`� changed% �
j �reply(17,8)
t �closewindow(w%(main%))
~�
��
�
�� �addtobootfile(handle%)
��#file,"Run "+dir$
��
�
�� �telltoload
��mouseinfo
�blk%!20=wind%
�blk%!24=icon%
�blk%!28=mx%
�blk%!32=my%
blk%!36=filesize%
blk%!40=filetype%
$(blk%+44)=filename$+�0
!blk%=(�$(blk%+44)+48)��3
(�reply(17,3)
2�
<
F.� �dropfile(filename$,filetype%,filesize%)
P�mouseinfo
Z
blk%!12=0
d
blk%!16=1
nblk%!20=wind%
xblk%!24=icon%
�blk%!28=mx%
�blk%!32=my%
�blk%!36=filesize%
�blk%!40=filetype%
�%$(blk%+44)=�lastbit(filename$)+�0
�!blk%=(�$(blk%+44)+48)��3
�0ș"Wimp_SendMessage",17,blk%,blk%!20,blk%!24
�
otrans%=0
��
�
�� - Sprite routines -
�
�� �loadsprites
spritefile$=dir$+".Sprites"
�fileinfo(spritefile$)
� exist%=1 �
"ssize%=filesize%+16
,� sprites% ssize%
6!sprites%=ssize%
@sprites%!4=0
Jsprites%!8=16
Tsprites%!12=16
^/ș"OS_SpriteOp",10+256,sprites%,spritefile$
h�
rsprites%=-1
|�
��
�/� �putsprite(sprite%,sprite$,x%,y%,z1%,z2%)
�5ș"OS_SpriteOp",24+256,sprite%,sprite$ � ,,saddr%
�:ș"OS_SpriteOp",40+256,sprite%,sprite$ � ,,,,,,spmode%
��tables
� � 8,0
�?ș"OS_SpriteOp",52+256,sprite%,sprite$,x%,y%,8,scale%,gcol%
��
�
�
� �tables
�dmode%=�
�dpal%=�wpal(dmode%)
�(!scale%=(1<<�modevar(spmode%,4))*z1%
)scale%!4=(1<<�modevar(spmode%,5))*z1%
scale%!8=pixelw%*z2%
scale%!12=pixelh%*z2%
&A� saddr%!32<>44 � spal%=�spritepalette � spal%=�wpal(spmode%)
0@ș"ColourTrans_SelectTable",spmode%,spal%,dmode%,dpal%,gcol%
:�
D
N� �spritepalette
Xcols%=�modevar(spmode%,3)
b� cols%>15 � cols%=15
l� c%=0 � cols%
v&sppal%!(c%<<2)=saddr%!(44+(c%<<3))
�� c%
�=sppal%
�
�7� �copypalette(fsprite%,fsprite$,tsprite%,tsprite$)
�7ș"OS_SpriteOp",24+256,fsprite%,fsprite$ � ,,faddr%
�7ș"OS_SpriteOp",24+256,tsprite%,tsprite$ � ,,taddr%
�� a%=44 � faddr%!32-4 � 4
� taddr%!a%=faddr%!a%
�� a%
��
�
�� - file handling -
�
� �fileinfo(file$)
-ș"OS_File",5,file$ � exist%,,,,filesize%
�
*� �filesize(file$)
4� exist%,filesize%
>�fileinfo(file$)
H=filesize%
R
\� �fileexist(file$)
f� exist%,filesize%
p�fileinfo(file$)
z=exist%
�
�� �loadtemplate(title$)
�Gș"Wimp_LoadTemplate",,blk%,ind%,indend%,fonttable%,title$ � ,,ind%
�%� sprites%<>-1 � blk%!64=sprites%
�'ș"Wimp_CreateWindow",,blk% � wind%
�
=wind%
�
�� �nameok(file$)
�
result%=�
�9� �file$,":")+�file$,".")=0 � file$<>"<Wimp$Scrap>" �
�8�report("To save, drag icon to a directory viewer.")
�
result%=�
��
=result%
� - menus -
$
."� �tickmenu(menu%,item%,tick%)
8p%=menu%+28+item%*24
B&� tick% � !p%=!p% �1 � !p%=!p% ��1
L�
V
`#� �menutitle(title$,� menuptr%)
joldptr%=menuptr%
t$menuptr%=title$
~max%=�title$
�menuptr%!12=&70207
�menuptr%!20=44
�menuptr%!24=0
�menuptr%+=4
��
�
�#� �menuitem(� text$,� menuptr%)
�menuptr%+=24
�!menuptr%=0
�menuptr%!4=0
�word$=�nextword(text$)
�token$=�token(word$)
i1%=-1
ȕ token$<>""
Ȏ token$ �
*� ">" : menuptr%!4=�(�nextword(text$))
(#� "/" : !menuptr%=!menuptr% � 1
2#� "-" : !menuptr%=!menuptr% � 2
< � "!"
F !menuptr%=!menuptr% � 4
P valid$=�nextword(text$)
Z � �valid$ �
d � i1% �valid$+1
n $i1%=valid$
x �
��
�token$=�token(word$)
��
�menuptr%!8=(7<<24) � %10001
�"� !menuptr% � 4 � token$="#" �
�.�inditem(�(�nextword(text$)),i1%,�(word$))
��
�� �word$<=12 �
�$(menuptr%+12)=word$
��
�� i0% �word$+1
�$i0%=word$
��inditem(i0%,-1,�word$+1)
�
� �word$>max% � max%=�word$
�
"�
,
6� �endmenu(� menuptr%)
@!menuptr%=!menuptr% � &80
Jmenuptr%+=24
Toldptr%!16=max%*16+12
^�
h
r� �menu(text$)
|stext$=text$
�items%=0
�text$+=","
�title$=�nextword(text$)
��menutitle(title$,menuptr%)
�ȕ text$<>""
�
items%+=1
��menuitem(text$,menuptr%)
��
��endmenu(menuptr%)
�=oldptr%
�
�� �inditem(i0%,i1%,i2%)
� menuptr%!8=menuptr%!8 � 1<<8
menuptr%!12=i0%
menuptr%!16=i1%
menuptr%!20=i2%
&1� i2%-1>max% � (!menuptr% � 4)=0 � max%=i2%-1
0�
:
D� �token(� word$)
N
token$=""
X� �">/!#-",�word$)) �
btoken$=�word$,1)
lword$=�word$,�word$-1)
v�
�=token$
�
�� �nextword(� text$)
�� word$,pos%
�pos%=�text$,",")
�word$=�text$,pos%-1)
�text$=�text$,pos%+1)
�
=word$
�
�� �closemenu
�ș"Wimp_CreateMenu",,-1
��
�
!� - icons -
!
!!� �shadeicon(!q%,q%!4,shade%)
! "� shade% � q%!8=1<<22 � q%!8=0
!*q%!12=1<<22
!4ș"Wimp_SetIconState",,q%
!>�
!H
!R� �icontext(!q%,q%!4)
!\ș"Wimp_GetIconState",,q%
!f4� q%!24�(1<<8) � text$=$(q%!28) � text$=$(q%+28)
!p
=text$
!z
!�� �iconval(!q%,q%!4)
!�=�(�icontext(!q%,q%!4))
!�
!�� �redoicon(!q%,q%!4)
!�ș"Wimp_GetIconState",,q%
!�3ș"Wimp_ForceRedraw",!q%,q%!8,q%!12,q%!16,q%!20
!��
!�
!�� �deleteicon(!q%,q%!4)
!�ș"Wimp_DeleteIcon",,q%
!��
!�
!�� �iconinfo(wind%,icon%)
"!blk%=wind%
"blk%!4=icon%
"ș"Wimp_GetIconState",,blk%
"$�
".
"8� �selected(!q%,q%!4)
"Bș"Wimp_GetIconState",,q%
"L=(((q%!24)�(1<<21))>0)
"V
"`7� �cricon(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,$(q%+24))
"j#ș"Wimp_CreateIcon",,q% � icon%
"t
=icon%
"~
"�� �buttype(!q%,q%!4)
"�3� q%!4>=0 � ș"Wimp_GetIconState",,q% � q%!24=0
"�=((q%!24)>>12)�15
"�
"�#� �selecticon(!q%,q%!4,select%)
"�ș"Wimp_GetIconState",,q%
"�#� select% � q%!8=1<<21 � q%!8=0
"�q%!12=1<<21
"�7� (q%!24 � q%!12)<>q%!8 � ș"Wimp_SetIconState",,q%
"��
"�
"�� �seticonfc(!q%,q%!4,col%)
# ș"Wimp_GetIconState",,q%
#
q%!8=col%<<24
#q%!12=15<<24
#7� (q%!24 � q%!12)<>q%!8 � ș"Wimp_SetIconState",,q%
#(�
#2
#< � �seticonval(!q%,q%!4,val%)
#F"�seticontext(!q%,q%!4,�(val%))
#P�
#Z
#d"� �seticontext(!q%,q%!4,text$)
#nș"Wimp_GetIconState",,q%
#xtext$=�text$,q%!36-1)
#�� $(q%!28)<>text$ �
#�$(q%!28)=text$
#�
q%!8=0
#�q%!12=0
#�ș"Wimp_SetIconState",,q%
#��
#��
#�
#�� �icontp(!q%,q%!4)
#�ș"Wimp_GetIconState",,q%
#�
=q%!28
#�
#�� �startdrag(id%,icon%)
$dragid%=id%
$dragicon%=icon%
$wind%=w%(dragid%)
$"�windowinfo(wind%)
$,!blk%=wind%
$6blk%!4=icon%
$@ș"Wimp_GetIconState",,blk%
$J!blk%=0
$Tblk%!4=5
$^blk%!8+=wx%
$hblk%!12+=wy%
$rblk%!16+=wx%
$|blk%!20+=wy%
$�
blk%!24=0
$�
blk%!28=0
$�blk%!32=scx%
$�blk%!36=scy%
$�
� drag% �
$�Eș"DragASprite_Start",197,1,�icontext(wind%,icon%),blk%+8,blk%+24
$��
$�ș"Wimp_DragBox",,blk%
$��
$��
$�
$�� - user interogation -
$�
%� �check(message$)
%ș"Wimp_DragBox",,0
% !q%=0
%&$(q%+4)=message$
%0Bș"Wimp_ReportError",q%,19,"Message from "+program$ � ,answer%
%:� answer%=1 � =� � =�
%D
%N� �report(message$)
%X%d%=�question(message$,"OK","","")
%b�
%l
%v0� �question(ans$(0),ans$(1),ans$(2),ans$(3))
%�
� status%
%�
status%=2
%��closemenu
%�� i%=0 � 3
%� � ans$(i%)="" �
%�# �removeicon(w%(report%),i%)
%� �
%�# �reiniticon(w%(report%),i%)
%�- �seticontext(w%(report%),i%,ans$(i%))
%� �
%�� i%
%��losecaret
%��openincentre(w%(report%))
&� beep% � � 7
&
answer%=0
&�
& $ ș"Wimp_Poll",1,blk% � reason%
&* Ȏ reason% �
&4 � 1:�redraw
&>@ � 6:� blk%!12=w%(report%) � blk%!16>-1 � answer%=blk%!16
&H/ � 17,18:�message(blk%!4,blk%!8,blk%!16)
&R �
&\
� answer%
&f�closewindow(w%(report%))
&p=answer%
&z
&�� - misc -
&�
&�� �quit
&��closedown
&��
&�
&�� �closedown
&��resetslot
&�� i%=1 � 255
&�ȕ fonttable%?i%
&�ș"Font_LoseFont",i%
&�fonttable%?i%-=1
&��
'� i%
'ș"Wimp_CloseDown",mytask%
'�
'$�
'.
'8� �modevar(mode%,var%)
'B/ș"OS_ReadModeVariable",mode%,var% � ,,val%
'L =val%
'V
'`� �setfontcolours
'jȎ cols% �
't* � 1 : ș"Font_SetFontColours",,0,1,0
'~* � 3 : ș"Font_SetFontColours",,0,1,2
'�+ � 15 : ș"Font_SetFontColours",,0,1,6
'�: � 15 : ș"Font_SetFontColours",,0,1,14,!pal%,pal%!28
'��
'��
'�
'�� �string(b%)
'�� s$
'� s$=""
'�
ȕ ?b%>31
'�s$+=�(?b%)
'� b%+=1
'��
( =s$
(
(� - windows -
(
((1� �setwindowextent(wind%,!q%,q%!4,q%!8,q%!12)
(2ș"Wimp_SetExtent",wind%,q%
(<�
(F
(P� �openincentre(!blk%)
(Z!ș"Wimp_GetWindowState",,blk%
(dm1%=blk%!12-blk%!4
(nm2%=blk%!16-blk%!8
(xblk%!4=(scx%-m1%)>>1
(�blk%!8=(scy%-m2%)>>1
(�blk%!12=(scx%+m1%)>>1
(�blk%!16=(scy%+m2%)>>1
(�blk%!28=-1
(��openwindow
(��
(�
(�� �newtitle(!blk%,title$)
(� ș"Wimp_GetWindowInfo",,blk%
(�� $(blk%!76)<>title$ �
(�$(blk%!76)=title$
(�� active%(�id(!blk%)) �
(�% ș"Wimp_GetWindowOutline",,blk%
)? ș"Wimp_ForceRedraw",-1,blk%!4,blk%!16-44,blk%!12,blk%!16
)�
)�
)"�
),
)6� �forceredraw(!blk%)
)@ ș"Wimp_GetWindowInfo",,blk%
)J>ș"Wimp_ForceRedraw",!blk%,blk%!44,blk%!48,blk%!52,blk%!56
)T�
)^
)h� �updatewindow(!blk%)
)r ș"Wimp_GetWindowInfo",,blk%
)|blk%!4=blk%!44
)�blk%!8=blk%!48
)�blk%!12=blk%!52
)�blk%!16=blk%!56
)�'ș"Wimp_UpdateWindow",,blk% � more%
)��
)�
)�� �openfully(!blk%,top%)
)� ș"Wimp_GetWindowInfo",,blk%
)�$blk%!12=blk%!4+(blk%!52-blk%!44)
)�$blk%!8=blk%!16-(blk%!56-blk%!48)
)�� top% � blk%!28=-1
)��openwindow
)��
*
*� �closewindow(wind%)
*� cid%,close%
*&cid%=�id(wind%)
*0B� sysflags%(cid%)�2 � close%=�("FNclose"+id$(cid%)) � close%=�
*:� close% �
*D active%(cid%)=�
*N! �quickclosewindow(w%(cid%))
*X�
*b�
*l
*v� �quickclosewindow(!q%)
*�ș"Wimp_CloseWindow",,q%
*��
*�
*�� �reopen(!blk%)
*�!ș"Wimp_GetWindowState",,blk%
*��openwindow
*��forceredraw(!blk%)
*��
*�
*�� �windowinfo(wind%)
*�!blk%=wind%
*� ș"Wimp_GetWindowInfo",,blk%
*�wx%=blk%!4-blk%!20
+wy%=blk%!16-blk%!24
+ww%=blk%!12-blk%!4
+wh%=blk%!16-blk%!8
+ �
+*
+4#� �savebox(filetype%,standard$)
+>$wind%=�window("save","save",0,0)
+H<�seticontext(w%(wind%),3,"file_"+�"00"+�~(filetype%),3))
+R'�seticontext(w%(wind%),1,standard$)
+\misc%(wind%)=filetype%
+f
=wind%
+p
+z� �lastbit(file$)
+�ȕ �file$,".")
+�file$=�file$,�file$,".")+1)
+��
+�
=file$
+�
+�� �mouseinfo
+�ș"Wimp_GetPointerInfo",,q%
+�mx%=!q%
+�my%=q%!4
+�
but%=q%!8
+�wind%=q%!12
+�icon%=q%!16
+��
,
,#� �setfiletype(file$,filetype%)
,#ș"OS_File",&12,file$,filetype%
,$�
,.
,8$� �shademenu(menu%,item%,shade%)
,Bp%=menu%+36+item%*24
,L!p%=!p% ��(1<<22)
,V� shade% � !p%=!p% �(1<<22)
,`�
,j
,t� �getcaret
,~!ș"Wimp_GetCaretPosition",,q%
,�cwind%=!q%
,�cicon%=q%!4
,�cxoff%=q%!8
,�cyoff%=q%!12
,�cheight%=q%!16
,�cindex%=q%!20
,��
,�
,�#� �putcaret(wind%,icon%,index%)
,� len%=��icontext(wind%,icon%)
,�� index%>len% � index%=len%
,�5ș"Wimp_SetCaretPosition",wind%,icon%,,,-1,index%
- �
-
-� �resetcaret(wind%,icon%)
-!ș"Wimp_GetCaretPosition",,q%
-( � (!q%=wind% � q%!4=icon%) �
-2 index%=q%!20
-<" len%=��icontext(wind%,icon%)
-F! � index%>len% � index%=len%
-P7 ș"Wimp_SetCaretPosition",wind%,icon%,,,-1,index%
-Z�
-dI� wind%=0 � ș"Wimp_SetCaretPosition",!q%,q%!4,q%!8,q%!12,q%!16,q%!20
-n�
-x
-�� �losecaret
-�-� mycaret% � ș"Wimp_SetCaretPosition",-1
-��
-�
-�� �flashicon(!q%,q%!4)
-�� f%=1 � 3
-� Ȗ:Ȗ
-��selecticon(!q%,q%!4,�)
-� Ȗ:Ȗ
-��selecticon(!q%,q%!4,�)
-�� f%
-��
-�
.#� �openiconmenu(!q%,q%!4,wind%)
.openmenu%=wind%
.ș"Wimp_GetIconState",,q%
."menux%=q%!16
.,menuy%=q%!20
.6�windowinfo(!q%)
.@menux%+=wx%
.Jmenuy%+=wy%
.T0ș"Wimp_CreateMenu",,openmenu%,menux%,menuy%
.^�
.h
.r"� �infowindow(i1$,i2$,i3$,i4$)
.| wind%=�window("info","",0,0)
.�!�seticontext(w%(wind%),1,i1$)
.�!�seticontext(w%(wind%),2,i2$)
.�!�seticontext(w%(wind%),3,i3$)
.�!�seticontext(w%(wind%),4,i4$)
.�
=wind%
.�
.�/� �wimpinit(name$,sprite$,work$,no%,isize%)
.�changed%=�
.�ș"OS_GetEnv" � autoload$
.�=autoload$=�autoload$,�autoload$,�34,�autoload$,�34)+1)+2)
.�
status%=0
.�mycaret%=�
.�windows%=no%+3
/program$=name$
/+� blk% 2000,q% 256,ind% isize%,pal% 256
/indend%=ind%+isize%
/&$blk%="TASK"
/05ș"Wimp_Initialise",200,!blk%,program$ � ,mytask%
/:0iconbar%=�cricon(-1,0,0,68,68,&2002,sprite$)
/D$q%=work$+"$Dir"
/N.ș"OS_ReadVarVal",q%,blk%,256,0,3 � ,,len%
/Xblk%?len%=13
/bdir$=$blk%
/l=ș"XOS_SWINumberFromString",,"DragASprite_Start" � ;drag%
/vdrag%=(drag% � 1)=0
/�ș"OS_Byte",161,28 � ,,bit%
/�� (bit% � 2)=0 � drag%=�
/�&ș"Wimp_SlotSize",-1,-1 � appsize%
/��loadsprites
/�
tft%=&FFF
/�
dft%=&AFF
/�
sft%=&FF9
/�
exit=�
/�=� gcol% 256,pal% 80,pal2% 80,pal4% 80,sppal% 80,scale% 16
/�� i%=0 � 1
/�& pal2%!(4*(1-i%))=(&F0F0F0*i%)<<8
/�� i%
/�� i%=0 � 3
0& pal4%!(4*(3-i%))=(&505050*i%)<<8
0� i%
0�newmode
0 %� menubuffer% 2000,fonttable% 256
0*twind%=0
04{� w%(windows%),menu%(windows%),id$(windows%),misc%(windows%),active%(windows%),default%(5,windows%),sysflags%(windows%)
0>menuptr%=menubuffer%
0H� i%=1 � 255
0Rfonttable%?i%=0
0\� i%
0fw%(0)=-2:id$(0)="iconbar"
0p,ș"Wimp_OpenTemplate",,dir$+".Templates"
0z�initwindows
0�*report%=�window("report","report",0,0)
0�ș"Wimp_CloseTemplate"
0�
� ans$(3)
0�beep%=�
0��
0�
0�!� ==== memory management ====
0�
0�� �space(size%)
0�7ș"XWimp_SlotSize",appsize%+size%,-1 � new%;noroom%
0�room%=((noroom%�1)=0)
0�#� new%<appsize%+size% � room%=�
0�#� room% � appinc%=new%-appsize%
1
=room%
1
1� �initheap
1$heap%=�
1.heapsize%=8*1024
18� �space(heapsize%) �
1B$ ș"OS_Heap",0,heap%,,heapsize%
1L�
1V �error("Out of room.")
1`�
1j�
1t
1~� �largestblock
1�$ș"OS_Heap",1,heap% � ,,largest%
1�
=largest%
1�
1�� �getblock(size%)
1� � ok%
1� ok%=�
1� ȕ ok% � �largestblock<size%
1� ok%=�extendheap(8*1024)
1��
1�� ok% �
1�+ ș"OS_Heap",2,heap%,,size% � ,,block%
1��
2 block%=-1
2
�
2=block%
2
2(� �loseblock(� block%)
22,� block%>-1 � ș"OS_Heap",3,heap%,block%
2<
block%=-1
2F�shrinkheap
2P�
2Z
2d� �shrinkheap
2n� ok%,size%
2x ok%=�
2�size%=-1024
2�
ȕ ok%
2�( ș"XOS_Heap",5,heap%,,size% � ;ok%
2� ok%=((ok%�1)=0)
2�
� ok% �
2� heapsize%=heap%!12
2� ok%=�space(heapsize%)
2� �
2��
2��
2�
2�� �extendheap(size%)
2� � ok%
3ok%=�space(heapsize%+size%)
3� ok% �
3 ș"OS_Heap",5,heap%,,size%
3" heapsize%=heap%!12
3,�
36=ok%
3@
3J� �resetslot
3T!ș"Wimp_SlotSize",appsize%,-1
3^
appinc%=0
3h�
3r
3|&� ==== filing system routines ====
3�
3�� �standardfilename(wind%)
3�=�icontext(wind%,1)
3�
3� � �save(id%,file$,prepared%)
3�filename$=file$
3�saved%=�
3�� �nameok(filename$) �
3�;� prepared%=� � prepared%=�("FNprepare"+�~(misc%(id%)))
3�Ȏ prepared% �
3�
� -1
3�J ș"OS_File",10,filename$,misc%(id%),,savebuff%,savebuff%+filesize%
3�& d%=�("FNsaved"+�~(misc%(id%)))
4
� -2
4% d%=�("FNsave"+�~(misc%(id%)))
4�
4&�closemenu
40%�seticontext(w%(id%),2,filename$)
4:saved%=�
4D�
4N�
4X�
4b
4l� ==== menu routines ====
4v
4� � �openwindowasmenu(window%)
4��windowinfo(window%)
4��mouseinfo
4�menux%=mx%-ww%/2
4�menuy%=my%+wh%/2
4�openmenu%=window%
4�id%=�id(window%)
4��reopenmenu
4��
4�
4�� �iconbarmenu(text$)
4�menu%(0)=�menu(text$)
4�barheight%=items%*44+96
5�
5
5� �menuselect
5 d%=�("FNmenu"+id$(menuid%))
5*�mouseinfo
54� but%=1 � �reopenmenu
5>�
5H
5R� �reopenmenu
5\3� sysflags%(id%)�4 � d%=�("FNpremenu"+id$(id%))
5f0ș"Wimp_CreateMenu",,openmenu%,menux%,menuy%
5p�
5z
5�� �openmenu(id%)
5�� menu%(id%) �
5�menuid%=id%
5�openmenu%=menu%(id%)
5�,� id%=0 � menuy%=barheight% � menuy%=my%
5�"menux%=mx%-(openmenu%!16)/2-16
5��reopenmenu
5��
5��
5�
5�� ==== window routines ====
5�
5�'� �window(wind$,name$,menu%,flags%)
6
twind%+=1
6#w%(twind%)=�loadtemplate(wind$)
6�windowinfo(w%(twind%))
6$� d%=0 � 5
6.)default%(d%,twind%)=!(blk%+(d%<<2)+4)
68� d%
6Bid$(twind%)=name$
6Lmenu%(twind%)=menu%
6Vsysflags%(twind%)=flags%
6`=twind%
6j
6t
� �redraw
6~id%=�id(!blk%)
6��windowinfo(!blk%)
6�'ș"Wimp_RedrawWindow",,blk% � more%
6�ȕ more%
6�x0%=blk%!28-wx%
6�y0%=blk%!32-wy%
6�x1%=blk%!36-wx%
6�y1%=blk%!40-wy%
6�d%=�("FNredraw"+id$(id%))
6�'ș"Wimp_GetRectangle",,blk% � more%
6��
6��
6�
7 � �id(find%)
7
found%=windows%
7� i%=0 � windows%
7� w%(i%)=find% � found%=i%
7(� i%
72=found%
7<
7F� �openup(wind%)
7P!blk%=wind%
7Zid%=�id(wind%)
7d� �active%(id%) �
7n� d%=0 � 5
7x&!(blk%+(d%<<2)+4)=default%(d%,id%)
7�� d%
7��
7�!ș"Wimp_GetWindowState",,blk%
7��
7�blk%!28=-1
7��openwindow
7��
7�
7�� �openwindow
7�id%=�id(!blk%)
7�ș"Wimp_OpenWindow",,blk%
7�active%(id%)=�
7�0� sysflags%(id%)�1 � d%=�("FNopen"+id$(id%))
8�
8
8� �frontopenwindow(!blk%)
8"!ș"Wimp_GetWindowState",,blk%
8,blk%!28=-1
86�openwindow
8@�
8J
8T%� �redobox(wind%,x0%,y0%,x1%,y1%)
8^� x1%<x0% � Ȕ x0%,x1%
8h� y1%<y0% � Ȕ y0%,y1%
8r.ș"Wimp_ForceRedraw",wind%,x0%,y0%,x1%,y1%
8|�
8�
8�� �deletewindow(� !q%)
8�ș"Wimp_DeleteWindow",,q%
8� !q%=0
8��
8�
8�� ==== icon routines ====
8�
8�&� �click(mx%,my%,but%,wind%,icon%)
8�7� �buttype(wind%,icon%)=9 � �flashicon(wind%,icon%)
8�id%=�id(wind%)
8�
Ȏ but% �
8�� 64
9" Ȏ �buttype(w%(id%),icon%) �
9- � 6,7,8,10,14 : �startdrag(id%,icon%)
9 �
9&� 2 : �openmenu(id%)
90
9:d%=�("FNclick"+id$(id%))
9D�
9N�
9X
9b� �enddrag
9l�mouseinfo
9v"� drag% � ș"DragASprite_Stop"
9�d%=�("FNdrop"+id$(dragid%))
9��
9�
9�L� �startdragbox(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28,q%!32,q%!36)
9�ș"Wimp_DragBox",,q%
9��
9�
9�"� �key(wind%,icon%,xpos%,key%)
9�$taken=�("FNkey"+id$(�id(wind%)))
9�(� taken=� � ș"Wimp_ProcessKey",key%
9��
9�
9�(� �incicon(iicon%,dec%,inc%,lb%,ub%)
:
change%=�
:� icon%=dec% � icon%=inc% �
:!val%=��icontext(wind%,iicon%)
: val%+=(icon%=dec%)*2+1
:*1� val%>ub% � val%=ub% � � val%<lb% � val%=lb%
:4&�seticontext(wind%,iicon%,�(val%))
:>�resetcaret(wind%,iicon%)
:H
change%=�
:R�
:\�
:f=change%
:p
:z� �removeicon(!q%,q%!4)
:�q%!8=(1<<24)
:�)q%!12=(1<<2)�(1<<5)�(15<<24)�(15<<12)
:�ș"Wimp_SetIconState",,q%
:��
:�
:�� �reiniticon(!q%,q%!4)
:�&q%!8=(1<<2)�(1<<5)�(7<<24)�(3<<12)
:�)q%!12=(1<<2)�(1<<5)�(15<<12)�(15<<24)
:�ș"Wimp_SetIconState",,q%
:��
:�
:�� �iconkeys(data%)
:�taken=�
;icons%=0
;ȕ data%?icons%<255
; icons%+=1
;$�
;.
icons%-=1
;8
found%=-1
;B� p%=0 � icons%
;L" � data%?p%=icon% � found%=p%
;V� p%
;`newicon%=-1
;j� found%>=0 �
;t Ȏ key% �
;~ � 13 : newicon%=found%+1
;�4 � &18E : � found%<icons% � newicon%=found%+1
;�/ � &18F : � found%>0 � newicon%=found%-1
;�* � &19E,&1AE,&1BE : newicon%=icons%
;�% � &19F,&1AF,&1BF : newicon%=0
;�
;� taken=�
;� �
;��
;�,� newicon%>icons% � taken=-2:newicon%=-1
;�� newicon%>=0 �
;� �getcaret
;�- �putcaret(wind%,data%?newicon%,cindex%)
<