home *** CD-ROM | disk | FTP | other *** search
/ Dream 55 / Amiga_Dream_55.iso / RISCOS / MAGAZINE / LABOS / KING.ZIP / King / !FUNQTM / Waves (.txt) < prev   
RISC OS BBC BASIC V Source  |  1997-12-14  |  19KB  |  737 lines

  1.  Authors: Original 3D point and wave algo. code routine by Jan Vlietink.
  2.           Rest by KING.
  3.  Comments: Well that's my favourite FUNQTM's part. Code in BASIC/ass gives so good speed.    
  4.  "<Basic$Dir>.Library.General"
  5. General
  6. ShadowInit
  7. mode("X640 Y480 G256")
  8.  PROCmode("X320 Y256 G256")
  9. XS%=XScreen%
  10. YS%=YScreen%
  11. PP%=13
  12.     VU%=8
  13.  XS%=1024
  14.  "QTM_VUBarControl",1,4
  15. DAMP=11-7
  16. DM1=100
  17. DM2=100
  18. PROP=12-5
  19. !SH=6 : FIX=2^SH : 
  20.  Precision
  21. lengte=64+16
  22. WX%=50
  23. !PointSize%=WX%*WX%*12+5000*12
  24.  Punt% PointSize%
  25.  Punt2% PointSize%
  26.  Velo1% WX%*WX%*4+10000
  27.  Velo2% WX%*WX%*4+10000
  28. MotionSize%=4*3*4+8
  29.  Project% 1000*4*2
  30.  Motion% MotionSize%*100+4
  31.  Point_Type(3)
  32.  Plane_Type(3)
  33. buildpunt
  34.  A%=0 
  35.  PointSize% 
  36. Punt2%!A%=Punt%!A%
  37.  No velocity
  38.  A%=0 
  39.  WX%*WX%*4 
  40. Velo1%!A%=0
  41. Velo2%!A%=0
  42.  Pal% 256*4*2
  43. U%=255/3
  44. Grad(1,U%,255,0,255,255,255,0)
  45. Grad(U%,U%*2,255,255,0,0,255,255)
  46. Grad(U%*2,255,0,255,255,255,0,255)
  47. Pal%!0=0
  48. ?+Pal%!4=(255<<24) 
  49.  (255<<16) 
  50.  (255<<8)
  51.  "ColourTrans_WritePalette",-1,,Pal%
  52. buildmotion
  53.  XS%,YS%
  54. ShadowSwitch
  55.  set2
  56.  A%=Motion%
  57.  128,0,0,0
  58.  waves
  59. >500 
  60.  X%,Y%,C%
  61.   Motion%!TXD+=X%*FIX/10
  62.   Motion%!TYD+=Y%*FIX/10
  63.   Motion%!TZD+=Y%*FIX/10
  64.   Motion%!HZD+=X%*FIX/100
  65.   Motion%!HXD+=Y%*FIX/100
  66.   Motion%!HYD+=X%*FIX/100
  67. U%=255/3
  68. RndColors(RA%,GA%,BA%)
  69. RndColors(RB%,GB%,BB%)
  70. RndColors(RC%,GC%,BC%)
  71. Grad(1,U%,RA%,GA%,BA%,RB%,GB%,BB%)
  72. Grad(U%,U%*2,RB%,GB%,BB%,RC%,GC%,BC%)
  73. Grad(U%*2,255,RC%,GC%,BC%,RA%,GA%,BA%)
  74. Pal%!0=0
  75.  "ColourTrans_WritePalette",-1,,Pal%
  76.  Motion%!HZD=TIME/500*FIX*50
  77.  Motion%!HYD=
  78. /500*FIX*100
  79.  Motion%!TYD=-
  80. /500*FIX*100
  81.  Motion%!TZD=+
  82. /500*FIX*300
  83.  A%=Motion%
  84.  calc_rot_matrix
  85.  A%=A%!48
  86.  transform_draw
  87. ScreenSwitch
  88.  PASS=0 
  89.     P%=Q%
  90. [OPT PASS
  91. Screen    EQUD 0
  92.           EQUD 0
  93. .ScreenSwitch
  94.           ADR R0,Screen
  95.           LDR R1,[R0]
  96.           LDR R2,[R0,#4]
  97.           STR R2,[R0]
  98.           STR R1,[R0,#4]
  99. *          
  100.  &6,113,Bank%+1 : 
  101.  Screen
  102. Waves
  103.     EE=10
  104.  PASS=0 
  105.     P%=Q%
  106. [OPT PASS
  107. .Point    EQUD Punt%
  108.           EQUD Punt2%
  109. .Velo     EQUD Velo1%
  110.           EQUD Velo2%
  111. %.Adr      EQUD 4+12*(EE*WX%+EE)  
  112. '          EQUD 4+12*(EE*WX%+WX%-EE)
  113. )          EQUD 4+12*((WX%-EE)*WX%+EE)
  114. -          EQUD 4+12*((WX%-EE)*WX%+WX%-EE)
  115.  .Adr2     EQUD 4*(EE*WX%+EE)
  116. &          EQUD 4*((WX%-EE)*WX%+EE)
  117. *          EQUD 4*((WX%-EE)*WX%+WX%-EE)
  118. $          EQUD 4*(EE*WX%+WX%-EE)
  119. .Viscosity          EQUD 2 
  120. .waves
  121.   STMFD     R13!,{R14}
  122.   MOV R0,#0
  123.   SWI "QTM_ReadVULevels"
  124.   ADR R3,Point
  125.   LDR R1,[R3]
  126.   LDR R2,[R3,#4]
  127.   STR R2,[R3]
  128.   STR R1,[R3,#4]
  129.   ADR R3,Adr
  130.   ; Offsets pointed by R3
  131.   LDR R4,[R3] 
  132.  R5,R0,#&FF
  133.   MOV R0,R0,ASR #8
  134.   MOV R5,R5,LSL #VU%
  135.   STR R5,[R1,R4]
  136.   LDR R4,[R3,#4] 
  137.  R5,R0,#&FF
  138.   MOV R0,R0,ASR #8
  139.   MOV R5,R5,LSL #VU%
  140.   STR R5,[R1,R4]
  141.   LDR R4,[R3,#8] 
  142.  R5,R0,#&FF
  143.   MOV R0,R0,ASR #8
  144.   MOV R5,R5,LSL #VU%
  145.   STR R5,[R1,R4]
  146.   LDR R4,[R3,#12] 
  147.  R5,R0,#&FF
  148.   MOV R0,R0,ASR #8
  149.   MOV R5,R5,LSL #VU%
  150.   STR R5,[R1,R4]
  151.   ADR R0,Velo
  152.   LDR R9,[R0]
  153.   LDR R11,[R0,#4]
  154.   STR R11,[R0]
  155.   STR R9,[R0,#4]
  156.   MOV R0,#0
  157.   ADR R3,Adr2
  158.   LDR R4,[R3]
  159.   STR R0,[R9,R4]
  160.   LDR R4,[R3,#4]
  161.   STR R0,[R9,R4]
  162.   LDR R4,[R3,#8]
  163.   STR R0,[R9,R4]
  164.   LDR R4,[R3,#12]
  165.   STR R0,[R9,R4]
  166.   ADR R12,Viscosity
  167.   LDR R12,[R12]
  168.   MOV R0,R1
  169.   MOV R10,R2
  170.   ADD R0,R0,#4
  171.   ADD R10,R10,#4
  172.   MOV R1,#WX%
  173.   .koopy
  174.   MOV R2,#WX%
  175.     .koopx
  176.         
  177.     LDR R3,[R9] ; R3 v(x,y)
  178.     LDR R4,[R0] ; R4 h(x,y)
  179.     MOV R5,#0
  180.     MOV R6,#0
  181.     MOV R7,#0
  182.     MOV R8,#0
  183.         
  184.     CMP R2,#1
  185.     LDRNE R5,[R0,#12]
  186.     CMP R2,#WX%
  187.     LDRNE R6,[R0,#-12]
  188.     CMP R1,#1
  189.     LDRNE R7,[R0,#WX%*12]
  190.     CMP R1,#WX%
  191.     LDRNE R8,[R0,#-WX%*12]
  192.          
  193.     ADD R5,R5,R6
  194.     ADD R5,R5,R7
  195.     ADD R5,R5,R8
  196.     SUB R5,R5,R4,LSL #2
  197. /    ADD R3,R3,R5,ASR R12 : 
  198.  H Viscosity + 
  199. .    SUB R4,R4,R4,ASR #5 : 
  200.  V Viscosity - 
  201.         
  202. (    ADD R5,R4,R3;,ASR #1 :
  203.  TimeStep
  204.     STR R5,[R10] ; h'(x,y)
  205.     STR R3,[R11] ; v'(x,y)
  206.  h'(x,y)=
  207. N    
  208.  v'(x,y)=b*v(x,y)+c*((h(x-1,y)+h(x+1,y)+h(x,y-1)+h(x,y+1)-4*h(x,y))/4
  209.     ADD R0,R0,#12
  210.     ADD R10,R10,#12
  211.     ADD R9,R9,#4
  212.     ADD R11,R11,#4
  213.     SUBS R2,R2,#1
  214.     BNE koopx
  215.     SUBS R1,R1,#1
  216.   BNE koopy
  217.   LDMFD     13!,{PC}
  218.   MOV PC,R14
  219. /    Q%=P%
  220.  Q% 130000
  221.  INVERS 4*1024
  222.  DITABLE 4000*16*4
  223.  CSTABLE 4096*8
  224.  CTABLE 100*16
  225. Waves
  226.  PROCShadowSwitch
  227. calc_invers
  228. calc_cstable
  229. calc_divtable
  230. transform
  231. moveobjects
  232. calc_rot_matrix
  233. RotPalette
  234. RotPalette
  235.  PASS=0 
  236. G    P%=Q%
  237. [OPT PASS
  238. .Pal      EQUD Pal%
  239. .RotPalette
  240. L"          STMFD     R13!,{R14}
  241.           ADR       R0,Pal
  242.           LDR       R0,[R0]
  243.           MOV       R1,#256
  244. P"          LDR       R6,[R0,#4]
  245. Q$          ADD       R8,R0,#255*4
  246. R"          ADD       R0,R0,#4+4
  247.           
  248. .RotLoop:
  249. U"          LDMIA     R0,{R2-R5}
  250. V           SUB       R7,R0,#4
  251. W"          STMIA     R7,{R2-R5}
  252. X"          ADD       R0,R0,#4*4
  253. Y           SUBS      R1,R1,#4
  254.           BPL       RotLoop
  255.           STR       R6,[R8]
  256. \"          LDMFD     R13!,{R14}
  257.           MOVS      PC,R14
  258. buildpunt
  259. P%=Punt%
  260. L=lengte*FIX
  261. Point_Type(1)=P%
  262. Plane
  263. SphereRND
  264.  PROCBall(15000,15000,15000,10000)
  265. [OPT 0
  266. DCD (1<<30)
  267. Point_Type(3)=P%
  268. Plane
  269.  V=-1 
  270.  2/WX%
  271.  U=-1 
  272.  2/WX%
  273. (U*U+V*V)
  274.   [OPT 0
  275.   DCD U*L*3
  276.   DCD 0
  277.   DCD V*L*3
  278. SphereRND
  279.      A%=0
  280.   Y=(
  281. (2000)-1000)/1000
  282. (1-Y*Y)
  283.   X=(
  284. (2000)-1000)/1000
  285.   Z=(
  286. (2000)-1000)/1000
  287. (X*X+Z*Z)
  288.  D<>0 
  289.    X=X/D*N
  290.    Z=Z/D*N
  291.   [OPT 0
  292.   DCD X*20000
  293.   DCD Y*20000
  294.   DCD Z*20000
  295.   A%+=1
  296.  A%=500
  297. Ball(x,y,z,r)
  298.      A%=0
  299.   Y=(
  300. (2000)-1000)/1000
  301. (1-Y*Y)
  302.   X=(
  303. (2000)-1000)/1000
  304.   Z=(
  305. (2000)-1000)/1000
  306. (X*X+Z*Z)
  307.  D<>0 
  308.    X=X/D*N
  309.    Z=Z/D*N
  310.   R=r*X
  311.   [OPT 0
  312.   DCD X*R+x
  313.   DCD Y*R+y
  314.   DCD Z*R+z
  315.   A%+=1
  316.  A%=500
  317. buildmotion
  318.  PNTR
  319. -TXD=0:TYD=4:TZD=8:DTXD=12:DTYD=16:DTZD=20
  320. 0HXD=24:HYD=28:HZD=32:DHXD=36:DHYD=40:DHZD=44
  321. TYPE=1
  322. "PNTR=Motion%+(I-1)*MotionSize%
  323. )PNTR!TXD=0               : 
  324.  TX,TY,TZ
  325. PNTR!TYD=0
  326. PNTR!TZD=0
  327. PNTR!DTXD=0 : 
  328.  DTX,DTY,DTZ
  329. PNTR!DTYD=0
  330. PNTR!DTZD=0
  331. 6PNTR!HXD=0                            : 
  332.  HX,HY,HZ
  333. PNTR!HYD=0
  334. PNTR!HZD=0
  335. PNTR!DHXD=0 : 
  336.  DHX,DHY,DYZ
  337. PNTR!DHYD=0
  338. PNTR!DHZD=0
  339. PNTR!48=Point_Type(TYPE)
  340.  initial position of drawing and cleaning object is the same
  341. PNTRO=PNTR
  342. "PNTR=Motion%+(I-1)*MotionSize%
  343.  J=0 
  344. PNTR!J=PNTRO!J
  345. PNTR!48=Point_Type(TYPE)
  346. PNTR!56=1<<31
  347.  Nr of type objects
  348. calc_invers
  349. K=2<<20
  350.  I=1 
  351.  1023:INVERS!(4*I)=K/I+.5:
  352. calc_cstable
  353. /4096:V=2^15
  354. T2=CSTABLE+8*1024
  355. T3=CSTABLE+8*2048
  356. T4=CSTABLE+8*3072
  357.  H=0 
  358.  1023
  359.     K=F*H
  360. (K)*V:SN=
  361. (K)*V
  362. CSTABLE!(8*H)=CS
  363. CSTABLE!(8*H+4)=SN
  364. T2!(8*H)=-SN
  365. T2!(8*H+4)=CS
  366. T3!(8*H)=-CS
  367. T3!(8*H+4)=-SN
  368. T4!(8*H)=SN
  369. T4!(8*H+4)=-CS
  370. calc_divtable
  371. T=0:N=1:Q=2:I=3:J=4:DIT=5
  372.  PASS=0 
  373.     P%=Q%
  374. [OPT PASS
  375. .DNRD EQUD 4000*16
  376. .DITH EQUD DITABLE
  377. .calc_divtable
  378. %          STMFD     13!,{0-12,14}
  379.            LDR       DIT,DITH
  380.           LDR       I,DNRD
  381. .DVLOOP2
  382. "          MOV       T,#YS%<<12
  383.           MOV       N,I
  384.           MOV       J,#0
  385.           MOV       Q,#0
  386. .DVLOOP3
  387.           CMP       N,T
  388. "          MOVLO     N,N,LSL #1
  389.           ADDLO     J,J,#1
  390.           BLO       DVLOOP3
  391. !          MOV       N,N,LSR J
  392. .DVLOOP1
  393. !          CMP       T,N,LSL J
  394. #          SUBHS     T,T,N,LSL J
  395.           ADC       Q,Q,Q
  396.           SUBS      J,J,#1
  397.           BPL       DVLOOP1
  398. (          STR       Q,[DIT,I,LSL #2]
  399.           SUBS      I,I,#1
  400.           BNE       DVLOOP2
  401. %          LDMFD     13!,{0-12,PC}
  402.     Q%=P%
  403.  calc_divtable
  404. calc_rot_matrix
  405. CHX=0:SHX=1
  406. CHY=2:SHY=3
  407. CHZ=4:SHZ=5
  408. T=6:S=7:H=8
  409. DHX=3:DHY=4:DHZ=5
  410. HX=9:HY=10:HZ=11
  411. TX=9:TY=10:TZ=11
  412. !    CS=12
  413. SCR=0:COL=1
  414.  PASS=0 
  415. $    P%=Q%
  416. [OPT PASS
  417.  calc 3x4 transformation matrix on the basis of
  418.  hx,hy,hz and tx,ty,tz of the motion array
  419. .CSD EQUD CSTABLE
  420. .calc_rot_matrix
  421. *%          STMFD     13!,{0-12,14}
  422.           
  423.           MOV       H,0
  424.  Load angles  HX,HY,HZ
  425. .           ADD       T,H,#HXD
  426. /$          LDMIA     T,{HX,HY,HZ}
  427.  Do a modulo 4096 operation on the angles (=> periodic lookup)
  428.           MOV       S,#4096
  429.           SUB       S,S,#1
  430.  Lookup (cosHX,sinHX) (cosHY, sinHY) (cosHZ, sinHZ)
  431.           LDR       CS,CSD
  432.           CMP       HX,#0
  433. 6           RSBMI     HX,HX,#0
  434.           
  435.        HX,HX,S
  436. 8&          ADD       T,CS,HX,LSL #3
  437. 9#          LDMIA     T,{CHX,SHX}
  438. :"          RSBMI     SHX,SHX,#0
  439.           CMP       HY,#0
  440. <           RSBMI     HY,HY,#0
  441.           
  442.        HY,HY,S
  443. >&          ADD       T,CS,HY,LSL #3
  444. ?#          LDMIA     T,{CHY,SHY}
  445. @"          RSBMI     SHY,SHY,#0
  446.           CMP       HZ,#0
  447. B           RSBMI     HZ,HZ,#0
  448.           
  449.        HZ,HZ,S
  450. D&          ADD       T,CS,HZ,LSL #3
  451. E#          LDMIA     T,{CHZ,SHZ}
  452. F"          RSBMI     SHZ,SHZ,#0
  453.  Load displacement values TX,TY,TZ
  454. H           ADD       T,H,#TXD
  455. I$          LDMIA     T,{TX,TY,TZ}
  456.  ________First ROW____________
  457.  cosHY*cosHZ
  458.  cosHY*sinHZ
  459.  sinHY
  460. O!          MUL       T,CHY,CHZ
  461. P#          MOV       T,T,ASR #15
  462. Q!          MUL       S,CHY,SHZ
  463. R#          MOV       S,S,LSR #15
  464. S%          ADD       T,S,T,LSL #16
  465.           STR       T,A1D
  466. U(          ADD       T,TX,SHY,LSL #16
  467.           STR       T,A2D
  468.  _________Second ROW___________
  469.  -sinHX*sinHY*cosHZ-cosHX*sinHZ
  470.  -sinHX*sinHY*sinHZ+cosHX*cosHZ
  471.   sinHX*cosHY
  472. \!          MUL       T,SHX,SHY
  473. ]#          MOV       T,T,ASR #15
  474.           MOV       S,T
  475. _!          MUL       H,CHX,SHZ
  476. `!          MLA       T,CHZ,T,H
  477.           RSB       T,T,#0
  478. b#          MOV       T,T,ASR #15
  479. c!          MUL       H,CHX,CHZ
  480.           MUL       S,SHZ,S
  481.           SUB       S,H,S
  482. f#          MOV       S,S,LSR #15
  483. g%          ADD       T,S,T,LSL #16
  484.           STR       T,B1D
  485. i!          MUL       T,SHX,CHY
  486. j#          MOV       T,T,ASR #15
  487. k&          ADD       T,TY,T,LSL #16
  488.           STR       T,B2D
  489.  _______ Third ROW ___________
  490.  -cosHX*sinHY*cosHZ+sinHX*sinHZ
  491.  -cosHX*sinHY*sinHZ-sinHX*cosHZ
  492.   cosHX*cosHY
  493. r!          MUL       T,CHX,SHY
  494. s#          MOV       T,T,ASR #15
  495.           MOV       S,T
  496.           MUL       T,CHZ,T
  497. v!          MUL       H,SHX,SHZ
  498.           SUB       T,H,T
  499. x#          MOV       T,T,ASR #15
  500.           MUL       S,SHZ,S
  501. z#          MLA       H,SHX,CHZ,S
  502.           RSB       S,H,#0
  503. |#          MOV       S,S,LSR #15
  504. }%          ADD       T,S,T,LSL #16
  505.           STR       T,C1D
  506. !          MUL       T,CHX,CHY
  507. #          MOV       T,T,ASR #15
  508. &          ADD       T,TZ,T,LSL #16
  509.           STR       T,C2D
  510. %          LDMFD     13!,{0-12,PC}
  511.     Q%=P%
  512. moveobjects
  513. sentinel=1<<31
  514. xmin=150*FIX
  515. xmax=150*FIX
  516. ymin=150*FIX
  517. ymax=150*FIX
  518. zmin=0*FIX
  519. zmax=300*FIX
  520.  PASS=0 
  521.     P%=Q%
  522. [OPT PASS
  523. .tmp      EQUD 0
  524. .moveobjects
  525. "          STMFD     13!,{0-12}
  526.           STR       13,tmp
  527.           MOV       12,0
  528. .move_loop
  529. 6          LDMIA     12,{0,1,2,3,4,5,6,7,8,9,10,11}
  530. #          CMP       0,#sentinel
  531.            BEQ       move_end
  532. 0          ADD       0,0,3           ; x=x+dx
  533. "          ADD       13,0,#xmin
  534. B          CMP       13,#xmax+xmin   ; if x<xmin or x>xmax then
  535. :          RSBHI     3,3,#0          ; dx=-dx; x=x+2*dx
  536. $          ADDHI     0,0,3,LSL #1
  537.           ADD       1,1,4
  538. "          ADD       13,1,#ymin
  539. %          CMP       13,#ymax+ymin
  540.           RSBHI     4,4,#0
  541. $          ADDHI     1,1,4,LSL #1
  542.           ADD       2,2,5
  543. "          SUB       13,2,#zmin
  544. %          CMP       13,#zmax-zmin
  545.           RSBHI     5,5,#0
  546. $          ADDHI     2,2,5,LSL #1
  547. 2          ADD       6,6,9          ; hx=hx+dhx
  548.           ADD       7,7,10
  549.           ADD       8,8,11
  550. .          STMIA     12,{0,1,2,3,4,5,6,7,8}
  551. *          ADD       12,12,#MotionSize%
  552. !          BAL       move_loop
  553. .move_end LDR       13,tmp
  554. "          LDMFD     13!,{0-12}
  555.           MOV       PC,R14
  556. .moveobject
  557. "          STMFD     13!,{0-12}
  558.           STR       13,tmp
  559.           MOV       12,0
  560. 6          LDMIA     12,{0,1,2,3,4,5,6,7,8,9,10,11}
  561. 0          ADD       0,0,3           ; x=x+dx
  562. "          ADD       13,0,#xmin
  563. B          CMP       13,#xmax+xmin   ; if x<xmin or x>xmax then
  564. :          RSBHI     3,3,#0          ; dx=-dx; x=x+2*dx
  565. $          ADDHI     0,0,3,LSL #1
  566.           ADD       1,1,4
  567. "          ADD       13,1,#ymin
  568. %          CMP       13,#ymax+ymin
  569.           RSBHI     4,4,#0
  570. $          ADDHI     1,1,4,LSL #1
  571.           ADD       2,2,5
  572. "          SUB       13,2,#zmin
  573. %          CMP       13,#zmax-zmin
  574.           RSBHI     5,5,#0
  575. $          ADDHI     2,2,5,LSL #1
  576. 2          ADD       6,6,9          ; hx=hx+dhx
  577.           ADD       7,7,10
  578.           ADD       8,8,11
  579. .          STMIA     12,{0,1,2,3,4,5,6,7,8}
  580.           LDR       13,tmp
  581. "          LDMFD     13!,{0-12}
  582.           MOV       PC,R14
  583.     Q%=P%
  584. transform
  585. 3A1=0:A2=1:B1=2:B2=3:C1=4:C2=5:T=6:DIT=7:A=8:B=9
  586. !U=10:V=11:W=12:X=11:Y=13:Z=14
  587.  PASS=0 
  588.     P%=Q%
  589. [OPT PASS
  590. .A1D EQUD 0:.A2D EQUD 0
  591. .B1D EQUD 0:.B2D EQUD 0
  592. .C1D EQUD 0:.C2D EQUD 0
  593. .DITD EQUD DITABLE
  594. .VD EQUD 0
  595. .SP EQUD 0
  596. .LK EQUD 0
  597. .Lim      EQUD Punt%
  598. .Val      EQUD WX%*WX%*12
  599. .screen1 EQUD 148:EQUD -1
  600. .screen EQUD 0
  601.     .set2
  602. :ADR R0,screen1:ADR R1,screen:SWI "OS_ReadVduVariables"
  603. MOV PC,R14
  604. .COLD     EQUD 15
  605. .CTEL     EQUD 0
  606. .transform_draw
  607. %          STMFD     13!,{0-12,14}
  608.           MOV       A,0
  609.            ADR       R0,Point
  610.           LDR       A,[R0]
  611.           LDR       R1,Val
  612.           ADD       R1,A,R1
  613.           STR       R1,Lim
  614.           STR       13,SP
  615.           ADR       T,A1D
  616. 1          LDMIA     T,{A1,A2,B1,B2,C1,C2,DIT}
  617.     $          LDMIA     (A)!,{X,Y,Z}
  618.            LDR       B,screen
  619. .trans_draw
  620. <          MOV       T,C1,ASR #16         ; z transformed
  621.           MUL       W,T,X
  622. $          MOV       T,C1,LSL #16
  623. #          MOV       T,T,ASR #16
  624.           MLA       W,Y,T,W
  625. $          MOV       T,C2,ASR #16
  626.           MLA       W,Z,T,W
  627. $          MOV       T,C2,LSL #16
  628. #          MOV       T,T,ASR #16
  629. %          ADDS      W,T,W,ASR #15
  630. !          CMP       W,#10*FIX
  631.           BMI       nodraw
  632. <          MOV       T,A1,ASR #16         ; x transformed
  633.           MUL       U,X,T
  634. $          MOV       T,A1,LSL #16
  635. #          MOV       T,T,ASR #16
  636.           MLA       U,Y,T,U
  637. $          MOV       T,A2,ASR #16
  638.           MLA       U,Z,T,U
  639.  $          MOV       T,A2,LSL #16
  640. !#          MOV       T,T,ASR #16
  641. "%          ADD       U,T,U,ASR #15
  642. $;          MOV       T,B1,ASR #16        ; y transformed
  643.           MUL       V,T,X
  644. &$          MOV       T,B1,LSL #16
  645. '#          MOV       T,T,ASR #16
  646.           MLA       V,Y,T,V
  647. )$          MOV       T,B2,ASR #16
  648.           MLA       V,Z,T,V
  649. +$          MOV       T,B2,LSL #16
  650. ,#          MOV       T,T,ASR #16
  651. -%          ADD       V,T,V,ASR #15
  652. /H          LDR       W,[DIT,W,LSL #2]    ; perspective transformation
  653.           MUL       U,W,U
  654.           MUL       V,W,V
  655. 2$          MOV       U,U,ASR #PP%
  656. 3$          MOV       V,V,ASR #PP%
  657. 4"          ADD       U,U,#XS%/2
  658. 5"          RSB       V,V,#YS%/2
  659. 7C          CMP       U,#XS%              ; clipping and plotting
  660.           CMPLO     V,#YS%
  661. ]          
  662.  XS% 
  663.  1024
  664. OPT PASS
  665. >@          ADDLO     T,U,V,LSL #10        ; resolution factor
  666.           
  667. OPT PASS
  668. D$          ADDLO     T,V,V,LSL #2
  669. E?          ADDLO     T,U,T,LSL #7        ; resolution factor
  670.           
  671. OPT PASS
  672. K$          ADDLO     T,V,V,LSL #2
  673. L?          ADDLO     T,U,T,LSL #6        ; resolution factor
  674.           
  675. OPT PASS
  676.        
  677.           BHS       nodraw
  678. ; BRUNO          
  679. W"          MOV       Z,Y,ASR #5
  680.           CMP       Z,#0
  681.           CMPNE     Z,#1
  682.           
  683. Q     Z,#2
  684. ; BRUNO          
  685.           
  686.           LDR       Y,Lim
  687.           CMP       Y,A
  688.           MOVLT     Z,#1
  689.           
  690.           STRB      Z,[B,T]
  691.           
  692. c!          BLT       nodraw   
  693.           CMP       W,#0
  694.           ADDGT     Y,T,#1
  695.           STRGTB    Z,[B,Y]
  696.           
  697.           CMP       W,#300
  698. i           ADDGT     Y,T,#XS%
  699.           STRGTB    Z,[B,Y]
  700.           
  701.           CMP       W,#500
  702.           ADDGT     Y,Y,#1
  703.           STRGTB    Z,[B,Y]
  704. pE.nodraw   LDMIA     (A)!,{X,Y,Z}        ; U colour previous point
  705. q           CMP       X,#1<<30
  706. r"          BNE       trans_draw
  707. t    .skip
  708.           LDR       13,SP
  709. v%          LDMFD     13!,{0-12,PC}
  710. {    Q%=P%
  711. Grad(A%,B%,RA%,GA%,BA%,RB%,GB%,BB%)
  712.  D%=B%-A%
  713.  IncrR=(RB%-RA%)/D%
  714.  IncrG=(GB%-GA%)/D%
  715.  IncrB=(BB%-BA%)/D%
  716.  R=RA%
  717.  G=GA%
  718.  B=BA%
  719.  C%=A% 
  720.      R%=R
  721.      G%=G
  722.      B%=B
  723. . Pal%!(C%*4)=(B%<<24) 
  724.  (G%<<16) 
  725.  (R%<<8)
  726.  R+=IncrR
  727.  G+=IncrG
  728.  B+=IncrB
  729. RndColors(
  730.  0 : R%=255 : G%=0 : B%=0
  731.  1 : R%=255 : G%=255 : B%=0
  732.  2 : R%=0 : G%=255 : B%=0
  733.  3 : R%=0 : G%=255 : B%=255
  734.  4 : R%=0 : G%=0 : B%=255
  735.  5 : R%=255 : G%=0 : B%=255
  736.  6 : R%=255 : G%=255 : B%=255
  737.