Home » Archimedes archive » Archimedes World » AW-1992-10.adf » AWOct92 » !AWOct92/Goodies/JigWord/!JigWord/!RunImage
!AWOct92/Goodies/JigWord/!JigWord/!RunImage
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Archimedes World » AW-1992-10.adf » AWOct92 |
Filename: | !AWOct92/Goodies/JigWord/!JigWord/!RunImage |
Read OK: | ✔ |
File size: | 9D8C bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM >!RunImage 20REM Remember to test if CreateMenu reports an error abt indirected data 30REM Remember to do PROCDeleteMStruct for all those difficult windows 40ON ERROR MODE 0:SYS "Wimp_CloseDown":PRINT REPORT$;" at line ";ERL:END 50: 60SYS "Wimp_Initialise",200,&4B534154,"JigWord" TO ,task% 70: 80PROCInitialise 90A%=hilitecol%:CALL ChangeHiCol 100PROCCreateIcon(0) 110: 120PROCCreateWindow(1) 130: 140quit%=FALSE:menus%=-1:menuw%=-1:mask%=1 150REPEAT 160 ON ERROR LOCAL PROCError1st 170 SYS "Wimp_Poll",mask%,b% TO p% 180 CASE p% OF 190 WHEN 0:REMPROCCycle 200 WHEN 1:PROCP_1(b%) 210 WHEN 2:SYS "Wimp_OpenWindow",,b% 220 WHEN 3:PROCP_3(b%) 230 WHEN 6:PROCP_6(b%) 240 WHEN 8:PROCP_8(b%) 250 WHEN 9:PROCP_9(b%) 260 WHEN 17,18:PROCReceive(b%) 270 ENDCASE 280UNTIL quit% 290SYS "Wimp_CloseDown",task%,&4B534154 300END 310: 320 "Oh no! An error, this can't be!" 330 'Sorry, but it's worse than that.' 340 "Worse? It, it, it's not a fatal error, is it?" 350 'That just about sums it up. Sorry' 360 "Arghhhh!" 370: 380DEF PROCError1st 390!error%=ERR 400$(error%+4)=REPORT$+" at line "+STR$(ERL) 410SYS "Wimp_ReportError",error%,,"JigWord" 420SYS "Wimp_CloseDown" 430END 440ENDPROC 450: 460 "Stop messing with my mind you little horrors!" 470 480 'But it's our job. Don't think of us as an error, 490 more as messages from RISCOS - postcards from 500 ROM.' 510 520 "ROM, ROM? Isn't that where the volcano appeared and 530 wiped out hundreds of innocent programmers? I saw that 540 video last night." 550 560 'You really do have problems. I don't think your 570 sliced loaf goes right to the crust.' 580 590 "And your disc drive head doesn't go to the last track." 600 610 'Touchy touchy, aren't we. Well, onto the next 620 procedure.' 630: 640DEF PROCError2nd(err%) 650!error%=err% 660$(error%+4)=error$(err%) 670SYS "Wimp_ReportError",error%,,"JigWord" 680ENDPROC 690: 700 "Noooooooo!" 710 'Don't worry about it. Relax.' 720 "Arghhhhhh!" 730 'It's only another type of fatal internal error.' 740 750 'And stop dribbling!' 760: 770DEF PROCError3rd 780!error%=0 790$(error%+4)=err$ 800SYS "Wimp_ReportError",error%,,"JigWord" 810SYS "Wimp_CloseDown" 820END 830ENDPROC 840: 850 "?" 860 870 'That's it, take him away lads. Into the 880 land of eternal internal error.' 890 900 "?" 910 920 'Take him to room 101.' 930 940 "What, what's in room 101?" 950 960 'You know what is in room 101. Everyone 970 knows what is in room 101' 980 990 "Arghhhhh!" 1000: 1010DEF PROCErrorPrint1st 1020!error%=ERR 1030$(error%+4)=REPORT$+" at line "+STR$(ERL) 1040SYS "Wimp_ReportError",error%,,"JigWord" 1050REM 'Snigger snigger.' 1060ENDPROC 1070: 1080DEF PROCInitialise 1090hilitecol%=9 1100print$="printer:" 1110pwidth%=80 1120: 1130DIM b% 256 1140DIM b2% 256 1150DIM code% 4096 1160: 1170DIM creates% 7*1024 1180cjiglen%=8192:cscratlen%=512 1190DIM cjigst% cjiglen%,cscratst% cscratlen% 1200: 1210SYS "OS_ReadVarVal","JigWord$Dir",b%,255,0,0 TO ,,l% 1220b%?l%=&0D 1230path$=$b% 1240h%=OPENIN(path$+".Words") 1250wordlen%=(BGET#h%)+((BGET#h%)<<8)+((BGET#h%)<<16)+((BGET#h%)<<24) 1260CLOSE#h% 1270DIM wordst% wordlen% 1280OSCLI "Load "+path$+".Words 10_"+STR$(wordst%) 1290: 1300OSCLI "Load "+path$+".CreateO 10_"+STR$(creates%) 1310result%=creates% 1320changejig%=creates%+creates%!4 1330cwordst%=creates%+creates%!8 1340csize%=creates%+creates%!12 1350changecscrat%=creates%+creates%!16 1360cpuzzarea%=creates%+creates%!20 1370cinitvar%=creates%+creates%!24 1380createjig%=creates%+creates%!28 1390crand%=creates%+creates%!32 1400A%=RND(-TIME):A%=RND:CALL crand% 1410A%=cjigst%:B%=cjiglen%:CALL changejig% 1420A%=wordst%:CALL cwordst% 1430A%=cscratst%:B%=cscratlen%:CALL changecscrat% 1440: 1450DIM dispjigst% 6144 1460OSCLI "Load "+path$+".JigDispO 10_"+STR$(dispjigst%) 1470ChangeHiCol=dispjigst%+dispjigst%!00 1480puzzshuffle=dispjigst%+dispjigst%!04 1490puzzselect=dispjigst%+dispjigst%!08 1500HFit=dispjigst%+dispjigst%!12 1510VFit=dispjigst%+dispjigst%!16 1520ChangeJig=dispjigst%+dispjigst%!20 1530ChangeSel=dispjigst%+dispjigst%!24 1540CreateHeap=dispjigst%+dispjigst%!28 1550Gridsetc=dispjigst%+dispjigst%!32 1560Word=dispjigst%+dispjigst%!36 1570puzzshflags1=dispjigst%+dispjigst%!40 1580nextpuzzst=dispjigst%+dispjigst%!44 1590selh=dispjigst%+dispjigst%!48 1600selv=dispjigst%+dispjigst%!52 1610fit=dispjigst%+dispjigst%!56 1620hlen=dispjigst%+dispjigst%!60 1630vlen=dispjigst%+dispjigst%!64 1640ChangeBckGndCol=dispjigst%+dispjigst%!68 1650: 1660err%=FALSE:err$="" 1670DIM error$(10),error% 256 1680FOR a%=0 TO 8 1690 READ error$(a%) 1700NEXT 1710: 1720maxpuzz%=10 1730DIM puzzst% 32*1024,puzzin%(maxpuzz%),pinfo%(maxpuzz%,10) 1740DIM puzzim% 1024 1750puzzend%=puzzst%+32*1024 1760nxtpuzzst%=puzzst% 1770DIM pfree%(maxpuzz%) 1780: 1790DIM scratch% 4096 1800: 1810maxpword%=10 1820DIM pword%(maxpword%,5),pwuse%(maxpword%) 1830: 1840DIM create%(10) 1850: 1860DIM sprarea%(4):REM sprite area addresses, 0 is Wimp area 1870sprarea%(0)=1 1880: 1890numicon%=75:nexticon%=0 1900DIM icon%(numicon%,9),icon$(numicon%,1) 1910DIM iconst% 64 1920PROCReadIconData 1930pwordiconst%=nexticon% 1940nexticon%+=(maxpword%+1)*3 1950: 1960nummenu%=10:nextmenu%=0:maxitem%=9 1970DIM item%(nummenu%,maxitem%,4),item$(nummenu%,maxitem%,1) 1980DIM menu%(nummenu%,1),menu$(nummenu%) 1990DIM menust% 1024,menuin%(nummenu%) 2000nxtmenust%=menust%:menuend%=menust%+1024:nextmenu%=0 2010PROCReadMenuData 2020: 2030numms%=10:REM number menu structures 2040DIM mstructst% 1023,mstructin%(numms%) 2050nxtmstruct%=mstructst%:mstructend%=mstructst%+1024 2060PROCReadMStructData 2070: 2080numdat%=200 2090DIM indata% 1024,data%(numdat%,3) 2100dataend%=indata%+1024 2110nextdat%=0:nextdatst%=indata% 2120REM indirected data 2130REM data%(item num,[data start,length,validation{-1},length{-1}] 2140: 2150nextwpos%=0:REM incremented to allow windows to open at offsets 2160numwind%=15 2170DIM wind%(numwind%,20),wind$(numwind%),wuse%(numwind%) 2180DIM wbuff% 512 2190PROCReadWindowData 2200ENDPROC 2210: 2220 Anyone wanting to know how the puzzles are 2230 created, tough! It's all in machine code. And so 2240 is the display code. 2250: 2260DEF PROCInitialiseDispFile(p%) 2270pinfo%(p%,0)=nxtpuzzst%!4 2280pinfo%(p%,1)=nxtpuzzst%!8 2290pinfo%(p%,2)=FNPNumOfWords(nxtpuzzst%) 2300pinfo%(p%,3)=0 2310pinfo%(p%,4)=0 2320pinfo%(p%,5)=-1 2330pinfo%(p%,6)=-1 2340pinfo%(p%,7)=-1 2350pinfo%(p%,8)=0 2360pinfo%(p%,9)=0 2370pinfo%(p%,10)=0 2380pfree%(p%)=-1 2390puzzin%(p%)=nxtpuzzst% 2400nxtpuzzst%+=!nxtpuzzst% 2410ENDPROC 2420: 2430DEF PROCReadIconData 2440LOCAL a%,b%,n% 2450RESTORE 4140 2460READ n% 2470FOR a%=0 TO n%-1 2480 FOR b%=0 TO 9 2490 READ icon%(a%,b%) 2500 IF icon%(a%,6)=4 THEN icon%(a%,6)=1 2510 NEXT 2520 READ icon$(a%,0),icon$(a%,1) 2530 PROCCheckIconData(a%,icon%(a%,8),icon$(a%,0),icon$(a%,1),icon%(a%,4)) 2540 IF err% THEN PROCError3rd 2550NEXT 2560nexticon%=n% 2570ENDPROC 2580DEF PROCCheckIconData(i%,l%,a$,b$,f%) 2590CASE icon%(a%,6) OF 2600 WHEN 0: 2610 IF LEN(a$)>12 OR (f% AND %1)<>%1 OR (f% AND 256)=256 THEN 2620 err%=TRUE:err$="Icon "+STR$(i%)+" is invalid (0)" 2630 ENDPROC 2640 ENDIF 2650 WHEN 1: 2660 IF LEN(a$)+1>l% OR (f% AND %1)<>%1 OR (f% AND 256)=0 THEN 2670 err%=TRUE:err$="Icon "+STR$(i%)+" is invalid (1)" 2680 ENDPROC 2690 ENDIF 2700 WHEN 2: 2710 IF LEN(a$)>12 OR (f% AND %10)<>%10 OR (f% AND 256)=256 THEN 2720 err%=TRUE:err$="Icon "+STR$(i%)+" is invalid (2)" 2730 ENDPROC 2740 ENDIF 2750 WHEN 3: 2760 IF LEN(a$)+1>l% OR b$="" OR (f% AND %10)=0 OR (f% AND 256)=0 THEN 2770 err%=TRUE:err$="Icon "+STR$(i%)+" is invalid (3)" 2780 ENDPROC 2790 ENDIF 2800 WHEN 4: 2810 err%=TRUE:err$="Icon "+STR$(i%)+" has type 4, please use type 1" 2820 OTHERWISE 2830 err%=TRUE:err$="Icon "+STR$(i%)+" has an unknown type" 2840 ENDPROC 2850ENDCASE 2860ENDPROC 2870: 2880DEF PROCReadMenuData 2890LOCAL a%,n%,b% 2900RESTORE 3950 2910READ n% 2920FOR a%=0 TO n%-1 2930 READ menu$(a%) 2940 READ menu%(a%,0),menu%(a%,1) 2950 FOR b%=0 TO menu%(a%,1)-1 2960 READ item%(a%,b%,0),item%(a%,b%,1),item%(a%,b%,2),item%(a%,b%,3) 2970 READ item%(a%,b%,4) 2980 READ item$(a%,b%,0),item$(a%,b%,1) 2990 NEXT 3000 PROCCheckMenuData(a%) 3010 IF err% THEN PROCError3rd 3020NEXT 3030ENDPROC 3040DEF PROCCheckMenuData(m%) 3050LOCAL b%,f% 3060IF LEN(menu$(m%))>12 THEN 3070 err$="Menu "+STR$(a%)+" title too long" 3080 err%=TRUE 3090 ENDPROC 3100ENDIF 3110FOR b%=0 TO menu%(m%,1)-1 3120 f%=item%(m%,b%,3) 3130 IF (f% AND %100001)<>%10001 AND f%<>0 THEN 3140 err$="Menu "+STR$(m%)+" item "+STR$(b%)+" icon flags should be %100001" 3150 err%=TRUE 3160 ENDPROC 3170 ENDIF 3180 IF LEN(item$(m%,b%,0))>12 AND (f% AND 256)=0 THEN 3190 err$="Menu "+STR$(m%)+" item "+STR$(b%)+" should be indirected" 3200 err%=TRUE 3210 ENDPROC 3220 ENDIF 3230 IF (f% AND 256)=256 AND LEN(item$(m%,b%,0))+1<item%(m%,b%,4) THEN 3240 err$="Menu "+STR$(m%)+" item "+STR$(b%)+" should is a mess" 3250 err%=TRUE 3260 ENDPROC 3270 ENDIF 3280NEXT 3290ENDPROC 3300: 3310DEF PROCReadMStructData 3320LOCAL a%,n%,o%,addr%,d% 3330RESTORE 4750 3340READ n% 3350addr%=nxtmstruct% 3360FOR a%=0 TO n%-1 3370 mstructin%(a%)=addr% 3380 REPEAT 3390 READ d% 3400 !addr%=d% 3410 addr%+=4 3420 UNTIL d%=-1 3430NEXT 3440nstmstruct%=addr% 3450ENDPROC 3460: 3470DEF PROCReadWindowData 3480LOCAL a%,n%,b% 3490RESTORE 3720 3500READ n% 3510FOR a%=0 TO n%-1 3520 READ wind$(a%) 3530 FOR b%=0 TO 20 3540 READ wind%(a%,b%) 3550 NEXT 3560 wuse%(a%)=-1 3570NEXT 3580ENDPROC 3590: 3600REM If you get the first message, congratulations! It took me forever. 3610: 3620DATA "Not enough indirected data workspace, tell a competent programmer" 3630DATA "Minimum width is 30" 3640DATA "Minimum height is 15" 3650DATA "Too many puzzles" 3660DATA "Not enough room for puzzle" 3670DATA "Not enough workspace to open window" 3680DATA "Only 5 views of a puzzle allowed" 3690DATA "Maximum width is 99" 3700DATA "Maximum height is 99" 3710REM Actually 255*255 is the biggest size. But also impossible 3720: 3730REM Windows 3740DATA 3 3750DATA About this program 3760DATA -1,-1, 0,0,604,212, 0,0 3770DATA 0,-212,604,0, 0,0 3780DATA %10010+(132<<24) 3790DATA 1 3800DATA 1,8,-1,0,0 3810 3820DATA "JigWord Creation" 3830DATA -1,-1, 200,200,456,800, 0,0 3840DATA 0,-256,0,0, 0,200 3850DATA %10010+(135<<24)+(1<<12) 3860DATA 1,9,6,-1,3,0 3870 3880DATA "About this Puzzle" 3890DATA -1,-1,0,0,332,160, 0,0 3900DATA 0,-160,332,0, 0,0 3910DATA %10010+(132<<24) 3920DATA 1 3930DATA 15,6,-1,0,0 3940: 3950: 3960REM Menus 3970DATA 3 3980DATA JigWord,72,2 3990DATA -1,%0000,0,0,0,Info, 4000DATA -1,%10000000,-1,0,0,Quit, 4010 4020DATA JigWord,136,5 4030DATA -1,%0000,2,0,0,Info, 4040DATA -1,%0000,-1,0,0,Cheat, 4050DATA -1,%0000,-1,0,0,Words, 4060DATA -1,%0000,-1,0,0,New View, 4070DATA -1,%10000000,-1,0,0,Print, 4080: 4090DATA Words,136,2 4100DATA -1,%0000,-1,0,0,New View, 4110DATA -1,%10000000,-1,0,0,Print, 4120: 4130: 4140: 4150REM Icons 4160DATA 21 4170DATA 0,0,68,68,(3<<12)+%10 4180DATA -1,2,-1,9,-1 4190DATA "!jigword", 4200 4210DATA 20,-48,156,-8,%1000010001+(7<<24)+(2<<28) 4220DATA 0,0,-1,8,-1,"Name:", 4230DATA 20,-100,156,-60,%1000010001+(7<<24)+(2<<28) 4240DATA 0,0,-1,8,-1,"Purpose:", 4250DATA 20,-152,156,-112,%1000010001+(7<<24)+(2<<28) 4260DATA 0,0,-1,8,-1,"Author:", 4270DATA 20,-204,156,-164,%1000010001+(7<<24)+(2<<28) 4280DATA 0,0,-1,8,-1,"Version:", 4290REMDATA 160,-48,598,-8,%1000111101+(7<<24)+(0<<28) 4300DATA 160,-52,598,-4,%1000111101+(7<<24)+(0<<28) 4310DATA 0,0,-1,9,-1,"!JigWord", 4320REMDATA 160,-100,598,-60,%1000111101+(7<<24)+(0<<28) 4330DATA 160,-104,598,-56,%1000111101+(7<<24)+(0<<28) 4340DATA 0,0,-1,8,-1,"Puzzlement!", 4350REMDATA 160,-152,598,-112,%1100111101+(7<<24)+(0<<28) 4360DATA 160,-156,598,-108,%1100111101+(7<<24)+(0<<28) 4370DATA 0,1,-1,16,-1,"P.Bentley, 1991", 4380REMDATA 160,-204,598,-164,%1100111101+(7<<24)+(0<<28) 4390DATA 160,-208,598,-160,%1100111101+(7<<24)+(0<<28) 4400DATA 0,1,-1,20,-1,"1.62 (05, Apr 1992)", 4410 4420DATA 20,-48,236,-4,%1000010001+(7<<24) 4430DATA 0,0,-1,8,-1,"Width:", 4440DATA 20,-100,236,-56,%1000010001+(7<<24) 4450DATA 0,0,-1,8,-1,"Height:", 4460REMDATA 20,-152,236,-112,%1100010001+(7<<24) 4470REMDATA 0,1,-1,14,-1,"Word density:", 4480DATA 240,-48,304,-4,%0100111101+(7<<24)+(0<<28)+(15<<12) 4490DATA 0,1,-1,3,-1,"30","A0-9" 4500DATA 240,-100,304,-56,%0100111101+(7<<24)+(0<<28)+(15<<12) 4510DATA 0,1,-1,3,-1,"15","A0-9" 4520REMDATA 240,-152,304,-112,%0100111101+(7<<24)+(0<<28)+(15<<12) 4530REMDATA 0,1,-1,3,-1,,"A0-9" 4540DATA 48,-168,284,-120,%1100010011+(7<<24)+(1<<28)+(11<<12) 4550DATA 0,1,-1,12,-1,"Start Word:","Soptoff,opton" 4560REMDATA 144,-224,284,-180,%1100010011+(7<<24)+(1<<28)+(11<<12) 4570REMDATA 0,1,-1,6,-1,"Grid:","Soptoff,opton" 4580DATA 120,-232,224,-188,%111101+(7<<24)+(12<<28)+(9<<12)+(1<<16) 4590DATA 0,0,-1,7,-1,"Create", 4600 4610DATA 20,-48,236,-8,%1000010001+(7<<24) 4620DATA 0,0,-1,6,-1,"Width:", 4630DATA 20,-100,236,-60,%1000010001+(7<<24) 4640DATA 0,0,-1,7,-1,"Height:", 4650DATA 20,-152,236,-112,%1100010001+(7<<24) 4660DATA 0,1,-1,14,-1,"No. of words:", 4670REMDATA 240,-48,312,-8,%0000111101+(7<<24)+(0<<28) 4680DATA 240,-52,312,-4,%0000111101+(7<<24)+(0<<28) 4690DATA 0,0,-1,14,-1,"", 4700DATA 240,-104,312,-56,%0000111101+(7<<24)+(0<<28) 4710DATA 0,0,-1,14,-1,"", 4720DATA 240,-156,312,-108,%0000111101+(7<<24)+(0<<28) 4730DATA 0,0,-1,14,-1,"", 4740: 4750: 4760REM menu structures 4770DATA 3 4780DATA 0,&8000,-1 4790DATA 2,&8001,-1 4800DATA &8002,-1 4810: 4820DEF FNSIcon(s$,but%,h%,x1%,y1%,x2%,y2%) 4830b%!0=h% 4840b%!4=x1% 4850b%!8=y1% 4860b%!12=x2% 4870b%!16=y2% 4880b%!20=%10+(but%<<12) 4890$(b%+24)=s$ 4900SYS "Wimp_CreateIcon",,b% TO h% 4910=h% 4920: 4930DEF PROCCreateWindow(w%) 4940LOCAL addr%,offset%,h%,a% 4950addr%=wbuff% 4960addr%!0=wind%(w%,2):addr%!4=wind%(w%,3) 4970addr%!8=wind%(w%,4):addr%!12=wind%(w%,5) 4980addr%!16=wind%(w%,6):addr%!20=wind%(w%,7) 4990addr%!24=-1 5000addr%!28=wind%(w%,14) 5010CASE wind%(w%,15) OF 5020 WHEN 1: 5030 addr%?32=7:addr%?33=2 5040 addr%?34=7:addr%?35=1 5050 addr%?36=3:addr%?37=1 5060 addr%?38=12:addr%?39=0 5070 OTHERWISE : 5080ENDCASE 5090addr%!40=wind%(w%,8):addr%!44=wind%(w%,9) 5100addr%!48=wind%(w%,10):addr%!52=wind%(w%,11) 5110IF LEN(wind$(w%))>12 THEN 5120 addr%!56=%100011001 5130ELSE 5140 addr%!56=%11001 5150ENDIF 5160addr%!60=wind%(w%,19)<<12:REM buttons 5170addr%!64=1:REM sprite area pointer 5180addr%?68=wind%(w%,12) MOD 256:addr%?69=wind%(w%,12) DIV 256 5190addr%?70=wind%(w%,13) MOD 256:addr%?71=wind%(w%,13) DIV 256 5200IF LEN(wind$(w%))<=12 THEN 5210 $(addr%+72)=wind$(w%) 5220ELSE 5230 IF wind%(w%,18)<>-1 THEN 5240 addr%!72=data%(wind%(w%,18),0) 5250 addr%!76=-1 5260 addr%!80=data%(wind%(w%,18),1) 5270 $data%(wind%(w%,18),0)=wind$(w%) 5280 ELSE 5290 IF (nextdatst%+LEN(wind$(w%))+1)>=dataend% THEN 5300 PROCError2nd(0) 5310 ENDPROC 5320 ENDIF 5330 wind%(w%,18)=nextdat%:nextdat%+=1 5340 data%(wind%(w%,18),0)=nextdatst%:nextdatst%+=LEN(wind$(w%))+1 5350 data%(wind%(w%,18),1)=LEN(wind$(w%))+1 5360 data%(wind%(w%,18),2)=-1 5370 data%(wind%(w%,18),3)=-1 5380 addr%!72=data%(wind%(w%,18),0) 5390 addr%!76=-1 5400 addr%!80=data%(wind%(w%,18),1) 5410 $data%(wind%(w%,18),0)=wind$(w%) 5420 ENDIF 5430ENDIF 5440addr%!84=wind%(w%,17) 5450offset%=88 5460IF wind%(w%,17)>0 THEN 5470 h%=0 5480 FOR a%=wind%(w%,16) TO wind%(w%,16)+wind%(w%,17)-1 5490 icon%(a%,9)=h% 5500 PROCCreateIData(a%,addr%+offset%) 5510 offset%+=32 5520 h%+=1 5530 NEXT 5540ENDIF 5550SYS "Wimp_CreateWindow",,addr% TO wind%(w%,0) 5560FOR a%=wind%(w%,16) TO wind%(w%,16)+wind%(w%,17)-1 5570 icon%(a%,5)=wind%(w%,0) 5580NEXT 5590ENDPROC 5600: 5610DEF PROCCreateMenu(m%) 5620LOCAL a%,addr%,a$,b$,f%,id% 5630menuin%(m%)=nxtmenust%:addr%=nxtmenust% 5640$addr%=menu$(m%) 5650addr%?12=7:addr%?13=2 5660addr%?14=7:addr%?15=0 5670addr%!16=menu%(m%,0) 5680addr%!20=44:addr%!24=0 5690addr%+=28 5700FOR a%=0 TO menu%(m%,1)-1 5710 addr%!0=item%(m%,a%,1) 5720 IF item%(m%,a%,2)<>-1 THEN 5730 IF item%(m%,a%,2)<&8000 THEN 5740 addr%!4=wind%(item%(m%,a%,2),0) 5750 ELSE 5760 addr%!4=menuin%(item%(m%,a%,2)-&8000) 5770 ENDIF 5780 ELSE 5790 addr%!4=-1 5800 ENDIF 5810 f%=item%(m%,a%,3) 5820 IF f%=0 THEN 5830 addr%!8=(1<<5)+(7<<24)+1 5840 ELSE 5850 addr%!8=f% 5860 ENDIF 5870 a$=item$(m%,a%,0) 5880 b$=item$(m%,a%,1) 5890 IF LEN(a$)>12 OR b$<>"" OR (f% AND 256)=256 OR item%(m%,a%,4)>12 THEN 5900 IF item%(m%,a%,0)=-1 THEN 5910 IF (nextdatst%+LEN(a$)+LEN(b$)+2)>=dataend% THEN 5920 PROCError2nd(0) 5930 ENDPROC 5940 ENDIF 5950 id%=nextdat%:item%(m%,a%,0)=id%:nextdat%+=1 5960 data%(id%,0)=nextdatst%:nextdatst%+=item%(m%,a%,4) 5970 data%(id%,1)=item%(m%,a%,4) 5980 IF b$<>"" THEN 5990 data%(id%,2)=nextdatst%:nextdatst%+=LEN(b$)+1 6000 data%(id%,3)=LEN(b$)+1 6010 ELSE 6020 data%(id%,2)=-1:data%(id%,3)=-1 6030 ENDIF 6040 ELSE 6050 id%=item%(m%,a%,0) 6060 ENDIF 6070 $data%(id%,0)=a$ 6080 IF b$<>"" THEN 6090 $(data%(id%,0)+item%(m%,a%,4))=b$ 6100 ENDIF 6110 addr%!12=data%(id%,0) 6120 addr%!16=data%(id%,2) 6130 addr%!20=data%(id%,1) 6140 addr%!8=addr%!8 OR (1<<8) 6150 ELSE 6160 $(addr%+12)=item$(m%,a%,0) 6170 ENDIF 6180 addr%+=24 6190NEXT 6200nxtmenust%=addr% 6210ENDPROC 6220: 6230DEF PROCCreateIcon(i%) 6240iconst%!0=icon%(i%,5) 6250PROCCreateIData(i%,iconst%+4) 6260SYS "Wimp_CreateIcon",,iconst% TO icon%(i%,9) 6270ENDPROC 6280: 6290DEF PROCCreateIData(i%,addr%) 6300LOCAL t%,a$,b$ 6310a$=icon$(i%,0):b$=icon$(i%,1) 6320addr%!0=icon%(i%,0) 6330addr%!4=icon%(i%,1) 6340addr%!8=icon%(i%,2) 6350addr%!12=icon%(i%,3) 6360addr%!16=icon%(i%,4) 6370t%=icon%(i%,6) 6380CASE t% OF 6390 WHEN 0:$(addr%+20)=icon$(i%,0) 6400 WHEN 1,4: 6410 PROCIndirectText(addr%+20,a$,b$,icon%(i%,7),icon%(i%,8),icon%(i%,7)) 6420 WHEN 2:$(addr%+20)=icon$(i%,0) 6430 WHEN 3: 6440 PROCIndirectText(addr%+20,a$,"",icon%(i%,7),icon%(i%,8),icon%(i%,7)) 6450 addr%!24=sprarea%(VAL(icon$(i%,1))) 6460 WHEN 4: 6470 WHEN 5:addr%!20=0:addr%!24=0:addr%!28=0 6480ENDCASE 6490ENDPROC 6500: 6510DEF PROCCreateMStruct(s%,x%,y%) 6520LOCAL a%,addr%,d%,e% 6530nxtmenust%=menust% 6540addr%=mstructin%(s%) 6550REPEAT 6560 e%=d% 6570 d%=!addr% 6580 addr%+=4 6590 IF d%<>-1 THEN 6600 IF d%<&8000 THEN PROCCreateWindow(d%) ELSE PROCCreateMenu(d%-&8000) 6610 ENDIF 6620UNTIL d%=-1 6630SYS "Wimp_CreateMenu",,menuin%(e%-&8000),x%,y% 6640menus%=s% 6650ENDPROC 6660: 6670DEF PROCIndirectText(a%,a$,b$,p%,l%,RETURN p%) 6680IF p%=-1 THEN 6690 IF (nextdatst%+l%+LEN(b$)+1)>=dataend% THEN 6700 PROCError2nd(0) 6710 ENDPROC 6720 ENDIF 6730 p%=nextdat%:nextdat%+=1 6740 data%(p%,0)=nextdatst%:nextdatst%+=l% 6750 data%(p%,1)=l% 6760 IF b$<>"" THEN 6770 data%(p%,2)=nextdatst%:nextdatst%+=LEN(b$)+1 6780 data%(p%,3)=LEN(b$)+1 6790 ELSE 6800 data%(p%,2)=-1:data%(p%,3)-=1 6810 ENDIF 6820ENDIF 6830$data%(p%,0)=a$ 6840IF b$<>"" THEN $(data%(p%,2))=b$ 6850a%!0=data%(p%,0) 6860a%!4=data%(p%,2) 6870a%!8=data%(p%,1) 6880ENDPROC 6890: 6900DEF PROCDeleteWindow(w%) 6910!wbuff%=wind%(w%,0):SYS "Wimp_DeleteWindow",,wbuff% 6920wind%(w%,0)=-1 6930ENDPROC 6940: 6950DEF PROCDestroyWindow(w%) 6960LOCAL a% 6970!wbuff%=wind%(w%,0):SYS "Wimp_DeleteWindow",,wbuff% 6980wind%(w%,0)=-1 6990wuse%(w%)=0 7000IF wind%(w%,17)>0 THEN 7010 FOR a%=wind%(w%,16) TO wind%(w%,16)+wind%(w%,17)-1 7020 icon%(a%,5)=0 7030 NEXT 7040ENDIF 7050ENDPROC 7060: 7070DEF PROCDeleteMStruct(s%) 7080LOCAL addr%,d% 7090addr%=mstructin%(s%) 7100REPEAT 7110 d%=!addr% 7120 addr%+=4 7130 IF d%<>-1 AND d%<&8000 THEN PROCDeleteWindow(d%) 7140UNTIL d%=-1 7150menus%=-1 7160menuw%=-1 7170ENDPROC 7180: 7190REM Redraw_Window_Request 7200DEF PROCP_1(a%) 7210LOCAL more%,w% 7220w%=FNWNum(a%!0) 7230SYS "Wimp_RedrawWindow",,a% TO more% 7240WHILE more% 7250 PROCWindRect(w%,a%) 7260 SYS "Wimp_GetRectangle",,a% TO more% 7270ENDWHILE 7280ENDPROC 7290: 7300REM Close_Window_Request 7310DEF PROCP_3(a%) 7320LOCAL w%,c%,p%,ret% 7330w%=FNWNum(!a%) 7340p%=wind%(w%,1) 7350IF p%=-1 THEN SYS "Wimp_CloseWindow",,a%:ENDPROC 7360IF p%>maxpuzz% THEN 7370 p%-=maxpuzz%+1 7380 PROCDestroyWindow(w%):pinfo%(p%,8)-=1 7390 IF pinfo%(p%,8)=0 THEN pinfo%(p%,4)=pinfo%(p%,4) AND NOT(%11) 7400 pwuse%(wind%(w%,20))=0 7410 ENDPROC 7420ENDIF 7430IF pinfo%(p%,3)=1 THEN 7440 b2%!0=0:$(b2%+4)="Are you sure you want to lose this puzzle?"+CHR$(0) 7450 SYS "Wimp_ReportError",b2%,%10111,"!JigWord" TO ,ret% 7460 IF ret%=0 OR ret%=2 THEN ENDPROC 7470ENDIF 7480PROCDestroyWindow(w%) 7490pinfo%(p%,3)-=1 7500IF pinfo%(p%,3)=0 THEN PROCDestroyPuzzle(p%):ENDPROC 7510IF pinfo%(p%,3)=1 THEN 7520 $data%(pinfo%(p%,5),0)="JigWord "+STR$(p%) 7530ELSE 7540 $data%(pinfo%(p%,5),0)="JigWord "+STR$(p%)+" "+STR$(pinfo%(p%,3)) 7550ENDIF 7560FOR c%=0 TO numwind% 7570 IF wuse%(c%)<>0 AND wind%(c%,1)=p% THEN 7580 !b%=wind%(c%,0) 7590 SYS "Wimp_GetWindowState",,b% 7600 SYS "Wimp_ForceRedraw",-1,b%!4,b%!16,b%!12,b%!16+44 7610 ENDIF 7620NEXT 7630ENDPROC 7640: 7650REM Mouse_Click 7660DEF PROCP_6(a%) 7670LOCAL w%,c% 7680IF a%!12=-2 PROCIconBarClick(a%!0,a%!4,a%!8) 7690w%=FNWNum(a%!12) 7700IF w%<0 OR w%>numwind% THEN ENDPROC 7710c%=FNINum(w%,a%!16) 7720IF w%=1 AND c%=14 AND (a%!8 AND 2)<>2 THEN PROCInitCreateJig:ENDPROC 7730IF wind%(w%,1)<>-1 AND wind%(w%,1)<=maxpuzz% THEN PROCPuzzleClick(w%,a%) 7740IF wind%(w%,1)<>-1 AND wind%(w%,1)>maxpuzz% THEN PROCWordClick(w%,c%,a%) 7750ENDPROC 7760: 7770REM Key_Pressed 7780DEF PROCP_8(a%) 7790LOCAL w%,c% 7800w%=FNWNum(a%!0) 7810CASE w% OF 7820 WHEN -1: 7830 SYS "Wimp_ProcessKey",a%!24 7840 WHEN 1:PROCKeyWind1(a%) 7850 OTHERWISE: 7860 SYS "Wimp_ProcessKey",a%!24 7870ENDCASE 7880ENDPROC 7890: 7900REM Menu_Selection 7910DEF PROCP_9(a%) 7920SYS &400CF,,b2%:z%=b2%!8 7930CASE menus% OF 7940 WHEN 0:IF a%!0=1 THEN quit%=TRUE 7950 WHEN 1: 7960 CASE a%!0 OF 7970 WHEN 1:PROCToggleCheat(menuw%) 7980 WHEN 2:PROCToggleWordWind(wind%(menuw%,1)) 7990 WHEN 3:PROCCreatePuzzWind(wind%(menuw%,1)) 8000 WHEN 4:PROCPrintPuzzGrid(menuw%,wind%(menuw%,1)) 8010 ENDCASE 8020 WHEN 2: 8030 CASE a%!0 OF 8040 WHEN 0:PROCCreateWordWind(wind%(menuw%,1)-maxpuzz%-1) 8050 WHEN 1:PROCPrintWordList(wind%(menuw%,1)-maxpuzz%-1) 8060 ENDCASE 8070ENDCASE 8080IF (z% AND 1)=1 THEN 8090 PROCCreateMStruct(menus%,0,0) 8100ELSE 8110 PROCDeleteMStruct(menus%) 8120ENDIF 8130ENDPROC 8140: 8150REM Poll 17 and 18 8160DEF PROCReceive(a%) 8170CASE a%!16 OF 8180 WHEN 0:quit%=TRUE 8190 WHEN &40300:PROCChangeHiLiteCol(a%) 8200ENDCASE 8210ENDPROC 8220: 8230REM Don't know if this works. 8240DEF PROCChangeHiLiteCol(a%) 8250LOCAL d%,s%,A%,B%,C%,D%,E%,F%,G%,H% 8260IF a%!20=&452295 THEN 8270 hilitecol%=a%!24 8280 A%=hilitecol%:CALL ChangeHiCol 8290 ENDPROC 8300ENDIF 8310IF a%!20=4522295 THEN 8320 s%=a%!24 8330 d%=a%+28 8340 A%=EVAL($d%) 8350 PROCNextPar(d%,d%) 8360 B%=EVAL($d%) 8370 PROCNextPar(d%,d%) 8380 C%=EVAL($d%) 8390 PROCNextPar(d%,d%) 8400 D%=EVAL($d%) 8410 PROCNextPar(d%,d%) 8420 E%=EVAL($d%) 8430 PROCNextPar(d%,d%) 8440 F%=EVAL($d%) 8450 PROCNextPar(d%,d%) 8460 G%=EVAL($d%) 8470 PROCNextPar(d%,d%) 8480 H%=EVAL($d%) 8490 SYS s%,A%,B%,C%,D%,E%,F%,G%,H% 8500 ENDPROC 8510ENDIF 8520IF a%!20=5922254 THEN 8530 d%=a%+24 8540 s%=EVAL($d%) 8550 PROCNextPar(d%,d%) 8560 A%=EVAL($d%) 8570 PROCNextPar(d%,d%) 8580 B%=EVAL($d%) 8590 PROCNextPar(d%,d%) 8600 C%=EVAL($d%) 8610 PROCNextPar(d%,d%) 8620 D%=EVAL($d%) 8630 PROCNextPar(d%,d%) 8640 E%=EVAL($d%) 8650 PROCNextPar(d%,d%) 8660 F%=EVAL($d%) 8670 PROCNextPar(d%,d%) 8680 G%=EVAL($d%) 8690 PROCNextPar(d%,d%) 8700 H%=EVAL($d%) 8710 CALL s% 8720 ENDPROC 8730ENDIF 8740IF a%!20=&1234DEBA THEN 8750 CALL (a%!24) 8760 ENDPROC 8770ENDIF 8780ENDPROC 8790: 8800DEF PROCNextPar(d%,RETURN d%) 8810d%+=1 8820WHILE ?d%<>13 8830 d%+=1 8840ENDWHILE 8850d%+=1 8860ENDPROC 8870: 8880REM 10.9.8.7.6.5.4.3.2.1...We have destruction. 8890DEF PROCDestroyPuzzle(p%) 8900LOCAL a%,addr1%,addr2% 8910FOR a%=0 TO maxpword% 8920IF pword%(a%,1)=p% AND pwuse%(a%) THEN 8930 pwuse%(a%)=0:PROCDestroyWindow(pword%(a%,0)) 8940ENDIF 8950NEXT 8960: 8970addr1%=puzzin%(p%) 8980addr2%=puzzshflags1 8990FOR a%=0 TO maxpuzz% 9000 IF pfree%(a%) THEN !addr2%=puzzin%(a%) ELSE !addr2%=0 9010 addr2%+=4 9020NEXT 9030A%=p%:CALL puzzshuffle 9040addr1%=puzzshflags1 9050FOR a%=0 TO maxpuzz% 9060 IF !addr1%<>0 THEN puzzin%(a%)=!addr1% 9070 addr1%+=4 9080NEXT 9090pfree%(p%)=0 9100nxtpuzzst%=!nextpuzzst 9110ENDPROC 9120: 9130REM Does anyone know that little known song 9140REM 'Stop tap-dancing on my icon bar' ? 9150DEF PROCIconBarClick(x%,y%,z%) 9160IF z%=1 THEN REM Adjust 9170IF z%=4 THEN PROCOpenWindow(1,-1) 9180IF z%=2 THEN 9190 IF menus%<>-1 THEN PROCDeleteMStruct(menus%) 9200 PROCCreateMStruct(0,x%-64,184) 9210 menuw%=-1 9220 ENDPROC 9230ENDIF 9240ENDPROC 9250: 9260REM A confused click? 9270DEF PROCPuzzleClick(w%,addr%) 9280LOCAL p% 9290p%=wind%(w%,1) 9300IF (addr%!8 AND 2)=2 THEN 9310 icon$(18,0)=STR$(pinfo%(p%,0)) 9320 icon$(19,0)=STR$(pinfo%(p%,1)) 9330 icon$(20,0)=STR$(pinfo%(p%,2)) 9340 IF (wind%(w%,20) AND %1)=%1 THEN 9350 item%(1,1,1)=item%(1,1,1) OR %1 9360 ELSE 9370 item%(1,1,1)=item%(1,1,1) AND NOT(%1) 9380 ENDIF 9390 IF (pinfo%(p%,4) AND %1)=%1 THEN 9400 item%(1,2,1)=item%(1,1,1) OR %1 9410 ELSE 9420 item%(1,2,1)=item%(1,1,1) AND NOT(%1) 9430 ENDIF 9440 IF menus%<>-1 THEN PROCDeleteMStruct(menus%) 9450 PROCCreateMStruct(1,addr%!0-64,addr%!4) 9460 menuw%=w% 9470 ENDPROC 9480ENDIF 9490IF (addr%!8 AND %100)=%100 THEN 9500 PROCPuzzSelect(p%,addr%!12,addr%!0,addr%!4) 9510 ENDPROC 9520ENDIF 9530IF (addr%!8 AND %001)=%001 THEN 9540 PROCDeHiLight(p%,2) 9550 pinfo%(p%,6)=0 9560 pinfo%(p%,7)=0 9570 pinfo%(p%,9)=0 9580 pinfo%(p%,10)=0 9590 ENDPROC 9600ENDIF 9610ENDPROC 9620: 9630REM Anyone who used this option to complete 9640REM a puzzle hasn't got the brains to understand 9650REM this program. So why are you reading it? 9660DEF PROCToggleCheat(w%) 9670wind%(w%,20)=wind%(w%,20) EOR %1 9680item%(1,1,1)=item%(1,1,1) EOR %1 9690b%!0=wind%(w%,0) 9700b%!4=wind%(w%,8) 9710b%!8=wind%(w%,9) 9720b%!12=wind%(w%,10) 9730b%!16=wind%(w%,11) 9740SYS "Wimp_UpdateWindow",,b% TO more% 9750WHILE more% 9760 PROCWindRect(w%,b%) 9770 SYS "Wimp_GetRectangle",,b% TO more% 9780ENDWHILE 9790ENDPROC 9800: 9810DEF PROCToggleWordWind(p%) 9820IF (pinfo%(p%,4) AND %10)=%00 THEN 9830 PROCCreateWordWind(p%) 9840 IF pinfo%(p%,8)=-1 THEN ENDPROC 9850 pinfo%(p%,4)=pinfo%(p%,4) OR %11 9860 item%(1,2,1)=item%(1,2,1) OR %1 9870 ENDPROC 9880ENDIF 9890ENDPROC 9900: 9910DEF PROCPuzzSelect(p%,w%,x%,y%) 9920LOCAL a%,addr1%,addr2%,v%,h%,n%,x1%,y1%,l% 9930!b%=w%:SYS &400CB,,b% 9940x%=x%-(b%!4-b%!20) 9950y%=y%-(b%!16-b%!24) 9960x%=(x%-22) DIV 20:y%=((y%+8) DIV 40)*-1 9970A%=x%:B%=y%:C%=puzzin%(p%):CALL puzzselect 9980h%=!selh:v%=!selv 9990IF h%<>0 THEN pinfo%(p%,9)=!hlen 10000IF v%<>0 THEN pinfo%(p%,10)=!vlen 10010: 10020IF h%=0 AND v%=0 THEN ENDPROC 10030IF h%=pinfo%(p%,6) AND v%=pinfo%(p%,7) THEN ENDPROC 10040IF h%>0 AND v%>0 THEN 10050 IF h%=pinfo%(p%,6) THEN 10060 PROCDeHiLight(p%,1):pinfo%(p%,10)=0 10070 ENDPROC 10080 ENDIF 10090 IF v%=pinfo%(p%,7) THEN 10100 PROCDeHiLight(p%,0):pinfo%(p%,9)=0 10110 ENDPROC 10120 ENDIF 10130 PROCDeHiLight(p%,2) 10140 pinfo%(p%,6)=h%:pinfo%(p%,7)=v% 10150 PROCHiLight(p%,0) 10160 PROCHiLight(p%,1) 10170 ENDPROC 10180ENDIF 10190IF h%>0 THEN 10200 IF pinfo%(p%,7)>0 THEN PROCDeHiLight(p%,1):pinfo%(p%,10)=0 10210 IF pinfo%(p%,6)<>h% THEN 10220 PROCDeHiLight(p%,0) 10230 pinfo%(p%,6)=h% 10240 PROCHiLight(p%,0) 10250 ENDIF 10260ELSE 10270 IF pinfo%(p%,6)>0 THEN PROCDeHiLight(p%,0):pinfo%(p%,9)=0 10280 IF pinfo%(p%,7)<>v% THEN 10290 PROCDeHiLight(p%,1) 10300 pinfo%(p%,7)=v% 10310 PROCHiLight(p%,1) 10320 ENDIF 10330ENDIF 10340ENDPROC 10350: 10360DEF PROCDeHiLight(p%,a%) 10370LOCAL c% 10380CASE a% OF 10390 WHEN 0:c%=pinfo%(p%,6):pinfo%(p%,6)=0:PROCUpdateSpace(p%,c%,0) 10400 WHEN 1:c%=pinfo%(p%,7):pinfo%(p%,7)=0:PROCUpdateSpace(p%,c%,1) 10410 WHEN 2:c%=pinfo%(p%,6):pinfo%(p%,6)=0:PROCUpdateSpace(p%,c%,0) 10420 c%=pinfo%(p%,7):pinfo%(p%,7)=0:PROCUpdateSpace(p%,c%,1) 10430ENDCASE 10440ENDPROC 10450: 10460DEF PROCHiLight(p%,a%) 10470CASE a% OF 10480 WHEN 0:PROCUpdateSpace(p%,pinfo%(p%,6),0) 10490 WHEN 1:PROCUpdateSpace(p%,pinfo%(p%,7),1) 10500 WHEN 2:PROCUpdateSpace(p%,pinfo%(p%,6),0) 10510 PROCUpdateSpace(p%,pinfo%(p%,7),1) 10520ENDCASE 10530ENDPROC 10540: 10550DEF PROCUpdateSpace(p%,s%,d%) 10560IF s%=0 THEN ENDPROC 10570LOCAL x%,y%,l%,wd%,a%,x1%,y1%,x2%,y2%,more% 10580PROCSpaceInfo(p%,s%,d%) 10590x1%=x%*20+20:y1%=y%*-40-4 10600CASE d% OF 10610 WHEN 0:x2%=x1%+l%*20+2:y2%=y1%-44 10620 WHEN 1:x2%=x1%+22:y2%=y1%-l%*40-4 10630ENDCASE 10640FOR a%=0 TO numwind% 10650 IF wind%(a%,1)=p% AND wuse%(a%) THEN 10660 b%!0=wind%(a%,0) 10670 b%!4=x1% 10680 b%!8=y2% 10690 b%!12=x2% 10700 b%!16=y1% 10710 SYS &400C9,,b% TO more% 10720 WHILE more% 10730 PROCWindRect(a%,b%) 10740 SYS &400CA,,b% TO more% 10750 ENDWHILE 10760 ENDIF 10770NEXT 10780ENDPROC 10790: 10800DEF PROCSpaceInfo(p%,space%,dir%) 10810LOCAL addr% 10820addr%=puzzin%(p%) 10830CASE dir% OF 10840 WHEN 0:addr%=addr%+addr%!24 10850 WHEN 1:addr%=addr%+addr%!28 10860ENDCASE 10870addr%+=4 10880addr%=addr%+space%*8-8 10890x%=addr%?0:y%=addr%?1:l%=addr%?2:wd%=addr%!4 10900ENDPROC 10910: 10920DEF PROCWordClick(w%,c%,addr%) 10930LOCAL pw%,p%,addr1%,addr2%,x%,y%,addr3%,a%,n%,f% 10940pw%=wind%(w%,20):p%=pword%(pw%,1) 10950IF (addr%!8 AND 2)=2 THEN 10960 PROCCreateMStruct(2,addr%!0-64,addr%!4) 10970 menuw%=w% 10980 ENDPROC 10990ENDIF 11000IF c%=pwordiconst%+pw%*3 THEN PROCChWordLen(-1,pw%,w%):ENDPROC 11010IF c%=pwordiconst%+pw%*3+1 THEN PROCChWordLen(1,pw%,w%):ENDPROC 11020x%=addr%!0:y%=addr%!4 11030!b2%=wind%(w%,0):SYS &400CB,,b2% 11040x%=x%-(b2%!4-b2%!20) 11050y%=y%-(b2%!16-b2%!24):y%=((y%+36) DIV 40)*-1-1 11060IF x%<pword%(pw%,3) OR x%>pword%(pw%,4) THEN ENDPROC 11070IF y%<0 THEN ENDPROC 11080IF y%>pword%(pw%,5) THEN ENDPROC 11090IF (addr%!8 AND 1)=1 THEN 11100 addr1%=FNWordAddr(pword%(pw%,2),y%,puzzin%(p%)) 11110 IF (?addr1% AND 128)=0 THEN ENDPROC 11120 ?addr1%=?addr1% EOR 128 11130 PROCUpdateWWind(w%,pw%,y%) 11140 addr1%=puzzin%(p%) 11150 addr2%=addr1%+addr1%!24 11160 n%=addr2%!0:addr2%+=4:f%=0:a%=0 11170 WHILE a%<n% AND NOT(f%) 11180 a%+=1 11190 IF (addr2%!4>>>16)=y% AND addr2%?2=pword%(pw%,2) THEN 11200 f%=TRUE 11210 addr2%?6=&FF:addr2%?7=&FF 11220 PROCUpdateSpace(p%,a%,0) 11230 ENDIF 11240 addr2%+=8 11250 ENDWHILE 11260 addr2%=addr1%+addr1%!28 11270 n%=addr2%!0:addr2%+=4:f%=0:a%=0 11280 WHILE a%<n% AND NOT(f%) 11290 a%+=1 11300 IF (addr2%!4>>>16)=y% AND addr2%?2=pword%(pw%,2) THEN 11310 f%=TRUE 11320 addr2%?6=&FF:addr2%?7=&FF 11330 PROCUpdateSpace(p%,a%,1) 11340 ENDIF 11350 addr2%+=8 11360 ENDWHILE 11370 ENDPROC 11380ENDIF 11390IF pinfo%(p%,9)=pinfo%(p%,10) THEN ENDPROC 11400addr1%=FNWordAddr(pword%(pw%,2),y%,puzzin%(p%)) 11410IF (?addr1% AND 128) THEN ENDPROC 11420IF pinfo%(p%,9)=pword%(pw%,2) THEN 11430 addr2%=FNClueAddr(pinfo%(p%,6),0,puzzin%(p%)) 11440 A%=puzzin%(p%):CALL ChangeJig 11450 A%=addr2%?0:B%=addr2%?1:C%=addr2%?2:D%=addr1%:CALL HFit 11460 IF !fit=0 THEN VDU 7:ENDPROC 11470 IF (addr2%!4>>>16)<>&FFFF THEN 11480 addr3%=FNWordAddr(pword%(pw%,2),addr2%?6+addr2%?7*256,puzzin%(p%)) 11490 ?addr3%=?addr3% EOR 128 11500 PROCUpdateWWind(w%,pw%,addr2%?6+addr2%?7*256) 11510 ENDIF 11520 addr2%?6=y% MOD 256 11530 addr2%?7=y% DIV 256 11540 ?addr1%=?addr1% EOR 128 11550 PROCUpdateSpace(p%,pinfo%(p%,6),0) 11560 PROCUpdateWWind(w%,pw%,y%) 11570ELSE 11580 IF pinfo%(p%,10)=pword%(pw%,2) THEN 11590 addr2%=FNClueAddr(pinfo%(p%,7),1,puzzin%(p%)) 11600 A%=puzzin%(p%):CALL ChangeJig 11610 A%=addr2%?0:B%=addr2%?1:C%=addr2%?2:D%=addr1%:CALL VFit 11620 IF !fit=0 THEN VDU 7:ENDPROC 11630 IF (addr2%!4>>>16)<>&FFFF THEN 11640 addr3%=FNWordAddr(pword%(pw%,2),addr2%?6+addr2%?7*256,puzzin%(p%)) 11650 ?addr3%=?addr3% EOR 128 11660 PROCUpdateWWind(w%,pw%,addr2%?6+addr2%?7*256) 11670 ENDIF 11680 addr2%?6=y% MOD 256 11690 addr2%?7=y% DIV 256 11700 ?addr1%=?addr1% EOR 128 11710 PROCUpdateSpace(p%,pinfo%(p%,7),1) 11720 PROCUpdateWWind(w%,pw%,y%) 11730 ENDIF 11740ENDIF 11750ENDPROC 11760ELSE 11770 ELSE 11780 ENDPROC 11790 ENDIF 11800ENDIF 11810ENDPROC 11820: 11830REM A procedure with a stutter 11840DEF PROCUpdateWWind(w%,pw%,a%) 11850LOCAL c%,p%,more% 11860p%=pword%(pw%,1) 11870FOR c%=0 TO numwind% 11880 IF wind%(c%,1)=p%+1+maxpuzz% AND wuse%(c%) THEN 11890 b%!0=wind%(c%,0) 11900 b%!4=pword%(pw%,3):b%!8=(a%+2)*-40-32:b%!12=pword%(pw%,4):b%!16=b%!8+40 11910 SYS &400C9,,b% TO more% 11920 WHILE more% 11930 PROCWindRect(c%,b%) 11940 SYS &400CA,,b% TO more% 11950 ENDWHILE 11960 ENDIF 11970NEXT 11980ENDPROC 11990ENDPROC 12000: 12010DEF PROCChWordLen(d%,pw%,w%) 12020LOCAL addr1%,addr2%,icst%,f%,n%,l%,mh%,wf%,p% 12030icst%=pwordiconst%+pw%*3 12040p%=wind%(w%,1)-maxpuzz%-1 12050addr1%=puzzin%(p%):addr2%=addr1%+addr1%!16 12060n%=addr2%!0:l%=pword%(pw%,2) 12070REPEAT 12080 l%+=d% 12090 IF l%=1 THEN l%=n% 12100 IF l%>n% THEN l%=2 12110 IF addr2%!(l%*4-4)>0 THEN f%=TRUE 12120UNTIL f% 12130pword%(pw%,2)=l% 12140icon$(icst%+2,0)=STR$(l%)+" Letters" 12150$data%(icon%(icst%+2,7),0)=icon$(icst%+2,0) 12160mh%=!(addr1%+addr2%!(l%*4-4))+2 12170wind%(w%,9)=-(mh%*40+16) 12180b%!0=wind%(w%,0):SYS "Wimp_GetWindowState",,b% 12190wf%=b%!28 12200wind%(w%,2)=b%!4:wind%(w%,4)=b%!12:wind%(w%,5)=b%!16 12210wind%(w%,3)=wind%(w%,5)+wind%(w%,9) 12220wind%(w%,6)=0:wind%(w%,7)=0 12230b%!0=wind%(w%,8):b%!4=wind%(w%,9) 12240b%!8=wind%(w%,10):b%!12=wind%(w%,11) 12250SYS "Wimp_SetExtent",wind%(w%,0),b% 12260PROCOpenWindow(w%,wf%) 12270pword%(pw%,3)=wind%(w%,10)/2-pword%(pw%,2)*8 12280pword%(pw%,4)=pword%(pw%,3)+pword%(pw%,2)*16 12290pword%(pw%,5)=mh%-3 12300SYS "Wimp_ForceRedraw",wind%(w%,0),0,wind%(w%,9),wind%(w%,10),0 12310ENDPROC 12320: 12330DEF PROCKeyWind1(a%) 12340LOCAL c%,nh%,lh%,h%,l%,f%,i% 12350c%=FNINum(1,a%!4) 12360CASE c% OF 12370 WHEN 11:nh%=icon%(12,9):lh%=icon%(12,9) 12380 WHEN 12:nh%=icon%(11,9):lh%=icon%(11,9) 12390 OTHERWISE:SYS "Wimp_ProcessKey",a%!24:ENDPROC 12400ENDCASE 12410CASE a%!24 OF 12420 WHEN &0D: 12430 h%=nh% 12440 i%=FNIFlags(1,14) 12450 IF c%=12 AND (i% AND (1<<22))=0 THEN 12460 a%!4=icon%(14,9) 12470 a%!8=1<<21 12480 a%!12=1<<21 12490 SYS "Wimp_SetIconState",,a% 12500 PROCInitCreateJig 12510 ENDPROC 12520 ELSE 12530 IF c%=12 THEN ENDPROC 12540 ENDIF 12550 WHEN &18E:h%=nh% 12560 WHEN &18F:h%=lh% 12570 OTHERWISE:SYS "Wimp_ProcessKey",a%!24:ENDPROC 12580ENDCASE 12590l%=LEN($(data%(icon%(FNINum(w%,h%),7),0))) 12600SYS "Wimp_SetCaretPosition",wind%(1,0),h%,0,0,-1,l% 12610ENDPROC 12620: 12630REM It's a bit hot in here. 12640DEF PROCOpenWindow(w%,f%) 12650b%!0=wind%(w%,0) 12660b%!4=wind%(w%,2):b%!8=wind%(w%,3) 12670b%!12=wind%(w%,4):b%!16=wind%(w%,5) 12680b%!20=wind%(w%,6):b%!24=wind%(w%,7) 12690b%!28=f% 12700SYS "Wimp_OpenWindow",,b% 12710ENDPROC 12720: 12730DEF PROCWindRect(w%,a%) 12740LOCAL wx1%,wy1%,wx2%,wy2% 12750wx1%=a%!20+(a%!28-a%!4):wy1%=a%!24+(a%!40-a%!16) 12760wx2%=wx1%+(a%!36-a%!28):wy2%=wy1%+(a%!32-a%!40) 12770ORIGIN a%!4-a%!20,a%!16-a%!24 12780IF wind%(w%,1)<>-1 AND wind%(w%,1)<=maxpuzz% THEN 12790 PROCPuzzRect(w%,wx1%,wy1%,wx2%,wy2%) 12800ENDIF 12810IF wind%(w%,1)<>-1 AND wind%(w%,1)>maxpuzz% THEN 12820 PROCWordRect(w%,wx1%,wy1%,wx2%,wy2%) 12830ENDIF 12840ORIGIN 0,0 12850ENDPROC 12860: 12870DEF PROCPuzzRect(w%,x1%,y1%,x2%,y2%) 12880LOCAL p% 12890p%=wind%(w%,1) 12900x1%=(x1%-22) DIV 20:x2%=(x2%-22) DIV 20 12910y1%=(y1%+8) DIV -40:y2%=(y2%+8) DIV -40 12920IF x1%<0 THEN x1%=0 12930IF x1%>=pinfo%(p%,0) THEN x1%=pinfo%(p%,0)-1 12940IF x2%>=pinfo%(p%,0) THEN x2%=pinfo%(p%,0)-1 12950A%=pinfo%(p%,6):B%=pinfo%(p%,7):CALL ChangeSel 12960A%=puzzin%(p%):B%=wind%(w%,20) AND %1:C%=scratch% 12970D%=x1%:E%=y1%:F%=x2%:G%=y2%:CALL CreateHeap 12980CALL Gridsetc 12990ENDPROC 13000: 13010DEF PROCWordRect(w%,x1%,y1%,x2%,y2%) 13020LOCAL p%,addr1%,addr2%,a%,b%,n%,pw% 13030pw%=wind%(w%,20) 13040x1%=(x1%-22) DIV 16:x2%=((x2%-22) DIV 16)+1 13050y1%=((y1%+36) DIV 40)*-1:y2%=(((y2%+36) DIV 40)-1)*-1 13060p%=wind%(w%,1)-maxpuzz%-1:l%=pword%(pw%,2) 13070addr1%=puzzin%(p%):addr2%=addr1%+addr1%!16 13080addr2%=addr1%+addr2%!(l%*4-4) 13090n%=addr2%!0:addr2%+=4 13100FOR a%=1 TO n% 13110 IF a%>=y1% AND a%<=y2% THEN 13120 MOVE pword%(pw%,3),-(a%*40+36) 13130 IF ?addr2% AND 128 THEN 13140 SYS "Wimp_SetColour",3:SYS "OS_WriteC",?addr2% EOR 128 13150 ELSE 13160 SYS "Wimp_SetColour",7:SYS "OS_WriteC",?addr2% 13170 ENDIF 13180 SYS "OS_WriteN",addr2%+1,l%-1 13190 addr2%+=l% 13200 ELSE 13210 addr2%+=l% 13220 ENDIF 13230NEXT 13240ENDPROC 13250: 13260DEF FNWord(n%,addr%) 13270A%=n%:B%=addr%:C%=b2%:CALL Word 13280=$b2% 13290LOCAL off%,a%,l%,c%,a$,b% 13300IF n%=&FFFF THEN ="" 13310a%=addr%+addr%!16 13320b%=addr%+addr%!12 13330l%=0:c%=2 13340REPEAT 13350 IF n%<(!(b%+c%*4)) AND n%>=(!(b%+c%*4-4)) THEN l%=c% 13360 c%+=1 13370UNTIL l%<>0 13380a%=addr%+a%!(l%*4-4) 13390a%=a%+(n%-!(b%+l%*4-4))*l%+4 13400a$="" 13410FOR c%=0 TO l%-1 13420a$+=CHR$(a%?c%) 13430NEXT 13440=a$ 13450: 13460DEF FNWNum(hand%) 13470LOCAL a%,f% 13480f%=-1 13490FOR a%=0 TO numwind% 13500 IF wind%(a%,0)=hand% THEN f%=a% 13510NEXT 13520=f% 13530: 13540DEF FNINum(w%,hand%) 13550LOCAL a%,f%,h% 13560f%=-1 13570h%=wind%(w%,0) 13580FOR a%=0 TO numicon% 13590 IF icon%(a%,9)=hand% AND icon%(a%,5)=h% THEN f%=a% 13600NEXT 13610=f% 13620: 13630DEF FNIFlags(w%,i%) 13640iconst%!0=wind%(w%,0) 13650iconst%!4=icon%(i%,9) 13660SYS "Wimp_GetIconState",,iconst% 13670=iconst%!24 13680: 13690REM Just about the only time I've ever 13700REM passed an array to a procedure. 13710REM (and got away with both my eyebrows!!!) (never mind) 13720DEF FN1stFree(array%(),maxdim%) 13730LOCAL a%,f% 13740a%=-1:f%=-1 13750REPEAT 13760 a%+=1 13770 IF array%(a%)=0 THEN f%=a% 13780UNTIL f%<>-1 OR a%=maxdim% 13790=f% 13800: 13810DEF FNPNumOfWords(addr%) 13820=!(!(addr%+addr%!12)*4+addr%+addr%!12) 13830: 13840DEF FNWordAddr(l%,w%,addr%) 13850LOCAL addr1% 13860addr1%=addr%+addr%!16:addr1%=addr%+addr1%!(l%*4-4) 13870=addr1%+4+l%*w% 13880: 13890DEF FNClueAddr(c%,d%,addr%) 13900LOCAL addr1% 13910IF d%=0 addr1%=addr%+addr%!24 ELSE addr1%=addr%+addr%!28 13920=addr1%+c%*8-4 13930: 13940DEF PROCInitCreateJig 13950LOCAL p%,addr1%,addr2%,n%,l% 13960b%!0=wind%(1,0):b%!4=icon%(14,9) 13970b%!8=0:b%!12=1<<21 13980SYS "Wimp_SetIconState",,b% 13990p%=FN1stFree(pfree%(),maxpuzz%) 14000IF p%=-1 THEN PROCError2nd(3):ENDPROC 14010create%(0)=VAL($data%(icon%(11,7),0)) 14020create%(1)=VAL($data%(icon%(12,7),0)) 14030create%(2)=(FNIFlags(1,13)>>21) AND %1 14040IF create%(0)<30 THEN PROCError2nd(1):ENDPROC 14050IF create%(1)<15 THEN PROCError2nd(2):ENDPROC 14060IF create%(0)>99 THEN PROCError2nd(7):ENDPROC 14070IF create%(1)>99 THEN PROCError2nd(8):ENDPROC 14080IF nxtpuzzst%+32>=puzzend% THEN 14090 PROCError2nd(4) 14100 ENDPROC 14110ENDIF 14120b%!0=wind%(1,0):b%!4=icon%(14,9) 14130b%!8=1<<22:b%!12=1<<22 14140SYS "Wimp_SetIconState",,b% 14150create%(3)=%00:create%(4)=0:create%(5)=p% 14160create%(6)=nxtpuzzst%:create%(7)=puzzend%-nxtpuzzst% 14170b%!0=wind%(1,0):b%!4=icon%(14,9) 14180b%!8=1<<22:b%!12=1<<22 14190SYS "Wimp_SetIconState",,b% 14200SYS "Hourglass_On" 14210A%=create%(0)-1:B%=create%(1)-1:CALL csize% 14220A%=create%(6):B%=create%(7):CALL cpuzzarea% 14230CALL cinitvar% 14240CALL createjig% 14250SYS "Hourglass_Off" 14260b%!0=wind%(1,0):b%!4=icon%(14,9) 14270b%!8=1<<22:b%!12=0<<22 14280SYS "Wimp_SetIconState",,b% 14290IF !result%=-1 THEN 14300 b2%!0=0 14310 $(b2%+4)=error$(4)+CHR$(0) 14320 SYS "Wimp_ReportError",b2%,%10101,"!JigWord" 14330 ENDPROC 14340ENDIF 14350IF create%(2)=1 THEN 14360 addr1%=create%(6) 14370 IF RND(2)=1 THEN addr2%=addr1%+addr1%!24 ELSE addr2%=addr1%+addr1%!28 14380 n%=addr2%!0:addr2%+=4 14390 addr2%+=(RND(n%)-1)*8 14400 addr2%?6=addr2%?4:addr2%?7=addr2%?5 14410 n%=addr2%!4 AND &FFFF:l%=addr2%?2 14420 addr2%=addr1%+addr1%!16 14430 addr2%+=l%*4-4 14440 addr2%=addr1%+!addr2%:addr2%+=4:addr2%+=l%*n% 14450 ?addr2%=?addr2% OR 128 14460ENDIF 14470PROCInitialiseDispFile(create%(5)) 14480PROCCreatePuzzWind(create%(5)) 14490mask%=0 14500ENDPROC 14510: 14520REM a little used procedure 14530DEF PROCCycle 14540b%!0=wind%(1,0):b%!4=icon%(14,9) 14550b%!8=0<<22:b%!12=1<<22 14560SYS "Wimp_SetIconState",,b% 14570mask%=1 14580CALL createinbckgnd 14590ENDPROC 14600: 14610REM A weather vain? 14620DEF PROCNextWindPos(w%) 14630IF nextwpos%=4 THEN nextwpos%=0 14640wind%(w%,2)=100:wind%(w%,5)=800-48*nextwpos% 14650nextwpos%+=1 14660ENDPROC 14670: 14680DEF PROCCreatePuzzWind(p%) 14690LOCAL w%,vx%,vy%,ht%,wid%,addr%,a%,more% 14700IF pinfo%(p%,3)=5 THEN PROCError2nd(6):ENDPROC 14710w%=FN1stFree(wuse%(),numwind%) 14720IF w%=-1 THEN 14730 PROCError2nd(5) 14740 ENDPROC 14750ENDIF 14760wuse%(w%)=-1 14770pinfo%(p%,3)+=1 14780addr%=puzzin%(p%) 14790wid%=addr%!4*20+40:ht%=addr%!8*40+12 14800wind%(w%,1)=p% 14810PROCNextWindPos(w%) 14820IF wid%>=640 THEN 14830 wind%(w%,4)=wind%(w%,2)+640 14840ELSE 14850 wind%(w%,4)=wind%(w%,2)+wid% 14860ENDIF 14870IF ht%>=612 THEN 14880 wind%(w%,3)=wind%(w%,5)-612 14890ELSE 14900 wind%(w%,3)=wind%(w%,5)-ht% 14910ENDIF 14920wind%(w%,6)=0:wind%(w%,7)=0 14930wind%(w%,8)=0:wind%(w%,9)=-ht% 14940wind%(w%,10)=wid%:wind%(w%,11)=0 14950wind%(w%,12)=0:wind%(w%,13)=0 14960wind%(w%,14)=%00010+(255<<24) 14970wind%(w%,15)=1 14980wind%(w%,16)=0:wind%(w%,17)=0 14990wind%(w%,18)=pinfo%(p%,5) 15000wind%(w%,19)=3 15010wind%(w%,20)=%0 15020wind$(w%)="0123456789ABCD" 15030PROCCreateWindow(w%) 15040pinfo%(p%,5)=wind%(w%,18) 15050IF pinfo%(p%,3)=1 THEN 15060 $data%(wind%(w%,18),0)="JigWord "+STR$(p%) 15070ELSE 15080 $data%(wind%(w%,18),0)="JigWord "+STR$(p%)+" "+STR$(pinfo%(p%,3)) 15090ENDIF 15100FOR a%=0 TO numwind% 15110 IF wuse%(a%)<>0 AND wind%(a%,1)=p% THEN 15120 IF a%<>w% THEN 15130 !b%=wind%(a%,0) 15140 SYS "Wimp_GetWindowState",,b%:wf%=b%!28 15150 SYS "Wimp_ForceRedraw",-1,b%!4,b%!16,b%!12,b%!16+44 15160 ELSE 15170 PROCOpenWindow(a%,-1) 15180 ENDIF 15190 ENDIF 15200NEXT 15210ENDPROC 15220: 15230DEF PROCCreateWordWind(p%) 15240LOCAL w%,a%,mw%,mh,addr1%,addr2%,icst%,f%,ww% 15250w%=FN1stFree(wuse%(),numwind%) 15260IF w%=-1 THEN PROCError2nd(5):ENDPROC 15270ww%=FN1stFree(pwuse%(),maxpword%) 15280IF ww%=-1 THEN PROCError2nd(5):ENDPROC 15290wuse%(w%)=-1 15300pwuse%(ww%)=-1 15310addr1%=puzzin%(p%):addr2%=addr1%+addr1%!12 15320mw%=!addr2%:addr2%+=8 15330IF mw%<LEN(" � Letters � ") THEN mw%=17 15340mh%=0 15350FOR a%=2 TO addr2%!-8 15360IF (!addr2%-addr2%!-4)>mh% THEN mh%=!addr2%-addr2%!-4:pword%(ww%,2)=a%:f%=-1 15370addr2%+=4 15380NEXT 15390mh%+=2 15400wind%(w%,1)=p%+maxpuzz%+1 15410wind%(w%,8)=0:wind%(w%,11)=0 15420wind%(w%,9)=-(mh%*40+16) 15430wind%(w%,10)=mw%*16+40 15440PROCNextWindPos(w%) 15450wind%(w%,4)=100+wind%(w%,10) 15460IF wind%(w%,9)<-600 THEN 15470 wind%(w%,3)=200 15480ELSE 15490 wind%(w%,3)=wind%(w%,5)+wind%(w%,9) 15500ENDIF 15510wind%(w%,6)=0:wind%(w%,7)=0 15520wind%(w%,12)=0:wind%(w%,13)=0 15530wind%(w%,14)=%10+(255<<24) 15540wind%(w%,15)=1 15550icst%=pwordiconst%+ww%*3 15560wind%(w%,16)=icst% 15570wind%(w%,17)=3 15580wind%(w%,18)=-1 15590wind%(w%,19)=3 15600wind%(w%,20)=ww% 15610wind$(w%)="JigWord "+STR$(p%) 15620icon%(icst%,0)=wind%(w%,10)/2-120:icon%(icst%,1)=-48 15630icon%(icst%,2)=icon%(icst%,0)+18:icon%(icst%,3)=-8 15640icon%(icst%,4)=%11001+(2<<12)+(7<<24) 15650icon%(icst%,5)=-1:icon%(icst%,6)=0 15660icon%(icst%,7)=-1:icon%(icst%,8)=1:icon$(icst%,0)=CHR$136 15670icst%+=1 15680icon%(icst%,0)=wind%(w%,10)/2+104:icon%(icst%,1)=-48 15690icon%(icst%,2)=icon%(icst%,0)+18:icon%(icst%,3)=-8 15700icon%(icst%,4)=%11001+(2<<12)+(7<<24) 15710icon%(icst%,5)=-1:icon%(icst%,6)=0 15720icon%(icst%,7)=-1:icon%(icst%,8)=1:icon$(icst%,0)=CHR$137 15730icst%+=1 15740icon%(icst%,0)=wind%(w%,10)/2-84:icon%(icst%,1)=-48 15750icon%(icst%,2)=icon%(icst%,0)+168:icon%(icst%,3)=-8 15760icon%(icst%,4)=%100011001+(7<<24) 15770icon%(icst%,5)=0:icon%(icst%,6)=1 15780icon%(icst%,7)=-1:icon%(icst%,8)=11 15790icon$(icst%,0)=STR$(pword%(ww%,2))+" Letters" 15800icon$(icst%,1)="" 15810PROCCreateWindow(w%) 15820pinfo%(p%,8)+=1 15830pinfo%(p%,4)=pinfo%(p%,4) OR %10 15840pword%(ww%,0)=w% 15850pword%(ww%,1)=p% 15860pword%(ww%,3)=wind%(w%,10)/2-pword%(ww%,2)*8 15870pword%(ww%,4)=pword%(ww%,3)+pword%(ww%,2)*16 15880pword%(ww%,5)=mh%-3 15890PROCOpenWindow(w%,-1) 15900ENDPROC 15910: 15920REM IF error trapping enhanced here, remember the grid backgnd col. 15930REM This little horror took me forever. You can change the print ratio 15940REM here if you want a bigger JigWord printed 15950DEF PROCPrintPuzzGrid(w%,p%) 15960LOCAL H%,O%,plx%,prx%,pby%,pty% 15970LOCAL f1%,f2%,x1%,y1%,x2%,y2% 15980H%=OPENOUT(print$) 15990LOCAL ERROR 16000ON ERROR LOCAL RESTORE ERROR:CLOSE#H%:PROCErrorPrint1st:ENDPROC 16010SYS &80145,H%,"JigWord" TO O% 16020LOCAL ERROR 16030ON ERROR LOCAL RESTORE ERROR:SYS&80149,H%:SYS&80145,O%:CLOSE#H%:PROCError1st 16040: 16050SYS &80143 TO,,,plx%,pby%,prx%,pty% 16060b%!0=0:b%!4=-(pinfo%(p%,1)*40+12):b%!8=pinfo%(p%,0)*20+40:b%!12=0 16070b%!16=65536:b%!20=0:b%!24=0:b%!28=65536 16080b%!32=plx%:b%!36=pby% 16090SYS "PDriver_GiveRectangle",%101,b%,b%+16,b%+32,&FFFFFF00 16100: 16110SYS "PDriver_DrawPage",1,b2% TO f1%,,f2% 16120a%=0 16130A%=0:CALL ChangeBckGndCol 16140WHILE f1% 16150 ORIGIN 0,0 16160 REMPROCPuzzRect(w%,b2%!0,b2%!4,b2%!8,b2%!12) 16170 x1%=(b2%!0-22) DIV 20:x2%=(b2%!8-22) DIV 20 16180 y1%=(b2%!4+8) DIV -40:y2%=(b2%!12+8) DIV -40 16190 IF y1%>y2% THEN SWAP y1%,y2% 16200 IF x1%<0 THEN x1%=0 16210 IF x1%>=pinfo%(p%,0) THEN x1%=pinfo%(p%,0)-1 16220 IF x2%>=pinfo%(p%,0) THEN x2%=pinfo%(p%,0)-1 16230 A%=0:B%=0:CALL ChangeSel 16240 A%=puzzin%(p%):B%=wind%(w%,20) AND %1:C%=scratch% 16250 D%=x1%:E%=y1%:F%=x2%:G%=y2%:CALL CreateHeap 16260 CALL Gridsetc 16270 a%+=1 16280 OSCLI "SET A1"+CHR$(64+a%)+" "+STR$(x1%) 16290 OSCLI "SET A2"+CHR$(64+a%)+" "+STR$(y1%) 16300 OSCLI "SET A3"+CHR$(64+a%)+" "+STR$(x2%) 16310 OSCLI "SET A4"+CHR$(64+a%)+" "+STR$(y2%) 16320 SYS "PDriver_GetRectangle",,b2% TO f1%,,f2% 16330ENDWHILE 16340A%=3:CALL ChangeBckGndCol 16350: 16360SYS "PDriver_EndJob",H% 16370RESTORE ERROR 16380SYS "PDriver_SelectJob",O% 16390RESTORE ERROR 16400CLOSE#H% 16410ENDPROC 16420: 16430DEF PROCPrintWordList(p%) 16440LOCAL addr1%,addr2%,n%,o%,nw%,c%,t$,d%,m% 16450addr1%=puzzin%(p%) 16460addr2%=addr1%+addr1%!16 16470o%=addr2%!0 16480*FX 3 10 16490PRINT STRING$(pwidth%/2-8," ");"JigWord word list" 16500PRINT STRING$(pwidth%/2-8," ");"-----------------" 16510PRINT:PRINT:PRINT 16520FOR n%=2 TO o% 16530 addr2%+=4 16540 IF !addr2%<>0 THEN 16550 addr3%=addr1%+!addr2% 16560 nw%=!addr3%:addr3%+=4 16570 t$=STR$(n%)+" letter word" 16580 IF nw%>1 THEN t$+="s" 16590 PRINT t$'STRING$(LEN(t$),"-"):PRINT 16600 m%=pwidth% DIV (n%+1):d%=0 16610 FOR c%=1 TO nw% 16620 d%+=1 16630 SYS "OS_WriteN",addr3%,n%:PRINT " "; 16640 IF d%=m% THEN SYS "OS_NewLine":d%=0 16650 addr3%+=n% 16660 NEXT 16670 PRINT:PRINT:PRINT 16680 ENDIF 16690NEXT 16700*FX 3 0 16710ENDPROC 16720: 16730REM If you think the comments are bad in this program 16740REM you should have seen the machine-code source code. 16750REM I apologise if there are some silly words in the 16760REM dictionary. 16770REM Anyone who doesn't get the room 101 bit, go and read 16780REM '1984' by George Orwell. It's a lot more interesting 16790REM that this. And a lot easier to understand. 16800: 16810REM I think we should do a survey. I'm programming at the 16820REM moment on ARMBE, with red text on black. What colour 16830REM schemes does everyone else use? 16840: 16850: 16860: 16870Don't you just luuurve it! 16880 16890********
� >!RunImage I� Remember to test if CreateMenu reports an error abt indirected data F� Remember to do PROCDeleteMStruct for all those difficult windows (4� � � 0:ș "Wimp_CloseDown":� �$;" at line ";�:� 2: <9ș "Wimp_Initialise",200,&4B534154,"JigWord" � ,task% F: P�Initialise ZA%=hilitecol%:� ChangeHiCol d�CreateIcon(0) n: x�CreateWindow(1) �: �'quit%=�:menus%=-1:menuw%=-1:mask%=1 �� � � � � �Error1st �! ș "Wimp_Poll",mask%,b% � p% � Ȏ p% � � � 0:�PROCCycle � � 1:�P_1(b%) �" � 2:ș "Wimp_OpenWindow",,b% � � 3:�P_3(b%) � � 6:�P_6(b%) � � 8:�P_8(b%) � � 9:�P_9(b%) � 17,18:�Receive(b%) � � quit% "'ș "Wimp_CloseDown",task%,&4B534154 ,� 6: @& "Oh no! An error, this can't be!" J) 'Sorry, but it's worse than that.' T4 "Worse? It, it, it's not a fatal error, is it?" ^* 'That just about sums it up. Sorry' h "Arghhhh!" r: |� �Error1st � !error%=� �#$(error%+4)=�$+" at line "+�(�) �+ș "Wimp_ReportError",error%,,"JigWord" �ș "Wimp_CloseDown" �� �� �: �4 "Stop messing with my mind you little horrors!" � �8 'But it's our job. Don't think of us as an error, �4 more as messages from RISCOS - postcards from � ROM.' � 9 "ROM, ROM? Isn't that where the volcano appeared and ; wiped out hundreds of innocent programmers? I saw that video last night." & 07 'You really do have problems. I don't think your :, sliced loaf goes right to the crust.' D N= "And your disc drive head doesn't go to the last track." X b5 'Touchy touchy, aren't we. Well, onto the next l procedure.' v: �� �Error2nd(err%) �!error%=err% �$(error%+4)=error$(err%) �+ș "Wimp_ReportError",error%,,"JigWord" �� �: � "Noooooooo!" �% 'Don't worry about it. Relax.' � "Arghhhhhh!" �8 'It's only another type of fatal internal error.' � � 'And stop dribbling!' �: � �Error3rd !error%=0 $(error%+4)=err$ +ș "Wimp_ReportError",error%,,"JigWord" *ș "Wimp_CloseDown" 4� >� H: R "?" \ f/ 'That's it, take him away lads. Into the p' land of eternal internal error.' z � "?" � � 'Take him to room 101.' � � "What, what's in room 101?" � �. 'You know what is in room 101. Everyone �! knows what is in room 101' � � "Arghhhhh!" �: �� �ErrorPrint1st � !error%=� #$(error%+4)=�$+" at line "+�(�) +ș "Wimp_ReportError",error%,,"JigWord" � 'Snigger snigger.' $� .: 8� �Initialise Bhilitecol%=9 Lprint$="printer:" Vpwidth%=80 `: j� b% 256 t � b2% 256 ~� code% 4096 �: �� creates% 7*1024 � cjiglen%=8192:cscratlen%=512 �+� cjigst% cjiglen%,cscratst% cscratlen% �: �6ș "OS_ReadVarVal","JigWord$Dir",b%,255,0,0 � ,,l% � b%?l%=&0D � path$=$b% �h%=�(path$+".Words") �9wordlen%=(�#h%)+((�#h%)<<8)+((�#h%)<<16)+((�#h%)<<24) ��#h% �� wordst% wordlen% +� "Load "+path$+".Words 10_"+�(wordst%) : .� "Load "+path$+".CreateO 10_"+�(creates%) result%=creates% ("changejig%=creates%+creates%!4 2 cwordst%=creates%+creates%!8 <csize%=creates%+creates%!12 F&changecscrat%=creates%+creates%!16 P#cpuzzarea%=creates%+creates%!20 Z"cinitvar%=creates%+creates%!24 d#createjig%=creates%+creates%!28 ncrand%=creates%+creates%!32 xA%=�(-�):A%=�:� crand% �'A%=cjigst%:B%=cjiglen%:� changejig% �A%=wordst%:� cwordst% �.A%=cscratst%:B%=cscratlen%:� changecscrat% �: �� dispjigst% 6144 �1� "Load "+path$+".JigDispO 10_"+�(dispjigst%) �(ChangeHiCol=dispjigst%+dispjigst%!00 �(puzzshuffle=dispjigst%+dispjigst%!04 �'puzzselect=dispjigst%+dispjigst%!08 �!HFit=dispjigst%+dispjigst%!12 �!VFit=dispjigst%+dispjigst%!16 �&ChangeJig=dispjigst%+dispjigst%!20 �&ChangeSel=dispjigst%+dispjigst%!24 'CreateHeap=dispjigst%+dispjigst%!28 %Gridsetc=dispjigst%+dispjigst%!32 !Word=dispjigst%+dispjigst%!36 ")puzzshflags1=dispjigst%+dispjigst%!40 ,'nextpuzzst=dispjigst%+dispjigst%!44 6!selh=dispjigst%+dispjigst%!48 @!selv=dispjigst%+dispjigst%!52 J fit=dispjigst%+dispjigst%!56 T!hlen=dispjigst%+dispjigst%!60 ^!vlen=dispjigst%+dispjigst%!64 h,ChangeBckGndCol=dispjigst%+dispjigst%!68 r: |err%=�:err$="" �� error$(10),error% 256 �� a%=0 � 8 � � error$(a%) �� �: �maxpuzz%=10 �;� puzzst% 32*1024,puzzin%(maxpuzz%),pinfo%(maxpuzz%,10) �� puzzim% 1024 �puzzend%=puzzst%+32*1024 �nxtpuzzst%=puzzst% �� pfree%(maxpuzz%) �: �� scratch% 4096 : maxpword%=10 +� pword%(maxpword%,5),pwuse%(maxpword%) &: 0� create%(10) :: D9� sprarea%(4):� sprite area addresses, 0 is Wimp area Nsprarea%(0)=1 X: bnumicon%=75:nexticon%=0 l)� icon%(numicon%,9),icon$(numicon%,1) v� iconst% 64 ��ReadIconData �pwordiconst%=nexticon% �nexticon%+=(maxpword%+1)*3 �: �&nummenu%=10:nextmenu%=0:maxitem%=9 �;� item%(nummenu%,maxitem%,4),item$(nummenu%,maxitem%,1) �'� menu%(nummenu%,1),menu$(nummenu%) �$� menust% 1024,menuin%(nummenu%) �8nxtmenust%=menust%:menuend%=menust%+1024:nextmenu%=0 ��ReadMenuData �: �&numms%=10:� number menu structures �(� mstructst% 1023,mstructin%(numms%) 6nxtmstruct%=mstructst%:mstructend%=mstructst%+1024 �ReadMStructData : numdat%=200 *#� indata% 1024,data%(numdat%,3) 4dataend%=indata%+1024 >!nextdat%=0:nextdatst%=indata% H� indirected data RB� data%(item num,[data start,length,validation{-1},length{-1}] \: fAnextwpos%=0:� incremented to allow windows to open at offsets pnumwind%=15 z8� wind%(numwind%,20),wind$(numwind%),wuse%(numwind%) �� wbuff% 512 ��ReadWindowData �� �: �0 Anyone wanting to know how the puzzles are �6 created, tough! It's all in machine code. And so � is the display code. �: �� �InitialiseDispFile(p%) �pinfo%(p%,0)=nxtpuzzst%!4 �pinfo%(p%,1)=nxtpuzzst%!8 �)pinfo%(p%,2)=�PNumOfWords(nxtpuzzst%) �pinfo%(p%,3)=0 pinfo%(p%,4)=0 pinfo%(p%,5)=-1 pinfo%(p%,6)=-1 $pinfo%(p%,7)=-1 .pinfo%(p%,8)=0 8pinfo%(p%,9)=0 Bpinfo%(p%,10)=0 Lpfree%(p%)=-1 Vpuzzin%(p%)=nxtpuzzst% `nxtpuzzst%+=!nxtpuzzst% j� t: ~� �ReadIconData �� a%,b%,n% � � �TlP �� n% �� a%=0 � n%-1 � � b%=0 � 9 � � icon%(a%,b%) �% � icon%(a%,6)=4 � icon%(a%,6)=1 � � � � icon$(a%,0),icon$(a%,1) �G �CheckIconData(a%,icon%(a%,8),icon$(a%,0),icon$(a%,1),icon%(a%,4)) � � err% � �Error3rd �� nexticon%=n% � $� �CheckIconData(i%,l%,a$,b$,f%) Ȏ icon%(a%,6) � ( � 0: 23 � �(a$)>12 � (f% � %1)<>%1 � (f% � 256)=256 � <2 err%=�:err$="Icon "+�(i%)+" is invalid (0)" F � P � Z � 1: d3 � �(a$)+1>l% � (f% � %1)<>%1 � (f% � 256)=0 � n2 err%=�:err$="Icon "+�(i%)+" is invalid (1)" x � � � � � 2: �5 � �(a$)>12 � (f% � %10)<>%10 � (f% � 256)=256 � �2 err%=�:err$="Icon "+�(i%)+" is invalid (2)" � � � � � � 3: �: � �(a$)+1>l% � b$="" � (f% � %10)=0 � (f% � 256)=0 � �2 err%=�:err$="Icon "+�(i%)+" is invalid (3)" � � � � � � 4: �@ err%=�:err$="Icon "+�(i%)+" has type 4, please use type 1" 6 err%=�:err$="Icon "+�(i%)+" has an unknown type" � "� ,� 6: @� �ReadMenuData J� a%,n%,b% T � �DnO ^� n% h� a%=0 � n%-1 r � menu$(a%) | � menu%(a%,0),menu%(a%,1) � � b%=0 � menu%(a%,1)-1 �C � item%(a%,b%,0),item%(a%,b%,1),item%(a%,b%,2),item%(a%,b%,3) � � item%(a%,b%,4) �% � item$(a%,b%,0),item$(a%,b%,1) � � � �CheckMenuData(a%) � � err% � �Error3rd �� �� �� �CheckMenuData(m%) �� b%,f% �� �(menu$(m%))>12 � �) err$="Menu "+�(a%)+" title too long" err%=� � � &� b%=0 � menu%(m%,1)-1 0 f%=item%(m%,b%,3) :' � (f% � %100001)<>%10001 � f%<>0 � DG err$="Menu "+�(m%)+" item "+�(b%)+" icon flags should be %100001" N err%=� X � b � l, � �(item$(m%,b%,0))>12 � (f% � 256)=0 � v? err$="Menu "+�(m%)+" item "+�(b%)+" should be indirected" � err%=� � � � � �< � (f% � 256)=256 � �(item$(m%,b%,0))+1<item%(m%,b%,4) � �; err$="Menu "+�(m%)+" item "+�(b%)+" should is a mess" � err%=� � � � � �� �� �: �� �ReadMStructData �� a%,n%,o%,addr%,d% � �tNR � n% addr%=nxtmstruct% � a%=0 � n%-1 * mstructin%(a%)=addr% 4 � > � d% H !addr%=d% R addr%+=4 \ � d%=-1 f� pnstmstruct%=addr% z� �: �� �ReadWindowData �� a%,n%,b% � � �tHN �� n% �� a%=0 � n%-1 � � wind$(a%) � � b%=0 � 20 � � wind%(a%,b%) � � � wuse%(a%)=-1 �� �� : I� If you get the first message, congratulations! It took me forever. : $I� "Not enough indirected data workspace, tell a competent programmer" .� "Minimum width is 30" 8� "Minimum height is 15" B� "Too many puzzles" L"� "Not enough room for puzzle" V+� "Not enough workspace to open window" `(� "Only 5 views of a puzzle allowed" j� "Maximum width is 99" t� "Maximum height is 99" ~?� Actually 255*255 is the biggest size. But also impossible �: � � Windows �� 3 �� About this program �� -1,-1, 0,0,604,212, 0,0 �� 0,-212,604,0, 0,0 �� %10010+(132<<24) �� 1 �� 1,8,-1,0,0 � �� "JigWord Creation" �!� -1,-1, 200,200,456,800, 0,0 � 0,-256,0,0, 0,200 � %10010+(135<<24)+(1<<12) � 1,9,6,-1,3,0 (� "About this Puzzle" 2� -1,-1,0,0,332,160, 0,0 <� 0,-160,332,0, 0,0 F� %10010+(132<<24) P� 1 Z� 15,6,-1,0,0 d: n: x� Menus �� 3 �� JigWord,72,2 �� -1,%0000,0,0,0,Info, �� -1,%10000000,-1,0,0,Quit, � �� JigWord,136,5 �� -1,%0000,2,0,0,Info, �� -1,%0000,-1,0,0,Cheat, �� -1,%0000,-1,0,0,Words, �� -1,%0000,-1,0,0,New View, � � -1,%10000000,-1,0,0,Print, �: �� Words,136,2 � -1,%0000,-1,0,0,New View, � -1,%10000000,-1,0,0,Print, : ": ,: 6� Icons @� 21 J� 0,0,68,68,(3<<12)+%10 T� -1,2,-1,9,-1 ^� "!jigword", h r/� 20,-48,156,-8,%1000010001+(7<<24)+(2<<28) |� 0,0,-1,8,-1,"Name:", �1� 20,-100,156,-60,%1000010001+(7<<24)+(2<<28) �� 0,0,-1,8,-1,"Purpose:", �2� 20,-152,156,-112,%1000010001+(7<<24)+(2<<28) �� 0,0,-1,8,-1,"Author:", �2� 20,-204,156,-164,%1000010001+(7<<24)+(2<<28) �� 0,0,-1,8,-1,"Version:", �4�DATA 160,-48,598,-8,%1000111101+(7<<24)+(0<<28) �0� 160,-52,598,-4,%1000111101+(7<<24)+(0<<28) �� 0,0,-1,9,-1,"!JigWord", �6�DATA 160,-100,598,-60,%1000111101+(7<<24)+(0<<28) �2� 160,-104,598,-56,%1000111101+(7<<24)+(0<<28) � � 0,0,-1,8,-1,"Puzzlement!", �7�DATA 160,-152,598,-112,%1100111101+(7<<24)+(0<<28) 3� 160,-156,598,-108,%1100111101+(7<<24)+(0<<28) %� 0,1,-1,16,-1,"P.Bentley, 1991", 7�DATA 160,-204,598,-164,%1100111101+(7<<24)+(0<<28) &3� 160,-208,598,-160,%1100111101+(7<<24)+(0<<28) 0)� 0,1,-1,20,-1,"1.62 (05, Apr 1992)", : D'� 20,-48,236,-4,%1000010001+(7<<24) N� 0,0,-1,8,-1,"Width:", X)� 20,-100,236,-56,%1000010001+(7<<24) b� 0,0,-1,8,-1,"Height:", l.�DATA 20,-152,236,-112,%1100010001+(7<<24) v'�DATA 0,1,-1,14,-1,"Word density:", �9� 240,-48,304,-4,%0100111101+(7<<24)+(0<<28)+(15<<12) �� 0,1,-1,3,-1,"30","A0-9" �;� 240,-100,304,-56,%0100111101+(7<<24)+(0<<28)+(15<<12) �� 0,1,-1,3,-1,"15","A0-9" �@�DATA 240,-152,304,-112,%0100111101+(7<<24)+(0<<28)+(15<<12) ��DATA 0,1,-1,3,-1,,"A0-9" �;� 48,-168,284,-120,%1100010011+(7<<24)+(1<<28)+(11<<12) �0� 0,1,-1,12,-1,"Start Word:","Soptoff,opton" �@�DATA 144,-224,284,-180,%1100010011+(7<<24)+(1<<28)+(11<<12) �-�DATA 0,1,-1,6,-1,"Grid:","Soptoff,opton" �@� 120,-232,224,-188,%111101+(7<<24)+(12<<28)+(9<<12)+(1<<16) �� 0,0,-1,7,-1,"Create", � '� 20,-48,236,-8,%1000010001+(7<<24) � 0,0,-1,6,-1,"Width:", )� 20,-100,236,-60,%1000010001+(7<<24) � 0,0,-1,7,-1,"Height:", **� 20,-152,236,-112,%1100010001+(7<<24) 4#� 0,1,-1,14,-1,"No. of words:", >4�DATA 240,-48,312,-8,%0000111101+(7<<24)+(0<<28) H0� 240,-52,312,-4,%0000111101+(7<<24)+(0<<28) R� 0,0,-1,14,-1,"", \2� 240,-104,312,-56,%0000111101+(7<<24)+(0<<28) f� 0,0,-1,14,-1,"", p3� 240,-156,312,-108,%0000111101+(7<<24)+(0<<28) z� 0,0,-1,14,-1,"", �: �: �� menu structures �� 3 �� 0,&8000,-1 �� 2,&8001,-1 �� &8002,-1 �: �(� �SIcon(s$,but%,h%,x1%,y1%,x2%,y2%) �b%!0=h% �b%!4=x1% �b%!8=y1% � b%!12=x2% b%!16=y2% b%!20=%10+(but%<<12) $(b%+24)=s$ $!ș "Wimp_CreateIcon",,b% � h% .=h% 8: B� �CreateWindow(w%) L� addr%,offset%,h%,a% Vaddr%=wbuff% `+addr%!0=wind%(w%,2):addr%!4=wind%(w%,3) j,addr%!8=wind%(w%,4):addr%!12=wind%(w%,5) t-addr%!16=wind%(w%,6):addr%!20=wind%(w%,7) ~addr%!24=-1 �addr%!28=wind%(w%,14) �Ȏ wind%(w%,15) � � � 1: � addr%?32=7:addr%?33=2 � addr%?34=7:addr%?35=1 � addr%?36=3:addr%?37=1 � addr%?38=12:addr%?39=0 � : �� �-addr%!40=wind%(w%,8):addr%!44=wind%(w%,9) �/addr%!48=wind%(w%,10):addr%!52=wind%(w%,11) �� �(wind$(w%))>12 � addr%!56=%100011001 � addr%!56=%11001 � ('addr%!60=wind%(w%,19)<<12:� buttons 2$addr%!64=1:� sprite area pointer <;addr%?68=wind%(w%,12) � 256:addr%?69=wind%(w%,12) � 256 F;addr%?70=wind%(w%,13) � 256:addr%?71=wind%(w%,13) � 256 P� �(wind$(w%))<=12 � Z $(addr%+72)=wind$(w%) d� n � wind%(w%,18)<>-1 � x$ addr%!72=data%(wind%(w%,18),0) � addr%!76=-1 �$ addr%!80=data%(wind%(w%,18),1) �& $data%(wind%(w%,18),0)=wind$(w%) � � �/ � (nextdatst%+�(wind$(w%))+1)>=dataend% � � �Error2nd(0) � � � � �' wind%(w%,18)=nextdat%:nextdat%+=1 �A data%(wind%(w%,18),0)=nextdatst%:nextdatst%+=�(wind$(w%))+1 �* data%(wind%(w%,18),1)=�(wind$(w%))+1 � data%(wind%(w%,18),2)=-1 � data%(wind%(w%,18),3)=-1 $ addr%!72=data%(wind%(w%,18),0) addr%!76=-1 $ addr%!80=data%(wind%(w%,18),1) "& $data%(wind%(w%,18),0)=wind$(w%) , � 6� @addr%!84=wind%(w%,17) Joffset%=88 T� wind%(w%,17)>0 � ^ h%=0 h4 � a%=wind%(w%,16) � wind%(w%,16)+wind%(w%,17)-1 r icon%(a%,9)=h% |# �CreateIData(a%,addr%+offset%) � offset%+=32 � h%+=1 � � �� �/ș "Wimp_CreateWindow",,addr% � wind%(w%,0) �3� a%=wind%(w%,16) � wind%(w%,16)+wind%(w%,17)-1 � icon%(a%,5)=wind%(w%,0) �� �� �: �� �CreateMenu(m%) �� a%,addr%,a$,b$,f%,id% �+menuin%(m%)=nxtmenust%:addr%=nxtmenust% $addr%=menu$(m%) addr%?12=7:addr%?13=2 addr%?14=7:addr%?15=0 &addr%!16=menu%(m%,0) 0addr%!20=44:addr%!24=0 : addr%+=28 D� a%=0 � menu%(m%,1)-1 N addr%!0=item%(m%,a%,1) X � item%(m%,a%,2)<>-1 � b � item%(m%,a%,2)<&8000 � l& addr%!4=wind%(item%(m%,a%,2),0) v � �, addr%!4=menuin%(item%(m%,a%,2)-&8000) � � � � � addr%!4=-1 � � � f%=item%(m%,a%,3) � � f%=0 � � addr%!8=(1<<5)+(7<<24)+1 � � � addr%!8=f% � � � a$=item$(m%,a%,0) � b$=item$(m%,a%,1) ? � �(a$)>12 � b$<>"" � (f% � 256)=256 � item%(m%,a%,4)>12 � � item%(m%,a%,0)=-1 � / � (nextdatst%+�(a$)+�(b$)+2)>=dataend% � �Error2nd(0) * � 4 � >2 id%=nextdat%:item%(m%,a%,0)=id%:nextdat%+=1 H9 data%(id%,0)=nextdatst%:nextdatst%+=item%(m%,a%,4) R" data%(id%,1)=item%(m%,a%,4) \ � b$<>"" � f3 data%(id%,2)=nextdatst%:nextdatst%+=�(b$)+1 p data%(id%,3)=�(b$)+1 z � �' data%(id%,2)=-1:data%(id%,3)=-1 � � � � � id%=item%(m%,a%,0) � � � $data%(id%,0)=a$ � � b$<>"" � �( $(data%(id%,0)+item%(m%,a%,4))=b$ � � � addr%!12=data%(id%,0) � addr%!16=data%(id%,2) � addr%!20=data%(id%,1) � addr%!8=addr%!8 � (1<<8) � $(addr%+12)=item$(m%,a%,0) � $ addr%+=24 .� 8nxtmenust%=addr% B� L: V� �CreateIcon(i%) `iconst%!0=icon%(i%,5) j�CreateIData(i%,iconst%+4) t/ș "Wimp_CreateIcon",,iconst% � icon%(i%,9) ~� �: �� �CreateIData(i%,addr%) �� t%,a$,b$ �!a$=icon$(i%,0):b$=icon$(i%,1) �addr%!0=icon%(i%,0) �addr%!4=icon%(i%,1) �addr%!8=icon%(i%,2) �addr%!12=icon%(i%,3) �addr%!16=icon%(i%,4) �t%=icon%(i%,6) �Ȏ t% � � � 0:$(addr%+20)=icon$(i%,0) � 1,4: G �IndirectText(addr%+20,a$,b$,icon%(i%,7),icon%(i%,8),icon%(i%,7)) � 2:$(addr%+20)=icon$(i%,0) � 3: (G �IndirectText(addr%+20,a$,"",icon%(i%,7),icon%(i%,8),icon%(i%,7)) 2' addr%!24=sprarea%(�(icon$(i%,1))) < � 4: F) � 5:addr%!20=0:addr%!24=0:addr%!28=0 P� Z� d: n� �CreateMStruct(s%,x%,y%) x� a%,addr%,d%,e% �nxtmenust%=menust% �addr%=mstructin%(s%) �� � e%=d% � d%=!addr% � addr%+=4 � � d%<>-1 � �< � d%<&8000 � �CreateWindow(d%) � �CreateMenu(d%-&8000) � � �� d%=-1 �1ș "Wimp_CreateMenu",,menuin%(e%-&8000),x%,y% � menus%=s% �� : (� �IndirectText(a%,a$,b$,p%,l%,� p%) � p%=-1 � "* � (nextdatst%+l%+�(b$)+1)>=dataend% � , �Error2nd(0) 6 � @ � J p%=nextdat%:nextdat%+=1 T* data%(p%,0)=nextdatst%:nextdatst%+=l% ^ data%(p%,1)=l% h � b$<>"" � r0 data%(p%,2)=nextdatst%:nextdatst%+=�(b$)+1 | data%(p%,3)=�(b$)+1 � � �# data%(p%,2)=-1:data%(p%,3)-=1 � � �� �$data%(p%,0)=a$ � � b$<>"" � $(data%(p%,2))=b$ �a%!0=data%(p%,0) �a%!4=data%(p%,2) �a%!8=data%(p%,1) �� �: �� �DeleteWindow(w%) �6!wbuff%=wind%(w%,0):ș "Wimp_DeleteWindow",,wbuff% wind%(w%,0)=-1 � : &� �DestroyWindow(w%) 0� a% :6!wbuff%=wind%(w%,0):ș "Wimp_DeleteWindow",,wbuff% Dwind%(w%,0)=-1 Nwuse%(w%)=0 X� wind%(w%,17)>0 � b4 � a%=wind%(w%,16) � wind%(w%,16)+wind%(w%,17)-1 l icon%(a%,5)=0 v � �� �� �: �� �DeleteMStruct(s%) �� addr%,d% �addr%=mstructin%(s%) �� � d%=!addr% � addr%+=4 �, � d%<>-1 � d%<&8000 � �DeleteWindow(d%) �� d%=-1 � menus%=-1 � menuw%=-1 � : � Redraw_Window_Request � �P_1(a%) *� more%,w% 4w%=�WNum(a%!0) >&ș "Wimp_RedrawWindow",,a% � more% Hȕ more% R �WindRect(w%,a%) \' ș "Wimp_GetRectangle",,a% � more% f� p� z: �� Close_Window_Request �� �P_3(a%) �� w%,c%,p%,ret% �w%=�WNum(!a%) �p%=wind%(w%,1) �)� p%=-1 � ș "Wimp_CloseWindow",,a%:� �� p%>maxpuzz% � � p%-=maxpuzz%+1 �' �DestroyWindow(w%):pinfo%(p%,8)-=1 �: � pinfo%(p%,8)=0 � pinfo%(p%,4)=pinfo%(p%,4) � �(%11) � pwuse%(wind%(w%,20))=0 � � �� � pinfo%(p%,3)=1 � G b2%!0=0:$(b2%+4)="Are you sure you want to lose this puzzle?"+�(0) 8 ș "Wimp_ReportError",b2%,%10111,"!JigWord" � ,ret% $ � ret%=0 � ret%=2 � � .� 8�DestroyWindow(w%) Bpinfo%(p%,3)-=1 L+� pinfo%(p%,3)=0 � �DestroyPuzzle(p%):� V� pinfo%(p%,3)=1 � `, $data%(pinfo%(p%,5),0)="JigWord "+�(p%) j� t@ $data%(pinfo%(p%,5),0)="JigWord "+�(p%)+" "+�(pinfo%(p%,3)) ~� �� c%=0 � numwind% �& � wuse%(c%)<>0 � wind%(c%,1)=p% � � !b%=wind%(c%,0) �" ș "Wimp_GetWindowState",,b% �8 ș "Wimp_ForceRedraw",-1,b%!4,b%!16,b%!12,b%!16+44 � � �� �� �: �� Mouse_Click �� �P_6(a%) �� w%,c% ,� a%!12=-2 �IconBarClick(a%!0,a%!4,a%!8) w%=�WNum(a%!12) � w%<0 � w%>numwind% � � c%=�INum(w%,a%!16) (5� w%=1 � c%=14 � (a%!8 � 2)<>2 � �InitCreateJig:� 2C� wind%(w%,1)<>-1 � wind%(w%,1)<=maxpuzz% � �PuzzleClick(w%,a%) <C� wind%(w%,1)<>-1 � wind%(w%,1)>maxpuzz% � �WordClick(w%,c%,a%) F� P: Z� Key_Pressed d� �P_8(a%) n� w%,c% xw%=�WNum(a%!0) �Ȏ w% � � � -1: � ș "Wimp_ProcessKey",a%!24 � � 1:�KeyWind1(a%) � : � ș "Wimp_ProcessKey",a%!24 �� �� �: �� Menu_Selection �� �P_9(a%) �ș &400CF,,b2%:z%=b2%!8 �Ȏ menus% � � 0:� a%!0=1 � quit%=� � 1: Ȏ a%!0 � " � 1:�ToggleCheat(menuw%) ,+ � 2:�ToggleWordWind(wind%(menuw%,1)) 6+ � 3:�CreatePuzzWind(wind%(menuw%,1)) @1 � 4:�PrintPuzzGrid(menuw%,wind%(menuw%,1)) J � T � 2: ^ Ȏ a%!0 � h6 � 0:�CreateWordWind(wind%(menuw%,1)-maxpuzz%-1) r5 � 1:�PrintWordList(wind%(menuw%,1)-maxpuzz%-1) | � �� �� (z% � 1)=1 � � �CreateMStruct(menus%,0,0) �� � �DeleteMStruct(menus%) �� �� �: �� Poll 17 and 18 �� �Receive(a%) �Ȏ a%!16 � � � 0:quit%=� �" � &40300:�ChangeHiLiteCol(a%) � � : &� Don't know if this works. 0� �ChangeHiLiteCol(a%) :#� d%,s%,A%,B%,C%,D%,E%,F%,G%,H% D� a%!20=&452295 � N hilitecol%=a%!24 X A%=hilitecol%:� ChangeHiCol b � l� v� a%!20=4522295 � � s%=a%!24 � d%=a%+28 � A%=�($d%) � �NextPar(d%,d%) � B%=�($d%) � �NextPar(d%,d%) � C%=�($d%) � �NextPar(d%,d%) � D%=�($d%) � �NextPar(d%,d%) � E%=�($d%) � �NextPar(d%,d%) � F%=�($d%) ! �NextPar(d%,d%) ! G%=�($d%) ! �NextPar(d%,d%) ! H%=�($d%) !*" ș s%,A%,B%,C%,D%,E%,F%,G%,H% !4 � !>� !H� a%!20=5922254 � !R d%=a%+24 !\ s%=�($d%) !f �NextPar(d%,d%) !p A%=�($d%) !z �NextPar(d%,d%) !� B%=�($d%) !� �NextPar(d%,d%) !� C%=�($d%) !� �NextPar(d%,d%) !� D%=�($d%) !� �NextPar(d%,d%) !� E%=�($d%) !� �NextPar(d%,d%) !� F%=�($d%) !� �NextPar(d%,d%) !� G%=�($d%) !� �NextPar(d%,d%) !� H%=�($d%) " � s% " � "� "$� a%!20=&1234DEBA � ". � (a%!24) "8 � "B� "L� "V: "`� �NextPar(d%,� d%) "j d%+=1 "tȕ ?d%<>13 "~ d%+=1 "�� "� d%+=1 "�� "�: "�1� 10.9.8.7.6.5.4.3.2.1...We have destruction. "�� �DestroyPuzzle(p%) "�� a%,addr1%,addr2% "�� a%=0 � maxpword% "�$� pword%(a%,1)=p% � pwuse%(a%) � "�. pwuse%(a%)=0:�DestroyWindow(pword%(a%,0)) "�� "�� # : # addr1%=puzzin%(p%) #addr2%=puzzshflags1 #� a%=0 � maxpuzz% #(3 � pfree%(a%) � !addr2%=puzzin%(a%) � !addr2%=0 #2 addr2%+=4 #<� #FA%=p%:� puzzshuffle #Paddr1%=puzzshflags1 #Z� a%=0 � maxpuzz% #d' � !addr1%<>0 � puzzin%(a%)=!addr1% #n addr1%+=4 #x� #�pfree%(p%)=0 #�nxtpuzzst%=!nextpuzzst #�� #�: #�-� Does anyone know that little known song #�)� 'Stop tap-dancing on my icon bar' ? #�� �IconBarClick(x%,y%,z%) #�� z%=1 � � Adjust #�� z%=4 � �OpenWindow(1,-1) #�� z%=2 � #�* � menus%<>-1 � �DeleteMStruct(menus%) #� �CreateMStruct(0,x%-64,184) #� menuw%=-1 $ � $� $� $": $,� A confused click? $6� �PuzzleClick(w%,addr%) $@� p% $Jp%=wind%(w%,1) $T� (addr%!8 � 2)=2 � $^ icon$(18,0)=�(pinfo%(p%,0)) $h icon$(19,0)=�(pinfo%(p%,1)) $r icon$(20,0)=�(pinfo%(p%,2)) $| � (wind%(w%,20) � %1)=%1 � $�$ item%(1,1,1)=item%(1,1,1) � %1 $� � $�' item%(1,1,1)=item%(1,1,1) � �(%1) $� � $� � (pinfo%(p%,4) � %1)=%1 � $�$ item%(1,2,1)=item%(1,1,1) � %1 $� � $�' item%(1,2,1)=item%(1,1,1) � �(%1) $� � $�* � menus%<>-1 � �DeleteMStruct(menus%) $�) �CreateMStruct(1,addr%!0-64,addr%!4) $� menuw%=w% $� � %� %� (addr%!8 � %100)=%100 � %- �PuzzSelect(p%,addr%!12,addr%!0,addr%!4) %& � %0� %:� (addr%!8 � %001)=%001 � %D �DeHiLight(p%,2) %N pinfo%(p%,6)=0 %X pinfo%(p%,7)=0 %b pinfo%(p%,9)=0 %l pinfo%(p%,10)=0 %v � %�� %�� %�: %�-� Anyone who used this option to complete %�2� a puzzle hasn't got the brains to understand %�.� this program. So why are you reading it? %�� �ToggleCheat(w%) %�"wind%(w%,20)=wind%(w%,20) � %1 %�"item%(1,1,1)=item%(1,1,1) � %1 %�b%!0=wind%(w%,0) %�b%!4=wind%(w%,8) %�b%!8=wind%(w%,9) %�b%!12=wind%(w%,10) &b%!16=wind%(w%,11) &&ș "Wimp_UpdateWindow",,b% � more% &ȕ more% & �WindRect(w%,b%) &*' ș "Wimp_GetRectangle",,b% � more% &4� &>� &H: &R� �ToggleWordWind(p%) &\ � (pinfo%(p%,4) � %10)=%00 � &f �CreateWordWind(p%) &p � pinfo%(p%,8)=-1 � � &z$ pinfo%(p%,4)=pinfo%(p%,4) � %11 &�# item%(1,2,1)=item%(1,2,1) � %1 &� � &�� &�� &�: &�� �PuzzSelect(p%,w%,x%,y%) &�*� a%,addr1%,addr2%,v%,h%,n%,x1%,y1%,l% &�!b%=w%:ș &400CB,,b% &�x%=x%-(b%!4-b%!20) &�y%=y%-(b%!16-b%!24) &�'x%=(x%-22) � 20:y%=((y%+8) � 40)*-1 &�+A%=x%:B%=y%:C%=puzzin%(p%):� puzzselect &�h%=!selh:v%=!selv ' � h%<>0 � pinfo%(p%,9)=!hlen '!� v%<>0 � pinfo%(p%,10)=!vlen ': '$� h%=0 � v%=0 � � '.+� h%=pinfo%(p%,6) � v%=pinfo%(p%,7) � � '8� h%>0 � v%>0 � 'B � h%=pinfo%(p%,6) � 'L& �DeHiLight(p%,1):pinfo%(p%,10)=0 'V � '` � 'j � v%=pinfo%(p%,7) � 't% �DeHiLight(p%,0):pinfo%(p%,9)=0 '~ � '� � '� �DeHiLight(p%,2) '�$ pinfo%(p%,6)=h%:pinfo%(p%,7)=v% '� �HiLight(p%,0) '� �HiLight(p%,1) '� � '�� '�� h%>0 � '�8 � pinfo%(p%,7)>0 � �DeHiLight(p%,1):pinfo%(p%,10)=0 '� � pinfo%(p%,6)<>h% � '� �DeHiLight(p%,0) '� pinfo%(p%,6)=h% ( �HiLight(p%,0) ( � (� (7 � pinfo%(p%,6)>0 � �DeHiLight(p%,0):pinfo%(p%,9)=0 (( � pinfo%(p%,7)<>v% � (2 �DeHiLight(p%,1) (< pinfo%(p%,7)=v% (F �HiLight(p%,1) (P � (Z� (d� (n: (x� �DeHiLight(p%,a%) (�� c% (�Ȏ a% � (�= � 0:c%=pinfo%(p%,6):pinfo%(p%,6)=0:�UpdateSpace(p%,c%,0) (�= � 1:c%=pinfo%(p%,7):pinfo%(p%,7)=0:�UpdateSpace(p%,c%,1) (�= � 2:c%=pinfo%(p%,6):pinfo%(p%,6)=0:�UpdateSpace(p%,c%,0) (�@ c%=pinfo%(p%,7):pinfo%(p%,7)=0:�UpdateSpace(p%,c%,1) (�� (�� (�: (�� �HiLight(p%,a%) (�Ȏ a% � (�( � 0:�UpdateSpace(p%,pinfo%(p%,6),0) (�( � 1:�UpdateSpace(p%,pinfo%(p%,7),1) )( � 2:�UpdateSpace(p%,pinfo%(p%,6),0) )+ �UpdateSpace(p%,pinfo%(p%,7),1) )� )"� ),: )6� �UpdateSpace(p%,s%,d%) )@� s%=0 � � )J+� x%,y%,l%,wd%,a%,x1%,y1%,x2%,y2%,more% )T�SpaceInfo(p%,s%,d%) )^x1%=x%*20+20:y1%=y%*-40-4 )hȎ d% � )r# � 0:x2%=x1%+l%*20+2:y2%=y1%-44 )|# � 1:x2%=x1%+22:y2%=y1%-l%*40-4 )�� )�� a%=0 � numwind% )�# � wind%(a%,1)=p% � wuse%(a%) � )� b%!0=wind%(a%,0) )� b%!4=x1% )� b%!8=y2% )� b%!12=x2% )� b%!16=y1% )� ș &400C9,,b% � more% )� ȕ more% )� �WindRect(a%,b%) )� ș &400CA,,b% � more% )� � * � *� *� *&: *0 � �SpaceInfo(p%,space%,dir%) *:� addr% *Daddr%=puzzin%(p%) *N Ȏ dir% � *X � 0:addr%=addr%+addr%!24 *b � 1:addr%=addr%+addr%!28 *l� *vaddr%+=4 *�addr%=addr%+space%*8-8 *�0x%=addr%?0:y%=addr%?1:l%=addr%?2:wd%=addr%!4 *�� *�: *�� �WordClick(w%,c%,addr%) *�0� pw%,p%,addr1%,addr2%,x%,y%,addr3%,a%,n%,f% *�%pw%=wind%(w%,20):p%=pword%(pw%,1) *�� (addr%!8 � 2)=2 � *�) �CreateMStruct(2,addr%!0-64,addr%!4) *� menuw%=w% *� � *�� *�5� c%=pwordiconst%+pw%*3 � �ChWordLen(-1,pw%,w%):� +6� c%=pwordiconst%+pw%*3+1 � �ChWordLen(1,pw%,w%):� +x%=addr%!0:y%=addr%!4 +#!b2%=wind%(w%,0):ș &400CB,,b2% + x%=x%-(b2%!4-b2%!20) +*0y%=y%-(b2%!16-b2%!24):y%=((y%+36) � 40)*-1-1 +4-� x%<pword%(pw%,3) � x%>pword%(pw%,4) � � +>� y%<0 � � +H� y%>pword%(pw%,5) � � +R� (addr%!8 � 1)=1 � +\3 addr1%=�WordAddr(pword%(pw%,2),y%,puzzin%(p%)) +f � (?addr1% � 128)=0 � � +p ?addr1%=?addr1% � 128 +z �UpdateWWind(w%,pw%,y%) +� addr1%=puzzin%(p%) +� addr2%=addr1%+addr1%!24 +�$ n%=addr2%!0:addr2%+=4:f%=0:a%=0 +� ȕ a%<n% � �(f%) +� a%+=1 +�5 � (addr2%!4>>>16)=y% � addr2%?2=pword%(pw%,2) � +� f%=� +� addr2%?6=&FF:addr2%?7=&FF +� �UpdateSpace(p%,a%,0) +� � +� addr2%+=8 +� � +� addr2%=addr1%+addr1%!28 ,$ n%=addr2%!0:addr2%+=4:f%=0:a%=0 , ȕ a%<n% � �(f%) , a%+=1 ,$5 � (addr2%!4>>>16)=y% � addr2%?2=pword%(pw%,2) � ,. f%=� ,8 addr2%?6=&FF:addr2%?7=&FF ,B �UpdateSpace(p%,a%,1) ,L � ,V addr2%+=8 ,` � ,j � ,t� ,~$� pinfo%(p%,9)=pinfo%(p%,10) � � ,�2addr1%=�WordAddr(pword%(pw%,2),y%,puzzin%(p%)) ,�� (?addr1% � 128) � � ,�"� pinfo%(p%,9)=pword%(pw%,2) � ,�1 addr2%=�ClueAddr(pinfo%(p%,6),0,puzzin%(p%)) ,� A%=puzzin%(p%):� ChangeJig ,�9 A%=addr2%?0:B%=addr2%?1:C%=addr2%?2:D%=addr1%:� HFit ,� � !fit=0 � � 7:� ,� � (addr2%!4>>>16)<>&FFFF � ,�G addr3%=�WordAddr(pword%(pw%,2),addr2%?6+addr2%?7*256,puzzin%(p%)) ,� ?addr3%=?addr3% � 128 ,�0 �UpdateWWind(w%,pw%,addr2%?6+addr2%?7*256) ,� � - addr2%?6=y% � 256 - addr2%?7=y% � 256 - ?addr1%=?addr1% � 128 -$ �UpdateSpace(p%,pinfo%(p%,6),0) -( �UpdateWWind(w%,pw%,y%) -2� -<$ � pinfo%(p%,10)=pword%(pw%,2) � -F2 addr2%=�ClueAddr(pinfo%(p%,7),1,puzzin%(p%)) -P A%=puzzin%(p%):� ChangeJig -Z: A%=addr2%?0:B%=addr2%?1:C%=addr2%?2:D%=addr1%:� VFit -d � !fit=0 � � 7:� -n � (addr2%!4>>>16)<>&FFFF � -xH addr3%=�WordAddr(pword%(pw%,2),addr2%?6+addr2%?7*256,puzzin%(p%)) -� ?addr3%=?addr3% � 128 -�1 �UpdateWWind(w%,pw%,addr2%?6+addr2%?7*256) -� � -� addr2%?6=y% � 256 -� addr2%?7=y% � 256 -� ?addr1%=?addr1% � 128 -�% �UpdateSpace(p%,pinfo%(p%,7),1) -� �UpdateWWind(w%,pw%,y%) -� � -�� -�� -�� -� � . � . � .� ."� .,: .6 � A procedure with a stutter .@� �UpdateWWind(w%,pw%,a%) .J� c%,p%,more% .Tp%=pword%(pw%,1) .^� c%=0 � numwind% .h. � wind%(c%,1)=p%+1+maxpuzz% � wuse%(c%) � .r b%!0=wind%(c%,0) .|M b%!4=pword%(pw%,3):b%!8=(a%+2)*-40-32:b%!12=pword%(pw%,4):b%!16=b%!8+40 .� ș &400C9,,b% � more% .� ȕ more% .� �WindRect(c%,b%) .� ș &400CA,,b% � more% .� � .� � .�� .�� .�� .�: .�� �ChWordLen(d%,pw%,w%) .�-� addr1%,addr2%,icst%,f%,n%,l%,mh%,wf%,p% .�icst%=pwordiconst%+pw%*3 /p%=wind%(w%,1)-maxpuzz%-1 /.addr1%=puzzin%(p%):addr2%=addr1%+addr1%!16 / n%=addr2%!0:l%=pword%(pw%,2) /&� /0 l%+=d% /: � l%=1 � l%=n% /D � l%>n% � l%=2 /N � addr2%!(l%*4-4)>0 � f%=� /X� f% /bpword%(pw%,2)=l% /l%icon$(icst%+2,0)=�(l%)+" Letters" /v/$data%(icon%(icst%+2,7),0)=icon$(icst%+2,0) /�#mh%=!(addr1%+addr2%!(l%*4-4))+2 /�wind%(w%,9)=-(mh%*40+16) /�1b%!0=wind%(w%,0):ș "Wimp_GetWindowState",,b% /� wf%=b%!28 /�8wind%(w%,2)=b%!4:wind%(w%,4)=b%!12:wind%(w%,5)=b%!16 /�'wind%(w%,3)=wind%(w%,5)+wind%(w%,9) /�wind%(w%,6)=0:wind%(w%,7)=0 /�%b%!0=wind%(w%,8):b%!4=wind%(w%,9) /�(b%!8=wind%(w%,10):b%!12=wind%(w%,11) /�&ș "Wimp_SetExtent",wind%(w%,0),b% /��OpenWindow(w%,wf%) /�0pword%(pw%,3)=wind%(w%,10)/2-pword%(pw%,2)*8 /�0pword%(pw%,4)=pword%(pw%,3)+pword%(pw%,2)*16 0pword%(pw%,5)=mh%-3 0Bș "Wimp_ForceRedraw",wind%(w%,0),0,wind%(w%,9),wind%(w%,10),0 0� 0 : 0*� �KeyWind1(a%) 04� c%,nh%,lh%,h%,l%,f%,i% 0>c%=�INum(1,a%!4) 0HȎ c% � 0R) � 11:nh%=icon%(12,9):lh%=icon%(12,9) 0\) � 12:nh%=icon%(11,9):lh%=icon%(11,9) 0f# :ș "Wimp_ProcessKey",a%!24:� 0p� 0zȎ a%!24 � 0� � &0D: 0� h%=nh% 0� i%=�IFlags(1,14) 0�" � c%=12 � (i% � (1<<22))=0 � 0� a%!4=icon%(14,9) 0� a%!8=1<<21 0� a%!12=1<<21 0�! ș "Wimp_SetIconState",,a% 0� �InitCreateJig 0� � 0� � 0� � c%=12 � � 0� � 1 � &18E:h%=nh% 1 � &18F:h%=lh% 1# :ș "Wimp_ProcessKey",a%!24:� 1$� 1.+l%=�($(data%(icon%(�INum(w%,h%),7),0))) 186ș "Wimp_SetCaretPosition",wind%(1,0),h%,0,0,-1,l% 1B� 1L: 1V� It's a bit hot in here. 1`� �OpenWindow(w%,f%) 1jb%!0=wind%(w%,0) 1t%b%!4=wind%(w%,2):b%!8=wind%(w%,3) 1~'b%!12=wind%(w%,4):b%!16=wind%(w%,5) 1�'b%!20=wind%(w%,6):b%!24=wind%(w%,7) 1�b%!28=f% 1�ș "Wimp_OpenWindow",,b% 1�� 1�: 1�� �WindRect(w%,a%) 1�� wx1%,wy1%,wx2%,wy2% 1�4wx1%=a%!20+(a%!28-a%!4):wy1%=a%!24+(a%!40-a%!16) 1�3wx2%=wx1%+(a%!36-a%!28):wy2%=wy1%+(a%!32-a%!40) 1�ȑ a%!4-a%!20,a%!16-a%!24 1�/� wind%(w%,1)<>-1 � wind%(w%,1)<=maxpuzz% � 1�& �PuzzRect(w%,wx1%,wy1%,wx2%,wy2%) 2 � 2 .� wind%(w%,1)<>-1 � wind%(w%,1)>maxpuzz% � 2& �WordRect(w%,wx1%,wy1%,wx2%,wy2%) 2� 2( ȑ 0,0 22� 2<: 2F#� �PuzzRect(w%,x1%,y1%,x2%,y2%) 2P� p% 2Zp%=wind%(w%,1) 2d'x1%=(x1%-22) � 20:x2%=(x2%-22) � 20 2n'y1%=(y1%+8) � -40:y2%=(y2%+8) � -40 2x� x1%<0 � x1%=0 2�,� x1%>=pinfo%(p%,0) � x1%=pinfo%(p%,0)-1 2�,� x2%>=pinfo%(p%,0) � x2%=pinfo%(p%,0)-1 2�/A%=pinfo%(p%,6):B%=pinfo%(p%,7):� ChangeSel 2�3A%=puzzin%(p%):B%=wind%(w%,20) � %1:C%=scratch% 2�,D%=x1%:E%=y1%:F%=x2%:G%=y2%:� CreateHeap 2�� Gridsetc 2�� 2�: 2�#� �WordRect(w%,x1%,y1%,x2%,y2%) 2�#� p%,addr1%,addr2%,a%,b%,n%,pw% 2�pw%=wind%(w%,20) 2�+x1%=(x1%-22) � 16:x2%=((x2%-22) � 16)+1 2�5y1%=((y1%+36) � 40)*-1:y2%=(((y2%+36) � 40)-1)*-1 3.p%=wind%(w%,1)-maxpuzz%-1:l%=pword%(pw%,2) 3.addr1%=puzzin%(p%):addr2%=addr1%+addr1%!16 3!addr2%=addr1%+addr2%!(l%*4-4) 3"n%=addr2%!0:addr2%+=4 3,� a%=1 � n% 36 � a%>=y1% � a%<=y2% � 3@! � pword%(pw%,3),-(a%*40+36) 3J � ?addr2% � 128 � 3T9 ș "Wimp_SetColour",3:ș "OS_WriteC",?addr2% � 128 3^ � 3h3 ș "Wimp_SetColour",7:ș "OS_WriteC",?addr2% 3r � 3|" ș "OS_WriteN",addr2%+1,l%-1 3� addr2%+=l% 3� � 3� addr2%+=l% 3� � 3�� 3�� 3�: 3�� �Word(n%,addr%) 3� A%=n%:B%=addr%:C%=b2%:� Word 3� =$b2% 3�� off%,a%,l%,c%,a$,b% 3�� n%=&FFFF � ="" 3�a%=addr%+addr%!16 4b%=addr%+addr%!12 4 l%=0:c%=2 4� 4&3 � n%<(!(b%+c%*4)) � n%>=(!(b%+c%*4-4)) � l%=c% 40 c%+=1 4:� l%<>0 4Da%=addr%+a%!(l%*4-4) 4N a%=a%+(n%-!(b%+l%*4-4))*l%+4 4X a$="" 4b� c%=0 � l%-1 4la$+=�(a%?c%) 4v� 4�=a$ 4�: 4�� �WNum(hand%) 4�� a%,f% 4� f%=-1 4�� a%=0 � numwind% 4� � wind%(a%,0)=hand% � f%=a% 4�� 4�=f% 4�: 4�� �INum(w%,hand%) 4�� a%,f%,h% 4� f%=-1 5h%=wind%(w%,0) 5� a%=0 � numicon% 51 � icon%(a%,9)=hand% � icon%(a%,5)=h% � f%=a% 5 � 5*=f% 54: 5>� �IFlags(w%,i%) 5Hiconst%!0=wind%(w%,0) 5Riconst%!4=icon%(i%,9) 5\#ș "Wimp_GetIconState",,iconst% 5f=iconst%!24 5p: 5z(� Just about the only time I've ever 5�%� passed an array to a procedure. 5�:� (and got away with both my eyebrows!!!) (never mind) 5� � �1stFree(array%(),maxdim%) 5�� a%,f% 5�a%=-1:f%=-1 5�� 5� a%+=1 5� � array%(a%)=0 � f%=a% 5�� f%<>-1 � a%=maxdim% 5�=f% 5�: 5�� �PNumOfWords(addr%) 5�*=!(!(addr%+addr%!12)*4+addr%+addr%!12) 6: 6� �WordAddr(l%,w%,addr%) 6� addr1% 6$6addr1%=addr%+addr%!16:addr1%=addr%+addr1%!(l%*4-4) 6.=addr1%+4+l%*w% 68: 6B� �ClueAddr(c%,d%,addr%) 6L� addr1% 6V8� d%=0 addr1%=addr%+addr%!24 � addr1%=addr%+addr%!28 6`=addr1%+c%*8-4 6j: 6t� �InitCreateJig 6~� p%,addr1%,addr2%,n%,l% 6�$b%!0=wind%(1,0):b%!4=icon%(14,9) 6�b%!8=0:b%!12=1<<21 6�ș "Wimp_SetIconState",,b% 6�"p%=�1stFree(pfree%(),maxpuzz%) 6�� p%=-1 � �Error2nd(3):� 6�'create%(0)=�($data%(icon%(11,7),0)) 6�'create%(1)=�($data%(icon%(12,7),0)) 6�'create%(2)=(�IFlags(1,13)>>21) � %1 6�$� create%(0)<30 � �Error2nd(1):� 6�$� create%(1)<15 � �Error2nd(2):� 6�$� create%(0)>99 � �Error2nd(7):� 6�$� create%(1)>99 � �Error2nd(8):� 7 � nxtpuzzst%+32>=puzzend% � 7 �Error2nd(4) 7 � 7� 7($b%!0=wind%(1,0):b%!4=icon%(14,9) 72b%!8=1<<22:b%!12=1<<22 7<ș "Wimp_SetIconState",,b% 7F-create%(3)=%00:create%(4)=0:create%(5)=p% 7P8create%(6)=nxtpuzzst%:create%(7)=puzzend%-nxtpuzzst% 7Z$b%!0=wind%(1,0):b%!4=icon%(14,9) 7db%!8=1<<22:b%!12=1<<22 7nș "Wimp_SetIconState",,b% 7xș "Hourglass_On" 7�,A%=create%(0)-1:B%=create%(1)-1:� csize% 7�,A%=create%(6):B%=create%(7):� cpuzzarea% 7�� cinitvar% 7�� createjig% 7�ș "Hourglass_Off" 7�$b%!0=wind%(1,0):b%!4=icon%(14,9) 7�b%!8=1<<22:b%!12=0<<22 7�ș "Wimp_SetIconState",,b% 7�� !result%=-1 � 7� b2%!0=0 7� $(b2%+4)=error$(4)+�(0) 7�0 ș "Wimp_ReportError",b2%,%10101,"!JigWord" 7� � 8� 8� create%(2)=1 � 8 addr1%=create%(6) 8"A � �(2)=1 � addr2%=addr1%+addr1%!24 � addr2%=addr1%+addr1%!28 8, n%=addr2%!0:addr2%+=4 86 addr2%+=(�(n%)-1)*8 8@( addr2%?6=addr2%?4:addr2%?7=addr2%?5 8J$ n%=addr2%!4 � &FFFF:l%=addr2%?2 8T addr2%=addr1%+addr1%!16 8^ addr2%+=l%*4-4 8h2 addr2%=addr1%+!addr2%:addr2%+=4:addr2%+=l%*n% 8r ?addr2%=?addr2% � 128 8|� 8�#�InitialiseDispFile(create%(5)) 8��CreatePuzzWind(create%(5)) 8�mask%=0 8�� 8�: 8�� a little used procedure 8�� �Cycle 8�$b%!0=wind%(1,0):b%!4=icon%(14,9) 8�b%!8=0<<22:b%!12=1<<22 8�ș "Wimp_SetIconState",,b% 8�mask%=1 8�� createinbckgnd 8�� 9: 9� A weather vain? 9� �NextWindPos(w%) 9&� nextwpos%=4 � nextwpos%=0 900wind%(w%,2)=100:wind%(w%,5)=800-48*nextwpos% 9:nextwpos%+=1 9D� 9N: 9X� �CreatePuzzWind(p%) 9b(� w%,vx%,vy%,ht%,wid%,addr%,a%,more% 9l%� pinfo%(p%,3)=5 � �Error2nd(6):� 9v!w%=�1stFree(wuse%(),numwind%) 9� � w%=-1 � 9� �Error2nd(5) 9� � 9�� 9�wuse%(w%)=-1 9�pinfo%(p%,3)+=1 9�addr%=puzzin%(p%) 9�(wid%=addr%!4*20+40:ht%=addr%!8*40+12 9�wind%(w%,1)=p% 9��NextWindPos(w%) 9�� wid%>=640 � 9� wind%(w%,4)=wind%(w%,2)+640 9�� :! wind%(w%,4)=wind%(w%,2)+wid% :� :� ht%>=612 � : wind%(w%,3)=wind%(w%,5)-612 :*� :4 wind%(w%,3)=wind%(w%,5)-ht% :>� :Hwind%(w%,6)=0:wind%(w%,7)=0 :R"wind%(w%,8)=0:wind%(w%,9)=-ht% :\$wind%(w%,10)=wid%:wind%(w%,11)=0 :f!wind%(w%,12)=0:wind%(w%,13)=0 :p!wind%(w%,14)=%00010+(255<<24) :zwind%(w%,15)=1 :�!wind%(w%,16)=0:wind%(w%,17)=0 :�wind%(w%,18)=pinfo%(p%,5) :�wind%(w%,19)=3 :�wind%(w%,20)=%0 :�wind$(w%)="0123456789ABCD" :��CreateWindow(w%) :�pinfo%(p%,5)=wind%(w%,18) :�� pinfo%(p%,3)=1 � :�, $data%(wind%(w%,18),0)="JigWord "+�(p%) :�� :�@ $data%(wind%(w%,18),0)="JigWord "+�(p%)+" "+�(pinfo%(p%,3)) :�� :�� a%=0 � numwind% ;& � wuse%(a%)<>0 � wind%(a%,1)=p% � ; � a%<>w% � ; !b%=wind%(a%,0) ;$- ș "Wimp_GetWindowState",,b%:wf%=b%!28 ;.9 ș "Wimp_ForceRedraw",-1,b%!4,b%!16,b%!12,b%!16+44 ;8 � ;B �OpenWindow(a%,-1) ;L � ;V � ;`� ;j� ;t: ;~� �CreateWordWind(p%) ;�-� w%,a%,mw%,mh,addr1%,addr2%,icst%,f%,ww% ;�!w%=�1stFree(wuse%(),numwind%) ;�� w%=-1 � �Error2nd(5):� ;�$ww%=�1stFree(pwuse%(),maxpword%) ;�� ww%=-1 � �Error2nd(5):� ;�wuse%(w%)=-1 ;�pwuse%(ww%)=-1 ;�.addr1%=puzzin%(p%):addr2%=addr1%+addr1%!12 ;�mw%=!addr2%:addr2%+=8 ;�)� mw%<�(" � Letters � ") � mw%=17 ;� mh%=0 ;�� a%=2 � addr2%!-8 <