home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / m / mask / !Mask / !RunImage (.txt) < prev    next >
RISC OS BBC BASIC V Source  |  1993-09-11  |  96KB  |  4,370 lines

  1.  >Mask
  2.  Michel Grimminck
  3. "Hourglass_Smash":
  4. " at line ";
  5. 'Version$="1.10":version=
  6. (Version$)
  7. init:
  8. main:
  9. lastmove=
  10. (  A$=
  11.  A$<>"" 
  12. key:lastmove=
  13.  X,Y,B:
  14.  B<>0 
  15.  lastmove=
  16. -lastmove)>6*60*100 
  17. joke:B=0:lastmove=
  18.  B<>0 
  19.  B>0 
  20. testbutton:
  21.  A$<>"none" 
  22. key:B=0
  23.  B>0 
  24.  X>XS/2-32 
  25.  X<(XS/2-32+MX) 
  26. selectmask:B=0
  27.  B>0 
  28.  X>=PX+16 
  29.  X<=PX+32 
  30.  Y>=Yd0 
  31.  Y<=Yd1 
  32.  B>1 
  33.  X>=PX 
  34.  X<=PX+48 
  35.  Y<Yd0 
  36.  M0+=1:
  37. changeM0:B=0
  38.  B>1 
  39.  X>=PX 
  40.  X<=PX+48 
  41.  Y>Yd1 
  42.  M0-=1:
  43. changeM0:B=0
  44.  B=1 
  45.  X>=PX 
  46.  X<=PX+48 
  47.  Y<Yd0 
  48.  M0-=1:
  49. changeM0:B=0
  50.  B=1 
  51.  X>=PX 
  52.  X<=PX+48 
  53.  Y>Yd1 
  54.  M0+=1:
  55. changeM0:B=0
  56.  B=1 
  57.  X<PX 
  58.  Y>YS/2 
  59. makesection:B=0
  60.  B=4 
  61.  X<PX 
  62.  Y<PY 
  63. makelocal:B=0
  64.  (B=1 
  65.  B=2) 
  66.  X<PX 
  67.  Y<PY 
  68. editpixel:B=0
  69.  B=4 
  70.  X<PX 
  71.  Y>YS/2 
  72. (-1) 
  73. gsline:B=0
  74.  B=4 
  75.  X<PX 
  76.  Y>YS/2 
  77. setxy
  78.  B=2 
  79. makeMask(Type,Mcurrent):
  80. update(Mcurrent)
  81.  (  Dcurrent=(Y-Yd0)/(Yd1-Yd0):
  82. printD
  83.  B=2 
  84. makeMask(Type,Mcurrent):
  85. update(Mcurrent)
  86.   Y0=Y:
  87.  X,Y,B:
  88.  B>0 
  89.  PX+24,Y
  90.  Y<>Y0 
  91. inversegetbxy(X,Y,
  92. ((X-ZOOM!0)/Xc*SFX)+SFX
  93. Yt=(ZOOM!12-Y)/Yc*SFY+SFY
  94. getxy(X,Y,
  95. .2Xt=
  96. ((X-SFX)/SFX)*Xc+ZOOM!0:
  97.  Xt<0 
  98.  Xt=ZOOM!0
  99. /6Yt=ZOOM!12+1-
  100. ((Y-YS/2)/SFY)*Yc:
  101.  Yt<0 
  102.  Yt=ZOOM!4
  103. getbxy(X,Y,
  104. 32Xt=
  105. ((X-SFX)/SFX)*Xc+ZOOM!0:
  106.  Xt<0 
  107.  Xt=ZOOM!0
  108. 42Yt=
  109. (ZOOM!12+1-
  110. (Y/SFY)*Yc):
  111.  Yt<0 
  112.  Yt=ZOOM!4
  113. setxy
  114. getxy(X,Y,Xt,Yt)
  115.  Xt>=0 
  116.  Xt<!MainX 
  117.  Yt>=0 
  118.  Yt<!MainY 
  119.  Xcurrent=Xt:Ycurrent=Yt:
  120. printXY
  121. gsline
  122.  !Main24=
  123. "Not implemented for <=8 bpp files":
  124. "Making line, release shift to abort"
  125. X0=X:Y0=Y
  126. Xold=X0:Yold=Y0:
  127.  X,Y,X,Y
  128. X,Y,B
  129.  X>=PX 
  130.  X=PX-1
  131.  Y>=PY+YS/2 
  132.  Y=PY+YS/2-1
  133.  Y<=YS/2 
  134.  Y=YS/2+1
  135.  X<>Xold 
  136.  Y<>Yold 
  137.  X0,Y0,Xold,Yold:
  138.  X,Y,X0,Y0:Xold=X:Yold=Y
  139. (-1) =
  140. "Shift was released, operation aborted":
  141.  X,Y,X0,Y0:
  142.  X,Y,X0,Y0
  143. getxy(X0,Y0,Xt0,Yt0)
  144. getxy(X,Y,Xt,Yt)
  145. O1A%=Xt:B%=Yt:
  146.  ReadRGB:
  147. 2:L%(R%)=RGB?R%:
  148. P3A%=Xt0:B%=Yt0:
  149.  ReadRGB:
  150. 2:M%(R%)=RGB?R%:
  151. M%()=M%()-L%()
  152. ((Xt0-Xt)^2+(Yt0-Yt)^2)+1
  153. DX=(Xt0-Xt)/L:DY=(Yt0-Yt)/L
  154. L:X%=Xt+T%*DX:Y%=Yt+T%*DY
  155. U,  AD%=MASK(Mcurrent)+!MainX*Y%+X%:?AD%=0
  156. V$  A%=!MainData+!MainLine*Y%+3*X%
  157.  R%=0
  158. 2:A%?R%=L%(R%)+T%*M%(R%)/L:
  159. displayMainOrig(1):
  160. update(Mcurrent)
  161. makesection
  162. X0=X:Y0=Y
  163. Xold=X0:Yold=Y0:
  164.  X,Y,0,0
  165. X,Y,B
  166.  X>=PX 
  167.  X=PX-1
  168.  Y>=PY+YS/2 
  169.  Y=PY+YS/2-1
  170.  Y<=YS/2 
  171.  Y=YS/2+1
  172.  X<>Xold 
  173.  Y<>Yold 
  174.  X0,Y0,Xold-X0,Yold-Y0:
  175.  X0,Y0,X-X0,Y-Y0:Xold=X:Yold=Y
  176.  X0,Y0,X-X0,Y-Y0
  177.  X<X0 
  178.  X,X0
  179.  Y<Y0 
  180.  Y,Y0
  181. getxy(X0,Y0,Xt0,Yt0)
  182. getxy(X,Y,Xt,Yt)
  183. do0:AD%=MASK(Mcurrent)
  184. Y%=Yt 
  185.  Yt0:AD%=MASK(Mcurrent)+!MainX*Y%:A%=AD%+Xt0:B%=AD%+Xt:C%=1:
  186.  VULMEM:
  187. update(Mcurrent)
  188. makelocal
  189. getbxy(X,Y,Xt,Yt):
  190.  Xt<0 
  191.  Xt=0
  192.  Yt<0 
  193.  Yt=0
  194. AD%=MASK(Mcurrent)
  195. C%=?(AD%+!MainX*Yt+Xt)
  196. fill(Xt,Yt,1500,2)
  197.  IK% 
  198.  C%=1 
  199.  A%=AD%:
  200.  Swap12
  201.  IK% 
  202.  C%=0 
  203.  A%=AD%:
  204.  Filter2
  205. A%=AD%:
  206.  Filter
  207. update(Mcurrent)
  208. line(X0,Y0,X1,Y1)
  209.  L,DX,T%,X%,Y%
  210. X0+=.5:Y0+=.5:X1+=.5:Y1+=.5
  211. ((X1-X0)^2+(Y1-Y0)^2)+1
  212. DX=(X1-X0)/L:DY=(Y1-Y0)/L
  213. L:X%=X0+T%*DX:Y%=Y0+T%*DY
  214. -AD%=MASK(Mcurrent)+!MainX*Y%+X%:?AD%=COL%
  215. editpixel
  216. getbxy(X,Y,Xt0,Yt0)
  217.  B=1 
  218.  COL%=0
  219.  B=2 
  220.  COL%=1
  221. X0=X:Y0=Y:
  222. X,Y,B0
  223. getbxy(X,Y,Xt,Yt)
  224. line(Xt0,Yt0,Xt,Yt)
  225. Xt0=Xt:Yt0=Yt
  226. update(Mcurrent)
  227.  B0=0
  228. "Seed: Please select a mask":M1%=
  229. input
  230. seedintern
  231.  M1%=Mcurrent 
  232. "Seed on itself has no effect":
  233. "Selecting seeds"
  234. Max%=12000
  235. mc_maxblock:
  236.  error$:
  237. mc_assign(M%):
  238.  error$:
  239.  Max%>= M%/8/4 
  240.  Max%=M%/8/4-1
  241. T%=L%:H%=1
  242. AD%=MASK(M1%):P%=0
  243.  !MainY-1:AD%=MASK(M1%)+!MainX*Y%
  244.  !MainX-1
  245.  AD%?X%=1 
  246.  T%!(4*P%)=X%+65536*Y%:
  247.  P%<(Max%-1) 
  248.  P%+=1
  249. DX%=!MainX
  250.  P%=Max%-1 
  251. "Not all seeds are used" 
  252. ;P%; " seeds used"
  253. 8C%=1:COL%=2:AD%=MASK(Mcurrent):DPT%=1400:
  254. seededfill
  255. A%=AD%:
  256.  Filter
  257. update(Mcurrent)
  258. fill(X%,Y%,DPT%,COL%)
  259.  P%,DX%,T%,H%,A%,B%,L%,M%,TN%
  260.  C%=COLOR
  261. P%=1:DX%=!MainX
  262. mc_maxblock:
  263.  error$:
  264. mc_assign(M%):
  265.  error$:
  266. T%=L%:H%=1
  267. 1T%!0=X%+65536*Y%:A%=AD%+!MainX*Y%+X%:?A%=COL%
  268. seededfill
  269. !FillAD=AD%:!FillKL=COL%
  270.  P%*4*5 >=M% 
  271. mc_release(L%):
  272.  "Operation failed due to memory problems":
  273.  H%=0 
  274.  TN%=L% 
  275.  TN%=L%+M%-P%*4*4
  276. !FillStoreAD=TN%:A%=T%
  277. !FillNP=0:B%=P%:
  278.  Fill
  279. T%=TN%:P%=!FillNP
  280. DPT%-=1:H%=1-H%
  281.  P%=0 
  282.  DPT%<0
  283. mc_release(L%):
  284. error$:
  285.  "V","v"       :
  286. version
  287.  "D","d"       :
  288. zoomtoc
  289.  "C","c"       :
  290. unzoomtoc
  291.  "Z","z"       :
  292.  "X","x"       :
  293. unzoom
  294.  "0"           :
  295. printbutton("0",
  296.  "1"           :
  297. printbutton("1",
  298.  "andnot"      :
  299. andnot:
  300. printbutton("andnot",
  301.  "=","copy"    :
  302. copy:
  303. printbutton("copy",
  304.  "A","a","and" :
  305. printbutton("and",
  306.  "O","o","or"  :
  307. printbutton("or",
  308.  "E","e","eor" :
  309. printbutton("eor",
  310.  "N","n","not" :
  311. printbutton("not",
  312.  "S","s","save":
  313. save:
  314. printbutton("save",
  315.  "1","grey"    :
  316. cleartypes:
  317. printbutton("grey",
  318. ):Type=0:
  319. makeMask(Type,Mcurrent):
  320. update(Mcurrent)
  321.  "2","rgb"     :
  322. cleartypes:
  323. printbutton("rgb",
  324. ):Type=1:
  325. makeMask(Type,Mcurrent):
  326. update(Mcurrent)
  327.  "3","color"   :
  328. cleartypes:
  329. printbutton("color",
  330. ):Type=2:
  331. makeMask(Type,Mcurrent):
  332. update(Mcurrent)
  333.  "edge:grey"   :
  334. cleartypes:
  335. printbutton("edge:grey",
  336. ):Type=3:
  337. makeMask(Type,Mcurrent):
  338. update(Mcurrent)
  339.  "hue"         :
  340. cleartypes:
  341. printbutton("hue",
  342. ):Type=4:
  343. makeMask(Type,Mcurrent):
  344. update(Mcurrent)
  345.  "save:pic"    :
  346. clearsave:SaveType$="save:pic":
  347. printbutton("save:pic",
  348. X,Y,B:
  349.  "save:smpic"  :
  350. clearsave:SaveType$="save:smpic":
  351. printbutton("save:smpic",
  352. X,Y,B:
  353.  "save:mask"   :
  354. clearsave:SaveType$="save:mask":
  355. printbutton("save:mask",
  356. X,Y,B:
  357.  "black","white","red","green","blue","purple","cyan","yellow","cgrey","darkred","darkblue":
  358. setmaskcolor(A$):
  359. displayMain(Mcurrent)
  360.  "noise"       :
  361. noise(noise):
  362. printbutton("noise",
  363.  "noise:1","noise:2","noise:3","noise:4","noise:5","noise:6","noise:8" :noise=
  364. A$,1)):
  365. clearnoise:
  366. printbutton(A$,
  367. X,Y,B:
  368.  "dilation"    :
  369. dilation:
  370. printbutton("dilation",
  371.  "dilation:1","dilation:3","dilation:5","dilation:6","dilation:8" :dilation=
  372. A$,1)):
  373. cleardilation:
  374. printbutton(A$,
  375. X,Y,B:
  376.  "load","l","L":
  377. load:
  378. printbutton("load",
  379.  "load:mask","load:pic","load:back"   :
  380. printbutton(LoadType$,
  381. printbutton(A$,
  382. ):LoadType$=A$:
  383. X,Y,B:
  384. mc_showmap
  385.  "T":
  386. tidymem
  387.  "seed"        :
  388. seed:
  389. printbutton("seed",
  390.  "large"       :
  391. large:
  392. printbutton("large",
  393.  "invall"      :
  394. inverse("all"):
  395. printbutton(A$,
  396.  "invmask"     :
  397. inverse("mask"):
  398. printbutton(A$,
  399. "           :
  400. speedtest
  401.  "erase"       :
  402. erase:
  403. printbutton(A$,
  404.  "24bit"       :
  405. 24bit:
  406. printbutton(A$,
  407.  "changecolor" :
  408. changecolor:
  409. printbutton(A$,
  410.  "changegrey"  :
  411. changegrey:
  412. printbutton(A$,
  413.  "correctcol"  :
  414. correctcol:
  415. printbutton(A$,
  416.  "gamma"       :
  417. gamma:
  418. printbutton(A$,
  419.  "sceleton"    :
  420. sceleton(1):
  421. update(Mcurrent):
  422. printbutton(A$,
  423.  "pal"         :!pal=1-!pal:
  424. setuppal(
  425. displayMainOrig(1):
  426. update(Mcurrent):
  427. printbutton("pal",-!pal)
  428.  "=":T%=
  429. checkpal:
  430. ;Colors?T%;:
  431.  "morph","m","M":
  432. transform:
  433. printbutton("morph",
  434.  "dma"         :dma=1-dma:
  435. printbutton("dma",dma-1):
  436. X,Y,B:
  437.  "fastdisplay" :FD=1-FD:
  438. printbutton("fastdisplay",-FD):
  439. displayMainOrig(1):
  440. X,Y,B:
  441.  "flipy"       :
  442. flipy:
  443. printbutton(A$,
  444. displayMainOrig(1)
  445.  "flipx"       :
  446. flipx:
  447. printbutton(A$,
  448. displayMainOrig(1)
  449.  "contrast"    :
  450. contrast:
  451. printbutton(A$,
  452. displayMainOrig(1)
  453.  "sharp"       :
  454. sharp:
  455. printbutton(A$,
  456. displayMainOrig(1)
  457.  "loadmap"     :
  458. loadmap:
  459. printbutton(A$,
  460.  "\"           :
  461. compress
  462.  "|"           :
  463. testmem
  464.  "J"           :
  465.  "K"           :
  466. lines
  467.  "tundo"       :undo=
  468.  undo:
  469. printbutton("tundo",undo):
  470. X,Y,B:
  471.  "undo"        :
  472. undo:
  473. printbutton(A$,
  474. dmaon
  475.  U%,F%,L%
  476. "OS_File",5,"<Wimp$ScrapDir>.MaskBackup" 
  477.  U%,,F%,,L%:F%=(F% >>8)
  478.  L%<>!MainL 
  479. "Unable to undo":
  480. printDiskAccess(
  481. "OS_File",255,"<Wimp$ScrapDir>.MaskBackup",MAIN
  482. printDiskAccess(
  483. displayMainOrig(1)
  484. backup
  485.  undo 
  486. printDiskAccess(
  487. 'CH%=
  488. ("<Wimp$ScrapDir>.MaskBackup")
  489. "OS_GBPB",&02,CH%,MAIN,!MainL
  490. "SetType <Wimp$ScrapDir>.MaskBackup 690"
  491. printDiskAccess(
  492.  OX,OY,X0,Y0,B0,X,Y,B,R,S,ROT,XL,YL,DX,DY
  493. RECTANGLEFILL SFX,YS/2+SFY,PX-SFX*2,PY-SFY*2
  494. "Let's not waste those ";
  495. (12*index+.5);" mips...."
  496. (1)<.45 
  497. lines:
  498. OX=PX/2:OY=PY/2+YS/2
  499. R=0:S=0.003:ROT=.015
  500. (1)<.3 
  501.  ROT=ROT*1.5:S=S*1.5
  502.  X0,Y0,B0
  503. (50)+120
  504. (50)+120
  505. (1)*(PX-SFX-XL)+SFX      -OX
  506. (1)*(PY-SFY-YL)+SFY+YS/2 -OY
  507. %%DX=(
  508. (1)-.5)*R-S*(X+XL/2)-Y*ROT-1
  509. &#DY=(
  510. (1)-.5)*R-S*(Y+YL/2)+X*ROT
  511. X+=OX:Y+=OY
  512.  (X+DX)>SFX 
  513.  (Y+DY)>(YS/2+SFY) 
  514.  (X+DX+XL+SFX)<PX 
  515.  (Y+DY+YL+SFY)<(PY+YS/2) 
  516.  X,Y,XL,YL 
  517.  X+DX,Y+DY
  518. (1)<1.5E-4 
  519. (255):
  520.  X,Y,XL,YL
  521.  X,Y,B
  522. (0)<>"" 
  523.  X<>X0 
  524.  Y<>Y0 
  525.  B<>0
  526. displayMainOrig(1)
  527. lines
  528.  T%,L,K,G,M,M2,OX,OY,B,X0,X1,Y0,Y1,VX0,VY0,VX1,VY1,C,CO
  529.  T%=0
  530. 9:X0(T%)=PX/2:Y0(T%)=YS/2+PY/2:K(T%)=
  531. L=1.8:
  532.  INVLOED X,Y
  533. K=.5:
  534.  VERKLEINING
  535. G=.99:
  536.  AFREMMING
  537. M=.01:M2=.2:
  538.  OX,OY,B
  539. CO=C:C=(C+1)
  540.  K(C):
  541.  X0(C),Y0(C),X1(C),Y1(C)
  542. :5X0(C)=(X0(C)+X0*L)/(1+L):Y0(C)=(Y0(C)+Y0*L)/(1+L)
  543. ;5X1(C)=(X0(C)+X1*L)/(1+L):Y1(C)=(Y0(C)+Y1*L)/(1+L)
  544.  X0(C),Y0(C),X1(C),Y1(C):K(C)=
  545. =GVX0=G*(VX0+
  546. rnd):VX1=G*(VX1+
  547. rnd):VY0=G*(VY0+
  548. rnd):VY1=G*(VY1+
  549. >)X1=(X1+M*X0)/(1+M):Y1=(Y1+M*Y0)/(1+M)
  550. ?'X0+=VX0:Y0+=VY0:X1+=VX1:Y1+=VY1:U=
  551.  X0<4 
  552.  X0>=1276:VX0=-VX0:X0+=VX0:U=
  553.  Y0<4 
  554.  Y0>=956:VY0=-VY0:Y0+=VY0:U=
  555.  X1<4 
  556.  X1>=1276:VX1=-VX1:X1+=VX1:U=
  557.  Y1<4 
  558.  Y1>=956:VY1=-VY1:Y1+=VY1:U=
  559.  X,Y,B
  560. (0)<>"" 
  561.  X<>OX 
  562.  Y<>OY 
  563.  B<>0
  564.  K(C) 
  565.  X0(C),Y0(C),X1(C),Y1(C)
  566. =(6+2*4)*(
  567. (1)-.5)
  568. testmem
  569. mc_showmap
  570. P.R%=
  571. ensuremem(
  572. mc_free+150*1024,
  573. ,2,0,0,0)
  574. "Result:";R%
  575. mc_showmap
  576. restoremem
  577. mc_showmap
  578. compress
  579. A%=MASK(Mcurrent)
  580.  CompressBitfield
  581. update(Mcurrent)
  582. CALL DeCompressBitfield
  583. PROCupdate(Mcurrent)
  584. sharp
  585.  !Main24=
  586.  "Operation not implemented for <24 bit files":
  587. b,T%=
  588. ensuremem(!MainN+4,
  589. ,Mcurrent,0,0,0)
  590. "Not enough memory for operation":
  591. restoremem:
  592. d5MAD=
  593. mc_assign(!MainN+4):
  594.  MAD=
  595. error$:
  596. MTEMP=MAD
  597. "Strength (def.=0.5)";S
  598.  S=0 
  599.  S=.5
  600. (S)>5 
  601. i)    
  602. "illegal strength. Aborted"
  603. j3    T%=
  604. mc_release(MAD):
  605. error$:
  606. restoremem
  607. l        
  608. m        
  609. backup
  610. M=1+4*S
  611. p6MX%=!MainLine:!sharpS=S*1024:!sharpM=M*1024:B%=MX%
  612.  C%=0
  613. "Processing colour:";C%
  614. Y%=1 
  615.  !MainY-2:!sharpMask=MASK(Mcurrent)+Y%*!MainX:A%=!MainData+!MainLine*Y%+C%:!sharpStore=MAD+Y%*!MainX
  616.  sharpen
  617. Y%=1 
  618.  !MainY-2:!sharpMask=MASK(Mcurrent)+Y%*!MainX:A%=!MainData+!MainLine*Y%+C%:!sharpStore=MAD+Y%*!MainX
  619.  sharpback
  620. "Memory stuff"
  621. {/T%=
  622. mc_release(MAD):
  623. error$:
  624. restoremem
  625. "Ready":
  626. printtime
  627. transform
  628.     T$=""
  629. ensuremem(!MainL+256 + MaskAmount+16,
  630. ,0,0,0,0)
  631. tridata=
  632. :OldMask=Mcurrent
  633. restoremem:
  634. "Not enough memory available for operation":
  635. DSEC=
  636. mc_assign(!MainL +256):
  637.  SEC=
  638. restoremem:
  639. error$:
  640. "Secondary picture (RETURN for none)";S$
  641.  S$<>"" 
  642. 7    
  643.  "OS_File",5,S$ 
  644.  U%,,F%,,L%:F%=(F% >>8)
  645. M    
  646.  F%<>&690 
  647. "Not a clear file. Transforming aborted":
  648. relsec:
  649. X    
  650.  L%>(!MainL+40) 
  651. "Second picture has an unequal size. Aborted":
  652. relsec:
  653. printDiskAccess(
  654. "OS_File",255,S$,SEC
  655. printDiskAccess(
  656.         
  657. hB$="":
  658.  S$<>"" 
  659.  !Main24=
  660. "Interpolate with secondary picture? (Yes/No/Abort)";B$:B$=
  661. B$,1)
  662.  B$="A" 
  663.  B$="a" 
  664. "Operation aborted.":
  665. relsec:
  666.  B$="Y" 
  667.  B$="y" 
  668.  int=
  669.  int=
  670. "Number of steps (default=1)";:
  671.  Step
  672.  Step=0 
  673.  Step=1
  674.  Step<0 
  675.  Step<>
  676. (Step) 
  677.  Step>500 
  678. "Illegal number of steps. Transforming aborted":
  679. relsec:
  680. F$="":
  681.  Step>1 
  682.  int 
  683. "Filename";
  684. .    
  685.  int=
  686. " (or RETURN not to save)";
  687.         
  688.  F$="" 
  689.  int 
  690. "Aborted:Must have a filename to interpolate":
  691. relsec:
  692.  F$<>"" 
  693. 6    
  694. "OS_File",5,F$ 
  695.  U%,,F%,,L%:F%=(F% >>8)
  696. L    
  697.  U%=1 
  698. "'"F$"' already exists as a file. Aborted.":
  699. relsec:
  700. "Cdir "+F$
  701. "Cdir "+F$+".spr"
  702.         
  703.  F$<>"" 
  704. ;    
  705. "Load point file (or RETURN not to load):";T$
  706.  T$<>"" 
  707. :        
  708. "OS_File",5,T$ 
  709.  U%,,F%,,L%:F%=(F% >>8)
  710. Z        
  711.  F%<>&FFD 
  712.  U%<>1 
  713. "illegal file, ignored. (press key)",~F%:B$=
  714. :T$=""
  715. %        
  716.  T$<>"" 
  717. loadtrans(T$)
  718.         
  719.         
  720. Ktridata=
  721. mc_assign(MaskAmount+16):
  722.  tridata=
  723. relsec:
  724.  error$:
  725. /MASK(0)=tridata:OldMask=Mcurrent:Mcurrent=0
  726. $templ=!MainData+!MainLine*!MainY
  727. X=!MainX:Y=!MainY
  728.  S$<>"" 
  729. initmain(SEC)
  730. `    
  731.  !MainX<>X 
  732.  !MainY<>Y 
  733. "The secondary image has wrong size. Aborted.":
  734. relsec:
  735. \    
  736.  !Main24=
  737.  int=
  738. "Secondary image must be 24bpp to interpolate":
  739. relsec:
  740. H    temp=MAIN:MAIN=SEC:
  741. displayMainOrig(0):MAIN=temp:
  742. initmain(MAIN)
  743.         
  744. "Please select points with the mouse, menu to end"
  745.  T$="" 
  746.  T$<>"" 
  747.  U%=5 
  748. draw(U%):
  749.  S$="" 
  750.  A%=MAIN:B%=templ:C%=SEC:
  751.  COPYMEM
  752.  X,Y,B:
  753.  X<PX 
  754. :S%=1
  755.  X0,Y0,B:B$=
  756.  B<>0 
  757.  B$<>""
  758. "\ZXDCzxdc
  759. ",B$)<=1 
  760.  X=X0:Y=Y0+4000*(X>PX):B$=
  761. testbutton
  762.  B$<>"none" 
  763.  (X<PX 
  764.  B=0) 
  765. handlezoom:B=0
  766.  Y>PY 
  767.  Y<YS/2 
  768.  Y0>=YS/2 
  769.  Y0-=YS/2
  770. getbxy(X0,Y0,X0,Y0)
  771.  B=1 
  772. {      D=4000:
  773. ((X(T%,S%)-X0)^2+(Y(T%,S%)-Y0)^2)<D 
  774. ((X(T%,S%)-X0)^2+(Y(T%,S%)-Y0)^2):Q%=T%:Q2%=S%
  775.       
  776. 5      X0=X(Q%,0):Y0=Y(Q%,0):X1=X(Q%,1):Y1=Y(Q%,1)
  777. L      N-=1:
  778. T%=Q% 
  779. N:X(T%,S%)=X(T%+1,S%):Y(T%,S%)=Y(T%+1,S%):
  780. <      B=8:S%=Q2%:X(N,0)=X0:Y(N,0)=Y0:X(N,1)=X1:Y(N,1)=Y1
  781.  B=4 
  782.  B=8 
  783.       Xold=X0:Yold=Y0
  784. J      
  785.  B=4 
  786.  X(N,1-S%)=X0:Y(N,1-S%)=Y0:X(N,S%)=X0:Y(N,S%)=Y0:
  787. draw(N)
  788.       
  789.          
  790.  X,Y,B
  791.          
  792.  X>=PX 
  793.  X=PX-1
  794.           
  795.  Y>=YS/2 
  796.  Y-=YS/2
  797.          
  798.  Y>=PY 
  799.  Y=PY-1
  800.          
  801. getbxy(X,Y,X,Y)
  802. V         
  803.  X<>Xold 
  804.  Y<>Yold 
  805. draw(N):X(N,S%)=X:Y(N,S%)=Y:
  806. draw(N):Xold=X:Yold=Y
  807.       
  808. 8      N+=1:S%=1:
  809.  N>50 
  810.  N=50:
  811. "No more points"
  812.  N=5 
  813. "Too little points. Aborted.":
  814. relsec::
  815.  S$<>"" 
  816.  A%=MAIN:B%=templ:C%=SEC:
  817.  COPYMEM
  818.  F$<>"" 
  819. savetrans(F$+".Points")
  820. N-=1:
  821. "Sorting points"
  822. 6   X(1,R%)=0:Y(1,R%)=0:X(2,R%)=!MainX-.5:Y(2,R%)=0
  823. F   X(3,R%)=!MainX-.5:Y(3,R%)=!MainY-.5:X(4,R%)=0:Y(4,R%)=!MainY-.5
  824. I  A=X(T,S%)*X(T,S%)+Y(T,S%)*Y(T,S%):
  825.  A<D 
  826.  D=A:X0=X(T,S%):Y0=Y(T,S%)
  827. MIN=-1
  828. N:MAX=1E9:V=-1
  829. N:C=(X(B,S%)-X0)*(X(B,S%)-X0)+(Y(B,S%)-Y0)*(Y(B,S%)-Y0)
  830.  C>MIN 
  831.  C<MAX 
  832.  MAX=C:V=B
  833.   I(A)=V:MIN=MAX
  834. backup
  835. "Making triangulation"
  836. -T(1,0)=I(1):T(1,1)=I(2):T(1,2)=I(3):TRI=1
  837. 3:HULL(T)=I(T):
  838. orient(HULL(1),HULL(2),HULL(3))=
  839.  HULL(1),HULL(2)
  840. *  L0=0:L1=0:P0=-1:P1=-1:P2=-1:USED()=
  841. %  O=
  842. orient(HULL(1),I(K),HULL(2))
  843.   JN=2
  844.   J=JN:
  845.  JN>H 
  846.  J-=H
  847.   J1=J+1:
  848.  J1>H 
  849.  J1-=H
  850. '  NO=
  851. orient(HULL(J),I(K),HULL(J1))
  852.  USED(J)=
  853.       USED(J)=
  854. J      
  855.  TRI+=1:T(TRI,0)=HULL(J):T(TRI,1)=I(K):T(TRI,2)=HULL(J1)
  856.       
  857.  L0=J:P0=HULL(J)
  858.  L1=J:P1=HULL(J1)
  859.   JN+=1:O=NO
  860.  L0>0 
  861.  L1>0 
  862.  (L1<L0 
  863.  J1<>L0)
  864. 1    H+=1:
  865.  L1+1 
  866.  -1:HULL(T)=HULL(T-1):
  867.     HULL(L1)=I(K)
  868.  L1>(L0+1) 
  869. <        H-=L1-L0-1:
  870. T=L0+1 
  871.  H:HULL(T)=HULL(T+L1-L0-1):
  872.         
  873.  L0>L1 
  874.         
  875.  L1=1 
  876.  H=L0+1
  877. <        
  878.  L1>1 
  879.  H=L0-L1+2:
  880. H:HULL(T)=HULL(T+L1-1):
  881.         
  882.   K+=1
  883. "Optimizing triangulation: pass=";P
  884.    F%=
  885.  H1=1 
  886.  TRI:
  887.  H2=1 
  888.  TRI:
  889. optimize(H1,H2):
  890.    P+=1
  891.  P>20
  892.  TRI:
  893. showline(T(T,0),T(T,1)):
  894. showline(T(T,1),T(T,2)):
  895. showline(T(T,2),T(T,0))
  896.  Init triangle table
  897. inittridata
  898. dotransformation(0)
  899.  int=
  900.  F$<>"" 
  901.      CH%=
  902. (F$+".000")
  903. .     
  904. writestring(CH%,"Run "+CurrentFile$)
  905.      
  906. #CH%,0
  907.      
  908. "     
  909. "SetType "+F$+".000 FEB"
  910.      
  911.  int 
  912.      
  913.  MAIN,SEC
  914.      S%=1-S%
  915.      
  916. inittridata
  917.      
  918. printDiskAccess(
  919.      
  920. "Cdir "+F$+".sec"
  921.      
  922. "Cdir "+F$+".mix"
  923. &      
  924. "OS_File",255,S$,MAIN
  925.      
  926. printDiskAccess(
  927. (?     A%=MAIN:B%=!MainData+!MainLine*!MainY:C%=SEC:
  928.  COPYMEM
  929.      
  930. dotransformation(1)
  931.      
  932.  MAIN,SEC
  933.        CH%=
  934. (F$+".mix.000")
  935. ,0       
  936. writestring(CH%,"Run "+CurrentFile$)
  937.        
  938. #CH%,0
  939.        
  940. /(       
  941. "SetType "+F$+".mix.000 FEB"
  942. 09       B$=F$+".mix."+
  943. ("0000"+
  944. (Step+1)),3):CH%=
  945. 1&       
  946. writestring(CH%,"Run "+S$)
  947.        
  948. #CH%,0
  949.        
  950. 4        
  951. "SetType "+B$+" FEB"
  952.        
  953.  NR=1
  954.  Step
  955. 6"         
  956. "Mixing nr:";NR
  957.          Mu=1-NR/(Step+1)
  958. 8)         C$=F$+"."+
  959. ("0000"+
  960. (NR)),3)
  961. 9$         
  962. "OS_File",255,C$,MAIN
  963. :4         
  964. initmain(MAIN):Da%=!MainData:N%=!MainN
  965. ;-         C$=F$+".sec."+
  966. ("0000"+
  967. (NR)),3)
  968. <#         
  969. "OS_File",255,C$,SEC
  970.          
  971. initmain(SEC)
  972. >:         A%=Da%:B%=!MainData:C%=1024*Mu:D%=1024*(1-Mu)
  973.          
  974. @0         
  975. initmain(MAIN):
  976. displayMainOrig(1)
  977. A-         C$=F$+".mix."+
  978. ("0000"+
  979. (NR)),3)
  980.          CH%=
  981. C,         
  982. "OS_GBPB",&02,CH%,MAIN,!MainL
  983.          
  984. E"         
  985. "SetType "+C$+" 690"
  986.        
  987.      
  988. H)T%=
  989. mc_release(SEC):
  990. error$:
  991. I-T%=
  992. mc_release(tridata):
  993. error$:
  994. Mcurrent=OldMask
  995. restoremem
  996. initmain(MAIN):
  997. "Ready.":
  998. printtime
  999. inittridata
  1000. "filling triangles"
  1001. AD%=tridata
  1002. TV    COL%=T:
  1003. setline(T(T,0),T(T,1)):
  1004. setline(T(T,1),T(T,2)):
  1005. setline(T(T,2),T(T,0))
  1006.     X%=0:Y%=0
  1007. V3    
  1008. 2:X%+=X(T(T,K),S%):Y%+=Y(T(T,K),S%):
  1009. W(    X%=X%/3:Y%=Y%/3:C%=0:AD%=tridata
  1010. fill(X%,Y%,1500,T)
  1011.  T%=1 
  1012.  !MainN-1:
  1013.  AD%?T%=0 
  1014.  AD%?T%=AD%?(T%-1)
  1015. relsec
  1016. mc_release(SEC)
  1017. error$:
  1018.  tridata<>
  1019. mc_release(tridata)
  1020. error$:
  1021. d Mcurrent=OldMask:
  1022. restoremem
  1023. savetrans(T$)
  1024.  U%,CH%
  1025. #CH%,N-5
  1026.  U%=5 
  1027. #CH%,X(U%,0),Y(U%,0),X(U%,1),Y(U%,1)
  1028. loadtrans(T$)
  1029.  U%,CH%
  1030. #CH%,N:N+=5
  1031.  U%=5 
  1032. #CH%,X(U%,0),Y(U%,0),X(U%,1),Y(U%,1)
  1033. dotransformation(dir)
  1034. initmain(MAIN)
  1035. {0LI%=!MainLine:X=!MainX:Y=!MainY:D%=!MainData
  1036. initmain(SEC):T%=1:To%=-1:L%=5:Da%=!MainData:ml%=!MainLine
  1037. !_DA=Da%:!_ML=ml%
  1038.  !Main24=
  1039.  !_bpp=3 
  1040.  !_bpp=1
  1041. "Hourglass_On"
  1042.  NR=1
  1043.  Step
  1044.  int 
  1045.  Mu=NR/(Step+1) 
  1046.  Mu=NR/Step
  1047.  dir 
  1048.  Mu=1-Mu
  1049. M1=1-Mu
  1050. !_Mu1=M1*MLacc:!_Xmax=X
  1051. "Transforming....";:
  1052.  Step>1 
  1053. "(Picture nr:";NR;")"
  1054.  !MainN>7E4*index 
  1055. dmaoff
  1056. 2X%=0:
  1057.  triangle=1 
  1058.  TRI:!_tri=triangle:
  1059. newtri
  1060. T=triangle
  1061. <TYmin=
  1062. min(Y(T(T,0),S%),
  1063. min(Y(T(T,1),S%),Y(T(T,2),S%)))
  1064. <TYmax=
  1065. max(Y(T(T,0),S%),
  1066. max(Y(T(T,1),S%),Y(T(T,2),S%)))
  1067. ;!_AD=D%+LI%*TYmin:!_LI=LI%:!_Msk=MASK(Mcurrent)+TYmin*X
  1068.  Y%= TYmin 
  1069.  TYmax
  1070.    !_v2=(YY0+M1*Y%+.5) *MXacc
  1071. M  VY0=Y%-Y0:!Aacc=4096*(VX0*VY2-VY0*VX2)*J:!Bacc=4096*(VY0*VX1-VX0*VY1)*J
  1072.  morph:
  1073. dmaon
  1074. initmain(MAIN):
  1075. displayMainOrig(1):
  1076. initmain(SEC)
  1077.  C$=F$+"."+
  1078. ("0000"+
  1079. (NR)),3)
  1080.  dir=1 
  1081.  C$=F$+".sec."+
  1082. ("0000"+
  1083. (NR)),3)
  1084.  F$<>"" 
  1085.    CH%=
  1086. "OS_GBPB",&02,CH%,MAIN,LI%*Y+D%-MAIN
  1087. "SetType "+C$+" 690"
  1088. "Hourglass_Off"
  1089. gettrianglenr(X%,Y%,T%)
  1090. intri(T%) 
  1091.  TRI:
  1092.  T%<>I% 
  1093. intri(I%) 
  1094. intri(T%)
  1095. 'A0%=
  1096. orient2(X%,Y%,T(T%,0),T(T%,1))
  1097. 'A1%=
  1098. orient2(X%,Y%,T(T%,1),T(T%,2))
  1099.  A0%<>A1% 
  1100. 'A2%=
  1101. orient2(X%,Y%,T(T%,2),T(T%,0))
  1102.  A0%<>A2% 
  1103. optimize(T0,T1)
  1104. (T0)=
  1105. (T1) 
  1106. TEL+=1
  1107. A0=-1:A1=-1:B0=-1:B1=-1
  1108.  T(T0,I)=T(T1,J) 
  1109.  A0>-1 
  1110.  B0=-1 
  1111.  B0=I:A1=J
  1112.  T(T0,I)=T(T1,J) 
  1113.  A0=-1 
  1114.  B0=-1 
  1115.  A0=I:B1=J
  1116.  A0=-1 
  1117.  B0=-1 
  1118. C0=-1:C1=-1
  1119.  A0<>T 
  1120.  B0<>T 
  1121.  C0=T
  1122.  A1<>T 
  1123.  B1<>T 
  1124.  C1=T
  1125.  C0=-1 
  1126.  C1=-1 
  1127. "ERROR":
  1128. orient(T(T0,C0),T(T0,A0),T(T1,C1))<> 
  1129. orient(T(T1,C1),T(T1,A1),T(T0,C0)) 
  1130. min( 
  1131. angle(T(T0,C0),T(T1,C1),T(T1,A1)) , 
  1132. angle(T(T0,C0),T(T0,A0),T(T1,C1)) )
  1133. min( 
  1134. angle(T(T0,A0),T(T0,B0),T(T0,C0)) , 
  1135. angle(T(T1,A1),T(T1,B1),T(T1,C1)) )
  1136.  R1<R2 
  1137. 'T(T0,A0)=T(T1,C1):T(T1,A1)=T(T0,C0)
  1138. newtri
  1139. T%=triangle
  1140. 'T0%=T(T%,0):T1%=T(T%,1):T2%=T(T%,2)
  1141. X0=X(T0%,S%):Y0=Y(T0%,S%)
  1142. %VX1=X(T1%,S%)-X0:VY1=Y(T1%,S%)-Y0
  1143. %VX2=X(T2%,S%)-X0:VY2=Y(T2%,S%)-Y0
  1144. $J=VX1*VY2-VX2*VY1:
  1145.  J<>0 
  1146.  J=1/J
  1147. J=J*MLacc
  1148. <XX0=X(T0%,1-S%)*Mu:XX1=X(T1%,1-S%)*Mu:XX2=X(T2%,1-S%)*Mu
  1149. <YY0=Y(T0%,1-S%)*Mu:YY1=Y(T1%,1-S%)*Mu:YY2=Y(T2%,1-S%)*Mu
  1150. #U0=XX1-XX0:U1=XX2-XX0:U2=XX0+.5
  1151. V0=YY1-YY0:V1=YY2-YY0
  1152. 0!_u0=U0 *MXacc:!_u1=U1 *MXacc:!_u2=U2 *MXacc
  1153. !!_v0=V0 *MXacc:!_v1=V1 *MXacc
  1154. ,VX0=X%-X0:!Da=4096*VY2*J:!Db=-4096*VY1*J
  1155. min(A,B)
  1156.  A<B 
  1157. max(A,B)
  1158.  A>B 
  1159. angle(P0,P1,P2)
  1160.  A,B,C,A1,A2,A3
  1161. dist(P0,P1):B=
  1162. dist(P1,P2):C=
  1163. dist(P2,P0)
  1164.  A<1 
  1165.  A=1:
  1166. "Warning: arcsine out of range"
  1167.  B<1 
  1168.  B=1:
  1169. "Warning: arcsine out of range"
  1170.  C<1 
  1171.  C=1:
  1172. "Warning: arcsine out of range"
  1173. )T=(A*A-B*B-C*C)/(2*B*C):
  1174.  T<-1 
  1175.  T=-1
  1176.  T>1 
  1177. )T=(B*B-C*C-A*A)/(2*C*A):
  1178.  T<-1 
  1179.  T=-1
  1180.  T>1 
  1181. )T=(C*C-A*A-B*B)/(2*A*B):
  1182.  T<-1 
  1183.  T=-1
  1184.  T>1 
  1185. min(A1,
  1186. min(A2,A3))
  1187. dist(P0,P1)
  1188. ((X(P0,S%)-X(P1,S%))^2+(Y(P0,S%)-Y(P1,S%))^2)
  1189. handlezoom
  1190. A$=B$:dontdismask=
  1191. Stemp=MAIN:MAIN=SEC:
  1192. initmain(SEC):
  1193. displayMainOrig(0):MAIN=temp:
  1194. initmain(MAIN)
  1195.  T%=5 
  1196.  N-1:
  1197. draw(T%):
  1198. flipy
  1199.  !Main24=
  1200.  !MainX/2
  1201. E        A%=!MainData+3*X%+0:B%=!MainData+!MainLine-3-3*X%:
  1202.  flipy
  1203. E        A%=!MainData+3*X%+1:B%=!MainData+!MainLine-2-3*X%:
  1204.  flipy
  1205. E        A%=!MainData+3*X%+2:B%=!MainData+!MainLine-1-3*X%:
  1206.  flipy
  1207.         
  1208.         
  1209. M    
  1210.  !MainX/2:A%=!MainData+X%:B%=!MainData+!MainLine-1-X%:
  1211.  flipy:
  1212.         
  1213. flipx
  1214. mc_assign(!MainLine+4)
  1215.  !MainY/2:AD%=!MainData+Y*!MainLine:AD1%=!MainData+(!MainY-Y-1)*!MainLine
  1216.  BU%=
  1217. 0    
  1218. X%=0 
  1219.  !MainLine-1 :
  1220.  AD%?X%,AD1%?X%:
  1221.         
  1222. 2    A%=AD%:B%=AD%+!MainLine-1:C%=BU%:
  1223.  COPYMEM
  1224. 4    A%=AD1%:B%=AD1%+!MainLine-1:C%=AD%:
  1225.  COPYMEM
  1226. 3    A%=BU%:B%=BU%+!MainLine-1:C%=AD1%:
  1227.  COPYMEM
  1228.         
  1229.  BU%<>
  1230.  BU%=
  1231. mc_release(BU%):
  1232.  BU%=
  1233. error$:
  1234. showline(P0,P1)
  1235.  X0,Y0,X1,Y1
  1236. inversegetbxy(X(P0,1-S%),Y(P0,1-S%),X0,Y0)
  1237. inversegetbxy(X(P1,1-S%),Y(P1,1-S%),X1,Y1)
  1238. window(1)
  1239.  X0,Y0+YS/2,X1,Y1+YS/2
  1240. inversegetbxy(X(P0,S%),Y(P0,S%),X0,Y0)
  1241. inversegetbxy(X(P1,S%),Y(P1,S%),X1,Y1)
  1242. window(0)
  1243.  X0,Y0,X1,Y1
  1244. setline(P0,P1)
  1245. line(X(P0,S%),Y(P0,S%),X(P1,S%),Y(P1,S%))
  1246. dist(P0,P1)
  1247. ((X(P0,S%)-X(P1,S%))^2+(Y(P0,S%)-Y(P1,S%))^2)
  1248. orient(T0,T1,T2)
  1249. *UO=(X(T1,S%)-X(T0,S%))*(Y(T2,S%)-Y(T0,S%))-(X(T2,S%)-X(T0,S%))*(Y(T1,S%)-Y(T0,S%))
  1250. orient2(X%,Y%,T1,T2)
  1251. /=O=(X(T1,S%)-X%)*(Y(T2,S%)-Y%)-(X(T2,S%)-X%)*(Y(T1,S%)-Y%)
  1252. 0    =O>=0
  1253. draw(Q%)
  1254.  X0,Y0,X1,Y1
  1255. inversegetbxy(X(Q%,0),Y(Q%,0),X0,Y0)
  1256. inversegetbxy(X(Q%,1),Y(Q%,1),X1,Y1)
  1257. window(0)
  1258.  X1,Y1,10
  1259.  X0,Y0,X1,Y1
  1260. window(1)
  1261.  X0,Y0+YS/2,10
  1262.  X0,Y0+YS/2,X1,Y1+YS/2
  1263. window(NR)
  1264.  24,SFX;SFY+YS/2*NR;PX-SFX;PY+YS/2*NR-SFY;
  1265. checkpal
  1266.  A%,B%,F%,T%
  1267. 4:Colors!T%=0:
  1268. F.A%=MASK(Mcurrent):B%=Colors:
  1269.  CheckPalette
  1270. G7double=0:Gaps=0:
  1271.  Colors?T%=3 
  1272.  double+=1
  1273.  Colors?T%=0 
  1274.  Gaps+=1
  1275. =double>0
  1276. sceleton(TI%)
  1277. 255:Colors?T%=0:
  1278. Colors?255=1:Colors?0=1
  1279. P7T1=(T% 
  1280. 1)=1:T2=(T% 
  1281. 2)=2:T3=(T% 
  1282. 4)=4:T4=(T% 
  1283. QAT5=(T% 
  1284. 16)=16:T6=(T% 
  1285. 32)=32:T7=(T% 
  1286. 64)=64:T8=(T% 
  1287. 128)=128
  1288.  Colors?T%=1
  1289.  Colors?T%=1
  1290.  Colors?T%=1
  1291.  Colors?T%=1
  1292.  Colors?T%=1
  1293.  Colors?T%=1
  1294.  Colors?T%=1
  1295.  Colors?T%=1
  1296.  Colors?T%=1
  1297.  Colors?T%=1
  1298.  Colors?T%=1
  1299.  Colors?T%=1
  1300.  Colors?T%=1
  1301.  Colors?T%=1
  1302.  Colors?T%=1
  1303.  Colors?T%=1
  1304.  (T1+T2+T3+T4+T5+T6+T7+T8)=-1 
  1305.  Colors?T%=1
  1306.  (T1+T2+T3+T4+T5+T6+T7+T8)<-4 
  1307.  Colors?T%=0
  1308. :Colors?255=1:Colors?0=1
  1309. DX%=!MainX
  1310. !MainY-2:AD%=MASK(Mcurrent)+!MainX*Y%
  1311. !MainX-2:A%=AD%+X%:
  1312.  ?A%=1 
  1313. hS    C%=(A%?1>0)+2*(A%?(1-DX%)>0)+4*(A%?(-DX%)>0)+8*(A%?(-1-DX%)>0)+16*(A%?-1>0)
  1314. i?    C%+=32*(A%?(-1+DX%)>0)+64*(A%?DX%>0)+128*(A%?(1+DX%)>0)
  1315.     ?A%=3-Colors?-C%
  1316. k        
  1317. A%=MASK(Mcurrent):
  1318.  Filter
  1319. changecolor
  1320.  !Main24=
  1321. s[    T%=
  1322. checkpal:
  1323. "OPERATION FAILED:Not able to change palette.":fail=
  1324. t        
  1325. "Use Current selected point or new point (C/N/A)"
  1326.  B$<>"N" 
  1327.  B$<>"C" 
  1328.  B$<>"c" 
  1329.  B$<>"n" 
  1330. "Operation aborted":
  1331.  B$="N" 
  1332.  B$="n" 
  1333. y,    
  1334. "Please enter red value:";:
  1335. z.    
  1336. "Please enter green value:";:
  1337. {-    
  1338. "Please enter blue value:";:
  1339. |        
  1340. })    A%=Xcurrent:B%=Ycurrent:
  1341.  ReadRGB
  1342.     R=RGB?0:G=RGB?1:B=RGB?2
  1343.         
  1344. backup
  1345.  R+G+B=0 
  1346.  R=1:G=1:B=1
  1347. #GR=(R+G+B):R=R/GR:G=G/GR:B=B/GR
  1348. "Busy..."
  1349.  !MainN>5E4*index 
  1350.  !Main24=
  1351. dmaoff
  1352.  !Main24=
  1353. 8    
  1354.  !MainEntry-1:
  1355.  Colors?T%<>1 
  1356.  Colors?T%=0
  1357.         
  1358. A    A=!MainData:N=!MainN:!MainData=!MainPal:!MainN=!MainEntry
  1359.     AD%=Colors
  1360.         
  1361.     AD%=MASK(Mcurrent)
  1362.         
  1363.  !MainN-1
  1364.  AD%?T%=1 
  1365. >    A%=!MainData+T%*3:R0=A%?0:G0=A%?1:B0=A%?2:GR0=R0+G0+B0
  1366. "    R0=R*GR0:G0=G*GR0:B0=B*GR0
  1367.  R0>255 
  1368.  R0=255
  1369.  G0>255 
  1370.  G0=255
  1371.  B0>255 
  1372.  B0=255
  1373.     A%?0=R0:A%?1=G0:A%?2=B0
  1374.         
  1375.  !Main24=
  1376.  !MainData=A:!MainN=N
  1377. dmaon
  1378. "Ready"
  1379. displayMainOrig(1):
  1380. update(Mcurrent)
  1381. changegrey
  1382. testpalette:
  1383.  fail :
  1384. "By which factor has the grey-value to be multiplied";
  1385.  F<0 
  1386. "What is a negative grey-value suppossed to mean?":
  1387. backup
  1388.  F>255 
  1389. "That much? Ok. but it will all turn white" 
  1390. "Busy..."
  1391.  !Main24=
  1392. 4:Table!T%=Colors!T%:
  1393.  255:G0=F*T%:
  1394.  G0>255 
  1395.  G0=255
  1396. :    maps?(4+T%)=G0:maps?(260+T%)=G0:maps?(516+T%)=G0:
  1397. generalcorrectcolor
  1398. "Ready"
  1399. displayMainOrig(1):
  1400. update(Mcurrent)
  1401. correctcol
  1402. testpalette:
  1403.  fail :
  1404. "By which factor has the red-value to be multiplied";
  1405.  R<0 
  1406. "What is a negative red-value suppossed to mean?":
  1407. "By which factor has the green-value to be multiplied";
  1408.  G<0 
  1409. "What is a negative green-value suppossed to mean?":
  1410. "By which factor has the blue-value to be multiplied";
  1411.  B<0 
  1412. "What is a negative blue-value suppossed to mean?":
  1413. backup
  1414. "Busy..."
  1415.  !Main24=
  1416. 4:Table!T%=Colors!T%:
  1417.  E%=0
  1418. 255:R%=R*E%:G%=G*E%:B%=B*E%
  1419.  R%<0 
  1420.  R%=0
  1421.  G%<0 
  1422.  G%=0
  1423.  B%<0 
  1424.  B%=0
  1425.  R%>255 
  1426.  R%=255
  1427.  G%>255 
  1428.  G%=255
  1429.  B%>255 
  1430.  B%=255
  1431. 6  maps?(4+E%)=R%:maps?(260+E%)=G%:maps?(516+E%)=B%
  1432. generalcorrectcolor
  1433.  fail :
  1434. "Ready"
  1435. displayMainOrig(1):
  1436. update(Mcurrent)
  1437. testpalette
  1438. fail=
  1439.  !Main24=
  1440. [    T%=
  1441. checkpal:
  1442. "OPERATION FAILED:Not able to change palette.":fail=
  1443.         
  1444. generalcorrectcolor
  1445. fail=
  1446.  !Main24=
  1447. [    T%=
  1448. checkpal:
  1449. "OPERATION FAILED:Not able to change palette.":fail=
  1450.         
  1451.  !Main24=
  1452. 4:Table!T%=Colors!T%:
  1453.  !Main24 
  1454. F    A%=maps+4:C%=MASK(Mcurrent):
  1455.  TransFormColor:A%+=256:
  1456. 6    
  1457.  !MainEntry-1:
  1458.  Table?T%<>1 
  1459.  Table?T%=0
  1460.         
  1461. A    A=!MainData:N=!MainN:!MainData=!MainPal:!MainN=!MainEntry
  1462. =    A%=maps+4:C%=Table:
  1463.  TransFormColor:A%+=256:
  1464.     !MainData=A:!MainN=N
  1465.         
  1466. gamma
  1467. testpalette:
  1468.  fail :
  1469. "gamma factor";
  1470.  G<=.001 
  1471.  G>100 
  1472. "Illegal gamma. Aborted.":
  1473. backup
  1474.  !Main24=
  1475. 4:Table!T%=Colors!T%:
  1476.  255:G0=255*(T%/255)^(1/G)
  1477. :    maps?(4+T%)=G0:maps?(260+T%)=G0:maps?(516+T%)=G0:
  1478. "maps?4=0:maps?260=0:maps?516=0
  1479. generalcorrectcolor
  1480.  fail 
  1481. "Ready"
  1482. -    
  1483. displayMainOrig(1):
  1484. update(Mcurrent)
  1485. loadmap
  1486. testpalette:
  1487.  fail :
  1488.     B$=M$
  1489. "Load map:Filename ('','last','other')";M$
  1490.  M$="last" 
  1491.  M$="LAST" 
  1492.  M$="Last" 
  1493.  M$=B$
  1494.  M$="" 
  1495.  M$="<Mask$Dir>.Maps.MyMap":
  1496. "Default map:'"M$"' taken."
  1497. M$,1)=":" 
  1498.  M$="<Mask$Dir>.Maps."+
  1499. M$,2)
  1500. "OS_File",5,M$ 
  1501.  U%,,F%,,L%:F%=(F% >>8)
  1502.  U%<>1 
  1503. "This file does not exist":
  1504.  L%<>832 
  1505. "This file is not a color-map. Its length is not 832 bytes.":
  1506.  F%<>&FFD 
  1507. "Warning:incorrect file-type"
  1508. "OS_File",255,M$,maps
  1509.  !maps<>&BD2A275D 
  1510. "Warning:incorrect indentifier"
  1511. backup
  1512. name(maps+4,60)
  1513. .A%=maps+64:B%=maps+832:C%=maps+4:
  1514.  COPYMEM
  1515. generalcorrectcolor
  1516.  fail 
  1517. -    
  1518. displayMainOrig(1):
  1519. update(Mcurrent)
  1520. 24bit
  1521.  !Main24=
  1522. "Picture is already in 24 bit format":
  1523. "T%=MAIN:
  1524.  ?T%<>0 T%+=1:
  1525. :M=T%
  1526.  (M-MAIN+4*!MainX*!MainY+4+7*mc_page) >mc_amount 
  1527. "Not enough memory for operation":
  1528.  T%=1 
  1529.  T%<=MaxMask% 
  1530. *        A%=MASK(T%):
  1531.  CompressBitfield
  1532.         
  1533. printDiskAccess(
  1534. 3        CH%=
  1535. ("<Wimp$ScrapDir>.MaskSwap"+
  1536. (T%))
  1537. 1        
  1538. "OS_GBPB",&02,CH%,A%,MaskAmount/8+1
  1539.         
  1540.         
  1541. printDiskAccess(
  1542.         
  1543. 8    R%=
  1544. mc_release(MASK(T%)):
  1545. error$:
  1546. OldMask%=MaxMask%
  1547. mc_assign(M-MAIN+3*!MainX*!MainY+4):
  1548. B    O=MAIN:MAIN=
  1549. mc_reallocate(MAIN):
  1550.  MAIN=
  1551. error$:
  1552. #    
  1553.  O<>MAIN 
  1554. initmain(MAIN)
  1555. /    N%=
  1556. mc_assign(M-MAIN+3*!MainX*!MainY+4)
  1557.         
  1558. error$:
  1559. "Converting....":
  1560.  (M-MAIN) 
  1561. 4:N%!T%=MAIN!T%:
  1562. 8O=N%+M-MAIN:O!1=M!1:O!5=M!5:O!9=M!9:O!13=24:AD%=O+17
  1563. A%=0:B%=AD%:
  1564.  ConvertTo24
  1565. !Main24=
  1566. !MainData=O+17
  1567. !MainLine=3*!MainX
  1568. mc_release(MAIN)=
  1569.  error$:
  1570. #2MAIN=N%:!MainL=!MainData-MAIN+!MainLine*!MainY
  1571. "reallocating..."
  1572. %8MAIN=
  1573. mc_reallocate(MAIN):
  1574.  MAIN=
  1575.  error$:
  1576. !MainData=MAIN+O+17-N%
  1577.  T%=1
  1578. 8:MASK(T%)=
  1579. mc_assign(1):
  1580.  MASK(T%)=
  1581. error$:
  1582. assignmasks
  1583.  T%=1 
  1584. min(MaxMask%,OldMask%)
  1585. printDiskAccess(
  1586. "OS_File",255,"<Wimp$ScrapDir>.MaskSwap"+
  1587. (T%),MASK(T%)
  1588. printDiskAccess(
  1589. .&  A%=MASK(T%):
  1590.  DeCompressBitfield
  1591. displayMask(M%,M%-M0+1):
  1592. version
  1593. T$="                                            Version:"+Version$+"   "+"Author:Michel Grimminck    Email:grimmink@phys.uva.nl     Smail:Westerstraat 155
  1594.  Amsterdam      "
  1595. 78T$=T$+"Current image contains "+
  1596. (!MainN)+" pixels "
  1597.  !Main24=
  1598.  T$=T$+"of 3 bytes per pixel" 
  1599.  T$=T$+"of one byte/pixel"
  1600. T$=T$+" "
  1601. (T$):
  1602. T$,T%,57):
  1603. contrast
  1604.  !Main24=
  1605. "Not implemented for <=8 bpp files":
  1606. getboundaries
  1607.  X0=0 
  1608.  Y0=0 
  1609.  X1=!MainX-1 
  1610.  Y1=!MainY 
  1611. "Erase/contrast cannot handle edges":
  1612. A*data=
  1613. mc_assign(3*(X1-X0+1)*(Y1-Y0+1))
  1614.  data=
  1615. "not enough memory for operation":
  1616. "Contrast factor";CF
  1617.  Y%=Y0 
  1618.  Y1:AD%=data+3*(X1-X0+1)*(Y%-Y0):ADL%=!MainData+Y%*!MainLine
  1619.  X%=3*X0 
  1620.  3*X1+2:AD%?(X%-X0)=ADL%?X%
  1621. erase
  1622.  fail=
  1623. mc_release(data):
  1624. error$:
  1625.  fail=
  1626.  Y%=Y0 
  1627.  Y1:AD%=data+3*(X1-X0+1)*(Y%-Y0):ADL%=!MainData+Y%*!MainLine
  1628.  X%=3*X0 
  1629.  3*X1+2:N=(1-CF)*ADL%?X%+CF*AD%?(X%-X0)
  1630.  N<0 
  1631.  N>255 
  1632.  N=255
  1633. ADL%?X%=N
  1634. "Ready."
  1635. S0T%=
  1636. mc_release(data):
  1637. error$:
  1638. erase
  1639.  X0,Y0,X1,Y1
  1640. fail=
  1641.  !Main24=
  1642. "Not implemented for <=8 bpp files":
  1643. getboundaries
  1644.  X0=0 
  1645.  Y0=0 
  1646.  X1=!MainX-1 
  1647.  Y1=!MainY 
  1648. "Erase cannot handle edges":
  1649. \9T%=
  1650. ensuremem((X1-X0+3)*(Y1-Y0+3)*4,
  1651. ,Mcurrent,0,0,0)
  1652. "Erase:not enough memory for operation":
  1653. restoremem:
  1654. ^UGS%=
  1655. mc_assign((X1-X0+3)*(Y1-Y0+3)*4):
  1656.  GS%=
  1657. error$:fail=
  1658. restoremem:
  1659. IM%=(X1-X0+1)*(Y1-Y0+1)*.07
  1660.  IM%<40 
  1661.  IM%=40
  1662.  IM%>1500 
  1663. cK     
  1664. "This is going to take a very long time. Are you sure?(Y/N)"
  1665.      B$=
  1666.      
  1667.  B$<>"Y" 
  1668.  B$<>"y" 
  1669. f9          T%=
  1670. mc_release(GS%):
  1671. error$:
  1672. g8          
  1673. "Erase aborted":fail=
  1674. restoremem:
  1675.           
  1676.      
  1677. backup
  1678. "Copying color";C%;" data"
  1679. DY%=(X1-X0+3)*4
  1680. (Y1-Y0+2):B%=Y%+Y0-1:AD%=GS%+DY%*Y%:M%=MASK(Mcurrent)+!MainX*B%+X0-1
  1681. (X1-X0+2):A%=X%+X0-1:
  1682.  M%?X%=0 
  1683.  ReadRGB:AD%!(X%*4)=256*RGB?C% 
  1684.  AD%!(X%*4)=0
  1685. "Doing ";IM%;" Gauss-Seidel iterations in color ";C%
  1686.  IM%>150*(index^.333) 
  1687. dmaoff
  1688. F%=DY%
  1689. (Y1-Y0)+1:A%=GS%+DY%*Y%:B%=MASK(Mcurrent)+!MainX*(Y%+Y0-1)+X0-1
  1690. D%=(X1-X0)+1:
  1691.  GaussSeidel
  1692. {    I%+=1
  1693. dmaon
  1694. "Copying color";C%;" back to picture"
  1695. (Y1-Y0+2):B%=Y%+Y0-1:AD%=GS%+DY%*Y%:M%=MASK(Mcurrent)+!MainX*B%+X0-1:S%=!MainData+!MainLine*B%+(X0-1)*3
  1696. (X1-X0+2):A%=X%-X0-1:
  1697.  M%?X%=1 
  1698.  S%?(X%*3+C%)=AD%!(X%*4)/256
  1699. "Ready"
  1700. mc_release(GS%):
  1701. error$:
  1702. restoremem
  1703. displayMainOrig(1)
  1704. update(Mcurrent)
  1705. speedtest
  1706. "Doing speedtests"
  1707. A%=MASK(Mcurrent)
  1708.  T%=0
  1709.  CompressBitfield:
  1710.  DeCompressBitfield:
  1711. "Time to compress+decompress:";
  1712. /100/T%*1000;" ms"
  1713. displayMask(Mcurrent,Mcurrent-M0+1):
  1714. "Black mask:";(
  1715. -TI%)/100/(T%-1)
  1716. displayMain(Mcurrent):
  1717. "Black main:";(
  1718. -TI%)/100/(T%-1)
  1719. &P%=BinaryInstr:[OPT 0:
  1720.  R3,R5,R7:]
  1721. BA%=MASK(Mcurrent):B%=MASK(Mcurrent):C%=MASK(Mcurrent):
  1722.  Binary
  1723. displayMask(Mcurrent,Mcurrent-M0+1):
  1724. "White mask:";(
  1725. -TI%)/100/(T%-1)
  1726. displayMain(Mcurrent):
  1727. "White main:";(
  1728. -TI%)/100/(T%-1)
  1729. inverse(option$)
  1730. fail=
  1731.  option$="all" 
  1732.   AD%=!MainData
  1733.  !Main24=
  1734. ?       
  1735. 255:Colors?T%=255-T%:
  1736. :A%=Colors:C%=0:
  1737.  B%=0
  1738.        
  1739.  TransFormColor:
  1740.        
  1741. 3       
  1742. T%=!MainPal 
  1743.  !MainData-1:?T%=255-?T%:
  1744.        
  1745.  option$="mask" 
  1746. 255:maps?(4+T%)=255-T%:maps?(260+T%)=255-T%:maps?(516+T%)=255-T%:
  1747. generalcorrectcolor
  1748.  fail :
  1749. displayMainOrig(1)
  1750. update(Mcurrent)
  1751. noise(D%)
  1752. DX%=!MainX
  1753.  !MainY-2:A%=MASK(Mcurrent)+DX%*Y%:
  1754.  Neighbours2:
  1755. A%=MASK(Mcurrent):
  1756.  Filter
  1757. update(Mcurrent)
  1758. dilation
  1759. DX%=!MainX:D%=dilation
  1760.  !MainY-2:A%=MASK(Mcurrent)+!MainX*Y%:
  1761.  Neighbours:
  1762. A%=MASK(Mcurrent):
  1763.  Filter2
  1764.  Filter
  1765. update(Mcurrent)
  1766. clearnoise
  1767. printbutton("noise:1",
  1768. printbutton("noise:2",
  1769. printbutton("noise:3",
  1770. printbutton("noise:4",
  1771. printbutton("noise:5",
  1772. printbutton("noise:6",
  1773. printbutton("noise:8",
  1774. cleardilation
  1775. printbutton("dilation:1",
  1776. printbutton("dilation:3",
  1777. printbutton("dilation:5",
  1778. printbutton("dilation:6",
  1779. printbutton("dilation:8",
  1780. cleartypes
  1781. printbutton("grey",
  1782. printbutton("rgb",
  1783. printbutton("color",
  1784. printbutton("edge:grey",
  1785. printbutton("hue",
  1786. clearsave
  1787. printbutton("save:pic",
  1788. printbutton("save:smpic",
  1789. printbutton("save:mask",
  1790. update(M%)
  1791. displayMask(M%,M%-M0+1):
  1792. displayMain(M%):
  1793. printtime
  1794. printtime
  1795. 40,0);"       ";:
  1796. 40,0)
  1797. changeM0
  1798.  M0<1 
  1799.  M0=1
  1800.  (M0+2)>MaxMask% 
  1801.  M0=MaxMask%-2
  1802. clearD:
  1803. printD
  1804. YY%=0
  1805. displayMask(YY%+M0,YY%+1):
  1806. showMaskRect
  1807. X,Y,B:
  1808. -T%)>12
  1809. large
  1810. ensuremem(MaskAmount,
  1811. ,Mcurrent,0,0,0)
  1812. "Large: not enough memory for operation":
  1813. restoremem:
  1814. QM1%=0:MASK(0)=
  1815. mc_assign(MaskAmount):
  1816.  MASK(0)=
  1817. error$:
  1818. restoremem:
  1819. "Please enter a minimal thickness (pixels)";
  1820.  S%:S%=
  1821. (S%/2)
  1822.  S%>200 
  1823. "Don't you think that is rather big?":
  1824. restoremem:
  1825. %P%=BinaryInstr:[OPT 0:MOV R3,R5:]
  1826. ;A%=MASK(0):B%=MASK(Mcurrent):C%=MASK(Mcurrent):
  1827.  Binary
  1828. K=Mcurrent:Mcurrent=M1%
  1829.  R%=1
  1830. noise(8):
  1831. Mcurrent=K:
  1832. seedintern
  1833. mc_release(MASK(0)):
  1834. error$:
  1835. restoremem
  1836. update(Mcurrent)
  1837. "And: Please select first mask":M1%=
  1838. input
  1839. "And: Please select second mask":M2%=
  1840. input
  1841. "Doing operation:z=x and y"
  1842. &P%=BinaryInstr:[OPT 0:
  1843.  R3,R5,R6:]
  1844. 8A%=MASK(Mcurrent):B%=MASK(M1%):C%=MASK(M2%):
  1845.  Binary
  1846. update(Mcurrent)
  1847. andnot
  1848. "And Not: Please select first mask":M1%=
  1849. input
  1850. "And Not: Please select second mask":M2%=
  1851. input
  1852. "Doing operation:z=x andnot y"
  1853. &P%=BinaryInstr:[OPT 0:
  1854.  R3,R5,R7:]
  1855. 3A%=MASK(M2%):B%=MASK(M2%):C%=MASK(M2%):
  1856.  Binary
  1857. &P%=BinaryInstr:[OPT 0:
  1858.  R3,R5,R6:]
  1859. 8A%=MASK(Mcurrent):B%=MASK(M1%):C%=MASK(M2%):
  1860.  Binary
  1861. &P%=BinaryInstr:[OPT 0:
  1862.  R3,R5,R7:]
  1863. 3A%=MASK(M2%):B%=MASK(M2%):C%=MASK(M2%):
  1864.  Binary
  1865. update(Mcurrent)
  1866. "Or: Please select first mask":M1%=
  1867. input
  1868. "Or: Please select second mask":M2%=
  1869. input
  1870. "Doing operation:z=x or y"
  1871. %'P%=BinaryInstr:[OPT 0:
  1872. R R3,R5,R6:]
  1873. &8A%=MASK(Mcurrent):B%=MASK(M1%):C%=MASK(M2%):
  1874.  Binary
  1875. update(Mcurrent)
  1876. "Exclusive or: Please select first mask":M1%=
  1877. input
  1878. "Exclusive or: Please select second mask":M2%=
  1879. input
  1880. "Doing operation:z=x eor y"
  1881. .&P%=BinaryInstr:[OPT 0:
  1882.  R3,R5,R6:]
  1883. /8A%=MASK(Mcurrent):B%=MASK(M1%):C%=MASK(M2%):
  1884.  Binary
  1885. update(Mcurrent)
  1886. "Not:Please select a mask":M1%=
  1887. input
  1888. "Doing operation:z=not x"
  1889. 6&P%=BinaryInstr:[OPT 0:
  1890.  R3,R5,R7:]
  1891. 78A%=MASK(Mcurrent):B%=MASK(M1%):C%=MASK(M1%):
  1892.  Binary
  1893. update(Mcurrent)
  1894. "Copy: Please select a mask":M1%=
  1895. input
  1896. "Doing operation:z=x"
  1897. >%P%=BinaryInstr:[OPT 0:MOV R3,R5:]
  1898. ?8A%=MASK(Mcurrent):B%=MASK(M1%):C%=MASK(M1%):
  1899.  Binary
  1900. update(Mcurrent)
  1901. update(Mcurrent)
  1902.  A%,B%,C%
  1903. I%P%=BinaryInstr:[OPT 0:MOV R3,#0:]
  1904. JBA%=MASK(Mcurrent):B%=MASK(Mcurrent):C%=MASK(Mcurrent):
  1905.  Binary
  1906. N%P%=BinaryInstr:[OPT 0:MOV R3,R7:]
  1907. OBA%=MASK(Mcurrent):B%=MASK(Mcurrent):C%=MASK(Mcurrent):
  1908.  Binary
  1909. update(Mcurrent)
  1910. input
  1911. X,Y,B:
  1912. X,Y,B:
  1913.  B>1 
  1914.  X>=PX 
  1915.  X<=PX+48 
  1916.  Y<Yd0 
  1917.  M0+=1:
  1918. changeM0:B=0
  1919.  B>1 
  1920.  X>=PX 
  1921.  X<=PX+48 
  1922.  Y>Yd1 
  1923.  M0-=1:
  1924. changeM0:B=0
  1925.  B=1 
  1926.  X>=PX 
  1927.  X<=PX+48 
  1928.  Y<Yd0 
  1929.  M0-=1:
  1930. changeM0:B=0
  1931.  B=1 
  1932.  X>=PX 
  1933.  X<=PX+48 
  1934.  Y>Yd1 
  1935.  M0+=1:
  1936. changeM0:B=0
  1937. (Y/YS*3)+(M0-1)
  1938. selectmask
  1939. c+M%=3-
  1940. (Y/YS*3)+(M0-1):
  1941.  M%>MaxMask% 
  1942. Mcurrent=M%
  1943. showMaskRect
  1944. displayMain(Mcurrent)
  1945. makeMask(TYPE%,NR%)
  1946. =0:A%=Xcurrent:B%=Ycurrent:
  1947.  ReadRGB
  1948. "Hourglass_Start",100
  1949.  TYPE% 
  1950. n9    A%=MASK(NR%):B%=RGB?0+RGB?1+RGB?2:C%=768*Dcurrent
  1951.  !Main24 
  1952.  Calc(0)
  1953. q        
  1954. r_    A%=Colors:A=!MainData:!MainData=!MainPal:N=!MainN:!MainN=!MainEntry:!Main24=
  1955.  Calc(0)
  1956. sB    !Main24=
  1957. :!MainN=N:!MainData=A:B%=MASK(Mcurrent):
  1958.  SetMask
  1959. t        
  1960. v/    A%=MASK(NR%):B%=RGB?0:C%=RGB?1:D%=RGB?2
  1961.     E%=Dcurrent^2*3*255*255
  1962.  !Main24=
  1963.  Calc(1)
  1964. z        
  1965. {_    A%=Colors:A=!MainData:!MainData=!MainPal:N=!MainN:!MainN=!MainEntry:!Main24=
  1966.  Calc(1)
  1967. |B    !Main24=
  1968. :!MainN=N:!MainData=A:B%=MASK(Mcurrent):
  1969.  SetMask
  1970. }        
  1971.     Z=Dcurrent^2 /3
  1972. -    TR=RGB?0:TG=RGB?1:TB=RGB?2:T=TR+TG+TB
  1973.     A%=T:B%=Z*65536
  1974.  !Main24=
  1975.     C%=MASK(NR%):
  1976.  Calc(2)
  1977.         
  1978. _    C%=Colors:A=!MainData:!MainData=!MainPal:N=!MainN:!MainN=!MainEntry:!Main24=
  1979.  Calc(2)
  1980. H    !Main24=
  1981. :!MainN=N:!MainData=A:A%=C%:B%=MASK(Mcurrent):
  1982.  SetMask
  1983.         
  1984. "Hourglass_Off"
  1985.  !Main24=
  1986. "Not implemented for 24 bpp files":
  1987. C=Dcurrent*
  1988. W3=2/3*
  1989. (3):P2=
  1990. X=RGB?0-.5*RGB?1-.5*RGB?2
  1991. Y=W3*RGB?1-W3*RGB?2
  1992.  Y=0 
  1993.     T=-
  1994. *(X<0)
  1995.         
  1996.     T=
  1997. (X/Y):
  1998.  X<0 
  1999.         
  2000. !MainEntry-1
  2001. 9  R=!MainPal+3*B%:G=!MainPal+3*B%+1:B=!MainPal+3*B%+2
  2002.   X=?R-.5*?G-.5*?B
  2003.   Y=W3*?G-W3*?B
  2004.  Y=0 
  2005.     H=-
  2006. *(X<0)
  2007.         
  2008.     H=
  2009. (X/Y):
  2010.  X<0 
  2011.         
  2012. (H-T):
  2013.  H>P2 
  2014.  H-=P2
  2015.  H=P2-H
  2016.  H<C 
  2017.  Colors?B%=1 
  2018.  Colors?B%=0
  2019. )A%=Colors:B%=MASK(Mcurrent):
  2020.  SetMask
  2021.  !MainN>140000*index :
  2022. "This will take a long time. Are you sure?(Y/N)"
  2023.  !MainN>140000*index 
  2024. ^    B$=
  2025.  B$<>"Y" 
  2026.  B$<>"y" 
  2027. "Edge aborted":
  2028. "Ok. busy for some time...."
  2029.         
  2030.  !MainN>14000*index 
  2031. dmaoff
  2032. #C%=(Dcurrent*600)^2:!EdgeVal=C%
  2033. !MainY-2:AD%=MASK(Mcurrent)+!MainX*B%:!EdgeAd=AD%:
  2034.  Edge:
  2035. dmaon
  2036. type2
  2037. "Hourglass_On":Z=Dcurrent^2 /3
  2038. )TR=RGB?0:TG=RGB?1:TB=RGB?2:T=TR+TG+TB
  2039. <A%=T:B%=Z*65536:C%=MASK(NR%):
  2040.  Calc(2):
  2041. "Hourglass_Off"
  2042. makebutton(X,Y,T$,A$)
  2043. (T$)*8*SFX:B=8*SFY
  2044. 3X0=X-2*SFX:Y0=Y-2*SFY:X1=X+A+2*SFX:Y1=Y+B+2*SFY
  2045. *ButtonP$(button)=T$:Button$(button)=A$
  2046. +Button(button,0)=X0:Button(button,1)=Y0
  2047. +Button(button,2)=X1:Button(button,3)=Y1
  2048. ButtonType(button)=1
  2049. button+=1
  2050. printbutton(A$,
  2051. makebutton2(X,Y,T$,A$)
  2052. (T$)*8*SFX:B=8*SFY
  2053. #X0=X:Y0=Y:X1=X+A:Y1=Y+B-1-1*SFY
  2054. *ButtonP$(button)=T$:Button$(button)=A$
  2055. +Button(button,0)=X0:Button(button,1)=Y0
  2056. +Button(button,2)=X1:Button(button,3)=Y1
  2057. ButtonType(button)=2
  2058.  X,Y,A,Y1-Y0:
  2059.  X,Y+SFY*7:
  2060. button+=1
  2061. printbutton(A$,Pressed%)
  2062.  A,B,X,Y,X0,X1,Y0,Y1,Q%
  2063. 7T%=-1:
  2064. Q%=button-1 
  2065.  A$=Button$(Q%) 
  2066.  T%=Q%
  2067.  T%=-1 
  2068. "button '"A$"' not found":
  2069.  ButtonType(T%)=2 
  2070. -X=Button(T%,0)+2*SFX:Y=Button(T%,1)+2*SFY
  2071. (ButtonP$(T%))*8*SFX:B=8*SFY
  2072. 3X0=X-2*SFX:Y0=Y-2*SFY:X1=X+A+2*SFX:Y1=Y+B+2*SFY
  2073.  Pressed% 
  2074.  X0,Y0,X1-X0,Y1-Y0
  2075.  Pressed% 
  2076.  X0,Y0,X1,Y0:
  2077.  X1,Y1
  2078.  Pressed% 
  2079.  X0,Y1:
  2080.  X0,Y0
  2081.  X,Y+B-SFY:
  2082.  ButtonP$(T%)
  2083. printline(X0,Y0,X1)
  2084.  X0,Y0,X1,Y0:
  2085.  X0,Y0+SFY
  2086.  X0,Y0+SFY,X1-SFX,Y0+SFY:
  2087.  X0,Y0
  2088. testbutton
  2089.  S,T%
  2090.  button-1
  2091.  X>=Button(T%,0) 
  2092.  X<=Button(T%,2) 
  2093.  Y>=Button(T%,1) 
  2094.  Y<=Button(T%,3) 
  2095.  S=T%
  2096.  S>=0 
  2097. printbutton(Button$(S),
  2098.  S=-1 
  2099.  ="none"
  2100. =Button$(S)
  2101. defaults
  2102.  mode:mode=
  2103. "FX 4 1"
  2104. .mapsize=6144  :
  2105.  Size of main fixed buffer
  2106.  PL 16,MASK(8),OldMask(8),Button(90,3),ButtonP$(90),Button$(90)
  2107.  ButtonType(90),C%(2,2,2),L%(2),M%(2),Colors 256,Table 256,R(15),G(15),B(15)
  2108.  X(50,1),Y(50,1),I(50),T(100,2),USED(40),HULL(40),maps mapsize
  2109.  K(10),X0(10),Y0(10),X1(10),Y1(10)
  2110.  maskstatus(8),temp(8),M(3)
  2111. button=0:on=1:off=0:M$=""
  2112. FD=deffd:dontdismask=
  2113. =PL!0=149:PL!4=-1:
  2114. "OS_ReadVduVariables",PL,PL+8:EE%=PL!8
  2115. "OS_ReadModeVariable",mode,3 
  2116.  ,,T%:
  2117.  T%<>63 
  2118.  mode=15:
  2119.  mode:
  2120.  "This program must run in a 256 color mode. Change !Defaults-file":
  2121. "OS_ReadModeVariable",mode,4 
  2122.  ,,FX
  2123. "OS_ReadModeVariable",mode,5 
  2124.  ,,FY
  2125. "OS_ReadModeVariable",mode,7 
  2126.  ,,ScrMem%
  2127. "OS_ReadModeVariable",mode,11 
  2128.  ,,XW:XW+=1
  2129. "OS_ReadModeVariable",mode,12 
  2130.  ,,YW:YW+=1
  2131. +SFX=1<<FX:SFY=1<<FY:XS=XW<<FX:YS=YW<<FY
  2132. PX=XS/2-32-64+16:PY=YS/2-36
  2133. Yd0=0:Yd1=YS-1-8*SFY
  2134. MY=YS/3-32:MX=MY:M0=1
  2135. 'XMmax=(PX >>FX)-2:YMmax=(PY >>FY)-2
  2136. )XMmaxM=(MX >>FX)-2:YMmaxM=(MY >>FY)-2
  2137.  Determen arm speed:
  2138. =0:T%=0:
  2139. :T%+=1:
  2140. >=10:index=T%/2100
  2141. 'dma=defdma:!pal=defpal:
  2142. setuppal(
  2143.  defdma=2 
  2144. %    
  2145.  index<.6 
  2146.  dma=off 
  2147.  dma=on
  2148.         
  2149.  0,0,PX,PY:
  2150.  0,YS/2,PX,PY
  2151. .MaxMask%=3:Mcurrent=2:Type=2:
  2152. showMaskRect
  2153. 7Xmenu=XS/2-32+MX+20:
  2154.  Xmenu,0,1500,3000
  2155. mc_init(
  2156. -48*1024,4096):
  2157. error$
  2158. -MAIN=
  2159. mc_assign(1)::
  2160.  MAIN=
  2161. error$
  2162. 8:MASK(T%)=
  2163. mc_assign(1):
  2164.  MASK(T%)=
  2165. error$
  2166. >SaveType$="save:smpic":Xcurrent=0:Ycurrent=0:Dcurrent=0.25
  2167. LoadType$="load:pic"
  2168. printXY:
  2169. printD
  2170. Y=YS*47/50
  2171. 21+128
  2172. makebutton(Xmenu+32,Y,"Grey","grey")
  2173. makebutton(Xmenu+128,Y,"RGB","rgb")
  2174. makebutton(Xmenu+208,Y,"Color","color")
  2175. makebutton(Xmenu+32,Y-3/50*YS,"Hue","hue")
  2176. makebutton(Xmenu+128,Y-3/50*YS,"Edge","edge:grey")
  2177. printbutton("color",
  2178. printline(Xmenu+0*SFX,Y-5/50*YS+SFY*3,XS)
  2179.  Xmenu+1,Y
  2180. YB=40/50*YS
  2181. makebutton(Xmenu+12,YB,"NOT","not")
  2182. makebutton(Xmenu+78,YB,"=","copy")
  2183. makebutton(Xmenu+114,YB,"AND","and")
  2184. makebutton(Xmenu+182,YB,"0","0")
  2185. makebutton(Xmenu+216,YB,"1","1")
  2186. makebutton(Xmenu+252,YB,"LARGE","large")
  2187. makebutton(Xmenu+12,YB-3/50*YS,"EOR","eor")
  2188. makebutton(Xmenu+80,YB-3/50*YS,"OR","or")
  2189. makebutton(Xmenu+132,YB-3/50*YS,"ANDNOT","andnot")
  2190. makebutton(Xmenu+248,YB-3/50*YS,"SEED","seed")
  2191. makebutton(Xmenu+12,YB-6/50*YS,"NOISE:","noise")
  2192. makebutton(Xmenu+126,YB-6/50*YS,"1","noise:1")
  2193. makebutton(Xmenu+158,YB-6/50*YS,"2","noise:2")
  2194. makebutton(Xmenu+190,YB-6/50*YS,"3","noise:3")
  2195. makebutton(Xmenu+222,YB-6/50*YS,"4","noise:4")
  2196. makebutton(Xmenu+254,YB-6/50*YS,"5","noise:5")
  2197. makebutton(Xmenu+286,YB-6/50*YS,"6","noise:6")
  2198. makebutton(Xmenu+318,YB-6/50*YS,"8","noise:8")
  2199. ;%noise=1:
  2200. printbutton("noise:1",
  2201. makebutton(Xmenu+12,YB-9/50*YS,"DILATION:","dilation")
  2202. makebutton(Xmenu+176,YB-9/50*YS,"1","dilation:1")
  2203. makebutton(Xmenu+208,YB-9/50*YS,"3","dilation:3")
  2204. makebutton(Xmenu+240,YB-9/50*YS,"5","dilation:5")
  2205. makebutton(Xmenu+272,YB-9/50*YS,"6","dilation:6")
  2206. makebutton(Xmenu+272+32,YB-9/50*YS,"8","dilation:8")
  2207. B+dilation=1:
  2208. printbutton("dilation:1",
  2209. printline(Xmenu+0*SFX,YB-11/50*YS+SFY*4,XS)
  2210.  Xmenu+1,YB
  2211. YF=YB-13/50*YS
  2212. makebutton(Xmenu+16,YF,"LOAD:","load")
  2213. makebutton(Xmenu+112,YF,"pic","load:pic")
  2214. makebutton(Xmenu+176,YF,"mask","load:mask")
  2215. makebutton(Xmenu+256,YF,"back","load:back")
  2216. printbutton(LoadType$,
  2217. makebutton(Xmenu+16,YF-YS*3/50,"SAVE:","save")
  2218. makebutton(Xmenu+112,YF-YS*3/50,"pic","save:pic")
  2219. makebutton(Xmenu+176,YF-YS*3/50,"smpic","save:smpic")
  2220. makebutton(Xmenu+270,YF-YS*3/50,"mask","save:mask")
  2221. printbutton(SaveType$,
  2222. printline(Xmenu+0*SFX,YF-5/50*YS+SFY*4,XS)
  2223.  Xmenu+1,YF
  2224. U%=-32+16
  2225. Ypic=YF-YS*7/50
  2226. makebutton(Xmenu+16,Ypic,"map","loadmap")
  2227. makebutton(Xmenu+86,Ypic,"InvM","invmask")
  2228. makebutton(Xmenu+170,Ypic,"
  2229. ","flipy")
  2230. makebutton(Xmenu+224,Ypic,"
  2231. ","flipx")
  2232. makebutton(Xmenu+278,Ypic,"24b","24bit")
  2233. makebutton(Xmenu+170,Ypic-YS*3/50,"Gam","gamma")
  2234. makebutton(Xmenu+240,Ypic-YS*3/50,"Filt","correctcol")
  2235. makebutton(Xmenu+100,Ypic-YS*3/50,"Col","changecolor")
  2236. makebutton(Xmenu+16,Ypic-YS*3/50,"grey","changegrey")
  2237. makebutton(Xmenu+16,Ypic-YS*6/50,"Morph","morph")
  2238. makebutton(Xmenu+116,Ypic-YS*6/50,"Erase","erase")
  2239. makebutton(Xmenu+216,Ypic-YS*6/50,"contrast","contrast")
  2240. makebutton(Xmenu+16,Ypic-YS*9/50,"sharp","sharp")
  2241. makebutton(Xmenu+116,Ypic-YS*9/50,"undo","undo")
  2242. Y=Ypic-12/50*YS
  2243. makebutton(Xmenu+U%+32,Y,"b","black")
  2244. makebutton(Xmenu+U%+64,Y,"w","white")
  2245. makebutton(Xmenu+U%+96,Y,"r","red")
  2246. makebutton(Xmenu+U%+128,Y,"g","green")
  2247. makebutton(Xmenu+U%+160,Y,"b","blue")
  2248. makebutton(Xmenu+U%+192,Y,"p","purple")
  2249. makebutton(Xmenu+U%+224,Y,"c","cyan")
  2250. makebutton(Xmenu+U%+256,Y,"y","yellow")
  2251. makebutton(Xmenu+U%+288,Y,"g","cgrey")
  2252. makebutton(Xmenu+U%+320,Y,"R","darkred")
  2253. makebutton(Xmenu+U%+352,Y,"B","darkblue")
  2254. printline(Xmenu+0*SFX,Ypic-14/50*YS+SFY*4,XS)
  2255. Yo=Y-4/50*YS
  2256. makebutton(Xmenu+16,Yo,"DMA","dma")
  2257. printbutton("dma",dma-1)
  2258. makebutton(Xmenu+88,Yo,"FD","fastdisplay")
  2259. printbutton("fastdisplay",-FD)
  2260. makebutton(Xmenu+144,Yo,"pal","pal")
  2261. printbutton("pal",-!pal)
  2262. makebutton(Xmenu+216,Yo,"undo","tundo")
  2263. printbutton("tundo",undo)
  2264.  Xmenu+1,Ypic
  2265. y(MaskColor$="":
  2266. setmaskcolor("black")
  2267. makebutton2(0,YS/2-8*SFY,"zoom","D")
  2268. makebutton2(16*5,YS/2-8*SFY,"unzoom","C")
  2269. makebutton2(16*12,YS/2-8*SFY,"mask","Z")
  2270. makebutton2(16*17,YS/2-8*SFY,"X","X")
  2271. makebutton2(16*19,YS/2-8*SFY,"
  2272. makebutton2(16*21,YS/2-8*SFY,"
  2273. makebutton2(16*23,YS/2-8*SFY,"
  2274. makebutton2(16*25,YS/2-8*SFY,"
  2275. loadClear("<Mask$Dir>.Demo2")
  2276. setmaskcolor(A$)
  2277.  MaskColor$<>"" 
  2278. printbutton(MaskColor$,
  2279. MaskColor$=A$
  2280.  "black" :?MaskColor=0
  2281. !    
  2282.  "white" :?MaskColor=255
  2283.      
  2284.  "red"   :?MaskColor=16
  2285. #    
  2286.  "darkred"   :?MaskColor=4
  2287.      
  2288.  "green" :?MaskColor=64
  2289. !    
  2290.  "blue"  :?MaskColor=128
  2291. #    
  2292.  "darkblue"  :?MaskColor=8
  2293. $    
  2294.  "purple":?MaskColor=128+16
  2295. $    
  2296.  "cyan"  :?MaskColor=128+64
  2297. #    
  2298.  "yellow":?MaskColor=64+16
  2299. $    
  2300.  "cgrey" :?MaskColor=4+8+32
  2301. printbutton(MaskColor$,
  2302. showMaskRect
  2303. T%=0 
  2304. 2:M%=3-T%:
  2305.  (M%+M0-1)<>Mcurrent 
  2306.  XS/2-32,T%*YS/3,MX,MY
  2307.  (M%+M0-1)>MaxMask% 
  2308.  XS/2-32,T%*YS/3,MX,MY
  2309. printXY
  2310.  A%,B%
  2311. %A%=Xcurrent:B%=Ycurrent:
  2312.  ReadRGB
  2313. 5:Y=YS*0.6/10
  2314.  Xmenu,Y-16*SFY,500,16*SFY::
  2315.  Xmenu+32,Y:
  2316. "Position:";
  2317.  Xcurrent;",";
  2318.  Ycurrent
  2319.  Xmenu+32,Y-8*SFY:
  2320. "Color:";RGB?0;",";RGB?1;",";RGB?2
  2321. printDiskAccess(
  2322. clearD
  2323.  PX+16,0,16,YS
  2324. showArrows
  2325. printD
  2326.  Dcurrent<0 
  2327.  Dcurrent=0
  2328.  Dcurrent>1 
  2329.  Dcurrent=1
  2330.  PX+16,Yd0,16,Yd1-Yd0
  2331.  PX+16,Yd0,16,(Yd1-Yd0)*Dcurrent
  2332. printDiskAccess(A%)
  2333.  Xmenu+32,YS*0.4/10:
  2334.  XS-15,15,10
  2335. dmaoff
  2336.  dma=off 
  2337. "OS_UpdateMEMC",0,1024
  2338. dmaon
  2339. "OS_UpdateMEMC",1024,1024
  2340. loadClear(C$)
  2341.  "OS_File",5,C$ 
  2342.  U%,,F%,,L%:F%=(F% >>8)
  2343.  F%<>&690 
  2344.  F%<>&FF9 
  2345. "Not a clear or sprite file":
  2346. %OLDMAIN=MAIN:MAINL=!MainL:FLAG%=
  2347.  mc_amount< (L%*1.33+9*mc_page) 
  2348. "Not enough memory for image":
  2349. %OldMask()=MASK():MAXMASK=MaxMask%
  2350. 8:MASK(T%)=
  2351. mc_reassign(MASK(T%),1):
  2352.  MASK(T%)=
  2353. error$:
  2354. MAIN=
  2355. mc_reassign(MAIN,L%):
  2356.  MAIN=
  2357.  error$="Not enough continious memory." 
  2358. "Tidying memory":
  2359. tidymem:MAIN=
  2360. mc_assign(L%)
  2361.  MAIN=
  2362. error$:
  2363. loadmask=
  2364. :fail=
  2365.  F%=&690 
  2366. loadtype690
  2367.  F%=&FF9 
  2368. loadtypeFF9
  2369. loadtype690
  2370. printDiskAccess(
  2371. "OS_File",255,C$,MAIN
  2372. printDiskAccess(
  2373. takecareofnew
  2374. takecareofnew
  2375. CurrentFile$=C$
  2376. (C$) +1:
  2377.  T%-=1:
  2378. C$,T%,1)="." 
  2379.  T%=0 
  2380. C$,T%,1)=":"
  2381. FileName$=
  2382. C$,T%+1)
  2383. initmain(MAIN)
  2384. 6ZOOM!0=0:ZOOM!4=0:ZOOM!8=!MainX-1:ZOOM!12=!MainY-1
  2385. initzoom
  2386. MaskAmount=!MainX*!MainY
  2387. assignmasks
  2388.  MaxMask%<=0 
  2389. displayMainOrig(1)
  2390.  loadmask=
  2391.  loadmask=
  2392. loadspritemask
  2393. displayMask(M%,M%-M0+1):
  2394. displayMainOrig(1)
  2395.  loadmask=
  2396. displayMain(Mcurrent)
  2397. loadtypeFF9
  2398. printDiskAccess(
  2399. readbuffer(12):
  2400.  !maps<>1 
  2401. "Warning: more than one sprite in this file"
  2402. readbuffer(44):S=maps
  2403. ,M=S!40:
  2404. "OS_ReadModeVariable",M,3 
  2405.  1:BPP=1
  2406.  3:BPP=2
  2407.  15:BPP=4
  2408.  63:BPP=8
  2409. "illegal spritefile. Loading aborted":fail=
  2410. <Y=S!20 +1:X=S!16*4*(8/BPP)+(S?28-S?24+1)/BPP:XL=S!16*4+4
  2411.  Y<=0 
  2412.  Y>1E4 
  2413.  X<=0 
  2414.  XL>mapsize 
  2415. "illegal spritefile. Loading aborted":fail=
  2416. name(S+4,12)
  2417. N%=S!36:M%=S?24/8:MO%=S?24
  2418.  (N%-44-XL*Y)>=0 
  2419.  N%-=XL*Y:loadmask=
  2420.  loadmask=
  2421. readbuffer(N%-44)
  2422.  converting to clear-format:
  2423.  T%=1
  2424. (S$):MAIN?(T%-1)=
  2425. S$,T%)):
  2426. :MAIN?(T%-1)=0
  2427. m=T%-1+MAIN
  2428. m!1=100*version
  2429.     m!5=X
  2430.     m!9=Y
  2431. m!13=8
  2432. p=m+17
  2433.  Q%=0
  2434.  767 
  2435. 4:p!Q%=0:
  2436.  Taking care of the palette:
  2437.  (N%-44)>0 
  2438.  (N%-44)<2048 
  2439.  Q%=0
  2440.  (2^BPP-1) :
  2441. 2: j=maps?(8*(Q% 
  2442. 63)+1+C%)
  2443. '      
  2444.  C%=1 
  2445.  (Q% 
  2446. 64)<>0 
  2447.  j+=128
  2448. (      
  2449.  C%=2 
  2450.  (Q% 
  2451. 128)<>0 
  2452.  j+=128
  2453.       p?(3*Q%+C%)=j
  2454.  (N%-44)=0 
  2455.         
  2456.  A%=0
  2457. 255: 
  2458.  getRGB8
  2459. ,         
  2460.  C%=0
  2461. 2:p?(3*A%+C%)=rgb!(4*C%)
  2462.          
  2463.        
  2464. !6       
  2465.  Q%=0
  2466.  C%=0
  2467. 2:p?(3*Q%+C%)=240-32*Q%:
  2468.        p!(3* 7)=&000000
  2469.        p!(3* 8)=&994400
  2470.        p!(3* 9)=&00EEEE
  2471.        p!(3*10)=&00CC00
  2472.        p!(3*11)=&0000DD
  2473.        p!(3*12)=&99EEEE
  2474.        p!(3*13)=&008855
  2475.        p!(3*14)=&00BBFF
  2476.        p!(3*15)=&FFBB00
  2477.        p!(3*0)=&FFFFFF
  2478.        p!(3*1)=&BBBBBB
  2479.        p!(3*2)=&777777
  2480.        p!(3*3)=&000000
  2481.        p!(3*0)=&FFFFFF
  2482.        p!(3*1)=&000000
  2483. "illegal spritefile. Loading aborted":fail=
  2484.  (N%-44)=2048 
  2485.  Q%=0
  2486.  (2^BPP-1) :
  2487. 2: j=maps?(8*Q%+1+C%)
  2488.   p?(3*Q%+C%)=j
  2489.           :
  2490.  256 palette entries
  2491.  loading in the sprite:
  2492. = D=p+256*3:P%=mapsize/XL:W%=0
  2493.  C=63 
  2494.  V%=0
  2495. @0      
  2496.  W%=0 
  2497. readbuffer(XL*
  2498. min(P%,Y-V%))
  2499. A8      A%=maps+M%+XL*W%:B%=A%+X-1:C%=D+V%*X:
  2500.  COPYMEM
  2501.       W%+=1:
  2502.  W%=P% 
  2503.  W%=0
  2504. C        
  2505. D        
  2506.  C<63 
  2507. FL    MAIN=
  2508. mc_reassign(MAIN,X*Y+D-MAIN):
  2509.  MAIN=
  2510.  error$:fail=
  2511.     B%=2^BPP-1
  2512.  V%=0
  2513. I0      
  2514.  W%=0 
  2515. readbuffer(XL*
  2516. min(P%,Y-V%))
  2517. J*      S%=D+V%*X:O%=maps+XL*W%:bit%=MO%
  2518. KR      
  2519.  X%=0
  2520.  X-1:byte%=bit%/8:S%?X%=((O%?byte%) >> (bit% 
  2521.  B%:bit%+=BPP:
  2522.       W%+=1:
  2523.  W%=P% 
  2524.  W%=0
  2525. M        
  2526. N        
  2527.  loadmask=
  2528. printDiskAccess(
  2529. takecareofnew
  2530. loadspritemask
  2531. printDiskAccess(
  2532.     B%=2^BPP-1:W%=0
  2533.  V%=0
  2534. X0      
  2535.  W%=0 
  2536. readbuffer(XL*
  2537. min(P%,Y-V%))
  2538. Y7      S%=MASK(Mcurrent)+V%*X:O%=maps+XL*W%:bit%=MO%
  2539. ZZ      
  2540.  X%=0
  2541.  X-1:byte%=bit%/8:S%?X%=-((((O%?byte%) >> (bit% 
  2542.  B%)<>0):bit%+=BPP:
  2543.       W%+=1:
  2544.  W%=P% 
  2545.  W%=0
  2546. \        
  2547. printDiskAccess(
  2548. readbuffer(AA%)
  2549.  B,C%,D%,E%
  2550.  AA%<=mapsize 
  2551. d"    
  2552. "OS_GBPB",4,CH%,maps,AA%
  2553. e        
  2554. f(    
  2555. "OS_GBPB",4,CH%,maps,mapsize-1
  2556. g     
  2557. "OS_Args",0,CH% 
  2558.  ,,FP
  2559. h9    
  2560. "OS_GBPB",3,CH%,maps+mapsize-1,1,FP+AA%-mapsize
  2561. i        
  2562. initzoom
  2563. m:X=ZOOM!8-ZOOM!0+1:Y=ZOOM!12-ZOOM!4+1:!ZOOMX=X:!ZOOMY=Y
  2564. n%Xc=X/
  2565. (PX/SFX-1):Yc=Y/
  2566. (PY/SFY-1)
  2567. o1Xcm=!MainX/
  2568. (MX/SFX-1):Ycm=!MainY/
  2569. (MY/SFY-1)
  2570. initmain(MAIN)
  2571. t"T%=MAIN:
  2572.  ?T%<>0 T%+=1:
  2573. :M=T%
  2574. !MainX=M!5
  2575. !MainY=M!9
  2576. !MainN=M!5*M!9
  2577.  M!13<=8 
  2578.     !Main24=
  2579.     !MainPal=M+17
  2580.     !MainEntry=2^M!13
  2581. |!    !MainData=M+17+3*(2^M!13)
  2582.     !MainLine=!MainX
  2583. ~        
  2584.     !Main24=
  2585.     !MainData=M+17
  2586.     !MainLine=3*!MainX
  2587.         
  2588. *!MainL=!MainData-MAIN+!MainLine*!MainY
  2589. ,X0=ZOOM!0:Y0=ZOOM!4:X1=ZOOM!8:Y1=ZOOM!12
  2590. DX=X1-X0:DY=Y1-Y0:U=5
  2591. ":X0-=DX/U:X1-=DX/U
  2592. ":X0+=DX/U:X1+=DX/U
  2593. ":Y0+=DY/U:Y1+=DY/U
  2594. ":Y0-=DY/U:Y1-=DY/U
  2595.  X0<0 
  2596.  X1-=X0:X0=0
  2597.  X1>!MainX-1 
  2598.  X0-=X1-!MainX+1:X1=!MainX-1
  2599.  Y0<0 
  2600.  Y1-=Y0:Y0=0
  2601.  Y1>!MainY-1 
  2602.  Y0-=Y1-!MainY+1:Y1=!MainY-1
  2603. 255:B$=
  2604. zoomtoxy
  2605. unzoomtoc
  2606. L=.2:Q=L
  2607. X0=(1+Q)*ZOOM!0-Q*ZOOM!8
  2608. Y0=(1+Q)*ZOOM!4-Q*ZOOM!12
  2609. X1=(1+Q)*ZOOM!8-Q*ZOOM!0
  2610. Y1=(1+Q)*ZOOM!12-Q*ZOOM!4
  2611.  X0<0 
  2612.  X0=0
  2613.  X1>!MainX-1 
  2614.  X1=!MainX-1
  2615.  Y0<0 
  2616.  Y0=0
  2617.  Y1>!MainY-1 
  2618.  Y1=!MainY-1
  2619. zoomtoxy
  2620. 255:B$=
  2621. zoomtoc
  2622. L=.2:Q=-L
  2623. X0=(1+Q)*ZOOM!0-Q*ZOOM!8
  2624. Y0=(1+Q)*ZOOM!4-Q*ZOOM!12
  2625. X1=(1+Q)*ZOOM!8-Q*ZOOM!0
  2626. Y1=(1+Q)*ZOOM!12-Q*ZOOM!4
  2627. zoomtoxy
  2628. 255:B$=
  2629. unzoom
  2630. %X0=0:Y0=0:X1=!MainX-1:Y1=!MainY-1
  2631. zoomtoxy
  2632. 255:B$=
  2633. getboundaries
  2634. zoomtoxy
  2635. ,ZOOM!0=X0:ZOOM!4=Y0:ZOOM!8=X1:ZOOM!12=Y1
  2636. (X=ZOOM!8-ZOOM!0+1:Y=ZOOM!12-ZOOM!4+1
  2637. !ZOOMX=X:!ZOOMY=Y
  2638. %Xc=X/
  2639. (PX/SFX-1):Yc=Y/
  2640. (PY/SFY-1)
  2641. displayMainOrig(1)
  2642.  dontdismask=
  2643. displayMain(Mcurrent) 
  2644.  dontdismask=
  2645. assignmasks
  2646.  Mcurrent<=0 
  2647.  Mcurrent=1
  2648. ;Reserve%=
  2649. mc_assign(10*1024):
  2650.  No error handling needed
  2651. T%=0:
  2652. :T%+=1
  2653. 1MASK(T%)=
  2654. mc_reassign(MASK(T%),MaskAmount+16)
  2655.  T%=8 
  2656.  MASK(T%)=
  2657.  MASK(T%)=
  2658.  MaxMask%=T%-1 
  2659.  MaxMask%=8
  2660.  MASK(T%)=
  2661.  MASK(T%)=
  2662. mc_assign(1):
  2663.  MASK(T%)=
  2664. error$:
  2665.  MaxMask%>=4 
  2666.  MASK(MaxMask%)=
  2667. mc_reassign(MASK(MaxMask%),1):MaxMask%-=1:
  2668.  MASK(MaxMask%+1)=
  2669. error$:
  2670.  MaxMask%>=5 
  2671.  MASK(MaxMask%)=
  2672. mc_reassign(MASK(MaxMask%),1):MaxMask%-=1:
  2673.  MASK(MaxMask%+1)=
  2674. error$:
  2675.  Mcurrent>MaxMask% 
  2676.  Mcurrent=MaxMask%
  2677. T%=MaxMask%-3:
  2678.  T%<0 
  2679.  T%=0
  2680. !Yd0=8*SFY*T%:Yd1=YS-8*SFY-Yd0
  2681. showMaskRect:
  2682. clearD:
  2683. printD
  2684.  MaxMask%<=0 
  2685.  "Not enough memory. Load another object to avoid crashing!"
  2686.  Reserve%>0 
  2687. mc_release(Reserve%):
  2688. error$:
  2689. tidymem
  2690.  T%,R%,FLAG,O
  2691. T%=0:
  2692.   FLAG=
  2693. @  O=MAIN:MAIN=
  2694. mc_reallocate(MAIN):
  2695.  MAIN=
  2696. error$:
  2697.  O<>MAIN 
  2698.  FLAG=
  2699. initmain(MAIN)
  2700.     O=MASK(R%)
  2701. G    MASK(R%)=
  2702. mc_reallocate(MASK(R%)):
  2703.  MASK(R%)=
  2704. error$:
  2705.  MASK(R%)<>O 
  2706.  FLAG=
  2707.   T%+=1
  2708.  T%=8 
  2709.  FLAG=
  2710. showArrows
  2711.  (M0+3)<=MaxMask% 
  2712.  T%=M0+3 
  2713.  MaxMask%:
  2714.  PX+16,(-2+8*(1+T%-M0-3))*SFY:
  2715.  M0>1 
  2716.  M0-1:
  2717.  PX+16,YS-1-8*(T%)*SFY:
  2718. (139):
  2719. 0,0)"                                                          "
  2720. 0,0);
  2721.  LoadType$ 
  2722.  "load:pic" :
  2723.  "Load picture:filename";
  2724.  "load:mask" :
  2725.  "Load mask:filename";
  2726.  "load:back" :
  2727.  "Load background:filename";
  2728. "Bug in load procedure":
  2729.  S$="" 
  2730. "Loading aborted":
  2731.  "OS_File",5,S$ 
  2732.  U%,,F%,,L%:F%=(F% >>8)
  2733.  U%<>1 
  2734. "File not found":
  2735.  F%<>&690 
  2736.  F%<>&FF9 
  2737. "Not a clear or sprite file":
  2738.  LoadType$="load:mask":
  2739. loadmask:
  2740.  LoadType$="load:back":
  2741. loadback:
  2742. loadClear(S$)
  2743. loadmask
  2744. #CH%:C%+=1:
  2745.  C%=500 
  2746.  T%=0
  2747.  C%=500 
  2748.  "This file does not look like a clear file":
  2749. #CH%:
  2750. readnumber
  2751. readnumber
  2752. readnumber
  2753.  X<>!MainX 
  2754.  Y<>!MainY 
  2755.  "The mask has not the right size":
  2756. #CH%:
  2757. readnumber:
  2758.  T%<>1 
  2759.  "This is not a mask file ( >2 colors)":
  2760. #CH%:
  2761. 6:T%=
  2762. #CH%:
  2763. printDiskAccess(
  2764. "OS_GBPB",4,CH%,MASK(Mcurrent),!MainN
  2765. printDiskAccess(
  2766. update(Mcurrent)
  2767. loadback
  2768.  !Main24=
  2769.  "the operation is only implemented for 24 bit files":
  2770. #CH%:C%+=1:
  2771.  C%=500 
  2772.  T%=0
  2773.  C%=500 
  2774.  "This file does not look like a clear file":
  2775. #CH%:
  2776. readnumber
  2777. readnumber
  2778. readnumber
  2779.  X<>!MainX 
  2780.  Y<>!MainY 
  2781.  "The picture has not the right size":
  2782. #CH%:
  2783. readnumber:
  2784.  T%<>24 
  2785.  "Operation not implemented for <24 bit files":
  2786. #CH%:
  2787. printDiskAccess(
  2788. "AD%=!MainData:
  2789.  T%=0
  2790.  !MainN-1
  2791. #CH%:G%=
  2792. #CH%:B%=
  2793.  MASK(Mcurrent)?T%=0 
  2794.  AD%?(T%*3)=R%:AD%?(T%*3+1)=B%:AD%?(T%*3+2)=G%
  2795. printDiskAccess(
  2796. displayMainOrig(1)
  2797. savemask
  2798. ' A$="Mask of '"+FileName$+"'"
  2799. "Saving mask of ";!MainN+24+
  2800. (A$);" bytes"
  2801. printDiskAccess(
  2802. #CH%,
  2803. A$,T%,1)):
  2804. #CH%,0:
  2805. writenumber(100*
  2806. (Version$))
  2807. writenumber(!MainX):
  2808. writenumber(!MainY)
  2809. writenumber(1)
  2810. #CH%,0:
  2811. #CH%,0:
  2812. #CH%,0
  2813. #CH%,255:
  2814. #CH%,255:
  2815. #CH%,255
  2816. "OS_GBPB",2,CH%,MASK(Mcurrent),!MainN
  2817. "SetType "+S$+" 690"
  2818. printDiskAccess(
  2819. writenumber(R%)
  2820. #CH%, R% 
  2821. 255:R%=R% >>8:
  2822. writestring(CH%,S$)
  2823. (S$):
  2824. #CH%, 
  2825. S$,T%)):
  2826. readnumber
  2827. #CH% *256
  2828. #CH% *65536
  2829. #CH% *65536*256
  2830. okToSave(S$)
  2831.  U%,F%,L%
  2832.  "OS_File",5,S$ 
  2833.  U%,,F%,,L%:F%=(F% >>8)
  2834.  U%=2 
  2835.  S$;" is a directory, saving aborted":=
  2836.  U%=1 
  2837.  F%<>&690 
  2838. OJ    
  2839.  "File already exists with type &";~F%;" Are you sure (Y/N)"
  2840. P<    A$=
  2841.  A$<>"Y" 
  2842.  A$<>"y" 
  2843. "Saving aborted":=
  2844.     =
  2845. R        
  2846.  SaveType$ 
  2847.  "save:pic" :
  2848.  "Save picture:filename";
  2849.  "save:smpic" :
  2850.  "Save small picture:filename";
  2851.  "save:mask" :
  2852.  "Save mask:filename";
  2853. "Bug in save procedure":
  2854.  S$="" 
  2855. "Saving aborted":
  2856. okToSave(S$)=
  2857.  SaveType$="save:pic" 
  2858.  X0=0:Y0=0:X1=!MainX-1:Y1=!MainY-1
  2859.  SaveType$="save:smpic" 
  2860. getboundaries:
  2861.  Y0>Y1 
  2862.  X0>X1 
  2863.  SaveType$="save:mask" 
  2864. savemask:
  2865. d"T%=MAIN:
  2866.  ?T%<>0 T%+=1:
  2867. :M=T%
  2868. M!5=X1-X0+1:M!9=Y1-Y0+1
  2869. "Saving ";M!5*M!9*!MainLine/!MainX+!MainData-MAIN;" bytes"
  2870. g3A%=?MaskColor:
  2871.  getRGB8:R=rgb!0:G=rgb!4:B=rgb!8
  2872.  !Main24=
  2873. i0   C%=0:U=1E6:
  2874.  2^M!13-1 :AD%=M+17+3*T%
  2875. jD   V=(AD%?0-R)*(AD%?0-R)+(AD%?1-G)*(AD%?1-G)+(AD%?2-B)*(AD%?2-B)
  2876.  V<U 
  2877.  U=V:C%=T%
  2878. printDiskAccess(
  2879. o4bsize%=
  2880. mc_maxblock:
  2881.  bsize%=
  2882.  error$:
  2883. p<BU%=
  2884. mc_assign(bsize%):
  2885.  BU%=
  2886.  BU%=maps:bsize%=mapsize
  2887. !_buffer=BU%
  2888. T%=MAIN 
  2889.  !MainData-1:
  2890. #CH%,?T%:
  2891.  !Main24=
  2892. u0    E%=CH%:B%=X0:C%=R:F%=X1:G%=G:H%=B:!_bp=0
  2893. vi    
  2894. Y%=Y0 
  2895.  Y1:ADmain%=!MainData+!MainLine*Y%:ADmask%=MASK(Mcurrent)+!MainX*Y%:A%=ADmask%:D%=ADmain%
  2896.  write3row
  2897. x&    
  2898.  (!_bp +!MainLine) >=bsize% 
  2899. y&        
  2900. "OS_GBPB",2,CH%,BU%,!_bp
  2901.         !_bp=0
  2902.         
  2903. }!   
  2904. "OS_GBPB",2,CH%,BU%,!_bp
  2905. !    E%=CH%:B%=X0:F%=X1:!_bp=0
  2906. i    
  2907. Y%=Y0 
  2908.  Y1:ADmain%=!MainData+!MainLine*Y%:ADmask%=MASK(Mcurrent)+!MainX*Y%:A%=ADmask%:D%=ADmain%
  2909.  writerow
  2910. &    
  2911.  (!_bp +!MainLine) >=bsize% 
  2912. &        
  2913. "OS_GBPB",2,CH%,BU%,!_bp
  2914.         !_bp=0
  2915.         
  2916.         
  2917. "    
  2918. "OS_GBPB",2,CH%,BU%,!_bp
  2919.         
  2920. "SetType "+S$+" 690"
  2921. printDiskAccess(
  2922.  BU%<>
  2923.  BU%<>Colors :T%=
  2924. mc_release(BU%):
  2925.  error$:
  2926. getboundaries
  2927.  B%,C%,D%
  2928. Y0=-1:Y1=0:X0=-1:X1=0
  2929.  !MainY-1
  2930.  AD%=MASK(Mcurrent)+!MainX*Y%
  2931. (B%=AD%:C%=!MainX-1:D%=1:M%=
  2932.  TestGT0
  2933.  Y0=-1 
  2934.  Y0=Y%
  2935.  Y1=Y%
  2936.  !MainX-1
  2937. AD%=MASK(Mcurrent)+X%
  2938. :B%=AD%:D%=!MainX:C%=(!MainY-1)*D%:M%=
  2939.  TestGT0
  2940.  X0=-1 
  2941.  X0=X%
  2942.  X1=X%
  2943. displayMainOrig(p)
  2944.  L1,L2,S0%,C%,H%,T%,Y%,D%,B%
  2945. :S0%=EE%+
  2946. ((YS/2-PY)/SFY)*XW+1:
  2947.  p=0 
  2948.  S0%=S0%+
  2949. (YS/2/SFY)*XW
  2950. H%=0:C%=Xc *2^18+1
  2951. mc_assign(4*XW/2+8):
  2952.  !_L1=
  2953. error$:
  2954. mc_assign(4*XW/2+8):
  2955.  !_L2=
  2956. error$:
  2957.  4*XW/2+4 
  2958. 4:T%!L1=&808080:T%!L2=&808080:
  2959. !_L1=L1+4:!_L2=L2+4
  2960.  FD=off 
  2961.  YMmax:D%=S0%+XW*Y%+.5:B%=Y%*Yc+ZOOM!4
  2962.  DisplayMain:
  2963.  L1,L2:!_L1=L1+4:!_L2=L2+4:
  2964.  YMmax:D%=S0%+XW*Y%+.5:B%=Y%*Yc+ZOOM!4:H%=!MainX*B%
  2965.  DisplayMainFast:
  2966.  L1,L2:!_L1=L1+4:!_L2=L2+4:
  2967. mc_release(L1):
  2968. error$:
  2969. mc_release(L2):
  2970. error$:
  2971. displayMain(MASK)
  2972.  B%,C%,D%,H%,S0%
  2973. :S0%=EE%+
  2974. ((YS-PY)/SFY)*XW+1:L0%=EE%+
  2975. ((YS/2-PY)/SFY)*XW+1
  2976. 4C%=Xc *2^18+1:!_MASK=MASK(MASK):!_XW=XW:!_S0=S0%
  2977.  YMmax:H%=D%*Yc+ZOOM!4:B%=L0%+XW*D%:
  2978.  DisplayMainMask:
  2979. displayMask(M%,NR%)
  2980.  A%,B%,C%,D%,S0%
  2981.  NR%<1 
  2982.  NR%>3 
  2983.  M%<1 
  2984.  M%>MaxMask% 
  2985. @S0%=EE%+
  2986. (NR%*YS/3+.999)-MY)/SFY+.999)*XW+(XS/2-32)/SFX+1
  2987. LC%=XMmaxM:D%=Xcm*2^18+1:!_S0=S0%:!_XW=XW:!_MASK=MASK(M%):!_DY=Ycm*2^18+1
  2988.     !_Y=0
  2989. "A%=YMmaxM+1:B%=0:
  2990.  DisplayMask
  2991. setuppal(Q%)
  2992.  !pal 
  2993.  0:P$="brtt"
  2994.  1:P$="rrbg"
  2995.  Q% :
  2996. "Palette set to:"P$
  2997. &R()=0:G()=0:B()=0:R=2:G=1:B=2:TI=1
  2998. 4:M=16>>Q:A$=
  2999. P$,Q,1)
  3000. M)=M 
  3001.  A$="t" 
  3002.  U=1<<TI:R(T)+=U:G(T)+=U:B(T)+=U
  3003.  A$="r" 
  3004.  R(T)+=1<<R
  3005.  A$="g" 
  3006.  G(T)+=1<<G
  3007.  A$="b" 
  3008.  B(T)+=1<<B
  3009.  A$="t" 
  3010.  TI-=1
  3011.  A$="g" 
  3012.  G-=1
  3013.  A$="r" 
  3014.  R-=1
  3015.  A$="b" 
  3016.  B-=1
  3017.  T,R(T)*16,G(T)*16,B(T)*16:
  3018.  CODE 9000
  3019.  CalcLoop(10),Calc(10),CalcEnd(10)
  3020.  PASS=0
  3021. P%=CODE
  3022. -ADmask=11:X=10:C=2:ADmain=3:X1=5:V=0:T=12
  3023. BU=4:BP=8 :ch=4
  3024. [OPT PASS
  3025. ._buffer EQUD0
  3026. ._bp EQUD0
  3027. .writerow
  3028. MOV ADmask,R0
  3029. MOV X,R1
  3030. (MOV R1,ch            ;output channel
  3031. 0LDR BU,_buffer       ;address of some buffer
  3032. +LDR BP,_bp           ;pointer in buffer
  3033. .writerowloop
  3034. LDRB T,[ADmask,X]
  3035. CMP T,#0
  3036. Q V,C
  3037. LDRNE V,[ADmain,X]
  3038. STRB V,[BU,BP]
  3039. ADD BP,BP,#1
  3040. ADD X,X,#1
  3041. CMP X,X1
  3042. BLE writerowloop
  3043. STR BP,_bp
  3044. MOV PC,R14
  3045. R=2:G=6:B=7:X3=9
  3046. [OPT PASS
  3047. .write3row
  3048. MOV ADmask,R0
  3049. MOV X,R1
  3050. (MOV R1,ch            ;output channel
  3051.  ADD X3,X,X,LSL#1     ;X3=3*X
  3052. 0LDR BU,_buffer       ;address of some buffer
  3053. +LDR BP,_bp           ;pointer in buffer
  3054. .write3rowloop
  3055. LDRB T,[ADmask,X]
  3056. CMP T,#0
  3057. Q V,R
  3058. LDRNE V,[ADmain,X3]
  3059. STRB V,[BU,BP]
  3060. ADD BP,BP,#1
  3061. ADD X3,X3,#1
  3062. Q V,G
  3063. LDRNE V,[ADmain,X3]
  3064. STRB V,[BU,BP]
  3065. ADD BP,BP,#1
  3066. ADD X3,X3,#1
  3067. Q V,B
  3068. LDRNE V,[ADmain,X3]
  3069. STRB V,[BU,BP]
  3070. ADD BP,BP,#1
  3071. ADD X3,X3,#1
  3072. ADD X,X,#1
  3073. CMP X,X1
  3074. BLE write3rowloop
  3075. STR BP,_bp
  3076. MOV PC,R14
  3077. 'MASK=0:Table=1:X=2:T=3:I=4:AD=5:P=6
  3078. [OPT PASS
  3079. ;1 color is in mask
  3080. ;2 color is out mask
  3081. ;3 color is in and out mask
  3082. .CheckPalette
  3083. LDR AD,MainData
  3084. LDR X,MainN:SUB X,X,#1
  3085. .PalLoop
  3086. LDRB P,[AD,X]
  3087. LDRB T,[MASK,X]
  3088. LDRB I,[Table,P]
  3089.     '$CMP T,#1:
  3090. REQ I,I,#1:
  3091. RNE I,I,#2
  3092. STRB I,[Table,P]
  3093. SUBS X,X,#1
  3094. BPL PalLoop
  3095. MOV PC,R14
  3096. AD=5:X=6:T=7:C=8
  3097. [OPT PASS
  3098. .ConvertTo24
  3099. MOV AD,R1:MOV R11,R14
  3100. MOV X,R0:LDR C,MainN
  3101.     2!ADD AD,AD,X:ADD AD,AD,X,LSL#1
  3102. .ConvertLoop
  3103. MOV R0,X:MOV R1,#0
  3104. BL ReadRGBfast
  3105. STRB R0,[AD]
  3106. STRB R1,[AD,#1]
  3107. STRB R2,[AD,#2]
  3108. ADD AD,AD,#3
  3109. ADD X,X,#1
  3110. SUBS C,C,#1
  3111. BGT ConvertLoop
  3112. MOV PC,R11
  3113.     ?)Table=0:C=1:AD=2:TEMP=3:T=4:M=5:USE=6
  3114. [OPT PASS
  3115. .TransFormColor
  3116. MOV M,R2:CMP M,#0
  3117. Q USE,#1:MOVNE USE,#0
  3118. LDR AD,MainData
  3119. LDR T,MainN
  3120. ADD AD,AD,C
  3121. .TransLoop
  3122. LDRB TEMP,[M],#1
  3123. ADD TEMP,TEMP,USE
  3124. CMP TEMP,#1
  3125. LDRB TEMP,[AD]
  3126. LDRB TEMP,[Table,TEMP]
  3127.     M&STRPLB TEMP,[AD],#3:ADDLT AD,AD,#3
  3128. SUBS T,T,#1
  3129. BGT TransLoop
  3130. MOV PC,R14
  3131.     R!Col=0:M=1:X=2:P=4:TEMP=5:T1=6
  3132. [OPT PASS
  3133. .SetMask
  3134. LDR X,MainN:BIC X,X,#3
  3135. LDR P,MainData
  3136. .SetMaskLoop
  3137. LDRB TEMP,[P,X]
  3138. LDRB T1,[Col,TEMP]
  3139. ADD X,X,#1
  3140. LDRB TEMP,[P,X]
  3141. LDRB TEMP,[Col,TEMP]
  3142. ADD T1,T1,TEMP,LSL#8
  3143. ADD X,X,#1
  3144. LDRB TEMP,[P,X]
  3145. LDRB TEMP,[Col,TEMP]
  3146. ADD T1,T1,TEMP,LSL#16
  3147. ADD X,X,#1
  3148. LDRB TEMP,[P,X]
  3149. LDRB TEMP,[Col,TEMP]
  3150. ADD T1,T1,TEMP,LSL#24
  3151. SUB X,X,#3
  3152. STR T1,[M,X]
  3153. SUBS X,X,#4
  3154. BGE SetMaskLoop
  3155. MOV PC,R14
  3156. [OPT PASS
  3157. .TestGT0
  3158. MOV R0,#0
  3159. .TestGT0loop
  3160. LDRB R4,[R1,R2]
  3161. CMP R4,#0:MVNNE R0,#0
  3162. SUBS R2,R2,R3
  3163. BGE TestGT0loop
  3164. MOV PC,R14
  3165.     v&AD=0:M=1:X=3:TEMP=4:DY=5:S=6:AD0=7
  3166. [OPT PASS
  3167. .GaussSeidel
  3168. MOV AD0,AD
  3169. .GSloop
  3170. LDRB TEMP,[M,X]
  3171. CMP TEMP,#0
  3172. BEQ GSscip
  3173. ADD AD,AD0,X,LSL#2
  3174. LDR S,[AD,#4]
  3175. "LDR TEMP,[AD,#-4]:ADD S,S,TEMP
  3176. !LDR TEMP,[AD,DY]:ADD S,S,TEMP
  3177. SUB AD,AD,DY
  3178. !LDR TEMP,[AD,#0]:ADD S,S,TEMP
  3179. ADD AD,AD,DY
  3180. LDR TEMP,[AD,#0]
  3181. SUB S,S,TEMP,ASL#2
  3182.  ADD S,S,S,ASR#1       ;1.5*D
  3183. !ADD S,S,S,ASR#2       ;1.75*D
  3184. MOV S,S,ASR#2
  3185. ADD S,S,TEMP
  3186. STR S,[AD,#0]
  3187. .GSscip
  3188. SUBS X,X,#1
  3189. BGT GSloop
  3190. MOV PC,R14
  3191. <A=0:TN=1:C=2:NP=3:X=4:Y=5:DX=6:TEMP=7:T=8:J=9:P=10:KL=11
  3192. [OPT PASS
  3193. .FillStoreAD EQUD0
  3194. .FillNP EQUD0
  3195. .FillAD EQUD0
  3196. .FillKL EQUD0
  3197.     .Fill
  3198. ,MOV T,R0:MOV J,#0:MOV P,R1:MOV P,P,LSL#2
  3199. ,LDR DX,MainX:LDR NP,FillNP:LDR KL,FillKL
  3200. .FillLoop
  3201. LDR TN,FillStoreAD
  3202. ADD TN,TN,NP,LSL#2
  3203. LDR X,[T,J]:ADD J,J,#4
  3204. #MOV Y,X,LSR#16:SUB X,X,Y,LSL#16
  3205. LDR A,FillAD
  3206. MLA A,DX,Y,A
  3207. ADD A,A,X
  3208. SUB TEMP,DX,#1
  3209. CMP X,TEMP
  3210. BGE Fill2
  3211. LDRB TEMP,[A,#1]
  3212. CMP TEMP,C
  3213. BNE Fill2
  3214. MOV TEMP,KL
  3215. STRB TEMP,[A,#1]
  3216. ADD TEMP,X,#1
  3217. ADD TEMP,TEMP,Y,LSL#16
  3218. STR TEMP,[TN],#4
  3219. ADD NP,NP,#1
  3220. .Fill2
  3221. CMP X,#0
  3222. BLE Fill3
  3223. LDRB TEMP,[A,#-1]
  3224. CMP TEMP,C
  3225. BNE Fill3
  3226. MOV TEMP,KL
  3227. STRB TEMP,[A,#-1]
  3228. SUB TEMP,X,#1
  3229. ADD TEMP,TEMP,Y,LSL#16
  3230. STR TEMP,[TN],#4
  3231. ADD NP,NP,#1
  3232. .Fill3
  3233. #LDR TEMP,MainY:SUB TEMP,TEMP,#1
  3234. CMP Y,TEMP:BGE Fill4
  3235. LDRB TEMP,[A,DX]
  3236. CMP TEMP,C
  3237. BNE Fill4
  3238. MOV TEMP,KL
  3239. STRB TEMP,[A,DX]
  3240. ADD TEMP,Y,#1
  3241. ADD TEMP,X,TEMP,LSL#16
  3242. STR TEMP,[TN],#4
  3243. ADD NP,NP,#1
  3244. .Fill4
  3245. CMP Y,#0:BLE Fill5
  3246. SUB A,A,DX
  3247. LDRB TEMP,[A]
  3248. CMP TEMP,C
  3249. BNE Fill5
  3250. MOV TEMP,KL
  3251. STRB TEMP,[A]
  3252. SUB TEMP,Y,#1
  3253. ADD TEMP,X,TEMP,LSL#16
  3254. STR TEMP,[TN],#4
  3255. ADD NP,NP,#1
  3256. .Fill5
  3257. CMP J,P
  3258. BLT FillLoop
  3259. STR NP,FillNP
  3260. MOV PC,R14
  3261. )AD=0:DX=1:S=2:T=3:DIL=4:NOI=4:B=5:X=6
  3262. [OPT PASS
  3263. .Neighbours
  3264. MOV DIL,R3:MOV B,R0
  3265. (LDR X,MainX:SUBS X,X,#2:MOVLE PC,R14
  3266. .NeighboursLoop
  3267. ADD AD,B,X
  3268. +LDRB T,[AD,#0]:CMP T,#0:BNE NeighboursC
  3269. LDR DX,MainX
  3270. MOV S,#0
  3271. SUB AD,AD,DX
  3272. )LDRB T,[AD,#-1]:CMP T,#1:ADDEQ S,S,#1
  3273. (LDRB T,[AD,#0]:CMP T,#1:ADDEQ S,S,#1
  3274. (LDRB T,[AD,#1]:CMP T,#1:ADDEQ S,S,#1
  3275. ADD AD,AD,DX
  3276. )LDRB T,[AD,#-1]:CMP T,#1:ADDEQ S,S,#1
  3277. (LDRB T,[AD,#1]:CMP T,#1:ADDEQ S,S,#1
  3278. ADD AD,AD,DX
  3279. )LDRB T,[AD,#-1]:CMP T,#1:ADDEQ S,S,#1
  3280. (LDRB T,[AD,#0]:CMP T,#1:ADDEQ S,S,#1
  3281. (LDRB T,[AD,#1]:CMP T,#1:ADDEQ S,S,#1
  3282. 6CMP S,DIL:MOVPL T,#2:SUB AD,AD,DX:STRPLB T,[AD,#0]
  3283. .NeighboursC
  3284. SUBS X,X,#1
  3285. BGT NeighboursLoop
  3286. MOV PC,R14
  3287. .Neighbours2
  3288. LDR DX,MainX
  3289. MOV NOI,R3:MOV B,R0
  3290. (LDR X,MainX:SUBS X,X,#2:MOVLE PC,R14
  3291. .Neighbours2Loop
  3292. MOV S,#0:ADD AD,B,X
  3293. ,LDRB T,[AD,#0]:CMP T,#1:BNE Neighbours2C
  3294. SUB AD,AD,DX
  3295. )LDRB T,[AD,#-1]:CMP T,#1:ADDGE S,S,#1
  3296. (LDRB T,[AD,#0]:CMP T,#1:ADDGE S,S,#1
  3297. (LDRB T,[AD,#1]:CMP T,#1:ADDGE S,S,#1
  3298. ADD AD,AD,DX
  3299. )LDRB T,[AD,#-1]:CMP T,#1:ADDGE S,S,#1
  3300. (LDRB T,[AD,#1]:CMP T,#1:ADDGE S,S,#1
  3301. ADD AD,AD,DX
  3302. )LDRB T,[AD,#-1]:CMP T,#1:ADDGE S,S,#1
  3303. (LDRB T,[AD,#0]:CMP T,#1:ADDGE S,S,#1
  3304. (LDRB T,[AD,#1]:CMP T,#1:ADDGE S,S,#1
  3305. 6CMP S,NOI:MOVPL T,#2:SUB AD,AD,DX:STRPLB T,[AD,#0]
  3306. MOV R0,S
  3307. .Neighbours2C
  3308. SUBS X,X,#1
  3309. BGT Neighbours2Loop
  3310. MOV PC,R14
  3311. AD=0:X=1:TEMP=2
  3312. [OPT PASS
  3313. .Filter
  3314. LDR X,MainN:SUB X,X,#1
  3315. .FilterLoop
  3316. LDRB TEMP,[AD,X]
  3317. CMP TEMP,#2
  3318. Q TEMP,#1:MOVNE TEMP,#0
  3319. STRB TEMP,[AD,X]
  3320. SUBS X,X,#1
  3321. BPL FilterLoop
  3322. MOV PC,R14
  3323. .Filter2
  3324. LDR X,MainN:SUB X,X,#1
  3325. .Filter2Loop
  3326. LDRB TEMP,[AD,X]
  3327. CMP TEMP,#1
  3328. Q TEMP,#2
  3329. STREQB TEMP,[AD,X]
  3330. SUBS X,X,#1
  3331. BPL Filter2Loop
  3332. MOV PC,R14
  3333. .Swap12
  3334. LDR X,MainN:SUB X,X,#1
  3335. .SwapLoop
  3336. LDRB TEMP,[AD,X]
  3337. CMP TEMP,#2
  3338. Q R8,#1:STREQB R8,[AD,X]
  3339. CMP TEMP,#1
  3340. Q R8,#2:STREQB R8,[AD,X]
  3341. SUBS X,X,#1
  3342. BPL SwapLoop
  3343. MOV PC,R14
  3344. -%S=0:L1=1:L2=2:RES=3:X=4:V1=5:V2=6
  3345. [OPT PASS
  3346. .Binary
  3347. 05MOV R7,#&1:ADD R7,R7,R7,LSL#8:ADD R7,R7,R7,LSL#16
  3348. LDR X,MainN:BIC X,X,#3
  3349. .BinaryLoop
  3350. LDR V1,[L1,X]
  3351. LDR V2,[L2,X]
  3352. .BinaryInstr
  3353.  RES,V1,V2
  3354. STR RES,[S,X]
  3355. SUBS X,X,#4
  3356. BGE BinaryLoop
  3357. MOV PC,R14
  3358. X=7:MASK=8:V=9:G=10:D=11
  3359. [OPT PASS
  3360. .Calc(0)
  3361. MOV R12,R14
  3362. MOV G,R1:MOV D,R2
  3363. MOV MASK,R0
  3364. LDR X,MainN
  3365.   .CalcLoop(0)
  3366.   SUBS X,X,#1
  3367.   MOVLT PC,R12
  3368.   MOV R0,X:BL ReadRGBfast
  3369.   MOV V,#0
  3370. H,  ADD R0,R0,R1:ADD R0,R0,R2:SUBS R0,R0,G
  3371.   RSBLT R0,R0,#0:CMP R0,D
  3372.   MOVLE V,#1
  3373.   STRB V,[MASK,X]
  3374. B CalcLoop(0)
  3375. N&X=7:MASK=8:V=9:R=10:G=11:B=12:D=13
  3376. [OPT PASS
  3377. .RGBopsl EQUD0:EQUD0:EQUD0
  3378. .Calc(1)
  3379. STR R13,CalcOpsl
  3380. STR R14,CalcOpsl+4
  3381. MOV MASK,R0
  3382. U'MOV R,R1:MOV G,R2:MOV B,R3:MOV D,R4
  3383. V1STR R,RGBopsl:STR G,RGBopsl+4:STR B,RGBopsl+8
  3384. LDR X,MainN
  3385.   .CalcLoop(1)
  3386.   SUBS X,X,#1
  3387.   BLT CalcEnd(1)
  3388.   MOV R0,X:BL ReadRGBfast
  3389.   MOV V,#0
  3390. ]4  LDR  R,RGBopsl:LDR G,RGBopsl+4:LDR B,RGBopsl+8
  3391. ^&  SUB R,R,R0:SUB G,G,R1:SUB B,B,R2
  3392. _   MOV R0,R:MOV R1,G:MOV R2,B
  3393. `)  MUL R0,R,R0:MUL R1,G,R1:MUL R2,B,R2
  3394.   ADD R0,R0,R1:ADD R0,R0,R2
  3395.   CMP R0,D
  3396.   MOVLE V,#1
  3397.   STRB V,[MASK,X]
  3398. B CalcLoop(1)
  3399. .CalcEnd(1)
  3400. LDR R13,CalcOpsl
  3401. LDR PC,CalcOpsl+4
  3402. .CalcOpsl EQUD0:EQUD0
  3403. k?Z=5:M=6:X=7:V=8:T=9:D=10:TEMP1=4:TEMP2=14:TR=13:TG=12:TB=11
  3404. [OPT PASS
  3405. .Calc(2)
  3406. STR R13,CalcOpsl
  3407. STR R14,CalcOpsl+4
  3408. p4MOV T,R0:LDRB TR,RGB:LDRB TG,RGB+1:LDRB TB,RGB+2
  3409. MOV Z,R1:MOV M,R2
  3410. LDR X,MainN
  3411. .CalcLoop(2)
  3412. SUBS X,X,#1
  3413.   BLT CalcEnd(1)
  3414.   MOV R0,X:BL ReadRGBfast
  3415.   ADD V,R0,R1:ADD V,V,R2
  3416.   MUL TEMP1,R0,T
  3417.   MUL TEMP2,TR,V
  3418. zC  SUB TEMP1,TEMP1,TEMP2:MOV TEMP2,TEMP1,ASR#2:MUL D,TEMP1,TEMP2
  3419.   MOV D,D,LSR#8
  3420.   MUL TEMP1,R1,T
  3421.   MUL TEMP2,TG,V
  3422. ~[  SUB TEMP1,TEMP1,TEMP2:MOV TEMP2,TEMP1,ASR#2:MUL TEMP2,TEMP1,TEMP2:ADD D,D,TEMP2,LSR#8
  3423.   MUL TEMP1,R2,T
  3424.   MUL TEMP2,TB,V
  3425. [  SUB TEMP1,TEMP1,TEMP2:MOV TEMP2,TEMP1,ASR#2:MUL TEMP2,TEMP1,TEMP2:ADD D,D,TEMP2,LSR#8
  3426. )  MUL TEMP1,V,T:MOV TEMP1,TEMP1,LSR#4
  3427. 5  MOV TEMP2,TEMP1:MUL TEMP2,TEMP1,TEMP2  ;V*V*T*T
  3428. /  MOV TEMP2,TEMP2,LSR#12:MUL TEMP2,Z,TEMP2:
  3429.   MOV TEMP2,TEMP2,LSR#6
  3430.   MOV R0,#0
  3431.   CMP D,TEMP2
  3432.   MOVLE R0,#1
  3433.   STRB R0,[M,X]
  3434. B CalcLoop(2)
  3435. ?L=0:S=1:Y=1:MAX=2:DX=3:Xacc=5:TEMP=6:V=7:TEL=10:YY=11:MM=12
  3436. [OPT PASS
  3437. !.ZOOM EQUD0:EQUD0:EQUD0:EQUD0
  3438. .ZOOMX EQUD0
  3439. .ZOOMY EQUD0
  3440. ._S0 EQUD0
  3441. ._XW EQUD0
  3442. ._MASK EQUD0
  3443. ._DY EQUD0
  3444. ._Y EQUD0
  3445. .DisplayMask
  3446. #MOV TEL,R0:MOV YY,#0:MOV MM,MAX
  3447. .DisplayMaskLoop2
  3448. LDR L,_Y:MOV L,L,LSR#18
  3449. LDR TEMP,MainX
  3450. MUL L,TEMP,L
  3451. LDR TEMP,_MASK
  3452. ADD L,L,TEMP
  3453. LDR TEMP,_XW
  3454. MUL S,TEMP,YY
  3455. LDR TEMP,_S0
  3456. ADD S,S,TEMP
  3457. MOV Xacc,#0
  3458. MOV MAX,MM
  3459. .DisplayMaskLoop
  3460. LDRB TEMP,[L,Xacc,ASR#18]
  3461. MOV V,TEMP,LSL#2
  3462. CMP V,#4:
  3463. Q V,#255
  3464. STRB V,[S],#1
  3465. ADD Xacc,Xacc,DX
  3466. SUBS MAX,MAX,#1
  3467. BGE DisplayMaskLoop
  3468. LDR V,_Y
  3469. LDR TEMP,_DY
  3470. ADD V,V,TEMP
  3471. STR V,_Y
  3472. ADD YY,YY,#1
  3473. SUBS TEL,TEL,#1
  3474. BGT DisplayMaskLoop2
  3475. .DoNothing
  3476. MOV PC,R14
  3477. DX=0:Y=1:L=1:CM=2:MASK=7:AD=8:Xacc=9:DX=10:Xmax=11:ER=4:EG=5:EB=6
  3478. L1=12:L2=13
  3479. [OPT PASS
  3480. .MaskColor EQUD0
  3481. .DisplayMainMask
  3482. 5STR R13,DisplayMainOpsl:STR R14,DisplayMainOpsl+4
  3483. MOV DX,R2:MOV R12,R1
  3484. $LDR Xmax,ZOOM+8:ADD Xmax,Xmax,#1
  3485. MOV R13,MASK:LDR MASK,_MASK
  3486. LDR R12,MainX
  3487. MLA MASK,R12,R13,MASK
  3488. LDR R13,_XW:LDR R14,_S0
  3489. MLA AD,R13,R3,R14
  3490. &LDR Xacc,ZOOM:MOV Xacc,Xacc,LSL#18
  3491. LDRB CM,MaskColor
  3492. .DisplayMainMaskLoop
  3493. LDRB R4,[MASK,Xacc,ASR#18]
  3494. #CMP R4,#0:
  3495. Q R0,CM:ADDEQ L,L,#1
  3496. LDRNEB R0,[L],#1
  3497. STRB R0,[AD],#1
  3498. ADD Xacc,Xacc,DX
  3499. CMP Xacc,Xmax,LSL#18
  3500. BLT DisplayMainMaskLoop
  3501. LDR R13,DisplayMainOpsl
  3502. LDR PC,DisplayMainOpsl+4
  3503. ._L1 EQUD0
  3504. ._L2 EQUD0
  3505. ".DisplayData EQUD0:EQUD0:EQUD0
  3506.  .DisplayMainOpsl EQUD0:EQUD0
  3507. .DisplayMain
  3508. 5STR R13,DisplayMainOpsl:STR R14,DisplayMainOpsl+4
  3509. #MOV DX,R2:MOV AD,R3:MOV MASK,R1
  3510. $LDR Xmax,ZOOM+8:ADD Xmax,Xmax,#1
  3511. LDR Xacc,ZOOM
  3512. MOV Xacc,Xacc,LSL#18
  3513. LDR L1,_L1
  3514. LDR L2,_L2
  3515. .DisplayLoop
  3516.  MOV Y,MASK:MOV X,Xacc,LSR#18
  3517. BL ReadRGB
  3518. ;LDR R3,[L1,#-1]
  3519. ";LDR R3,[L1,#-1]:;ADD R3,R3,R4
  3520.  LDR R3,[L1,#0]:;ADD R3,R3,R4
  3521. LDR R4,[L2,#0]:ADD R3,R3,R4
  3522. 6SUB R3,R3,#&80:SUB R3,R3,#&8000:SUB R3,R3,#&800000
  3523.  R4,R3,#&FF0000:MOV R4,R4,LSR#16:SUB R4,R4,#&80
  3524. ADD R0,R0,R4
  3525.  R4,R3,#&00FF00:MOV R4,R4,LSR#8:SUB R4,R4,#&80
  3526. ADD R1,R1,R4
  3527.  R4,R3,#&0000FF:SUB R4,R4,#&80
  3528. ADD R2,R2,R4
  3529. CMP R0,#255:MOVPL R0,#255
  3530. CMP R1,#255:MOVPL R1,#255
  3531. CMP R2,#255:MOVPL R2,#255
  3532. CMP R0,#0:MOVLT R0,#0
  3533. CMP R1,#0:MOVLT R1,#0
  3534. CMP R2,#0:MOVLT R2,#0
  3535. ADR R4,DisplayData
  3536. STMIA R4,{R0,R1,R2}
  3537. BL RGBtoPOKE
  3538. STRB R0,[AD],#1
  3539. BL getRGB8
  3540. ADR R4,DisplayData
  3541. LDMIA R4,{ER,EG,EB}
  3542. *SUB ER,ER,R0:SUB EG,EG,R1:SUB EB,EB,R2
  3543. MOV R0,#&80
  3544. <ADD ER,R0,ER,ASR#1:ADD EG,R0,EG,ASR#1:ADD EB,R0,EB,ASR#1
  3545. ADD R0,EB,EG,LSL#8
  3546. ADD R0,R0,ER,LSL#16
  3547. STR R0,[L1,#4]
  3548. STR R0,[L2,#0]
  3549. ADD L1,L1,#4:ADD L2,L2,#4
  3550. ADD Xacc,Xacc,DX
  3551. CMP Xacc,Xmax,LSL#18
  3552. BLT DisplayLoop
  3553. LDR R13,DisplayMainOpsl
  3554. LDR PC,DisplayMainOpsl+4
  3555. .DisplayMainFast
  3556. 5STR R13,DisplayMainOpsl:STR R14,DisplayMainOpsl+4
  3557. $MOV DX,R2:MOV AD,R3:;MOV MASK,R1
  3558. $LDR Xmax,ZOOM+8:ADD Xmax,Xmax,#1
  3559. LDR Xacc,ZOOM
  3560. MOV Xacc,Xacc,LSL#18
  3561. .DisplayLoopFast
  3562. ADD X,MASK,Xacc,LSR#18
  3563. BL ReadRGBfast
  3564. BL RGBtoPOKE
  3565. STRB R0,[AD],#1
  3566. ADD Xacc,Xacc,DX
  3567. CMP Xacc,Xmax,LSL#18
  3568. BLT DisplayLoopFast
  3569. LDR R13,DisplayMainOpsl
  3570. LDR PC,DisplayMainOpsl+4
  3571. #X=0:Y=1:R=0:G=1:B=2:TEMP=3:AD=4
  3572. [OPT PASS
  3573. .MainX EQUD0
  3574. .MainY EQUD0
  3575. .MainN EQUD0
  3576. .MainLine EQUD0
  3577. .MainL EQUD0
  3578. .Main24 EQUD0
  3579. .MainPal EQUD0
  3580. .MainEntry EQUD0
  3581. .MainData EQUD0
  3582. .RGB EQUD0
  3583. .ReadRGB
  3584. LDR TEMP,Main24
  3585. CMP TEMP,#0
  3586. BEQ ReadRGBpalette
  3587. LDR AD,MainData
  3588. '!ADD AD,AD,X:ADD AD,AD,X,LSL#1
  3589. LDR TEMP,MainLine
  3590. MUL TEMP,Y,TEMP
  3591. ADD AD,AD,TEMP
  3592. +0LDRB R,[AD,#0]:LDRB G,[AD,#1]:LDRB B,[AD,#2]
  3593. ,(STRB R,RGB:STRB G,RGB+1:STRB B,RGB+2
  3594. MOV PC,R14
  3595. .ReadRGBpalette
  3596. LDR AD,MainData
  3597. ADD AD,AD,X
  3598. LDR TEMP,MainLine
  3599. MUL TEMP,Y,TEMP
  3600. ADD AD,AD,TEMP
  3601. LDRB TEMP,[AD]
  3602. ADD TEMP,TEMP,TEMP,LSL#1
  3603. LDR AD,MainPal
  3604. ADD AD,AD,TEMP
  3605. LDRB R,[AD,#0]
  3606. LDRB G,[AD,#1]
  3607. LDRB B,[AD,#2]
  3608. ;(STRB R,RGB:STRB G,RGB+1:STRB B,RGB+2
  3609. MOV PC,R14
  3610. .ReadRGBfast
  3611. LDR TEMP,Main24
  3612. CMP TEMP,#0
  3613. BEQ ReadRGBpalettefast
  3614. LDR AD,MainData
  3615. C!ADD AD,AD,X:ADD AD,AD,X,LSL#1
  3616. D0LDRB R,[AD,#0]:LDRB G,[AD,#1]:LDRB B,[AD,#2]
  3617. MOV PC,R14
  3618. .ReadRGBpalettefast
  3619. LDR AD,MainData
  3620. LDRB TEMP,[AD,X]
  3621. ADD TEMP,TEMP,TEMP,LSL#1
  3622. LDR AD,MainPal
  3623. ADD AD,AD,TEMP
  3624. LDRB R,[AD,#0]
  3625. LDRB G,[AD,#1]
  3626. LDRB B,[AD,#2]
  3627. MOV PC,R14
  3628. .RGBtoPOKE
  3629. R'LDR R3,pal:CMP R3,#0:BNE RGBtoPOKE1
  3630. CMP R0,#0:MOVLT R0,#0
  3631. CMP R1,#0:MOVLT R1,#0
  3632. CMP R2,#0:MOVLT R2,#0
  3633. CMP R0,#255:MOVGT R0,#255
  3634. CMP R1,#255:MOVGT R1,#255
  3635. CMP R2,#255:MOVGT R2,#255
  3636. SUB R0,R0,R0,ASR#5
  3637. SUB R1,R1,R1,ASR#5
  3638. SUB R2,R2,R2,ASR#5
  3639.  R3,R0,#48:
  3640.  R4,R1,#48:
  3641.  R5,R2,#48
  3642. ])ADD R3,R3,R4:ADD R3,R3,R5:ADR R4,TTAB
  3643. LDRB R3,[R4,R3,LSR#4]
  3644. _3MOV R0,R0,LSR#6:MOV R1,R1,LSR#6:MOV R2,R2,LSR#6
  3645. ADD R3,R3,R1,LSL#5
  3646.  R4,R0,#1:ADD R3,R3,R4,LSL#2
  3647.  R4,R2,#1:ADD R3,R3,R4,LSL#3
  3648.  R4,R0,#2:ADD R3,R3,R4,LSL#3
  3649.  R4,R2,#2:ADD R0,R3,R4,LSL#6
  3650. MOV PC,R14
  3651. .RGBtoPOKE1
  3652. CMP R0,#0:MOVLT R0,#0
  3653. CMP R1,#0:MOVLT R1,#0
  3654. CMP R2,#0:MOVLT R2,#0
  3655. CMP R0,#255:MOVGT R0,#255
  3656. CMP R1,#255:MOVGT R1,#255
  3657. CMP R2,#255:MOVGT R2,#255
  3658. SUB R0,R0,R0,ASR#4
  3659. SUB R1,R1,R1,ASR#4
  3660. SUB R2,R2,R2,ASR#3
  3661. p3MOV R0,R0,LSR#5:MOV R1,R1,LSR#5:MOV R2,R2,LSR#6
  3662. MOV R3,R0,LSL#2
  3663.  R4,R1,#%110:ADD R3,R3,R4,LSL#4
  3664.  R4,R1,#%1:ADD R3,R3,R4
  3665.  R4,R2,#%10:ADD R3,R3,R4,LSL#6
  3666.  R4,R2,#%1:ADD R0,R3,R4,LSL#1
  3667. MOV PC,R14
  3668. w    .TTAB
  3669. EQUB 0
  3670. EQUB 0
  3671. EQUB 1
  3672. EQUB 1
  3673. EQUB 1
  3674. EQUB 2
  3675. EQUB 2
  3676. EQUB 3
  3677. EQUB 3
  3678. EQUB 3
  3679.     ALIGN
  3680. .getRGB8
  3681. .;Leest RGB waardes van r0=archimedes kleur
  3682. )STR R4,getRGB8O+12:STR R5,getRGB8O+16
  3683. %LDR R4,pal:CMP R4,#1:BEQ getRGB81
  3684. MOV R4,R0
  3685.  R0,R4,#16:MOV R0,R0,LSR#1:
  3686.  R5,R4,#7:ADD R0,R0,R5:MOV R0,R0,LSL#4;Rood
  3687.  R1,R4,#96:MOV R1,R1,LSL#1:
  3688.  R5,R4,#3:ADD R1,R1,R5,LSL#4;Groen
  3689.  R2,R4,#128:
  3690.  R5,R4,#8:ADD R2,R2,R5,LSL#3:
  3691.  R5,R4,#3:ADD R2,R2,R5,LSL#4;Blauw
  3692. <ADD R0,R0,R0,LSR#4:ADD R1,R1,R1,LSR#4:ADD R2,R2,R2,LSR#4
  3693. )LDR R4,getRGB8O+12:LDR R5,getRGB8O+16
  3694. (STR R0,rgb:STR R1,rgb+4:STR R2,rgb+8
  3695. MOV PC,R14
  3696. .getRGB81
  3697. MOV R4,R0
  3698.  R0,R4,#%11100:MOV R0,R0,LSL#3
  3699.  R1,R4,#%01100000:MOV R1,R1,LSL#1:
  3700.  R5,R4,#1:ADD R1,R1,R5,LSL#5
  3701.  R2,R4,#%10000000:
  3702.  R5,R4,#%10:ADD R2,R2,R5,LSL#5
  3703. <ADD R0,R0,R0,LSR#3:ADD R1,R1,R1,LSR#3:ADD R2,R2,R2,LSR#2
  3704. )LDR R4,getRGB8O+12:LDR R5,getRGB8O+16
  3705. (STR R0,rgb:STR R1,rgb+4:STR R2,rgb+8
  3706. MOV PC,R14
  3707. MOV R4,R0
  3708. .getRGB8O
  3709. +.rgb EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0
  3710. .pal EQUD 0
  3711. (X=5:Y=6:C=7:T=8:EX=9:A=10:EY=11:E=12
  3712. [OPT PASS
  3713. .EdgeVal EQUD0
  3714. .EdgeAd EQUD0
  3715. .EdgeOpsl EQUD0:EQUD0
  3716.     .Edge
  3717. 'STR R13,EdgeOpsl:STR R14,EdgeOpsl+4
  3718. LDR X,MainX:SUB X,X,#2
  3719. MOV Y,R1
  3720. ADR A,RGB
  3721. .EdgeLoopX
  3722. MOV E,#0:MOV C,#2
  3723. .EdgeLoop
  3724. SUB R0,X,#1:SUB R1,Y,#1
  3725. BL ReadRGB
  3726. LDRB EX,[A,C]
  3727. LDRB EY,[A,C]
  3728. MOV R0,X:SUB R1,Y,#1
  3729. BL ReadRGB
  3730. LDRB T,[A,C]
  3731. ADD EY,EY,T,LSL#1
  3732. ADD R0,X,#1:SUB R1,Y,#1
  3733. BL ReadRGB
  3734. LDRB T,[A,C]
  3735. SUB EX,EX,T:ADD EY,EY,T
  3736. SUB R0,X,#1:MOV R1,Y
  3737. BL ReadRGB
  3738. LDRB T,[A,C]
  3739. ADD EX,EX,T,LSL#1
  3740. ADD R0,X,#1:MOV R1,Y
  3741. BL ReadRGB
  3742. LDRB T,[A,C]
  3743. SUB EX,EX,T,LSL#1
  3744. SUB R0,X,#1:ADD R1,Y,#1
  3745. BL ReadRGB
  3746. LDRB T,[A,C]
  3747. ADD EX,EX,T:SUB EY,EY,T
  3748. MOV R0,X:ADD R1,Y,#1
  3749. BL ReadRGB
  3750. LDRB T,[A,C]
  3751. SUB EY,EY,T,LSL#1
  3752. ADD R0,X,#1:ADD R1,Y,#1
  3753. BL ReadRGB
  3754. LDRB T,[A,C]
  3755. SUB EX,EX,T:SUB EY,EY,T
  3756. MOV T,EX:MUL EX,T,EX
  3757. MOV T,EY:MUL EY,T,EY
  3758. ADD E,E,EX:ADD E,E,EY
  3759. SUBS C,C,#1
  3760. BPL EdgeLoop
  3761. LDR R0,EdgeAd
  3762. LDR T,EdgeVal
  3763. CMP E,T
  3764. MOV T,#0:MOVGT T,#1
  3765. STRB T,[R0,X]
  3766. SUBS X,X,#1
  3767. BGT EdgeLoopX
  3768. LDR R13,EdgeOpsl
  3769. LDR PC,EdgeOpsl+4
  3770. 'A=0:B=1:X=2:TEMP=3:S=4:L=5:T=L:TX=6
  3771. ,Lacc=12:Xacc=4:MLacc=2^Lacc:MXacc=2^Xacc
  3772. [OPT PASS
  3773. ._LI EQUD0
  3774. ._AD EQUD0
  3775. ._DA EQUD0
  3776. ._ML EQUD0
  3777. ._bpp EQUD0
  3778. ._Mu1 EQUD0
  3779. ._u0 EQUD0
  3780. ._u1 EQUD0
  3781. ._u2 EQUD0
  3782. ._v0 EQUD0
  3783. ._v1 EQUD0
  3784. ._v2 EQUD0
  3785. ._l1 EQUD0
  3786. ._l2 EQUD0
  3787. .Aacc EQUD0
  3788. .Bacc EQUD0
  3789. .Da EQUD0
  3790. .Db EQUD0
  3791. .morphx EQUD0
  3792. ._tri EQUD0
  3793. ._Msk EQUD0
  3794. ._Xmax EQUD0
  3795. .morph
  3796. MOV TEMP,#0
  3797. STR TEMP,morphx
  3798. .morphline
  3799. LDR A,Aacc
  3800. LDR B,Bacc
  3801. LDR TEMP,Da
  3802. ADD TEMP,TEMP,A
  3803. STR TEMP,Aacc
  3804. LDR TEMP,Db
  3805. ADD TEMP,TEMP,B
  3806. STR TEMP,Bacc
  3807. MOV A,A,ASR#12
  3808. MOV B,B,ASR#12
  3809. LDR TEMP,_Msk
  3810. LDR X,morphx
  3811. 'LDRB X,[TEMP,X]     ;check triangle
  3812. LDR TEMP,_tri
  3813. CMP TEMP,X
  3814. *BNE inx             ;in wrong triangle
  3815. STR R0,_l1
  3816. STR R1,_l2
  3817. LDR TEMP,_v0
  3818. LDR T,_l1
  3819. !MUL B,T,TEMP         ;B=L1*V0
  3820. LDR TEMP,_v1
  3821. LDR T,_l2
  3822. 'MLA B,T,TEMP,B       ;B=L1*V0+L2*V1
  3823. LDR TEMP,_v2
  3824. ADD B,B,TEMP,LSL#Lacc
  3825. ;ADD B,B,#1<< (Lacc+Xacc-1)
  3826. MOV B,B,ASR#Lacc+Xacc
  3827. CMP B,#0:MOVMI B,#0
  3828. LDR TEMP,_u0
  3829. LDR T,_l1
  3830. !MUL A,T,TEMP         ;A=L1*U0
  3831. LDR TEMP,_u1
  3832. LDR T,_l2
  3833. 'MLA A,T,TEMP,A       ;A=L1*U0+L2*U1
  3834. LDR TEMP,_u2
  3835. ADD A,A,TEMP,LSL#Lacc
  3836. ;ADD A,A,#1<< (Lacc+Xacc-1)
  3837. LDR TEMP,_Mu1
  3838. LDR X,morphx
  3839. MUL TEMP,X,TEMP
  3840. ADD A,A,TEMP,LSL#Xacc
  3841. MOV A,A,ASR#Lacc+Xacc
  3842. ADD TX,X,#1
  3843. STR TX,morphx
  3844. LDR TEMP,_bpp
  3845. MUL A,TEMP,A       ;A=3*A%
  3846. MUL X,TEMP,X       ;X=3*X%
  3847. LDR TEMP,_AD
  3848. '1ADD S,X,TEMP       ;Write address ;S=AD%+3*X%
  3849. LDR TEMP,_ML
  3850. )%MLA L,TEMP,B,A     ;L=B%*ml%+3*A%
  3851. LDR TEMP,_DA
  3852. +)ADD L,L,TEMP       ;L=Da%+B%*ml%+3*A%
  3853. LDRB TEMP,[L,#0]
  3854. STRB TEMP,[S,#0]
  3855. LDRB TEMP,[L,#1]
  3856. STRB TEMP,[S,#1]
  3857. LDRB TEMP,[L,#2]
  3858. STRB TEMP,[S,#2]
  3859. LDR X,morphx
  3860. LDR TEMP,_Xmax
  3861. CMP X,TEMP
  3862. BLT morphline
  3863. 6    B iny
  3864. LDR X,morphx
  3865. ADD X,X,#1
  3866. STR X,morphx
  3867. LDR TEMP,_Xmax
  3868. CMP X,TEMP
  3869. BLT morphline
  3870. LDR A,_AD
  3871. LDR TEMP,_LI
  3872. ADD A,A,TEMP
  3873. STR A,_AD
  3874. LDR A,_Msk
  3875. LDR TEMP,_Xmax
  3876. ADD A,A,TEMP
  3877. STR A,_Msk
  3878. MOV PC,R14
  3879. I%P0=0:P1=1:M0=2:M1=3:T=4:T0=5:T1=6
  3880. [OPT PASS
  3881. LDR T,MainN
  3882. M$ADD T,T,T,LSL#2        ;3*!MainN
  3883. SUB T,T,#1
  3884. .mixloop
  3885. LDRB T0,[P0,T]
  3886. LDRB T1,[P1,T]
  3887. MUL T0,M0,T0
  3888. MLA T0,M1,T1,T0
  3889. ADD T0,T0,#512
  3890. MOV T0,T0,LSR#10
  3891. STRB T0,[P0,T]
  3892. SUBS T,T,#1
  3893. BGT mixloop
  3894. MOV PC,R14
  3895. [9LAD=0:X=1:MAX=2:SAD=3:T=4:B=5:W1=10:W2=11:W3=12:W4=13
  3896. [OPT PASS
  3897. .CompressBitfield
  3898. LDR MAX,MainN
  3899. MOV SAD,LAD
  3900. MOV X,#0
  3901. .comloop
  3902. LDMIA (LAD),{W1,W2}
  3903. ADD LAD,LAD,#8
  3904.  T,W1,#1
  3905. TST W1,#1<<8:ADDNE T,T,#2
  3906. TST W1,#1<<16:ADDNE T,T,#4
  3907. TST W1,#1<<24:ADDNE T,T,#8
  3908. TST W2,#1:ADDNE T,T,#16
  3909. TST W2,#1<<8:ADDNE T,T,#32
  3910. TST W2,#1<<16:ADDNE T,T,#64
  3911. k TST W2,#1<<24:ADDNE T,T,#128
  3912. STRB T,[SAD],#1
  3913. ADD X,X,#8
  3914. CMP X,MAX
  3915. BLT comloop
  3916. MOV PC,R14
  3917. .DeCompressBitfield
  3918. LDR X,MainN
  3919. s*SUB X,X,#1:MOV X,X,LSR#3:MOV X,X,LSL#3
  3920. ADD SAD,LAD,X
  3921. ADD LAD,LAD,X,LSR#3
  3922. .decomloop
  3923. LDRB T,[LAD],#-1
  3924.  W1,T,#1
  3925. TST T,#2:ADDNE W1,W1,#1<<8
  3926. TST T,#4:ADDNE W1,W1,#1<<16
  3927. TST T,#8:ADDNE W1,W1,#1<<24
  3928. MOV W2,T,LSR#4:
  3929.  W2,W2,#1
  3930. TST T,#32:ADDNE W2,W2,#1<<8
  3931. ~ TST T,#64:ADDNE W2,W2,#1<<16
  3932. !TST T,#128:ADDNE W2,W2,#1<<24
  3933. STMIA SAD,{W1,W2}
  3934. SUB SAD,SAD,#8
  3935. SUBS X,X,#8
  3936. BPL decomloop
  3937. MOV PC,R14
  3938. Ecentre=0:dx=1:MASK=5:XMAX=6:store=7:TEMP=8:S=9:M=10:sharp=11:X=12
  3939. [OPT PASS
  3940. .sharpS EQUD0
  3941. .sharpM EQUD0
  3942. .sharpMask EQUD0
  3943. .sharpStore EQUD0
  3944. .sharpen
  3945. MOV X,#1
  3946. LDR store,sharpStore
  3947. LDR S,sharpS
  3948. LDR M,sharpM
  3949. LDR XMAX,MainX
  3950. SUB XMAX,XMAX,#2
  3951. LDR MASK,sharpMask
  3952. .sharploop
  3953. ADD centre,centre,#3
  3954. LDRB TEMP,[MASK,X]
  3955. CMP TEMP,#0
  3956. BEQ sharpcont
  3957. LDRB sharp,[centre,#3]
  3958. LDRB TEMP,[centre,#-3]
  3959. ADD sharp,sharp,TEMP
  3960. LDRB TEMP,[centre,dx]
  3961. ADD sharp,sharp,TEMP
  3962. RSB dx,dx,#0
  3963. LDRB TEMP,[centre,dx]
  3964. ADD sharp,sharp,TEMP
  3965. MUL sharp,S,sharp
  3966. LDRB TEMP,[centre,#0]
  3967. MUL TEMP,M,TEMP
  3968. SUB sharp,TEMP,sharp
  3969. MOV sharp,sharp,ASR#10
  3970. CMP sharp,#0
  3971. MOVLT sharp,#0
  3972. CMP sharp,#255
  3973. MOVGT sharp,#255
  3974. STRB sharp,[store,X]
  3975. .sharpcont
  3976. ADD X,X,#1
  3977. CMP X,XMAX
  3978. BLE sharploop
  3979. MOV PC,R14
  3980. .sharpback
  3981. MOV X,#1
  3982. LDR store,sharpStore
  3983. LDR XMAX,MainX
  3984. SUB XMAX,XMAX,#2
  3985. LDR MASK,sharpMask
  3986. .sharpbackloop
  3987. ADD centre,centre,#3
  3988. LDRB TEMP,[MASK,X]
  3989. CMP TEMP,#0
  3990. BEQ sharpbackcont
  3991. LDRB sharp,[store,X]
  3992. STRB sharp,[centre]
  3993. .sharpbackcont
  3994. ADD X,X,#1
  3995. CMP X,XMAX
  3996. BLE sharpbackloop
  3997. MOV PC,R14
  3998. $AD1=0:AD2=1:L=9:Y=10:T1=11:T2=12
  3999. [OPT PASS
  4000. .flipy
  4001. LDR Y,MainY
  4002. LDR L,MainLine
  4003. .flipyloop
  4004. LDRB T1,[AD1]
  4005. LDRB T2,[AD2]
  4006. STRB T1,[AD2]
  4007. STRB T2,[AD1]
  4008. ADD AD1,AD1,L
  4009. ADD AD2,AD2,L
  4010. SUBS Y,Y,#1
  4011. BPL flipyloop
  4012. MOV PC,R14
  4013. name(AD%,N%)
  4014.  A$,T%
  4015. <A$="":T%=0:
  4016.  AD%?T%>=31 
  4017.  T%<N%:A$=A$+
  4018. (AD%?T%):T%+=1:
  4019. defaults
  4020. %CHANNEL=
  4021. ("<Mask$Dir>.!Defaults")
  4022.  T%=1
  4023. #CHANNEL):
  4024.  A$=":"
  4025.   A$=
  4026. #CHANNEL)
  4027.  A$="="
  4028. V$="":
  4029. #CHANNEL):
  4030.  A<>34 
  4031.  V$=V$+
  4032.  C%=(A<32 ) 
  4033.  C%=( A<=32 
  4034.  A=34)
  4035.  A<>34 
  4036. (V$)-1)
  4037.  1:mode=V:
  4038.  V<0 
  4039.  V>127 
  4040. "Illegal mode":
  4041.        
  4042.  "on":defdma=1
  4043.        
  4044.  "off":defdma=0
  4045.        
  4046.  "auto":defdma=2
  4047. I    
  4048. "Error in !Defauls file:dma option unknown":defdma=2:B$=
  4049.         
  4050.        
  4051.  "off":deffd=0
  4052.        
  4053.  "on":deffd=1
  4054. Q    
  4055. "Error in !Defaults file:FastDisplay option unknown":deffd=0:B$=
  4056.         
  4057.  4:defpal=V:
  4058.  V<>0 
  4059.  V<>1 
  4060. "Error in !Defaults file:palette option unknown":defpal=0:B$=
  4061.        
  4062.  "off":undo=
  4063.        
  4064.  "on":undo=
  4065. L       
  4066. "Error in !Defaults file:Undo option unknown":undo=
  4067.         
  4068. #CHANNEL
  4069. swap_init
  4070.  Swap$(8),SwapLock(8),SwapLength(8),SwapAd(8)
  4071. Swap$()="InMemory"
  4072. SwapLock()=
  4073. swap_ensure(S%(0),S%(1),S%(2),S%(3))
  4074.  S%(3)
  4075.  S%(T%)>=0 
  4076.  SwapLock(S%(T%))=
  4077.  S%(T%)>=0 
  4078.  Swap$(S%(T%)) 
  4079.  "InMemory":
  4080. 9    
  4081.  "Crunched":
  4082. swap_makefree(MaskAmount):
  4083. uncrunch
  4084. 6    
  4085.  "OnDisc"  :
  4086. swap_makefree(SwapLength(S%(T%))
  4087.         
  4088. swap_makefree(amount)
  4089.  S%(3)
  4090. enough
  4091. *larg=
  4092. mc_maxblock:
  4093.  larg=
  4094. error$:
  4095. block=
  4096. mc_usage(MASK(1))
  4097.  amount<=larg 
  4098.          :
  4099.  Memory can be assigned
  4100.  amount<=free 
  4101. tidymem
  4102. #.    larg=
  4103. mc_maxblock:
  4104.  larg=
  4105. error$:
  4106. $G    
  4107.  amount<=larg 
  4108.      :
  4109.  Memory can be assigned after tidymem
  4110. %        
  4111. ensuremem(amount,main,M(0),M(1),M(2),M(3))
  4112.  larg,free,block
  4113. maskstatus()=0
  4114. enough=
  4115.  not enough space, so make space:
  4116.  T%=1 
  4117.  MaxMask%:maskstatus(T%)=0:
  4118.  0=free to use
  4119.  T%=0
  4120. 3:maskstatus(M(T%))=1:
  4121.       :
  4122.  1=not free to use
  4123. /9left=0:
  4124.  T%=1 
  4125.  MaxMask%:
  4126.  maskstatus(T%)=0 
  4127.  left+=1
  4128. maxfree=free+left*block
  4129.  main=
  4130.  maxfree+=
  4131. mc_usage(MAIN)
  4132.  amount > maxfree 
  4133.  :memory definitly can not be made free
  4134.  maskstatus(T%)=0 
  4135. 7B    A%=MASK(T%):
  4136.  CompressBitfield:
  4137. PRINT"Compressed mask:";T%
  4138. 8D    MASK(T%)=
  4139. mc_reassign(A%,MaskAmount/8+16):
  4140. error$:
  4141. 9G    maskstatus(T%)=2                      :
  4142.  2=bitfield compressed.
  4143.     free+=block
  4144. ;        
  4145. <    T%+=1
  4146.  T%>MaxMask% 
  4147.  amount<=free
  4148. >*larg=
  4149. mc_maxblock:
  4150.  larg=
  4151. error$:
  4152. enough=
  4153.  All masks are compressed and there is still not enough memory
  4154. restoremem
  4155.  T%,FLAG%
  4156. FLAG%=
  4157.  T%=1 
  4158.  MaxMask%
  4159.  maskstatus(T%)=2 
  4160.       FLAG%=
  4161. I5      
  4162.  (MaskAmount+16) > 
  4163. mc_maxblock 
  4164. tidymem
  4165. J7      MASK(T%)=
  4166. mc_reassign(MASK(T%),MaskAmount+16)
  4167. K&      
  4168. PRINT"Decompressing nr:";T%
  4169.       
  4170.  MASK(T%)=
  4171. "Due to memory problems, masks are lost. (sorry).":MaxMask%=T%-1 
  4172.  A%=MASK(T%):
  4173.  DeCompressBitfield
  4174.       
  4175.  FLAG% :
  4176. tidymem
  4177. mc_init(amount,page)
  4178.  A%,B%,C%
  4179.  inits memory controller, giving it 'amount' bytes off memory.
  4180. readcopymem:mc_page=page
  4181.  mc_page<16 
  4182.  mc_page=256
  4183. W#mc_amount=-
  4184. (-amount/page)*page
  4185.  mc_memory mc_amount
  4186. YCmc_max=amount/mc_page-1:
  4187.  mc_map mc_max+5:mc_map+=1:mc_map?-1=
  4188. ZEA%=mc_map:B%=mc_map+mc_max+2:C%=0:
  4189.  VULMEM:?(mc_map+mc_max+1)=255
  4190. error$="No error"
  4191. mc_restore(ad,amount)
  4192.  T1,T2
  4193. mc_nr(ad):
  4194. a&T2=
  4195. mc_nr(ad+amount-1):
  4196. mc_getnr:
  4197.  T%=T1 
  4198.  mc_map?T%<>0 
  4199.  error$="memory is occupied":=
  4200.   mc_map?T%=nr
  4201. mc_assign(amount)
  4202.  A%,B%,C%,T%
  4203.  amount>
  4204. mc_free 
  4205.  error$="Not enough memory, "+
  4206. (amount-
  4207. mc_free)+" Bytes too little.":=
  4208. mc_getnr:
  4209. m,mc_ad=
  4210. mc_bestfit(amount):
  4211.  mc_ad=
  4212. mc_nr(mc_ad)=
  4213. oKA%=mc_map+
  4214. mc_nr(mc_ad):B%=mc_map+
  4215. mc_nr(mc_ad+amount-1):C%=nr:
  4216.  VULMEM
  4217. =mc_ad
  4218. mc_free
  4219.  T%,F%:F%=0
  4220.  T%=0
  4221. mc_max:
  4222.  mc_map?T%=0 
  4223.  F%+=1
  4224. :=F%*mc_page
  4225. mc_maxblock
  4226.  T%,F%
  4227. mc_largest=-1:T%=0
  4228. {+F%=0:
  4229.  mc_map?T%=0:T%+=1:F%+=1:
  4230. :T%+=1
  4231.  F%>mc_largest 
  4232.  mc_largest=F%
  4233.  T%>mc_max
  4234. =mc_largest*mc_page
  4235. mc_getnr
  4236.  A%,B%,C%,D%,F%,T%,M%:M%=1
  4237. "A%=mc_max:B%=mc_map:C%=M%:D%=
  4238.  mc_getnr
  4239.     M%+=1
  4240.  M%>=255
  4241.  M%>=255 
  4242.  error$="Too many handles":=
  4243.     =M%-1
  4244. mc_nr(ad)
  4245. nr%=(ad-mc_memory)/mc_page
  4246.  nr%<0 
  4247.  nr%>mc_max 
  4248.  error$="handle is outside range":=
  4249. mc_showmap
  4250.  T%,N%
  4251.  T%=0
  4252. mc_max:N%=mc_map?T%
  4253.  N%>0 
  4254. (48+N%); 
  4255. mc_bestfit(amount)
  4256.  T%,best,len
  4257. mc_smallest=1E8:best=0:T%=0
  4258.  mc_map?T%<>0:T%+=1:
  4259.  T%<=mc_max 
  4260. +    len=0:
  4261.  mc_map?T%=0:len+=1:T%+=1:
  4262. S    
  4263.  (len*mc_page >= amount) 
  4264.  (len<mc_smallest) 
  4265.  mc_smallest=len:best=T%-len
  4266.         
  4267.  T%>mc_max
  4268.   mc_smallest=1E8 
  4269.  error$="Not enough continious memory.":=
  4270. =mc_memory+best*mc_page
  4271. mc_release(handle)
  4272.  A%,B%,C%,T%,nr
  4273. Gnr=mc_map?
  4274. mc_nr(handle):
  4275.  nr=0 
  4276.  error$="Handle does not exist":=
  4277. *A%=mc_map:B%=mc_max:C%=nr:
  4278.  mc_release
  4279. mc_usage(handle)
  4280.  T%,U%,nr
  4281. -U%=0:nr=mc_map?
  4282. mc_nr(handle):
  4283.  T%=0 
  4284.  mc_max:
  4285.  mc_map?T%=nr 
  4286.  U%+=1
  4287. =U%*mc_page
  4288. mc_reallocate(handle)
  4289.  nr,amount,T%
  4290. ,amount=
  4291. mc_usage(handle):
  4292.  amount=
  4293. mc_reassign(handle,amount):
  4294. mc_reassign(handle,amount)
  4295.  A%,B%,C%,T%,nr,ad,a
  4296. mc_usage(handle):
  4297.  amount<a 
  4298.  a=amount
  4299. mc_release(handle)=
  4300. error$:
  4301. mc_assign(amount):
  4302.  ad<>handle 
  4303. mc_nr(handle)<>
  4304.  A%=handle:B%=handle+a-1:C%=ad:
  4305.  FASTCOPYMEM
  4306. readcopymem
  4307.  COPYMEM 280
  4308.  CALL COPYMEM   (BeginLoad,EindLoad,BeginSave,-,-,0,0,0,0,0,0,0,0,0,0,0)
  4309.  Verplaats een stuk geheugen. Van BeginLoad tot EindLoad naar BeginSave
  4310.  CALL VULMEM   (Beginadres,Eindadres,Waarde,0,0,0,0,0,0,0,0,0,0,0,0,0)
  4311.  PASS=0
  4312. P%=COPYMEM
  4313. [OPT PASS
  4314. CMP R0,R2
  4315. BLS Anderevolgorde
  4316. .COPYMEMLOOP
  4317. LDRB R3,[R0],#1
  4318. STRB R3,[R2],#1
  4319. CMP R0,R1
  4320. BLE COPYMEMLOOP
  4321. MOV PC,R14
  4322. .Anderevolgorde
  4323. SUB R3,R2,R0
  4324. $ADD R3,R3,R1        ;R3=EindSave
  4325. .COPYLOOP2
  4326. LDRB R4,[R1],#-1
  4327. STRB R4,[R3],#-1
  4328. CMP R1,R0
  4329. BPL COPYLOOP2
  4330. MOV PC,R14
  4331. .FASTCOPYMEM
  4332. CMP R0,R2
  4333. BLS AnderevolgordeF
  4334. .FASTCOPYMEMLOOP
  4335. LDR R3,[R0],#4
  4336. STR R3,[R2],#4
  4337. CMP R0,R1
  4338. BLE FASTCOPYMEMLOOP
  4339. MOV PC,R14
  4340. .AnderevolgordeF
  4341. #MOV R1,R1,LSR#2:MOV R1,R1,LSL#2
  4342. SUB R3,R2,R0
  4343. $ADD R3,R3,R1        ;R3=EindSave
  4344. .FASTCOPYLOOP2
  4345. LDR R4,[R1],#-4
  4346. STR R4,[R3],#-4
  4347. CMP R1,R0
  4348. BPL FASTCOPYLOOP2
  4349. MOV PC,R14
  4350. .VULMEM
  4351. STRB R2,[R0],#1
  4352. CMP R0,R1
  4353. BLE VULMEM
  4354. MOV PC,R14
  4355. .mc_getnr
  4356. LDRB R4,[R1,R0]
  4357. CMP R4,R2:MVNEQ R3,#0
  4358. SUBS R0,R0,#1
  4359. BPL mc_getnr
  4360. MOV R0,R3
  4361. MOV PC,R14
  4362. .mc_release
  4363. MOV R4,#0
  4364. LDRB R3,[R0,R1]
  4365. CMP R3,R2
  4366. STREQB R4,[R0,R1]
  4367. SUBS R1,R1,#1
  4368. BPL mc_release
  4369. MOV PC,R14
  4370.