Home » Archimedes archive » Acorn User » AU 1998-09.adf » Regulars » StarInfo/Brobecker/EnvMapRPC

StarInfo/Brobecker/EnvMapRPC

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Acorn User » AU 1998-09.adf » Regulars
Filename: StarInfo/Brobecker/EnvMapRPC
Read OK:
File size: 1CD7 bytes
Load address: 0000
Exec address: 0000
File contents
   10REM>>> Environment Mapping
   20REM    Alain BROBECKER (baah/Arm's Tech) on 05-Apr-1998
   30
   40REM==== ASM CODE ============================================================
   50DIMcode% 1024:FORopt%=0TO2STEP2:P%=code%:[opt opt%
   60.old_stack              ; Used to save r13, will overwrite on 'envmap' routine
   70
   80;\\\\\\\\\\\\\\\\\\\\\\\\\\\
   90; Calculate Environment Map >
  100;///////////////////////////
  110;This routine creates the environment map. We calculate the intensity as an
  120;affine function of the distance d=SQR(x^2+y^2).
  130;           r0=adress where to save 128*128 environment map
  140.envmap
  150  stmfd     r13!,{r0-r5,r14}
  160  mov       r1,#256                 ; y coord
  170.env_y
  180  mov       r2,#256                 ; x coord
  190  sub       r4,r1,#128              ; r5=y-128
  200  mul       r3,r4,r4                ; r4=(y-128)^2
  210.env_x
  220  sub       r14,r2,#128             ; r14=x-128
  230  mla       r5,r14,r14,r3           ; r6=(x-128)^2+(y-128)^2
  240  FNsqrt(4,5,14)                    ; r5=sqrt((x-128)^2+(y-128)^2)
  250  mov       r4,r4,lsl #1
  260  rsbS      r4,r4,#255              ; r5=255-2*sqrt(...)
  270  movMI     r4,#0
  280  strB      r4,[r0],#1              ; Save pixel
  290 subS r2,r2,#1:bNE env_x            ; Next pixel
  300 subS r1,r1,#1:bNE env_y            ; Next line
  310  ldmfd     r13!,{r0-r5,pc}^
  320
  330;\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  340; Compute Displacements Table>
  350;////////////////////////////
  360;This routine use the height field image to create the displacement table.
  370;Formulaes are disp_x(x;y)=h(x+1;y)-h(x-1;y) & disp_y(x;y)=h(x;y+1)-h(x;y-1).
  380;           r0=adress of heights
  390;           r1=table which will contain disp_x, disp_y
  400.displacements
  410  stmfd     r13!,{r0-r5,r14}
  420  mov       r2,#0                   ; y<<24
  430.disp_y
  440  mov       r3,#0                   ; x<<24
  450.disp_x
  460  add       r5,r0,r2,lsr #16        ; r5=h(0;y)
  470  sub       r4,r3,#1<<24            ; r4=(x-1 mod 255)<<24
  480  ldrB      r4,[r5,r4,lsr #24]      ; r4=h(x-1;y)
  490  add       r14,r3,#1<<24           ; r14=(x+1 mod 255)<<24
  500  ldrB      r14,[r5,r14,lsr #24]    ; r14=h(x+1;y)
  510  sub       r4,r14,r4               ; r4=h(x+1;y)-h(x-1;y)
  520  mov       r4,r4,asr #1
  530  add       r4,r4,#128
  540  strB      r4,[r1],#1
  550  add       r5,r0,r3,lsr #24        ; r5=h(x;0)
  560  sub       r4,r2,#1<<24            ; r4=(y-1 mod 255)<<24
  570  ldrB      r4,[r5,r4,lsr #16]      ; r4=h(x;y-1)
  580  add       r14,r2,#1<<24           ; r14=(y+1 mod 255)<<24
  590  ldrB      r14,[r5,r14,lsr #16]    ; r14=h(x;y+1)
  600  sub       r4,r14,r4               ; r4=h(x;y+1)-h(x;y-1)
  610  mov       r4,r4,asr #1
  620  add       r4,r4,#128
  630  strB      r4,[r1],#1
  640 addS r3,r3,#1<<24:bNE disp_x       ; x=(x+1 mod255)<<24, continue if <>0
  650 addS r2,r2,#1<<24:bNE disp_x       ; y=(y+1 mod255)<<24, continue if <>0
  660  ldmfd     r13!,{r0-r5,pc}^
  670
  680;\\\\\\\\\\\\\\\\\\\\\\\\\\
  690; Draw Environment Mapping >
  700;//////////////////////////
  710;For each screen pixel we compute which pixel to copy from environment map.
  720;Formula is screen(x;y)=envmap(disp_x(x;y)+lx-x;disp_y(x;y)+ly-y).
  730;           r0=vram
  740;           r1=table with disp_x, disp_y
  750;           r2=adress of 256*256 environment map
  760;           r3=lx
  770;           r4=ly
  780.draw_env
  790  stmfd     r13!,{r0-r12,r14}
  800  str       r13,old_stack
  810  mov       r5,#0                   ; r5=y<<24
  820.draw_y
  830  mov       r6,#0                   ; r6=x<<24
  840  sub       r11,r4,r5,lsr #24       ; r11=ly-y
  850.draw_x4
  860  sub       r12,r3,r6,lsr #24       ; r12=lx-x
  870  ldmia     r1!,{r13,r14}           ; Load 4*2 displacements
  880  mov       r9,#0                   ; Will contain 4 points
  890  and       r7,r13,#&ff             ; r7=disp_x
  900  and       r8,r13,#&ff00           ; r8=disp_y<<8
  910  addS      r7,r7,r12               ; r7=dx=disp_x+lx-x
  920  addGES    r8,r8,r11,lsl #8        ; r8=dy<<8=(disp_y+ly-y)<<8
  930  bMI       draw_next1              ; Don't draw if dx<0 or dy<0
  940  cmp       r7,#&ff
  950  cmpLE     r8,#&ff00
  960  addLE     r8,r7,r8                ; If dx<256 and dy<256, r8=dy<<8+dx
  970  ldrLEB    r9,[r2,r8]              ; And put envmap(dx;dy) in r9
  980.draw_next1
  990  sub       r12,r12,#1              ; lx-x-=1 (ie x+=1)
 1000  and       r7,r13,#&ff0000         ; Similar, 2nd pixel
 1010  addS      r7,r7,r12,lsl #16
 1020  addGES    r8,r11,r13,lsr #24
 1030  bMI       draw_next2
 1040  cmp       r7,#&ff0000
 1050  cmpLE     r8,#&ff
 1060  addLE     r8,r7,r8,lsl #24  
 1070  ldrLEB    r8,[r2,r8,lsr #16]
 1080  addLE     r9,r9,r8,lsl #8
 1090.draw_next2
 1100  sub       r12,r12,#1
 1110  and       r7,r14,#&ff             ; 3rd pixel
 1120  and       r8,r14,#&ff00
 1130  addS      r7,r7,r12
 1140  addGES    r8,r8,r11,lsl #8
 1150  bMI       draw_next3
 1160  cmp       r7,#&ff
 1170  cmpLE     r8,#&ff00
 1180  addLE     r8,r7,r8
 1190  ldrLEB    r8,[r2,r8]
 1200  addLE     r9,r9,r8,lsl #16
 1210.draw_next3
 1220  sub       r12,r12,#1
 1230  and       r7,r14,#&ff0000         ; 4th pixel
 1240  addS      r7,r7,r12,lsl #16
 1250  addGES    r8,r11,r14,lsr #24
 1260  bMI       draw_next4
 1270  cmp       r7,#&ff0000
 1280  cmpLE     r8,#&ff
 1290  addLE     r8,r7,r8,lsl #24
 1300  ldrLEB    r8,[r2,r8,lsr #16]
 1310  addLE     r9,r9,r8,lsl #24
 1320.draw_next4
 1330  str       r9,[r0],#4              ; Save 4 pixels
 1340 addS r6,r6,#4<<24:bNE draw_x4      ; x+=4<<24, continue if <>0
 1350  add       r0,r0,#320-256          ; Next vram line
 1360 addS r5,r5,#1<<24:bNE draw_y       ; y+=1<<24, continue if <>0
 1370  ldr       r13,old_stack
 1380  ldmfd     r13!,{r0-r12,pc}^
 1390  
 1400.screenmode
 1410  dcd   1
 1420  dcd   320
 1430  dcd   256
 1440  dcd   3
 1450  dcd   -1
 1460  dcd   0:dcd 128
 1461  dcd   3:dcd 255
 1470  dcd   -1
 1480  
 1490]:NEXTopt%:PRINT"Assembly code is ";P%-code%;" bytes long"
 1500
 1510REM==== BASIC CODE ==========================================================
 1520DIMenvmap% 65536
 1530DIMdisp% 65536*2
 1540REMLoad height field and compute displacements
 1550PRINT"Computing displacements" 
 1560A%=envmap%:B%=disp%
 1570f%=OPENIN("Height256"):SYS"OS_GBPB",4,f%,A%,65536:CLOSE#f%
 1580CALLdisplacements
 1590REMCreate environment map
 1600PRINT"Computing environment map"
 1610A%=envmap%:CALLenvmap
 1620
 1630REMScreen & color initialisation. Then let the show begin.
 1640MODE15:SYS"OS_ScreenMode",0,screenmode:OFF
 1650DIMv% 8:!v%=148:v%!4=-1:SYS"OS_ReadVduVariables",v%,v%:v%=!v%
 1651FORc%=1TO255
 1652 w%=255*(c%/255)^1.2
 1653 g%=w%*w%/255
 1654 r%=SQRw%*15
 1655 b%=w%*EXP(-w%*w%/500)
 1680 COLOURc%,r%,g%,b%
 1690NEXTc%
 1700b%=2
 1710B%=disp%
 1720C%=envmap%
 1730REPEAT
 1740 WAIT:SYS"OS_Byte",&71,b%:b%=b%EOR3:SYS"OS_Byte",&70,b%
 1750 A%=v%+(b%>>1)*81920+32
 1760 MOUSEx%,y%,z%
 1770 D%=(x%>>1)-32:E%=256-(y%>>1)
 1780 CALLdraw_env
 1790UNTILFALSE
 1800
 1810REM==== MACROS ====================================================
 1820REMm0=sqrt(m1).
 1830DEFFNsqrt(m0,m1,m2)
 1840LOCALn%
 1850[opt opt%
 1860  mov       m0,#0                   ; This is ripped from Jan/BASS.
 1870  mov       m2,#1<<30               ;  |
 1880  cmp       m1,m2                   ;  |
 1890  subHS     m1,m0,m2                ;  |
 1900  adc       m0,m0,m0                ;  |
 1910]:FORn%=2TO30STEP2:[opt opt%
 1920  add       m2,m0,#1<<30            ;  |
 1930  cmp       m1,m2,ror #n%           ;  |
 1940  subHS     m1,m1,m2,ror #n%        ;  |
 1950  adc       m0,m0,m0                ; End of ripped code.
 1960]:NEXTn%:[opt opt%
 1970  cmp       m1,m0                   ; Flags=val-root.
 1980  addPL     m0,m0,#1                ; Round to nearest integer.
 1990]:=""

�>>> Environment Mapping
9�    Alain BROBECKER (baah/Arm's Tech) on 05-Apr-1998

(O�==== ASM CODE ============================================================
2.�code% 1024:�opt%=0�2�2:P%=code%:[opt opt%
<R.old_stack              ; Used to save r13, will overwrite on 'envmap' routine
F
P ;\\\\\\\\\\\\\\\\\\\\\\\\\\\
Z!; Calculate Environment Map >
d ;///////////////////////////
nO;This routine creates the environment map. We calculate the intensity as an
x4;affine function of the distance d=SQR(x^2+y^2).
�?;           r0=adress where to save 128*128 environment map
�.envmap
�   stmfd     r13!,{r0-r5,r14}
�1  mov       r1,#256                 ; y coord
�
.env_y
�1  mov       r2,#256                 ; x coord
�2  sub       r4,r1,#128              ; r5=y-128
�6  mul       r3,r4,r4                ; r4=(y-128)^2
�
.env_x
�3  sub       r14,r2,#128             ; r14=x-128
�@  mla       r5,r14,r14,r3           ; r6=(x-128)^2+(y-128)^2
�E  �sqrt(4,5,14)                    ; r5=sqrt((x-128)^2+(y-128)^2)
�  mov       r4,r4,lsl #1
<  rsbS      r4,r4,#255              ; r5=255-2*sqrt(...)
  movMI     r4,#0
4  strB      r4,[r0],#1              ; Save pixel
"4 subS r2,r2,#1:bNE env_x            ; Next pixel
,3 subS r1,r1,#1:bNE env_y            ; Next line
6   ldmfd     r13!,{r0-r5,pc}^
@
J!;\\\\\\\\\\\\\\\\\\\\\\\\\\\\
T"; Compute Displacements Table>
^!;////////////////////////////
hN;This routine use the height field image to create the displacement table.
rQ;Formulaes are disp_x(x;y)=h(x+1;y)-h(x-1;y) & disp_y(x;y)=h(x;y+1)-h(x;y-1).
|$;           r0=adress of heights
�:;           r1=table which will contain disp_x, disp_y
�.displacements
�   stmfd     r13!,{r0-r5,r14}
�/  mov       r2,#0                   ; y<<24
�.disp_y
�/  mov       r3,#0                   ; x<<24
�.disp_x
�3  add       r5,r0,r2,lsr #16        ; r5=h(0;y)
�>  sub       r4,r3,#1<<24            ; r4=(x-1 mod 255)<<24
�5  ldrB      r4,[r5,r4,lsr #24]      ; r4=h(x-1;y)
�?  add       r14,r3,#1<<24           ; r14=(x+1 mod 255)<<24
�6  ldrB      r14,[r5,r14,lsr #24]    ; r14=h(x+1;y)
�>  sub       r4,r14,r4               ; r4=h(x+1;y)-h(x-1;y)
  mov       r4,r4,asr #1
  add       r4,r4,#128
  strB      r4,[r1],#1
&3  add       r5,r0,r3,lsr #24        ; r5=h(x;0)
0>  sub       r4,r2,#1<<24            ; r4=(y-1 mod 255)<<24
:5  ldrB      r4,[r5,r4,lsr #16]      ; r4=h(x;y-1)
D?  add       r14,r2,#1<<24           ; r14=(y+1 mod 255)<<24
N6  ldrB      r14,[r5,r14,lsr #16]    ; r14=h(x;y+1)
X>  sub       r4,r14,r4               ; r4=h(x;y+1)-h(x;y-1)
b  mov       r4,r4,asr #1
l  add       r4,r4,#128
v  strB      r4,[r1],#1
�M addS r3,r3,#1<<24:bNE disp_x       ; x=(x+1 mod255)<<24, continue if <>0
�M addS r2,r2,#1<<24:bNE disp_x       ; y=(y+1 mod255)<<24, continue if <>0
�   ldmfd     r13!,{r0-r5,pc}^
�
�;\\\\\\\\\\\\\\\\\\\\\\\\\\
� ; Draw Environment Mapping >
�;//////////////////////////
�O;For each screen pixel we compute which pixel to copy from environment map.
�F;Formula is screen(x;y)=envmap(disp_x(x;y)+lx-x;disp_y(x;y)+ly-y).
�;           r0=vram
�,;           r1=table with disp_x, disp_y
�4;           r2=adress of 256*256 environment map
�;           r3=lx
;           r4=ly

.draw_env
!  stmfd     r13!,{r0-r12,r14}
   str       r13,old_stack
*2  mov       r5,#0                   ; r5=y<<24
4.draw_y
>2  mov       r6,#0                   ; r6=x<<24
H2  sub       r11,r4,r5,lsr #24       ; r11=ly-y
R.draw_x4
\2  sub       r12,r3,r6,lsr #24       ; r12=lx-x
f@  ldmia     r1!,{r13,r14}           ; Load 4*2 displacements
p?  mov       r9,#0                   ; Will contain 4 points
z3  and       r7,r13,#&ff             ; r7=disp_x
�6  and       r8,r13,#&ff00           ; r8=disp_y<<8
�;  addS      r7,r7,r12               ; r7=dx=disp_x+lx-x
�C  addGES    r8,r8,r11,lsl #8        ; r8=dy<<8=(disp_y+ly-y)<<8
�D  bMI       draw_next1              ; Don't draw if dx<0 or dy<0
�  cmp       r7,#&ff
�  cmpLE     r8,#&ff00
�K  addLE     r8,r7,r8                ; If dx<256 and dy<256, r8=dy<<8+dx
�E  ldrLEB    r9,[r2,r8]              ; And put envmap(dx;dy) in r9
�.draw_next1
�;  sub       r12,r12,#1              ; lx-x-=1 (ie x+=1)
�<  and       r7,r13,#&ff0000         ; Similar, 2nd pixel
�!  addS      r7,r7,r12,lsl #16
�"  addGES    r8,r11,r13,lsr #24
  bMI       draw_next2
  cmp       r7,#&ff0000
  cmpLE     r8,#&ff
$"  addLE     r8,r7,r8,lsl #24  
."  ldrLEB    r8,[r2,r8,lsr #16]
8  addLE     r9,r9,r8,lsl #8
B.draw_next2
L  sub       r12,r12,#1
V3  and       r7,r14,#&ff             ; 3rd pixel
`  and       r8,r14,#&ff00
j  addS      r7,r7,r12
t   addGES    r8,r8,r11,lsl #8
~  bMI       draw_next3
�  cmp       r7,#&ff
�  cmpLE     r8,#&ff00
�  addLE     r8,r7,r8
�  ldrLEB    r8,[r2,r8]
�   addLE     r9,r9,r8,lsl #16
�.draw_next3
�  sub       r12,r12,#1
�3  and       r7,r14,#&ff0000         ; 4th pixel
�!  addS      r7,r7,r12,lsl #16
�"  addGES    r8,r11,r14,lsr #24
�  bMI       draw_next4
�  cmp       r7,#&ff0000
  cmpLE     r8,#&ff

   addLE     r8,r7,r8,lsl #24
"  ldrLEB    r8,[r2,r8,lsr #16]
   addLE     r9,r9,r8,lsl #24
(.draw_next4
27  str       r9,[r0],#4              ; Save 4 pixels
<C addS r6,r6,#4<<24:bNE draw_x4      ; x+=4<<24, continue if <>0
F8  add       r0,r0,#320-256          ; Next vram line
PC addS r5,r5,#1<<24:bNE draw_y       ; y+=1<<24, continue if <>0
Z  ldr       r13,old_stack
d!  ldmfd     r13!,{r0-r12,pc}^
n  
x.screenmode
�
  dcd   1
�  dcd   320
�  dcd   256
�
  dcd   3
�  dcd   -1
�  dcd   0:dcd 128
�  dcd   3:dcd 255
�  dcd   -1
�  
�7]:�opt%:�"Assembly code is ";P%-code%;" bytes long"
�
�O�==== BASIC CODE ==========================================================
��envmap% 65536
��disp% 65536*2
0�Load height field and compute displacements
�"Computing displacements" 
A%=envmap%:B%=disp%
"4f%=�("Height256"):ș"OS_GBPB",4,f%,A%,65536:�#f%
,�displacements
6�Create environment map
@ �"Computing environment map"
JA%=envmap%:�envmap
T
^<�Screen & color initialisation. Then let the show begin.
h(�15:ș"OS_ScreenMode",0,screenmode:�
r>�v% 8:!v%=148:v%!4=-1:ș"OS_ReadVduVariables",v%,v%:v%=!v%
s
�c%=1�255
t w%=255*(c%/255)^1.2
u g%=w%*w%/255
v r%=�w%*15
w b%=w%*�(-w%*w%/500)
� �c%,r%,g%,b%
��c%
�b%=2
�B%=disp%
�C%=envmap%
��
�5 Ȗ:ș"OS_Byte",&71,b%:b%=b%�3:ș"OS_Byte",&70,b%
� A%=v%+(b%>>1)*81920+32
� ȗx%,y%,z%
�! D%=(x%>>1)-32:E%=256-(y%>>1)
� �draw_env
���

E�==== MACROS ====================================================
�m0=sqrt(m1).
&ݤsqrt(m0,m1,m2)
0�n%
:
[opt opt%
DG  mov       m0,#0                   ; This is ripped from Jan/BASS.
N,  mov       m2,#1<<30               ;  |
X,  cmp       m1,m2                   ;  |
b,  subHS     m1,m0,m2                ;  |
l,  adc       m0,m0,m0                ;  |
v]:�n%=2�30�2:[opt opt%
�,  add       m2,m0,#1<<30            ;  |
�,  cmp       m1,m2,ror #n%           ;  |
�,  subHS     m1,m1,m2,ror #n%        ;  |
�=  adc       m0,m0,m0                ; End of ripped code.
�]:�n%:[opt opt%
�9  cmp       m1,m0                   ; Flags=val-root.
�C  addPL     m0,m0,#1                ; Round to nearest integer.
�	]:=""
�
00000000  0d 00 0a 1c f4 3e 3e 3e  20 45 6e 76 69 72 6f 6e  |.....>>> Environ|
00000010  6d 65 6e 74 20 4d 61 70  70 69 6e 67 0d 00 14 39  |ment Mapping...9|
00000020  f4 20 20 20 20 41 6c 61  69 6e 20 42 52 4f 42 45  |.    Alain BROBE|
00000030  43 4b 45 52 20 28 62 61  61 68 2f 41 72 6d 27 73  |CKER (baah/Arm's|
00000040  20 54 65 63 68 29 20 6f  6e 20 30 35 2d 41 70 72  | Tech) on 05-Apr|
00000050  2d 31 39 39 38 0d 00 1e  04 0d 00 28 4f f4 3d 3d  |-1998......(O.==|
00000060  3d 3d 20 41 53 4d 20 43  4f 44 45 20 3d 3d 3d 3d  |== ASM CODE ====|
00000070  3d 3d 3d 3d 3d 3d 3d 3d  3d 3d 3d 3d 3d 3d 3d 3d  |================|
*
000000a0  3d 3d 3d 3d 3d 3d 3d 3d  0d 00 32 2e de 63 6f 64  |========..2..cod|
000000b0  65 25 20 31 30 32 34 3a  e3 6f 70 74 25 3d 30 b8  |e% 1024:.opt%=0.|
000000c0  32 88 32 3a 50 25 3d 63  6f 64 65 25 3a 5b 6f 70  |2.2:P%=code%:[op|
000000d0  74 20 6f 70 74 25 0d 00  3c 52 2e 6f 6c 64 5f 73  |t opt%..<R.old_s|
000000e0  74 61 63 6b 20 20 20 20  20 20 20 20 20 20 20 20  |tack            |
000000f0  20 20 3b 20 55 73 65 64  20 74 6f 20 73 61 76 65  |  ; Used to save|
00000100  20 72 31 33 2c 20 77 69  6c 6c 20 6f 76 65 72 77  | r13, will overw|
00000110  72 69 74 65 20 6f 6e 20  27 65 6e 76 6d 61 70 27  |rite on 'envmap'|
00000120  20 72 6f 75 74 69 6e 65  0d 00 46 04 0d 00 50 20  | routine..F...P |
00000130  3b 5c 5c 5c 5c 5c 5c 5c  5c 5c 5c 5c 5c 5c 5c 5c  |;\\\\\\\\\\\\\\\|
00000140  5c 5c 5c 5c 5c 5c 5c 5c  5c 5c 5c 5c 0d 00 5a 21  |\\\\\\\\\\\\..Z!|
00000150  3b 20 43 61 6c 63 75 6c  61 74 65 20 45 6e 76 69  |; Calculate Envi|
00000160  72 6f 6e 6d 65 6e 74 20  4d 61 70 20 3e 0d 00 64  |ronment Map >..d|
00000170  20 3b 2f 2f 2f 2f 2f 2f  2f 2f 2f 2f 2f 2f 2f 2f  | ;//////////////|
00000180  2f 2f 2f 2f 2f 2f 2f 2f  2f 2f 2f 2f 2f 0d 00 6e  |/////////////..n|
00000190  4f 3b 54 68 69 73 20 72  6f 75 74 69 6e 65 20 63  |O;This routine c|
000001a0  72 65 61 74 65 73 20 74  68 65 20 65 6e 76 69 72  |reates the envir|
000001b0  6f 6e 6d 65 6e 74 20 6d  61 70 2e 20 57 65 20 63  |onment map. We c|
000001c0  61 6c 63 75 6c 61 74 65  20 74 68 65 20 69 6e 74  |alculate the int|
000001d0  65 6e 73 69 74 79 20 61  73 20 61 6e 0d 00 78 34  |ensity as an..x4|
000001e0  3b 61 66 66 69 6e 65 20  66 75 6e 63 74 69 6f 6e  |;affine function|
000001f0  20 6f 66 20 74 68 65 20  64 69 73 74 61 6e 63 65  | of the distance|
00000200  20 64 3d 53 51 52 28 78  5e 32 2b 79 5e 32 29 2e  | d=SQR(x^2+y^2).|
00000210  0d 00 82 3f 3b 20 20 20  20 20 20 20 20 20 20 20  |...?;           |
00000220  72 30 3d 61 64 72 65 73  73 20 77 68 65 72 65 20  |r0=adress where |
00000230  74 6f 20 73 61 76 65 20  31 32 38 2a 31 32 38 20  |to save 128*128 |
00000240  65 6e 76 69 72 6f 6e 6d  65 6e 74 20 6d 61 70 0d  |environment map.|
00000250  00 8c 0b 2e 65 6e 76 6d  61 70 0d 00 96 20 20 20  |....envmap...   |
00000260  73 74 6d 66 64 20 20 20  20 20 72 31 33 21 2c 7b  |stmfd     r13!,{|
00000270  72 30 2d 72 35 2c 72 31  34 7d 0d 00 a0 31 20 20  |r0-r5,r14}...1  |
00000280  6d 6f 76 20 20 20 20 20  20 20 72 31 2c 23 32 35  |mov       r1,#25|
00000290  36 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |6               |
000002a0  20 20 3b 20 79 20 63 6f  6f 72 64 0d 00 aa 0a 2e  |  ; y coord.....|
000002b0  65 6e 76 5f 79 0d 00 b4  31 20 20 6d 6f 76 20 20  |env_y...1  mov  |
000002c0  20 20 20 20 20 72 32 2c  23 32 35 36 20 20 20 20  |     r2,#256    |
000002d0  20 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 78  |             ; x|
000002e0  20 63 6f 6f 72 64 0d 00  be 32 20 20 73 75 62 20  | coord...2  sub |
000002f0  20 20 20 20 20 20 72 34  2c 72 31 2c 23 31 32 38  |      r4,r1,#128|
00000300  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
00000310  72 35 3d 79 2d 31 32 38  0d 00 c8 36 20 20 6d 75  |r5=y-128...6  mu|
00000320  6c 20 20 20 20 20 20 20  72 33 2c 72 34 2c 72 34  |l       r3,r4,r4|
00000330  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000340  3b 20 72 34 3d 28 79 2d  31 32 38 29 5e 32 0d 00  |; r4=(y-128)^2..|
00000350  d2 0a 2e 65 6e 76 5f 78  0d 00 dc 33 20 20 73 75  |...env_x...3  su|
00000360  62 20 20 20 20 20 20 20  72 31 34 2c 72 32 2c 23  |b       r14,r2,#|
00000370  31 32 38 20 20 20 20 20  20 20 20 20 20 20 20 20  |128             |
00000380  3b 20 72 31 34 3d 78 2d  31 32 38 0d 00 e6 40 20  |; r14=x-128...@ |
00000390  20 6d 6c 61 20 20 20 20  20 20 20 72 35 2c 72 31  | mla       r5,r1|
000003a0  34 2c 72 31 34 2c 72 33  20 20 20 20 20 20 20 20  |4,r14,r3        |
000003b0  20 20 20 3b 20 72 36 3d  28 78 2d 31 32 38 29 5e  |   ; r6=(x-128)^|
000003c0  32 2b 28 79 2d 31 32 38  29 5e 32 0d 00 f0 45 20  |2+(y-128)^2...E |
000003d0  20 a4 73 71 72 74 28 34  2c 35 2c 31 34 29 20 20  | .sqrt(4,5,14)  |
000003e0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000003f0  20 20 3b 20 72 35 3d 73  71 72 74 28 28 78 2d 31  |  ; r5=sqrt((x-1|
00000400  32 38 29 5e 32 2b 28 79  2d 31 32 38 29 5e 32 29  |28)^2+(y-128)^2)|
00000410  0d 00 fa 1c 20 20 6d 6f  76 20 20 20 20 20 20 20  |....  mov       |
00000420  72 34 2c 72 34 2c 6c 73  6c 20 23 31 0d 01 04 3c  |r4,r4,lsl #1...<|
00000430  20 20 72 73 62 53 20 20  20 20 20 20 72 34 2c 72  |  rsbS      r4,r|
00000440  34 2c 23 32 35 35 20 20  20 20 20 20 20 20 20 20  |4,#255          |
00000450  20 20 20 20 3b 20 72 35  3d 32 35 35 2d 32 2a 73  |    ; r5=255-2*s|
00000460  71 72 74 28 2e 2e 2e 29  0d 01 0e 15 20 20 6d 6f  |qrt(...)....  mo|
00000470  76 4d 49 20 20 20 20 20  72 34 2c 23 30 0d 01 18  |vMI     r4,#0...|
00000480  34 20 20 73 74 72 42 20  20 20 20 20 20 72 34 2c  |4  strB      r4,|
00000490  5b 72 30 5d 2c 23 31 20  20 20 20 20 20 20 20 20  |[r0],#1         |
000004a0  20 20 20 20 20 3b 20 53  61 76 65 20 70 69 78 65  |     ; Save pixe|
000004b0  6c 0d 01 22 34 20 73 75  62 53 20 72 32 2c 72 32  |l.."4 subS r2,r2|
000004c0  2c 23 31 3a 62 4e 45 20  65 6e 76 5f 78 20 20 20  |,#1:bNE env_x   |
000004d0  20 20 20 20 20 20 20 20  20 3b 20 4e 65 78 74 20  |         ; Next |
000004e0  70 69 78 65 6c 0d 01 2c  33 20 73 75 62 53 20 72  |pixel..,3 subS r|
000004f0  31 2c 72 31 2c 23 31 3a  62 4e 45 20 65 6e 76 5f  |1,r1,#1:bNE env_|
00000500  79 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 4e  |y            ; N|
00000510  65 78 74 20 6c 69 6e 65  0d 01 36 20 20 20 6c 64  |ext line..6   ld|
00000520  6d 66 64 20 20 20 20 20  72 31 33 21 2c 7b 72 30  |mfd     r13!,{r0|
00000530  2d 72 35 2c 70 63 7d 5e  0d 01 40 04 0d 01 4a 21  |-r5,pc}^..@...J!|
00000540  3b 5c 5c 5c 5c 5c 5c 5c  5c 5c 5c 5c 5c 5c 5c 5c  |;\\\\\\\\\\\\\\\|
00000550  5c 5c 5c 5c 5c 5c 5c 5c  5c 5c 5c 5c 5c 0d 01 54  |\\\\\\\\\\\\\..T|
00000560  22 3b 20 43 6f 6d 70 75  74 65 20 44 69 73 70 6c  |"; Compute Displ|
00000570  61 63 65 6d 65 6e 74 73  20 54 61 62 6c 65 3e 0d  |acements Table>.|
00000580  01 5e 21 3b 2f 2f 2f 2f  2f 2f 2f 2f 2f 2f 2f 2f  |.^!;////////////|
00000590  2f 2f 2f 2f 2f 2f 2f 2f  2f 2f 2f 2f 2f 2f 2f 2f  |////////////////|
000005a0  0d 01 68 4e 3b 54 68 69  73 20 72 6f 75 74 69 6e  |..hN;This routin|
000005b0  65 20 75 73 65 20 74 68  65 20 68 65 69 67 68 74  |e use the height|
000005c0  20 66 69 65 6c 64 20 69  6d 61 67 65 20 74 6f 20  | field image to |
000005d0  63 72 65 61 74 65 20 74  68 65 20 64 69 73 70 6c  |create the displ|
000005e0  61 63 65 6d 65 6e 74 20  74 61 62 6c 65 2e 0d 01  |acement table...|
000005f0  72 51 3b 46 6f 72 6d 75  6c 61 65 73 20 61 72 65  |rQ;Formulaes are|
00000600  20 64 69 73 70 5f 78 28  78 3b 79 29 3d 68 28 78  | disp_x(x;y)=h(x|
00000610  2b 31 3b 79 29 2d 68 28  78 2d 31 3b 79 29 20 26  |+1;y)-h(x-1;y) &|
00000620  20 64 69 73 70 5f 79 28  78 3b 79 29 3d 68 28 78  | disp_y(x;y)=h(x|
00000630  3b 79 2b 31 29 2d 68 28  78 3b 79 2d 31 29 2e 0d  |;y+1)-h(x;y-1)..|
00000640  01 7c 24 3b 20 20 20 20  20 20 20 20 20 20 20 72  |.|$;           r|
00000650  30 3d 61 64 72 65 73 73  20 6f 66 20 68 65 69 67  |0=adress of heig|
00000660  68 74 73 0d 01 86 3a 3b  20 20 20 20 20 20 20 20  |hts...:;        |
00000670  20 20 20 72 31 3d 74 61  62 6c 65 20 77 68 69 63  |   r1=table whic|
00000680  68 20 77 69 6c 6c 20 63  6f 6e 74 61 69 6e 20 64  |h will contain d|
00000690  69 73 70 5f 78 2c 20 64  69 73 70 5f 79 0d 01 90  |isp_x, disp_y...|
000006a0  12 2e 64 69 73 70 6c 61  63 65 6d 65 6e 74 73 0d  |..displacements.|
000006b0  01 9a 20 20 20 73 74 6d  66 64 20 20 20 20 20 72  |..   stmfd     r|
000006c0  31 33 21 2c 7b 72 30 2d  72 35 2c 72 31 34 7d 0d  |13!,{r0-r5,r14}.|
000006d0  01 a4 2f 20 20 6d 6f 76  20 20 20 20 20 20 20 72  |../  mov       r|
000006e0  32 2c 23 30 20 20 20 20  20 20 20 20 20 20 20 20  |2,#0            |
000006f0  20 20 20 20 20 20 20 3b  20 79 3c 3c 32 34 0d 01  |       ; y<<24..|
00000700  ae 0b 2e 64 69 73 70 5f  79 0d 01 b8 2f 20 20 6d  |...disp_y.../  m|
00000710  6f 76 20 20 20 20 20 20  20 72 33 2c 23 30 20 20  |ov       r3,#0  |
00000720  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000730  20 3b 20 78 3c 3c 32 34  0d 01 c2 0b 2e 64 69 73  | ; x<<24.....dis|
00000740  70 5f 78 0d 01 cc 33 20  20 61 64 64 20 20 20 20  |p_x...3  add    |
00000750  20 20 20 72 35 2c 72 30  2c 72 32 2c 6c 73 72 20  |   r5,r0,r2,lsr |
00000760  23 31 36 20 20 20 20 20  20 20 20 3b 20 72 35 3d  |#16        ; r5=|
00000770  68 28 30 3b 79 29 0d 01  d6 3e 20 20 73 75 62 20  |h(0;y)...>  sub |
00000780  20 20 20 20 20 20 72 34  2c 72 33 2c 23 31 3c 3c  |      r4,r3,#1<<|
00000790  32 34 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |24            ; |
000007a0  72 34 3d 28 78 2d 31 20  6d 6f 64 20 32 35 35 29  |r4=(x-1 mod 255)|
000007b0  3c 3c 32 34 0d 01 e0 35  20 20 6c 64 72 42 20 20  |<<24...5  ldrB  |
000007c0  20 20 20 20 72 34 2c 5b  72 35 2c 72 34 2c 6c 73  |    r4,[r5,r4,ls|
000007d0  72 20 23 32 34 5d 20 20  20 20 20 20 3b 20 72 34  |r #24]      ; r4|
000007e0  3d 68 28 78 2d 31 3b 79  29 0d 01 ea 3f 20 20 61  |=h(x-1;y)...?  a|
000007f0  64 64 20 20 20 20 20 20  20 72 31 34 2c 72 33 2c  |dd       r14,r3,|
00000800  23 31 3c 3c 32 34 20 20  20 20 20 20 20 20 20 20  |#1<<24          |
00000810  20 3b 20 72 31 34 3d 28  78 2b 31 20 6d 6f 64 20  | ; r14=(x+1 mod |
00000820  32 35 35 29 3c 3c 32 34  0d 01 f4 36 20 20 6c 64  |255)<<24...6  ld|
00000830  72 42 20 20 20 20 20 20  72 31 34 2c 5b 72 35 2c  |rB      r14,[r5,|
00000840  72 31 34 2c 6c 73 72 20  23 32 34 5d 20 20 20 20  |r14,lsr #24]    |
00000850  3b 20 72 31 34 3d 68 28  78 2b 31 3b 79 29 0d 01  |; r14=h(x+1;y)..|
00000860  fe 3e 20 20 73 75 62 20  20 20 20 20 20 20 72 34  |.>  sub       r4|
00000870  2c 72 31 34 2c 72 34 20  20 20 20 20 20 20 20 20  |,r14,r4         |
00000880  20 20 20 20 20 20 3b 20  72 34 3d 68 28 78 2b 31  |      ; r4=h(x+1|
00000890  3b 79 29 2d 68 28 78 2d  31 3b 79 29 0d 02 08 1c  |;y)-h(x-1;y)....|
000008a0  20 20 6d 6f 76 20 20 20  20 20 20 20 72 34 2c 72  |  mov       r4,r|
000008b0  34 2c 61 73 72 20 23 31  0d 02 12 1a 20 20 61 64  |4,asr #1....  ad|
000008c0  64 20 20 20 20 20 20 20  72 34 2c 72 34 2c 23 31  |d       r4,r4,#1|
000008d0  32 38 0d 02 1c 1a 20 20  73 74 72 42 20 20 20 20  |28....  strB    |
000008e0  20 20 72 34 2c 5b 72 31  5d 2c 23 31 0d 02 26 33  |  r4,[r1],#1..&3|
000008f0  20 20 61 64 64 20 20 20  20 20 20 20 72 35 2c 72  |  add       r5,r|
00000900  30 2c 72 33 2c 6c 73 72  20 23 32 34 20 20 20 20  |0,r3,lsr #24    |
00000910  20 20 20 20 3b 20 72 35  3d 68 28 78 3b 30 29 0d  |    ; r5=h(x;0).|
00000920  02 30 3e 20 20 73 75 62  20 20 20 20 20 20 20 72  |.0>  sub       r|
00000930  34 2c 72 32 2c 23 31 3c  3c 32 34 20 20 20 20 20  |4,r2,#1<<24     |
00000940  20 20 20 20 20 20 20 3b  20 72 34 3d 28 79 2d 31  |       ; r4=(y-1|
00000950  20 6d 6f 64 20 32 35 35  29 3c 3c 32 34 0d 02 3a  | mod 255)<<24..:|
00000960  35 20 20 6c 64 72 42 20  20 20 20 20 20 72 34 2c  |5  ldrB      r4,|
00000970  5b 72 35 2c 72 34 2c 6c  73 72 20 23 31 36 5d 20  |[r5,r4,lsr #16] |
00000980  20 20 20 20 20 3b 20 72  34 3d 68 28 78 3b 79 2d  |     ; r4=h(x;y-|
00000990  31 29 0d 02 44 3f 20 20  61 64 64 20 20 20 20 20  |1)..D?  add     |
000009a0  20 20 72 31 34 2c 72 32  2c 23 31 3c 3c 32 34 20  |  r14,r2,#1<<24 |
000009b0  20 20 20 20 20 20 20 20  20 20 3b 20 72 31 34 3d  |          ; r14=|
000009c0  28 79 2b 31 20 6d 6f 64  20 32 35 35 29 3c 3c 32  |(y+1 mod 255)<<2|
000009d0  34 0d 02 4e 36 20 20 6c  64 72 42 20 20 20 20 20  |4..N6  ldrB     |
000009e0  20 72 31 34 2c 5b 72 35  2c 72 31 34 2c 6c 73 72  | r14,[r5,r14,lsr|
000009f0  20 23 31 36 5d 20 20 20  20 3b 20 72 31 34 3d 68  | #16]    ; r14=h|
00000a00  28 78 3b 79 2b 31 29 0d  02 58 3e 20 20 73 75 62  |(x;y+1)..X>  sub|
00000a10  20 20 20 20 20 20 20 72  34 2c 72 31 34 2c 72 34  |       r4,r14,r4|
00000a20  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00000a30  20 72 34 3d 68 28 78 3b  79 2b 31 29 2d 68 28 78  | r4=h(x;y+1)-h(x|
00000a40  3b 79 2d 31 29 0d 02 62  1c 20 20 6d 6f 76 20 20  |;y-1)..b.  mov  |
00000a50  20 20 20 20 20 72 34 2c  72 34 2c 61 73 72 20 23  |     r4,r4,asr #|
00000a60  31 0d 02 6c 1a 20 20 61  64 64 20 20 20 20 20 20  |1..l.  add      |
00000a70  20 72 34 2c 72 34 2c 23  31 32 38 0d 02 76 1a 20  | r4,r4,#128..v. |
00000a80  20 73 74 72 42 20 20 20  20 20 20 72 34 2c 5b 72  | strB      r4,[r|
00000a90  31 5d 2c 23 31 0d 02 80  4d 20 61 64 64 53 20 72  |1],#1...M addS r|
00000aa0  33 2c 72 33 2c 23 31 3c  3c 32 34 3a 62 4e 45 20  |3,r3,#1<<24:bNE |
00000ab0  64 69 73 70 5f 78 20 20  20 20 20 20 20 3b 20 78  |disp_x       ; x|
00000ac0  3d 28 78 2b 31 20 6d 6f  64 32 35 35 29 3c 3c 32  |=(x+1 mod255)<<2|
00000ad0  34 2c 20 63 6f 6e 74 69  6e 75 65 20 69 66 20 3c  |4, continue if <|
00000ae0  3e 30 0d 02 8a 4d 20 61  64 64 53 20 72 32 2c 72  |>0...M addS r2,r|
00000af0  32 2c 23 31 3c 3c 32 34  3a 62 4e 45 20 64 69 73  |2,#1<<24:bNE dis|
00000b00  70 5f 78 20 20 20 20 20  20 20 3b 20 79 3d 28 79  |p_x       ; y=(y|
00000b10  2b 31 20 6d 6f 64 32 35  35 29 3c 3c 32 34 2c 20  |+1 mod255)<<24, |
00000b20  63 6f 6e 74 69 6e 75 65  20 69 66 20 3c 3e 30 0d  |continue if <>0.|
00000b30  02 94 20 20 20 6c 64 6d  66 64 20 20 20 20 20 72  |..   ldmfd     r|
00000b40  31 33 21 2c 7b 72 30 2d  72 35 2c 70 63 7d 5e 0d  |13!,{r0-r5,pc}^.|
00000b50  02 9e 04 0d 02 a8 1f 3b  5c 5c 5c 5c 5c 5c 5c 5c  |.......;\\\\\\\\|
00000b60  5c 5c 5c 5c 5c 5c 5c 5c  5c 5c 5c 5c 5c 5c 5c 5c  |\\\\\\\\\\\\\\\\|
00000b70  5c 5c 0d 02 b2 20 3b 20  44 72 61 77 20 45 6e 76  |\\... ; Draw Env|
00000b80  69 72 6f 6e 6d 65 6e 74  20 4d 61 70 70 69 6e 67  |ironment Mapping|
00000b90  20 3e 0d 02 bc 1f 3b 2f  2f 2f 2f 2f 2f 2f 2f 2f  | >....;/////////|
00000ba0  2f 2f 2f 2f 2f 2f 2f 2f  2f 2f 2f 2f 2f 2f 2f 2f  |////////////////|
00000bb0  2f 0d 02 c6 4f 3b 46 6f  72 20 65 61 63 68 20 73  |/...O;For each s|
00000bc0  63 72 65 65 6e 20 70 69  78 65 6c 20 77 65 20 63  |creen pixel we c|
00000bd0  6f 6d 70 75 74 65 20 77  68 69 63 68 20 70 69 78  |ompute which pix|
00000be0  65 6c 20 74 6f 20 63 6f  70 79 20 66 72 6f 6d 20  |el to copy from |
00000bf0  65 6e 76 69 72 6f 6e 6d  65 6e 74 20 6d 61 70 2e  |environment map.|
00000c00  0d 02 d0 46 3b 46 6f 72  6d 75 6c 61 20 69 73 20  |...F;Formula is |
00000c10  73 63 72 65 65 6e 28 78  3b 79 29 3d 65 6e 76 6d  |screen(x;y)=envm|
00000c20  61 70 28 64 69 73 70 5f  78 28 78 3b 79 29 2b 6c  |ap(disp_x(x;y)+l|
00000c30  78 2d 78 3b 64 69 73 70  5f 79 28 78 3b 79 29 2b  |x-x;disp_y(x;y)+|
00000c40  6c 79 2d 79 29 2e 0d 02  da 17 3b 20 20 20 20 20  |ly-y).....;     |
00000c50  20 20 20 20 20 20 72 30  3d 76 72 61 6d 0d 02 e4  |      r0=vram...|
00000c60  2c 3b 20 20 20 20 20 20  20 20 20 20 20 72 31 3d  |,;           r1=|
00000c70  74 61 62 6c 65 20 77 69  74 68 20 64 69 73 70 5f  |table with disp_|
00000c80  78 2c 20 64 69 73 70 5f  79 0d 02 ee 34 3b 20 20  |x, disp_y...4;  |
00000c90  20 20 20 20 20 20 20 20  20 72 32 3d 61 64 72 65  |         r2=adre|
00000ca0  73 73 20 6f 66 20 32 35  36 2a 32 35 36 20 65 6e  |ss of 256*256 en|
00000cb0  76 69 72 6f 6e 6d 65 6e  74 20 6d 61 70 0d 02 f8  |vironment map...|
00000cc0  15 3b 20 20 20 20 20 20  20 20 20 20 20 72 33 3d  |.;           r3=|
00000cd0  6c 78 0d 03 02 15 3b 20  20 20 20 20 20 20 20 20  |lx....;         |
00000ce0  20 20 72 34 3d 6c 79 0d  03 0c 0d 2e 64 72 61 77  |  r4=ly.....draw|
00000cf0  5f 65 6e 76 0d 03 16 21  20 20 73 74 6d 66 64 20  |_env...!  stmfd |
00000d00  20 20 20 20 72 31 33 21  2c 7b 72 30 2d 72 31 32  |    r13!,{r0-r12|
00000d10  2c 72 31 34 7d 0d 03 20  1d 20 20 73 74 72 20 20  |,r14}.. .  str  |
00000d20  20 20 20 20 20 72 31 33  2c 6f 6c 64 5f 73 74 61  |     r13,old_sta|
00000d30  63 6b 0d 03 2a 32 20 20  6d 6f 76 20 20 20 20 20  |ck..*2  mov     |
00000d40  20 20 72 35 2c 23 30 20  20 20 20 20 20 20 20 20  |  r5,#0         |
00000d50  20 20 20 20 20 20 20 20  20 20 3b 20 72 35 3d 79  |          ; r5=y|
00000d60  3c 3c 32 34 0d 03 34 0b  2e 64 72 61 77 5f 79 0d  |<<24..4..draw_y.|
00000d70  03 3e 32 20 20 6d 6f 76  20 20 20 20 20 20 20 72  |.>2  mov       r|
00000d80  36 2c 23 30 20 20 20 20  20 20 20 20 20 20 20 20  |6,#0            |
00000d90  20 20 20 20 20 20 20 3b  20 72 36 3d 78 3c 3c 32  |       ; r6=x<<2|
00000da0  34 0d 03 48 32 20 20 73  75 62 20 20 20 20 20 20  |4..H2  sub      |
00000db0  20 72 31 31 2c 72 34 2c  72 35 2c 6c 73 72 20 23  | r11,r4,r5,lsr #|
00000dc0  32 34 20 20 20 20 20 20  20 3b 20 72 31 31 3d 6c  |24       ; r11=l|
00000dd0  79 2d 79 0d 03 52 0c 2e  64 72 61 77 5f 78 34 0d  |y-y..R..draw_x4.|
00000de0  03 5c 32 20 20 73 75 62  20 20 20 20 20 20 20 72  |.\2  sub       r|
00000df0  31 32 2c 72 33 2c 72 36  2c 6c 73 72 20 23 32 34  |12,r3,r6,lsr #24|
00000e00  20 20 20 20 20 20 20 3b  20 72 31 32 3d 6c 78 2d  |       ; r12=lx-|
00000e10  78 0d 03 66 40 20 20 6c  64 6d 69 61 20 20 20 20  |x..f@  ldmia    |
00000e20  20 72 31 21 2c 7b 72 31  33 2c 72 31 34 7d 20 20  | r1!,{r13,r14}  |
00000e30  20 20 20 20 20 20 20 20  20 3b 20 4c 6f 61 64 20  |         ; Load |
00000e40  34 2a 32 20 64 69 73 70  6c 61 63 65 6d 65 6e 74  |4*2 displacement|
00000e50  73 0d 03 70 3f 20 20 6d  6f 76 20 20 20 20 20 20  |s..p?  mov      |
00000e60  20 72 39 2c 23 30 20 20  20 20 20 20 20 20 20 20  | r9,#0          |
00000e70  20 20 20 20 20 20 20 20  20 3b 20 57 69 6c 6c 20  |         ; Will |
00000e80  63 6f 6e 74 61 69 6e 20  34 20 70 6f 69 6e 74 73  |contain 4 points|
00000e90  0d 03 7a 33 20 20 61 6e  64 20 20 20 20 20 20 20  |..z3  and       |
00000ea0  72 37 2c 72 31 33 2c 23  26 66 66 20 20 20 20 20  |r7,r13,#&ff     |
00000eb0  20 20 20 20 20 20 20 20  3b 20 72 37 3d 64 69 73  |        ; r7=dis|
00000ec0  70 5f 78 0d 03 84 36 20  20 61 6e 64 20 20 20 20  |p_x...6  and    |
00000ed0  20 20 20 72 38 2c 72 31  33 2c 23 26 66 66 30 30  |   r8,r13,#&ff00|
00000ee0  20 20 20 20 20 20 20 20  20 20 20 3b 20 72 38 3d  |           ; r8=|
00000ef0  64 69 73 70 5f 79 3c 3c  38 0d 03 8e 3b 20 20 61  |disp_y<<8...;  a|
00000f00  64 64 53 20 20 20 20 20  20 72 37 2c 72 37 2c 72  |ddS      r7,r7,r|
00000f10  31 32 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |12              |
00000f20  20 3b 20 72 37 3d 64 78  3d 64 69 73 70 5f 78 2b  | ; r7=dx=disp_x+|
00000f30  6c 78 2d 78 0d 03 98 43  20 20 61 64 64 47 45 53  |lx-x...C  addGES|
00000f40  20 20 20 20 72 38 2c 72  38 2c 72 31 31 2c 6c 73  |    r8,r8,r11,ls|
00000f50  6c 20 23 38 20 20 20 20  20 20 20 20 3b 20 72 38  |l #8        ; r8|
00000f60  3d 64 79 3c 3c 38 3d 28  64 69 73 70 5f 79 2b 6c  |=dy<<8=(disp_y+l|
00000f70  79 2d 79 29 3c 3c 38 0d  03 a2 44 20 20 62 4d 49  |y-y)<<8...D  bMI|
00000f80  20 20 20 20 20 20 20 64  72 61 77 5f 6e 65 78 74  |       draw_next|
00000f90  31 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |1              ;|
00000fa0  20 44 6f 6e 27 74 20 64  72 61 77 20 69 66 20 64  | Don't draw if d|
00000fb0  78 3c 30 20 6f 72 20 64  79 3c 30 0d 03 ac 17 20  |x<0 or dy<0.... |
00000fc0  20 63 6d 70 20 20 20 20  20 20 20 72 37 2c 23 26  | cmp       r7,#&|
00000fd0  66 66 0d 03 b6 19 20 20  63 6d 70 4c 45 20 20 20  |ff....  cmpLE   |
00000fe0  20 20 72 38 2c 23 26 66  66 30 30 0d 03 c0 4b 20  |  r8,#&ff00...K |
00000ff0  20 61 64 64 4c 45 20 20  20 20 20 72 38 2c 72 37  | addLE     r8,r7|
00001000  2c 72 38 20 20 20 20 20  20 20 20 20 20 20 20 20  |,r8             |
00001010  20 20 20 3b 20 49 66 20  64 78 3c 32 35 36 20 61  |   ; If dx<256 a|
00001020  6e 64 20 64 79 3c 32 35  36 2c 20 72 38 3d 64 79  |nd dy<256, r8=dy|
00001030  3c 3c 38 2b 64 78 0d 03  ca 45 20 20 6c 64 72 4c  |<<8+dx...E  ldrL|
00001040  45 42 20 20 20 20 72 39  2c 5b 72 32 2c 72 38 5d  |EB    r9,[r2,r8]|
00001050  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
00001060  41 6e 64 20 70 75 74 20  65 6e 76 6d 61 70 28 64  |And put envmap(d|
00001070  78 3b 64 79 29 20 69 6e  20 72 39 0d 03 d4 0f 2e  |x;dy) in r9.....|
00001080  64 72 61 77 5f 6e 65 78  74 31 0d 03 de 3b 20 20  |draw_next1...;  |
00001090  73 75 62 20 20 20 20 20  20 20 72 31 32 2c 72 31  |sub       r12,r1|
000010a0  32 2c 23 31 20 20 20 20  20 20 20 20 20 20 20 20  |2,#1            |
000010b0  20 20 3b 20 6c 78 2d 78  2d 3d 31 20 28 69 65 20  |  ; lx-x-=1 (ie |
000010c0  78 2b 3d 31 29 0d 03 e8  3c 20 20 61 6e 64 20 20  |x+=1)...<  and  |
000010d0  20 20 20 20 20 72 37 2c  72 31 33 2c 23 26 66 66  |     r7,r13,#&ff|
000010e0  30 30 30 30 20 20 20 20  20 20 20 20 20 3b 20 53  |0000         ; S|
000010f0  69 6d 69 6c 61 72 2c 20  32 6e 64 20 70 69 78 65  |imilar, 2nd pixe|
00001100  6c 0d 03 f2 21 20 20 61  64 64 53 20 20 20 20 20  |l...!  addS     |
00001110  20 72 37 2c 72 37 2c 72  31 32 2c 6c 73 6c 20 23  | r7,r7,r12,lsl #|
00001120  31 36 0d 03 fc 22 20 20  61 64 64 47 45 53 20 20  |16..."  addGES  |
00001130  20 20 72 38 2c 72 31 31  2c 72 31 33 2c 6c 73 72  |  r8,r11,r13,lsr|
00001140  20 23 32 34 0d 04 06 1a  20 20 62 4d 49 20 20 20  | #24....  bMI   |
00001150  20 20 20 20 64 72 61 77  5f 6e 65 78 74 32 0d 04  |    draw_next2..|
00001160  10 1b 20 20 63 6d 70 20  20 20 20 20 20 20 72 37  |..  cmp       r7|
00001170  2c 23 26 66 66 30 30 30  30 0d 04 1a 17 20 20 63  |,#&ff0000....  c|
00001180  6d 70 4c 45 20 20 20 20  20 72 38 2c 23 26 66 66  |mpLE     r8,#&ff|
00001190  0d 04 24 22 20 20 61 64  64 4c 45 20 20 20 20 20  |..$"  addLE     |
000011a0  72 38 2c 72 37 2c 72 38  2c 6c 73 6c 20 23 32 34  |r8,r7,r8,lsl #24|
000011b0  20 20 0d 04 2e 22 20 20  6c 64 72 4c 45 42 20 20  |  ..."  ldrLEB  |
000011c0  20 20 72 38 2c 5b 72 32  2c 72 38 2c 6c 73 72 20  |  r8,[r2,r8,lsr |
000011d0  23 31 36 5d 0d 04 38 1f  20 20 61 64 64 4c 45 20  |#16]..8.  addLE |
000011e0  20 20 20 20 72 39 2c 72  39 2c 72 38 2c 6c 73 6c  |    r9,r9,r8,lsl|
000011f0  20 23 38 0d 04 42 0f 2e  64 72 61 77 5f 6e 65 78  | #8..B..draw_nex|
00001200  74 32 0d 04 4c 1a 20 20  73 75 62 20 20 20 20 20  |t2..L.  sub     |
00001210  20 20 72 31 32 2c 72 31  32 2c 23 31 0d 04 56 33  |  r12,r12,#1..V3|
00001220  20 20 61 6e 64 20 20 20  20 20 20 20 72 37 2c 72  |  and       r7,r|
00001230  31 34 2c 23 26 66 66 20  20 20 20 20 20 20 20 20  |14,#&ff         |
00001240  20 20 20 20 3b 20 33 72  64 20 70 69 78 65 6c 0d  |    ; 3rd pixel.|
00001250  04 60 1d 20 20 61 6e 64  20 20 20 20 20 20 20 72  |.`.  and       r|
00001260  38 2c 72 31 34 2c 23 26  66 66 30 30 0d 04 6a 19  |8,r14,#&ff00..j.|
00001270  20 20 61 64 64 53 20 20  20 20 20 20 72 37 2c 72  |  addS      r7,r|
00001280  37 2c 72 31 32 0d 04 74  20 20 20 61 64 64 47 45  |7,r12..t   addGE|
00001290  53 20 20 20 20 72 38 2c  72 38 2c 72 31 31 2c 6c  |S    r8,r8,r11,l|
000012a0  73 6c 20 23 38 0d 04 7e  1a 20 20 62 4d 49 20 20  |sl #8..~.  bMI  |
000012b0  20 20 20 20 20 64 72 61  77 5f 6e 65 78 74 33 0d  |     draw_next3.|
000012c0  04 88 17 20 20 63 6d 70  20 20 20 20 20 20 20 72  |...  cmp       r|
000012d0  37 2c 23 26 66 66 0d 04  92 19 20 20 63 6d 70 4c  |7,#&ff....  cmpL|
000012e0  45 20 20 20 20 20 72 38  2c 23 26 66 66 30 30 0d  |E     r8,#&ff00.|
000012f0  04 9c 18 20 20 61 64 64  4c 45 20 20 20 20 20 72  |...  addLE     r|
00001300  38 2c 72 37 2c 72 38 0d  04 a6 1a 20 20 6c 64 72  |8,r7,r8....  ldr|
00001310  4c 45 42 20 20 20 20 72  38 2c 5b 72 32 2c 72 38  |LEB    r8,[r2,r8|
00001320  5d 0d 04 b0 20 20 20 61  64 64 4c 45 20 20 20 20  |]...   addLE    |
00001330  20 72 39 2c 72 39 2c 72  38 2c 6c 73 6c 20 23 31  | r9,r9,r8,lsl #1|
00001340  36 0d 04 ba 0f 2e 64 72  61 77 5f 6e 65 78 74 33  |6.....draw_next3|
00001350  0d 04 c4 1a 20 20 73 75  62 20 20 20 20 20 20 20  |....  sub       |
00001360  72 31 32 2c 72 31 32 2c  23 31 0d 04 ce 33 20 20  |r12,r12,#1...3  |
00001370  61 6e 64 20 20 20 20 20  20 20 72 37 2c 72 31 34  |and       r7,r14|
00001380  2c 23 26 66 66 30 30 30  30 20 20 20 20 20 20 20  |,#&ff0000       |
00001390  20 20 3b 20 34 74 68 20  70 69 78 65 6c 0d 04 d8  |  ; 4th pixel...|
000013a0  21 20 20 61 64 64 53 20  20 20 20 20 20 72 37 2c  |!  addS      r7,|
000013b0  72 37 2c 72 31 32 2c 6c  73 6c 20 23 31 36 0d 04  |r7,r12,lsl #16..|
000013c0  e2 22 20 20 61 64 64 47  45 53 20 20 20 20 72 38  |."  addGES    r8|
000013d0  2c 72 31 31 2c 72 31 34  2c 6c 73 72 20 23 32 34  |,r11,r14,lsr #24|
000013e0  0d 04 ec 1a 20 20 62 4d  49 20 20 20 20 20 20 20  |....  bMI       |
000013f0  64 72 61 77 5f 6e 65 78  74 34 0d 04 f6 1b 20 20  |draw_next4....  |
00001400  63 6d 70 20 20 20 20 20  20 20 72 37 2c 23 26 66  |cmp       r7,#&f|
00001410  66 30 30 30 30 0d 05 00  17 20 20 63 6d 70 4c 45  |f0000....  cmpLE|
00001420  20 20 20 20 20 72 38 2c  23 26 66 66 0d 05 0a 20  |     r8,#&ff... |
00001430  20 20 61 64 64 4c 45 20  20 20 20 20 72 38 2c 72  |  addLE     r8,r|
00001440  37 2c 72 38 2c 6c 73 6c  20 23 32 34 0d 05 14 22  |7,r8,lsl #24..."|
00001450  20 20 6c 64 72 4c 45 42  20 20 20 20 72 38 2c 5b  |  ldrLEB    r8,[|
00001460  72 32 2c 72 38 2c 6c 73  72 20 23 31 36 5d 0d 05  |r2,r8,lsr #16]..|
00001470  1e 20 20 20 61 64 64 4c  45 20 20 20 20 20 72 39  |.   addLE     r9|
00001480  2c 72 39 2c 72 38 2c 6c  73 6c 20 23 32 34 0d 05  |,r9,r8,lsl #24..|
00001490  28 0f 2e 64 72 61 77 5f  6e 65 78 74 34 0d 05 32  |(..draw_next4..2|
000014a0  37 20 20 73 74 72 20 20  20 20 20 20 20 72 39 2c  |7  str       r9,|
000014b0  5b 72 30 5d 2c 23 34 20  20 20 20 20 20 20 20 20  |[r0],#4         |
000014c0  20 20 20 20 20 3b 20 53  61 76 65 20 34 20 70 69  |     ; Save 4 pi|
000014d0  78 65 6c 73 0d 05 3c 43  20 61 64 64 53 20 72 36  |xels..<C addS r6|
000014e0  2c 72 36 2c 23 34 3c 3c  32 34 3a 62 4e 45 20 64  |,r6,#4<<24:bNE d|
000014f0  72 61 77 5f 78 34 20 20  20 20 20 20 3b 20 78 2b  |raw_x4      ; x+|
00001500  3d 34 3c 3c 32 34 2c 20  63 6f 6e 74 69 6e 75 65  |=4<<24, continue|
00001510  20 69 66 20 3c 3e 30 0d  05 46 38 20 20 61 64 64  | if <>0..F8  add|
00001520  20 20 20 20 20 20 20 72  30 2c 72 30 2c 23 33 32  |       r0,r0,#32|
00001530  30 2d 32 35 36 20 20 20  20 20 20 20 20 20 20 3b  |0-256          ;|
00001540  20 4e 65 78 74 20 76 72  61 6d 20 6c 69 6e 65 0d  | Next vram line.|
00001550  05 50 43 20 61 64 64 53  20 72 35 2c 72 35 2c 23  |.PC addS r5,r5,#|
00001560  31 3c 3c 32 34 3a 62 4e  45 20 64 72 61 77 5f 79  |1<<24:bNE draw_y|
00001570  20 20 20 20 20 20 20 3b  20 79 2b 3d 31 3c 3c 32  |       ; y+=1<<2|
00001580  34 2c 20 63 6f 6e 74 69  6e 75 65 20 69 66 20 3c  |4, continue if <|
00001590  3e 30 0d 05 5a 1d 20 20  6c 64 72 20 20 20 20 20  |>0..Z.  ldr     |
000015a0  20 20 72 31 33 2c 6f 6c  64 5f 73 74 61 63 6b 0d  |  r13,old_stack.|
000015b0  05 64 21 20 20 6c 64 6d  66 64 20 20 20 20 20 72  |.d!  ldmfd     r|
000015c0  31 33 21 2c 7b 72 30 2d  72 31 32 2c 70 63 7d 5e  |13!,{r0-r12,pc}^|
000015d0  0d 05 6e 06 20 20 0d 05  78 0f 2e 73 63 72 65 65  |..n.  ..x..scree|
000015e0  6e 6d 6f 64 65 0d 05 82  0d 20 20 64 63 64 20 20  |nmode....  dcd  |
000015f0  20 31 0d 05 8c 0f 20 20  64 63 64 20 20 20 33 32  | 1....  dcd   32|
00001600  30 0d 05 96 0f 20 20 64  63 64 20 20 20 32 35 36  |0....  dcd   256|
00001610  0d 05 a0 0d 20 20 64 63  64 20 20 20 33 0d 05 aa  |....  dcd   3...|
00001620  0e 20 20 64 63 64 20 20  20 2d 31 0d 05 b4 15 20  |.  dcd   -1.... |
00001630  20 64 63 64 20 20 20 30  3a 64 63 64 20 31 32 38  | dcd   0:dcd 128|
00001640  0d 05 b5 15 20 20 64 63  64 20 20 20 33 3a 64 63  |....  dcd   3:dc|
00001650  64 20 32 35 35 0d 05 be  0e 20 20 64 63 64 20 20  |d 255....  dcd  |
00001660  20 2d 31 0d 05 c8 06 20  20 0d 05 d2 37 5d 3a ed  | -1....  ...7]:.|
00001670  6f 70 74 25 3a f1 22 41  73 73 65 6d 62 6c 79 20  |opt%:."Assembly |
00001680  63 6f 64 65 20 69 73 20  22 3b 50 25 2d 63 6f 64  |code is ";P%-cod|
00001690  65 25 3b 22 20 62 79 74  65 73 20 6c 6f 6e 67 22  |e%;" bytes long"|
000016a0  0d 05 dc 04 0d 05 e6 4f  f4 3d 3d 3d 3d 20 42 41  |.......O.==== BA|
000016b0  53 49 43 20 43 4f 44 45  20 3d 3d 3d 3d 3d 3d 3d  |SIC CODE =======|
000016c0  3d 3d 3d 3d 3d 3d 3d 3d  3d 3d 3d 3d 3d 3d 3d 3d  |================|
*
000016f0  3d 3d 3d 0d 05 f0 12 de  65 6e 76 6d 61 70 25 20  |===.....envmap% |
00001700  36 35 35 33 36 0d 05 fa  12 de 64 69 73 70 25 20  |65536.....disp% |
00001710  36 35 35 33 36 2a 32 0d  06 04 30 f4 4c 6f 61 64  |65536*2...0.Load|
00001720  20 68 65 69 67 68 74 20  66 69 65 6c 64 20 61 6e  | height field an|
00001730  64 20 63 6f 6d 70 75 74  65 20 64 69 73 70 6c 61  |d compute displa|
00001740  63 65 6d 65 6e 74 73 0d  06 0e 1f f1 22 43 6f 6d  |cements....."Com|
00001750  70 75 74 69 6e 67 20 64  69 73 70 6c 61 63 65 6d  |puting displacem|
00001760  65 6e 74 73 22 20 0d 06  18 17 41 25 3d 65 6e 76  |ents" ....A%=env|
00001770  6d 61 70 25 3a 42 25 3d  64 69 73 70 25 0d 06 22  |map%:B%=disp%.."|
00001780  34 66 25 3d 8e 28 22 48  65 69 67 68 74 32 35 36  |4f%=.("Height256|
00001790  22 29 3a c8 99 22 4f 53  5f 47 42 50 42 22 2c 34  |"):.."OS_GBPB",4|
000017a0  2c 66 25 2c 41 25 2c 36  35 35 33 36 3a d9 23 66  |,f%,A%,65536:.#f|
000017b0  25 0d 06 2c 12 d6 64 69  73 70 6c 61 63 65 6d 65  |%..,..displaceme|
000017c0  6e 74 73 0d 06 36 1b f4  43 72 65 61 74 65 20 65  |nts..6..Create e|
000017d0  6e 76 69 72 6f 6e 6d 65  6e 74 20 6d 61 70 0d 06  |nvironment map..|
000017e0  40 20 f1 22 43 6f 6d 70  75 74 69 6e 67 20 65 6e  |@ ."Computing en|
000017f0  76 69 72 6f 6e 6d 65 6e  74 20 6d 61 70 22 0d 06  |vironment map"..|
00001800  4a 16 41 25 3d 65 6e 76  6d 61 70 25 3a d6 65 6e  |J.A%=envmap%:.en|
00001810  76 6d 61 70 0d 06 54 04  0d 06 5e 3c f4 53 63 72  |vmap..T...^<.Scr|
00001820  65 65 6e 20 26 20 63 6f  6c 6f 72 20 69 6e 69 74  |een & color init|
00001830  69 61 6c 69 73 61 74 69  6f 6e 2e 20 54 68 65 6e  |ialisation. Then|
00001840  20 6c 65 74 20 74 68 65  20 73 68 6f 77 20 62 65  | let the show be|
00001850  67 69 6e 2e 0d 06 68 28  eb 31 35 3a c8 99 22 4f  |gin...h(.15:.."O|
00001860  53 5f 53 63 72 65 65 6e  4d 6f 64 65 22 2c 30 2c  |S_ScreenMode",0,|
00001870  73 63 72 65 65 6e 6d 6f  64 65 3a 87 0d 06 72 3e  |screenmode:...r>|
00001880  de 76 25 20 38 3a 21 76  25 3d 31 34 38 3a 76 25  |.v% 8:!v%=148:v%|
00001890  21 34 3d 2d 31 3a c8 99  22 4f 53 5f 52 65 61 64  |!4=-1:.."OS_Read|
000018a0  56 64 75 56 61 72 69 61  62 6c 65 73 22 2c 76 25  |VduVariables",v%|
000018b0  2c 76 25 3a 76 25 3d 21  76 25 0d 06 73 0d e3 63  |,v%:v%=!v%..s..c|
000018c0  25 3d 31 b8 32 35 35 0d  06 74 18 20 77 25 3d 32  |%=1.255..t. w%=2|
000018d0  35 35 2a 28 63 25 2f 32  35 35 29 5e 31 2e 32 0d  |55*(c%/255)^1.2.|
000018e0  06 75 11 20 67 25 3d 77  25 2a 77 25 2f 32 35 35  |.u. g%=w%*w%/255|
000018f0  0d 06 76 0e 20 72 25 3d  b6 77 25 2a 31 35 0d 06  |..v. r%=.w%*15..|
00001900  77 18 20 62 25 3d 77 25  2a a1 28 2d 77 25 2a 77  |w. b%=w%*.(-w%*w|
00001910  25 2f 35 30 30 29 0d 06  90 11 20 fb 63 25 2c 72  |%/500).... .c%,r|
00001920  25 2c 67 25 2c 62 25 0d  06 9a 07 ed 63 25 0d 06  |%,g%,b%.....c%..|
00001930  a4 08 62 25 3d 32 0d 06  ae 0c 42 25 3d 64 69 73  |..b%=2....B%=dis|
00001940  70 25 0d 06 b8 0e 43 25  3d 65 6e 76 6d 61 70 25  |p%....C%=envmap%|
00001950  0d 06 c2 05 f5 0d 06 cc  35 20 c8 96 3a c8 99 22  |........5 ..:.."|
00001960  4f 53 5f 42 79 74 65 22  2c 26 37 31 2c 62 25 3a  |OS_Byte",&71,b%:|
00001970  62 25 3d 62 25 82 33 3a  c8 99 22 4f 53 5f 42 79  |b%=b%.3:.."OS_By|
00001980  74 65 22 2c 26 37 30 2c  62 25 0d 06 d6 1b 20 41  |te",&70,b%.... A|
00001990  25 3d 76 25 2b 28 62 25  3e 3e 31 29 2a 38 31 39  |%=v%+(b%>>1)*819|
000019a0  32 30 2b 33 32 0d 06 e0  0f 20 c8 97 78 25 2c 79  |20+32.... ..x%,y|
000019b0  25 2c 7a 25 0d 06 ea 21  20 44 25 3d 28 78 25 3e  |%,z%...! D%=(x%>|
000019c0  3e 31 29 2d 33 32 3a 45  25 3d 32 35 36 2d 28 79  |>1)-32:E%=256-(y|
000019d0  25 3e 3e 31 29 0d 06 f4  0e 20 d6 64 72 61 77 5f  |%>>1).... .draw_|
000019e0  65 6e 76 0d 06 fe 06 fd  a3 0d 07 08 04 0d 07 12  |env.............|
000019f0  45 f4 3d 3d 3d 3d 20 4d  41 43 52 4f 53 20 3d 3d  |E.==== MACROS ==|
00001a00  3d 3d 3d 3d 3d 3d 3d 3d  3d 3d 3d 3d 3d 3d 3d 3d  |================|
*
00001a30  3d 3d 0d 07 1c 11 f4 6d  30 3d 73 71 72 74 28 6d  |==.....m0=sqrt(m|
00001a40  31 29 2e 0d 07 26 14 dd  a4 73 71 72 74 28 6d 30  |1)...&...sqrt(m0|
00001a50  2c 6d 31 2c 6d 32 29 0d  07 30 07 ea 6e 25 0d 07  |,m1,m2)..0..n%..|
00001a60  3a 0d 5b 6f 70 74 20 6f  70 74 25 0d 07 44 47 20  |:.[opt opt%..DG |
00001a70  20 6d 6f 76 20 20 20 20  20 20 20 6d 30 2c 23 30  | mov       m0,#0|
00001a80  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001a90  20 20 20 3b 20 54 68 69  73 20 69 73 20 72 69 70  |   ; This is rip|
00001aa0  70 65 64 20 66 72 6f 6d  20 4a 61 6e 2f 42 41 53  |ped from Jan/BAS|
00001ab0  53 2e 0d 07 4e 2c 20 20  6d 6f 76 20 20 20 20 20  |S...N,  mov     |
00001ac0  20 20 6d 32 2c 23 31 3c  3c 33 30 20 20 20 20 20  |  m2,#1<<30     |
00001ad0  20 20 20 20 20 20 20 20  20 20 3b 20 20 7c 0d 07  |          ;  |..|
00001ae0  58 2c 20 20 63 6d 70 20  20 20 20 20 20 20 6d 31  |X,  cmp       m1|
00001af0  2c 6d 32 20 20 20 20 20  20 20 20 20 20 20 20 20  |,m2             |
00001b00  20 20 20 20 20 20 3b 20  20 7c 0d 07 62 2c 20 20  |      ;  |..b,  |
00001b10  73 75 62 48 53 20 20 20  20 20 6d 31 2c 6d 30 2c  |subHS     m1,m0,|
00001b20  6d 32 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |m2              |
00001b30  20 20 3b 20 20 7c 0d 07  6c 2c 20 20 61 64 63 20  |  ;  |..l,  adc |
00001b40  20 20 20 20 20 20 6d 30  2c 6d 30 2c 6d 30 20 20  |      m0,m0,m0  |
00001b50  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
00001b60  20 7c 0d 07 76 1a 5d 3a  e3 6e 25 3d 32 b8 33 30  | |..v.]:.n%=2.30|
00001b70  88 32 3a 5b 6f 70 74 20  6f 70 74 25 0d 07 80 2c  |.2:[opt opt%...,|
00001b80  20 20 61 64 64 20 20 20  20 20 20 20 6d 32 2c 6d  |  add       m2,m|
00001b90  30 2c 23 31 3c 3c 33 30  20 20 20 20 20 20 20 20  |0,#1<<30        |
00001ba0  20 20 20 20 3b 20 20 7c  0d 07 8a 2c 20 20 63 6d  |    ;  |...,  cm|
00001bb0  70 20 20 20 20 20 20 20  6d 31 2c 6d 32 2c 72 6f  |p       m1,m2,ro|
00001bc0  72 20 23 6e 25 20 20 20  20 20 20 20 20 20 20 20  |r #n%           |
00001bd0  3b 20 20 7c 0d 07 94 2c  20 20 73 75 62 48 53 20  |;  |...,  subHS |
00001be0  20 20 20 20 6d 31 2c 6d  31 2c 6d 32 2c 72 6f 72  |    m1,m1,m2,ror|
00001bf0  20 23 6e 25 20 20 20 20  20 20 20 20 3b 20 20 7c  | #n%        ;  ||
00001c00  0d 07 9e 3d 20 20 61 64  63 20 20 20 20 20 20 20  |...=  adc       |
00001c10  6d 30 2c 6d 30 2c 6d 30  20 20 20 20 20 20 20 20  |m0,m0,m0        |
00001c20  20 20 20 20 20 20 20 20  3b 20 45 6e 64 20 6f 66  |        ; End of|
00001c30  20 72 69 70 70 65 64 20  63 6f 64 65 2e 0d 07 a8  | ripped code....|
00001c40  13 5d 3a ed 6e 25 3a 5b  6f 70 74 20 6f 70 74 25  |.]:.n%:[opt opt%|
00001c50  0d 07 b2 39 20 20 63 6d  70 20 20 20 20 20 20 20  |...9  cmp       |
00001c60  6d 31 2c 6d 30 20 20 20  20 20 20 20 20 20 20 20  |m1,m0           |
00001c70  20 20 20 20 20 20 20 20  3b 20 46 6c 61 67 73 3d  |        ; Flags=|
00001c80  76 61 6c 2d 72 6f 6f 74  2e 0d 07 bc 43 20 20 61  |val-root....C  a|
00001c90  64 64 50 4c 20 20 20 20  20 6d 30 2c 6d 30 2c 23  |ddPL     m0,m0,#|
00001ca0  31 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |1               |
00001cb0  20 3b 20 52 6f 75 6e 64  20 74 6f 20 6e 65 61 72  | ; Round to near|
00001cc0  65 73 74 20 69 6e 74 65  67 65 72 2e 0d 07 c6 09  |est integer.....|
00001cd0  5d 3a 3d 22 22 0d ff                              |]:=""..|
00001cd7