     1                                  ;VTrack.asm  by Robert Rayment  18/4/01
     2                                  
     3                                  ;VB
     4                                  
     5                                  ;   res& = CallWindowProc(ptMCode&, ptBITDATA&, irand&, 2&, OpCode&)
     6                                  ;                                   8           12      16  20        
     7                                  ;'=========================================================
     8                                  ;' Structure for input to mcode for RayCASTER & Plasma
     9                                  ;' PS = ProjSurf(), FS = FloorSurf()
    10                                  ; Public Type BITDATA
    11                                  ;   
    12                                  ;   PSWH As Long            'Width=Height of PS         0 PSWH
    13                                  ;   ptrProjSurf As Long     'Pointer to PS              4 ptPS
    14                                  ;   FSWH As Long            'Width=Height of FS         8 FSWH
    15                                  ;   ptrFloorSurf As Long    'Pointer to FS             12 ptFS
    16                                  ;   
    17                                  ;   LAH As Long             'Look ahead length L       16 LAH        'Input
    18                                  ;   ex As Long              'eye x-coord               20 ex         'Input
    19                                  ;   ey As Long              'eye y-coord               24 ey         'Input
    20                                  ;   TANG As Long            'Track angle 0-359         28 TANG       'Input
    21                                  ;   Collision As Long       '0/1 no/yes collision      32 Collision  'Return
    22                                  ;   
    23                                  ;   zvp As Single           'eye z-coord               36 zvp        'Input
    24                                  ;   zdslope As Single       'Ray slope                 40 zdslope    'Input
    25                                  ;   zslopemult As Single    'Ray slope multiplier      44 zslopemult 'Input
    26                                  ;   zhtmult As Single       'Objects height multiplier 48 zhtmult    'Input
    27                                  ;
    28                                  ; End Type
    29                                  ; Public bmp As BITDATA
    30                                  ;'=========================================================
    31                                  
    32                                  %macro movab 2		;name & num of parameters
    33                                    push dword %2		;2nd param
    34                                    pop dword %1		;1st param
    35                                  %endmacro			;use  movab %1,%2
    36                                  ;Allows eg	movab bmW,[ebx+4]
    37                                  
    38                                  ; INPUT DATA STORE
    39                                  ; Long integers
    40                                  %define PSWH        [ebp-4]
    41                                  %define ptPS        [ebp-8]
    42                                  %define FSWH        [ebp-12]
    43                                  %define ptFS        [ebp-16]
    44                                  %define LAH         [ebp-20]
    45                                  %define ex          [ebp-24]
    46                                  %define ey          [ebp-28]
    47                                  %define TANG        [ebp-32]
    48                                  %define Collision   [ebp-36]
    49                                  
    50                                  ; Singles
    51                                  %define zvp         [ebp-40]
    52                                  %define zdslope     [ebp-44]
    53                                  %define zslopemult  [ebp-48]
    54                                  %define zhtmult     [ebp-52]
    55                                  ; ----------------------------
    56                                  
    57                                  ;	TEMPORARY VARIABLES
    58                                  %define i2      [ebp-56]       ; integer 2
    59                                  %define i360    [ebp-60]       ; integer 360
    60                                  %define PSWH2   [ebp-64]       ; = PSWH/2
    61                                  
    62                                  %define zrayang	[ebp-68]       ; =(TANG*2*pi)-PSWH/2
    63                                  %define xvp     [ebp-72]       ; single x	
    64                                  %define yvp     [ebp-76]       ; single y
    65                                  %define C       [ebp-80]       ; Column number
    66                                  
    67                                  %define xray    [ebp-84]       ; singles
    68                                  %define yray    [ebp-88]
    69                                  %define zray    [ebp-92]
    70                                  %define izray   [ebp-96]       ; integer
    71                                  
    72                                  %define zdx     [ebp-100]      ; singles 
    73                                  %define zdy     [ebp-104]
    74                                  %define zdz     [ebp-108]
    75                                  
    76                                  %define zvoxscale  [ebp-112]
    77                                  %define row        [ebp-116]   ; integers
    78                                  
    79                                  %define ixr     [ebp-120]      
    80                                  %define iyr     [ebp-124]
    81                                  
    82                                  %define cul     [ebp-128]      ; color		
    83                                  %define iht     [ebp-132]      ; height integer
    84                                  
    85                                  %define Collide [ebp-136]      ; Collision value
    86                                  
    87                                  %define irand   [ebp-140]      ; Random seed
    88                                  %define ir255   [ebp-144]      ; Random seed
    89                                  
    90                                  [bits 32]
    91                                  
    92 00000000 55                      	push ebp
    93 00000001 89E5                    	mov ebp,esp
    94 00000003 81EC90000000            	sub esp,144
    95 00000009 57                      	push edi
    96 0000000A 56                      	push esi
    97 0000000B 53                      	push ebx
    98                                  
    99                                  ;	LOAD INPUT DATA
   100                                  
   101 0000000C 8B5D08                  	mov ebx,[ebp+8]		; ->BITDATA
   102                                  	
   103                                  	movab PSWH,[ebx]
   104 0000000F FF33                <1>   push dword %2
   105 00000011 8F45FC              <1>   pop dword %1
   106                                  	movab ptPS,[ebx+4]
   107 00000014 FF7304              <1>   push dword %2
   108 00000017 8F45F8              <1>   pop dword %1
   109                                  	movab FSWH,[ebx+8]
   110 0000001A FF7308              <1>   push dword %2
   111 0000001D 8F45F4              <1>   pop dword %1
   112                                  	movab ptFS,[ebx+12]
   113 00000020 FF730C              <1>   push dword %2
   114 00000023 8F45F0              <1>   pop dword %1
   115                                  	movab LAH, [ebx+16]
   116 00000026 FF7310              <1>   push dword %2
   117 00000029 8F45EC              <1>   pop dword %1
   118                                  	
   119                                  	movab ex,       [ebx+20]
   120 0000002C FF7314              <1>   push dword %2
   121 0000002F 8F45E8              <1>   pop dword %1
   122                                  	movab ey,       [ebx+24]
   123 00000032 FF7318              <1>   push dword %2
   124 00000035 8F45E4              <1>   pop dword %1
   125                                  	movab TANG,     [ebx+28]
   126 00000038 FF731C              <1>   push dword %2
   127 0000003B 8F45E0              <1>   pop dword %1
   128                                  	movab Collision,[ebx+32]
   129 0000003E FF7320              <1>   push dword %2
   130 00000041 8F45DC              <1>   pop dword %1
   131                                  	
   132                                  	movab zvp,       [ebx+36]
   133 00000044 FF7324              <1>   push dword %2
   134 00000047 8F45D8              <1>   pop dword %1
   135                                  	movab zdslope,   [ebx+40]
   136 0000004A FF7328              <1>   push dword %2
   137 0000004D 8F45D4              <1>   pop dword %1
   138                                  	movab zslopemult,[ebx+44]
   139 00000050 FF732C              <1>   push dword %2
   140 00000053 8F45D0              <1>   pop dword %1
   141                                  	movab zhtmult,   [ebx+48]
   142 00000056 FF7330              <1>   push dword %2
   143 00000059 8F45CC              <1>   pop dword %1
   144                                  
   145                                  ; ----------------------------
   146                                  	; GET OpCode&
   147 0000005C 8B4514                  	mov eax,[ebp+20]
   148                                  ; ----------------------------
   149                                  	
   150 0000005F 3D00000000              	cmp eax,0
   151 00000064 7510                    	jne TestFor1
   152                                  	
   153 00000066 898578FFFFFF            	mov Collide,eax		; No Collision
   154                                  	
   155 0000006C E82C000000              	CALL FloorCAST
   156                                  
   157 00000071 E918000000              	jmp GETOUT
   158                                  	
   159                                  TestFor1:
   160 00000076 D1D8                    	rcr eax,1
   161 00000078 7314                    	jnc TestFor2
   162                                  	
   163 0000007A E8FE010000              	CALL PLASMA
   164 0000007F E875040000              	CALL SMOOTHING
   165 00000084 E8C4040000              	CALL BYTESMOOTHING
   166                                  
   167 00000089 E900000000              	jmp GETOUT
   168                                  
   169                                  TestFor2:
   170                                  
   171                                  GETOUT:
   172                                  	
   173 0000008E 8B8574FFFFFF            	mov eax,irand
   174                                  	
   175                                  	
   176 00000094 5B                      	pop ebx
   177 00000095 5E                      	pop esi
   178 00000096 5F                      	pop edi
   179 00000097 89EC                    	mov esp,ebp
   180 00000099 5D                      	pop ebp
   181 0000009A C21000                  	RET 16
   182                                  
   183                                  ;###########################################
   184                                  FloorCAST:
   185                                  	; Store some constants
   186 0000009D B802000000              	mov eax,2
   187 000000A2 8945C8                  	mov i2,eax
   188 000000A5 B868010000              	mov eax,360
   189 000000AA 8945C4                  	mov i360,eax
   190 000000AD 8B45FC                  	mov eax,PSWH
   191 000000B0 D1E8                    	shr eax,1
   192 000000B2 8945C0                  	mov PSWH2,eax		; PSWH/2
   193                                  	
   194                                  	; Calculate zrayang
   195 000000B5 DB45E0                  	fild dword TANG		; TANG
   196 000000B8 DB45C8                  	fild dword i2		; 2,TANG
   197 000000BB DEC9                    	fmulp st1			; 2*TANG
   198 000000BD D9EB                    	fldpi				; pi,2*TANG
   199 000000BF DEC9                    	fmulp st1			; pi*2*TANG
   200 000000C1 DB45C0                  	fild dword PSWH2	; PSWH/2,pi*2*TANG
   201 000000C4 DEE9                    	fsubp ST1			; st1-st0
   202 000000C6 D95DBC                  	fstp dword zrayang  ; =(TANG*2*pi)-PSWH/2
   203                                  	
   204                                  	; Store ex & ey as singles ie xvp, yvp
   205 000000C9 DB45E8                  	fild dword ex		; xvp=ex
   206 000000CC D95DB8                  	fstp dword xvp
   207 000000CF DB45E4                  	fild dword ey		; yvp=ey
   208 000000D2 D95DB4                  	fstp dword yvp
   209                                  	
   210                                  	; OUTER COLUMN LOOP
   211 000000D5 B900000000              	mov ecx,0			; For C = 0 To PSWH - 1
   212                                  
   213                                  NEXT_COLUMN:
   214                                  
   215 000000DA 51                      	PUSH ecx
   216 000000DB 894DB0                  	mov dword C,ecx		; Store C
   217                                  
   218                                  	; Calc xray,yray,zray
   219 000000DE 8B45B8                  	mov eax,xvp			; xray = xvp
   220 000000E1 8945AC                  	mov xray,eax
   221 000000E4 8B45B4                  	mov eax,yvp			; yray = yvp
   222 000000E7 8945A8                  	mov yray,eax
   223 000000EA 8B45D8                  	mov eax,zvp			; zray = zvp
   224 000000ED 8945A4                  	mov zray,eax
   225                                  
   226                                  	; Store zray as integer izray
   227 000000F0 D945A4                  	fld dword zray
   228 000000F3 DB5DA0                  	fistp dword izray
   229                                  		
   230                                  	; Calc zdy,zdx
   231 000000F6 D945BC                  	fld dword zrayang	; zrayang
   232 000000F9 DB45B0                  	fild dword C		; C,zrayang
   233 000000FC DEC1                    	faddp st1			; zrayang+C
   234 000000FE DB45C4                  	fild dword i360
   235 00000101 DEF9                    	fdivp st1			; ((zrayang+C)/360)
   236 00000103 D9FB                    	fsincos				; cos | sin
   237 00000105 D95D98                  	fstp dword zdy		; = Cos((zrayang+C)/360)
   238 00000108 D95D9C                  	fstp dword zdx		; = Sin((zrayang+C)/360)
   239                                  	
   240                                  	; Calc zdz
   241 0000010B DB45C8                  	fild dword i2		; 2
   242 0000010E D945D4                  	fld dword zdslope	; zdslope,2
   243 00000111 D945D0                  	fld dword zslopemult; zslopemult,zdslope,2 
   244 00000114 DEC9                    	fmulp st1			; zslopemult*zdslope,2
   245 00000116 DEC9                    	fmulp st1			; zslopemult*zdslope*2
   246 00000118 D95D94                  	fstp dword zdz		; zdz = zslopemult*zdslope*2
   247                                  	
   248                                  	; Init zvoxscale
   249 0000011B D9EE                    	fldz				; 0
   250 0000011D D95D90                  	fstp dword zvoxscale; zvoxscale = 0
   251                                  	
   252                                  	; Init row
   253 00000120 B801000000              	mov eax,1			; row = 1
   254 00000125 89458C                  	mov row,eax
   255                                  
   256                                  	; LOOK AHEAD STEPS
   257 00000128 B900000000              	mov ecx,0			; For cstep = 0 To LAH
   258                                  
   259                                  NEXT_STEP:
   260                                  
   261                                  	; Find ixr & iyr
   262 0000012D D945AC                  	fld dword xray		; xray
   263 00000130 DB5D88                  	fistp dword ixr		; ixr = Int(xray)
   264 00000133 8B4588                  	mov eax,ixr			
   265 00000136 8B55F4                  	mov edx,FSWH
   266 00000139 4A                      	dec edx				; edx = FSWH-1
   267 0000013A 21D0                    	and eax,edx			
   268 0000013C 40                      	inc eax
   269 0000013D 894588                  	mov ixr,eax			; = (xray AND (FSWH - 1) + 1
   270                                  	
   271 00000140 D945A8                  	fld dword yray		; yray
   272 00000143 DB5D84                  	fistp dword iyr		; iyr = Int(yray)
   273 00000146 8B4584                  	mov eax,iyr
   274 00000149 21D0                    	and eax,edx
   275 0000014B 40                      	inc eax
   276 0000014C 894584                  	mov iyr,eax			; = (yray AND (FSWH - 1) + 1
   277                                  
   278                                  	; Get color/height = FloorSurf(ixr,iyr) ->cul
   279                                  	; and multiply by zhtmult
   280 0000014F 8B75F0                  	mov esi,ptFS		; -> FloorSurf(1,1)
   281 00000152 8B4584                  	mov eax,iyr
   282 00000155 48                      	dec eax
   283 00000156 8B55F4                  	mov edx,FSWH
   284 00000159 F7E2                    	mul edx		
   285 0000015B 01C6                    	add esi,eax 		; ptFS + (iyr-1) * FSWH
   286 0000015D 8B4588                  	mov eax,ixr
   287 00000160 48                      	dec eax
   288 00000161 01C6                    	add esi,eax			; -> FloorSurf(ixr,iyr)
   289                                  	
   290                                  	; Get cul
   291 00000163 31C0                    	xor eax,eax
   292 00000165 8A06                    	mov al,[esi]
   293 00000167 894580                  	mov cul,eax			; cul in AL
   294                                  	
   295                                  	; Multiply by zhtmult
   296 0000016A DB4580                  	fild dword cul		; cul
   297 0000016D D945CC                  	fld dword zhtmult	; zhtmult,cul
   298 00000170 DEC9                    	fmulp ST1
   299 00000172 DB9D7CFFFFFF            	fistp dword iht		; iht = Int(FloorSurf(ixr,iyr) * zhtmult)
   300                                  	
   301                                  	; Compare iht & izray
   302 00000178 8B857CFFFFFF            	mov eax,iht
   303 0000017E 3B45A0                  	cmp eax,izray
   304 00000181 0F8E9F000000            	jle near UPDATE_RAY ; iht <= izray
   305                                  
   306                                  	; zht > zray  -  above drawn area
   307                                  
   308                                  DRAW_PIX:
   309                                  
   310 00000187 8B7DF8                  	mov edi,ptPS		; ->ProjSurf(1,1)	
   311 0000018A 8B458C                  	mov eax,row
   312 0000018D 48                      	dec eax
   313 0000018E 8B55FC                  	mov edx,PSWH
   314 00000191 F7E2                    	mul edx
   315 00000193 01C7                    	add edi,eax			; ptPS + (row-1) * PSWH
   316 00000195 8B45B0                  	mov eax,C
   317                                  	;inc eax
   318 00000198 01C7                    	add edi,eax			; ->ProjSurf(C+1,row)
   319 0000019A 8B4580                  	mov eax,cul
   320 0000019D 8807                    	mov [edi],AL		; ProjSurf(C+1,row) = cul
   321                                  	
   322                                  	; Update zray
   323 0000019F D94594                  	fld dword zdz
   324 000001A2 D945D4                  	fld dword zdslope
   325 000001A5 DEC1                    	faddp st1
   326 000001A7 D95D94                  	fstp dword zdz		; zdz = zdz + zdslope
   327                                  	
   328 000001AA D945A4                  	fld dword zray
   329 000001AD D94590                  	fld dword zvoxscale
   330 000001B0 DEC1                    	faddp st1
   331 000001B2 D95DA4                  	fstp dword zray		; zray = zray + zvoxscale
   332                                  	
   333 000001B5 8B458C                  	mov eax,row
   334 000001B8 40                      	inc eax
   335 000001B9 89458C                  	mov row,eax			; row = row + 1
   336                                  	
   337 000001BC 3B45FC                  	cmp eax,PSWH		; row-PSWH
   338 000001BF 0F879D000000            	ja near UPDATE_COLUMN	;row > PSWH
   339                                  	
   340                                  	; Test collision
   341                                  	;---------------
   342 000001C5 8B8578FFFFFF            	mov eax,Collide
   343 000001CB 3D01000000              	cmp eax,1
   344 000001D0 743F                    	je End_Collision    ;Collision already found
   345                                  	
   346 000001D2 8B45E8                  	mov eax,ex			; eax=ex
   347 000001D5 8B5588                  	mov edx,ixr
   348 000001D8 81EA02000000            	sub edx,2			; edx=ixr-2
   349 000001DE 39D0                    	cmp eax,edx			; ex-(ixr-2)
   350 000001E0 7C2F                    	jl End_Collision	; ex < ixr-2
   351                                  
   352 000001E2 81C204000000            	add edx,4			; edx=ixr+2
   353 000001E8 39D0                    	cmp eax,edx			; ex-(ixr+2)
   354 000001EA 7F25                    	jg End_Collision	; ex > ixr+2
   355                                  	
   356 000001EC 8B45E4                  	mov eax,ey			; eax=ey
   357 000001EF 8B5584                  	mov edx,iyr
   358 000001F2 81EA02000000            	sub edx,2			; edx = iyr-2
   359 000001F8 39D0                    	cmp eax,edx			; ey-(iyr-2)
   360 000001FA 7C15                    	jl End_Collision	; ey < iyr-2
   361                                  
   362 000001FC 81C204000000            	add edx,4			; edx=iyr+2
   363 00000202 39D0                    	cmp eax,edx			; ey-(iyr+2)
   364 00000204 7F0B                    	jg End_Collision	; ey > iyr+2
   365                                  
   366 00000206 B801000000              	mov eax,1
   367 0000020B 898578FFFFFF            	mov Collide,eax		; A Collision
   368                                  End_Collision:
   369                                  	;---------------
   370                                  	
   371 00000211 D945A4                  	fld dword zray	
   372 00000214 DB5DA0                  	fistp dword izray
   373 00000217 8B45A0                  	mov eax,izray
   374 0000021A 3B857CFFFFFF            	cmp eax,iht			; izray-iht
   375 00000220 0F8E61FFFFFF            	jle near DRAW_PIX	; izray <= iht
   376                                  	
   377                                  	; izray > iht   column done
   378                                  
   379                                  UPDATE_RAY:
   380 00000226 D9459C                  	fld dword zdx
   381 00000229 D945AC                  	fld dword xray
   382 0000022C DEC1                    	faddp st1
   383 0000022E D95DAC                  	fstp dword xray		;xray=xray+zdx
   384                                  	
   385 00000231 D94598                  	fld dword zdy
   386 00000234 D945A8                  	fld dword yray
   387 00000237 DEC1                    	faddp st1
   388 00000239 D95DA8                  	fstp dword yray		;yray=yray+zdy
   389                                  	
   390 0000023C D94594                  	fld dword zdz
   391 0000023F D945A4                  	fld dword zray
   392 00000242 DEC1                    	faddp st1
   393 00000244 D95DA4                  	fstp dword zray		;zray=zray+zdz
   394                                  
   395                                  	; Store zray as integer izray
   396 00000247 D945A4                  	fld dword zray
   397 0000024A DB5DA0                  	fistp dword izray
   398                                  
   399 0000024D D945D4                  	fld dword zdslope
   400 00000250 D94590                  	fld dword zvoxscale
   401 00000253 DEC1                    	faddp st1
   402 00000255 D95D90                  	fstp dword zvoxscale	;zvoxscale=zvoxscale+zdslope
   403                                  	
   404 00000258 41                      	inc ecx
   405 00000259 3B4DEC                  	cmp ecx,LAH			; ecx-LAH
   406 0000025C 0F8ECBFEFFFF            	jle near NEXT_STEP	; ecx <= LAH	Next cstep
   407                                  
   408                                  UPDATE_COLUMN:
   409 00000262 59                      	POP ecx
   410 00000263 41                      	inc ecx
   411 00000264 8B45FC                  	mov eax,PSWH
   412 00000267 48                      	dec eax				; PSWH-1
   413 00000268 39C8                    	cmp eax,ecx			; (PSWH-1)-C
   414 0000026A 0F8F6AFEFFFF            	jg near NEXT_COLUMN	; (PSWH-1) > C  ie C < (PSWH-1)  Next C
   415                                  	
   416                                  	; C = PSWH-1  all columns done
   417                                  
   418                                  SaveCollision:
   419                                  	; Return Collision 0/1 no/yes collision
   420 00000270 8B5D08                  	mov ebx,[ebp+8]		; ->BITDATA
   421 00000273 8B8578FFFFFF            	mov eax,Collide
   422 00000279 894320                  	mov [ebx+32],eax	; bmp.Collision = Collide
   423 0000027C C3                      RET
   424                                  
   425                                  ;###########################################
   426                                  PLASMA:
   427                                  
   428                                  %define FSWH1		[ebp-56]       ; FSWH-1 for ANDing
   429                                  %define LEVUP		[ebp-60]       ; LEVUP where FSWH = 2^LEVUP
   430                                  %define StepSize	[ebp-64]       ; StepSize
   431                                  %define ix1			[ebp-68]
   432                                  %define iy1			[ebp-72]
   433                                  %define ix2			[ebp-76]
   434                                  %define iy2			[ebp-80]
   435                                  %define cul1		[ebp-84]
   436                                  %define cul2		[ebp-88]
   437                                  %define cul3		[ebp-92]
   438                                  %define cul4		[ebp-96]
   439                                  %define ixm			[ebp-100]    
   440                                  %define iym			[ebp-104]
   441                                  
   442 0000027D 8B45F4                  	mov eax,[ebp-12]
   443 00000280 898574FFFFFF            	mov irand,eax
   444                                  	
   445 00000286 8B75F0                  	mov esi,ptFS
   446 00000289 E840020000              	CALL RandRough
   447 0000028E 8806                    	mov [esi],al		;FloorSurf(1,1) = Rand 255
   448                                  
   449 00000290 8B45F4                  	mov eax,FSWH
   450 00000293 48                      	dec eax
   451 00000294 8945C8                  	mov FSWH1,eax		;FSWH-1  for ANDing
   452                                  
   453 00000297 01C6                    	add esi,eax
   454 00000299 E830020000              	CALL RandRough		;FloorSurf(FSWH,1) = Rand 255
   455 0000029E 8806                    	mov [esi],al
   456                                  
   457 000002A0 8B45F4                  	mov eax,FSWH
   458 000002A3 8B55F4                  	mov edx,FSWH
   459 000002A6 4A                      	dec edx
   460 000002A7 F7E2                    	mul edx
   461 000002A9 01C6                    	add esi,eax
   462 000002AB E81E020000              	CALL RandRough
   463 000002B0 8806                    	mov [esi],al		;FloorSurf(FSWH,FSWH) = Rand 255
   464                                  
   465 000002B2 8B55F4                  	mov edx,FSWH
   466 000002B5 4A                      	dec edx
   467 000002B6 29D6                    	sub esi,edx
   468 000002B8 E811020000              	CALL RandRough
   469 000002BD 8806                    	mov [esi],al		;FloorSurf(1,FSWH) = Rand 255
   470                                  
   471                                  	; Get power of 2 for FSWH
   472 000002BF 8B45F4                  	mov eax,FSWH
   473 000002C2 B900000000              	mov ecx,0
   474                                  Div2:
   475 000002C7 D1E8                    	shr eax,1
   476 000002C9 7206                    	jc StartLEV
   477 000002CB 41                      	inc ecx
   478 000002CC E9F6FFFFFF              	jmp Div2
   479                                  	
   480                                  StartLEV:				; ie FSWH = 2 ^ ecx
   481 000002D1 894DC4                  	mov LEVUP,ecx		; LEVUP where FSWH = 2^LEVUP  {LEVUP=11 OK}
   482                                  
   483 000002D4 B902000000              	mov ecx,2			; For Lev = 2 To LEVUP (11 for 2048) 
   484                                  
   485                                  NEXTLEV:
   486 000002D9 51                      	PUSH ecx
   487 000002DA BB01000000              	mov ebx,1
   488 000002DF D3E3                    	shl ebx,CL			; NoSteps = 2 ^ LEV
   489                                  
   490 000002E1 31D2                    	xor edx,edx
   491 000002E3 8B45F4                  	mov eax,FSWH
   492 000002E6 F7F3                    	div ebx
   493 000002E8 8945C0                  	mov StepSize,eax	; StepSize = FSWH/NoSteps
   494                                  
   495 000002EB BB01000000              	mov ebx,1			; For IY = 1 to FSWH + 1 Step StepSize
   496                                  NEXTIY:
   497 000002F0 B901000000              	mov ecx,1			; For IX = 1 to FSWH + 1 Step StepSize
   498                                  NEXTIX:
   499 000002F5 51                      	PUSH ecx
   500                                  	;=========================
   501 000002F6 89C8                    	mov eax,ecx			; IX
   502 000002F8 8B55C8                  	mov edx,FSWH1
   503 000002FB 21D0                    	and eax,edx
   504 000002FD 40                      	inc eax				; ix1 = (IX AND FSWH1) + 1
   505 000002FE 8945BC                  	mov ix1,eax
   506                                  	
   507 00000301 89D8                    	mov eax,ebx			; IY
   508 00000303 8B55C8                  	mov edx,FSWH1
   509 00000306 21D0                    	and eax,edx
   510 00000308 40                      	inc eax				; iy1 = (IY AND FSWH1) + 1
   511 00000309 8945B8                  	mov iy1,eax
   512                                  	
   513 0000030C 89C8                    	mov eax,ecx			; IX
   514 0000030E 8B55C0                  	mov edx,StepSize
   515 00000311 01D0                    	add eax,edx
   516 00000313 8B55C8                  	mov edx,FSWH1
   517 00000316 21D0                    	and eax,edx
   518 00000318 40                      	inc eax				; ix2 = ((IX + StepSize) AND FSWH1) + 1
   519 00000319 8945B4                  	mov ix2,eax
   520                                  	
   521 0000031C 89D8                    	mov eax,ebx			; IY
   522 0000031E 8B55C0                  	mov edx,StepSize
   523 00000321 01D0                    	add eax,edx
   524 00000323 8B55C8                  	mov edx,FSWH1
   525 00000326 21D0                    	and eax,edx
   526 00000328 40                      	inc eax				; iy1 = ((IY + StepSize) AND FSWH1) + 1
   527 00000329 8945B0                  	mov iy2,eax
   528                                  	;-------------------------
   529                                  	;----  cul1
   530 0000032C 8B75F0                  	mov esi,ptFS
   531 0000032F 8B45B8                  	mov eax,iy1
   532 00000332 48                      	dec eax
   533 00000333 8B55F4                  	mov edx,FSWH
   534 00000336 F7E2                    	mul edx
   535 00000338 01C6                    	add esi,eax
   536 0000033A 8B45BC                  	mov eax,ix1
   537 0000033D 48                      	dec eax
   538 0000033E 01C6                    	add esi,eax
   539 00000340 31C0                    	xor eax,eax
   540 00000342 8A06                    	mov AL,[esi]
   541 00000344 8945AC                  	mov cul1,eax
   542                                  	;----  cul2
   543 00000347 8B75F0                  	mov esi,ptFS
   544 0000034A 8B45B0                  	mov eax,iy2
   545 0000034D 48                      	dec eax
   546 0000034E 8B55F4                  	mov edx,FSWH
   547 00000351 F7E2                    	mul edx
   548 00000353 01C6                    	add esi,eax
   549 00000355 8B45BC                  	mov eax,ix1
   550 00000358 48                      	dec eax
   551 00000359 01C6                    	add esi,eax
   552 0000035B 31C0                    	xor eax,eax
   553 0000035D 8A06                    	mov AL,[esi]
   554 0000035F 8945A8                  	mov cul2,eax
   555                                  	;----  cul3
   556 00000362 8B75F0                  	mov esi,ptFS
   557 00000365 8B45B8                  	mov eax,iy1
   558 00000368 48                      	dec eax
   559 00000369 8B55F4                  	mov edx,FSWH
   560 0000036C F7E2                    	mul edx
   561 0000036E 01C6                    	add esi,eax
   562 00000370 8B45B4                  	mov eax,ix2
   563 00000373 48                      	dec eax
   564 00000374 01C6                    	add esi,eax
   565 00000376 31C0                    	xor eax,eax
   566 00000378 8A06                    	mov AL,[esi]
   567 0000037A 8945A4                  	mov cul3,eax
   568                                  	;----  cul4
   569 0000037D 8B75F0                  	mov esi,ptFS
   570 00000380 8B45B0                  	mov eax,iy2
   571 00000383 48                      	dec eax
   572 00000384 8B55F4                  	mov edx,FSWH
   573 00000387 F7E2                    	mul edx
   574 00000389 01C6                    	add esi,eax
   575 0000038B 8B45B4                  	mov eax,ix2
   576 0000038E 48                      	dec eax
   577 0000038F 01C6                    	add esi,eax
   578 00000391 31C0                    	xor eax,eax
   579 00000393 8A06                    	mov AL,[esi]
   580 00000395 8945A0                  	mov cul4,eax
   581                                  	;-------------------------
   582                                  	;--- Left ix1
   583 00000398 8B45B8                  	mov eax,iy1
   584 0000039B 0345B0                  	add eax,iy2
   585 0000039E D1E8                    	shr eax,1
   586 000003A0 894598                  	mov iym,eax
   587                                  	
   588 000003A3 8B45AC                  	mov eax,cul1
   589 000003A6 0345A8                  	add eax,cul2
   590 000003A9 D1E8                    	shr eax,1
   591 000003AB 50                      	push eax
   592 000003AC E81D010000              	CALL RandRough
   593 000003B1 58                      	pop eax
   594 000003B2 01D0                    	add eax,edx
   595 000003B4 25FF000000              	and eax,0FFh		; culav AND 255
   596 000003B9 89C1                    	mov ecx,eax			; ecx = culav AND 255
   597 000003BB 8B75F0                  	mov esi,ptFS
   598 000003BE 8B4598                  	mov eax,iym
   599 000003C1 48                      	dec eax
   600 000003C2 8B55F4                  	mov edx,FSWH
   601 000003C5 F7E2                    	mul edx
   602 000003C7 01C6                    	add esi,eax
   603 000003C9 8B45BC                  	mov eax,ix1
   604 000003CC 48                      	dec eax
   605 000003CD 01C6                    	add esi,eax
   606 000003CF 880E                    	mov [esi],CL
   607                                  	
   608                                  	;--- Right ix2
   609 000003D1 8B45A4                  	mov eax,cul3
   610 000003D4 0345A0                  	add eax,cul4
   611 000003D7 D1E8                    	shr eax,1
   612 000003D9 50                      	push eax
   613 000003DA E8EF000000              	CALL RandRough
   614 000003DF 58                      	pop eax
   615 000003E0 01D0                    	add eax,edx
   616 000003E2 25FF000000              	and eax,0FFh		; culav AND 255
   617 000003E7 89C1                    	mov ecx,eax			; ecx = culav AND 255
   618 000003E9 8B75F0                  	mov esi,ptFS
   619 000003EC 8B4598                  	mov eax,iym
   620 000003EF 48                      	dec eax
   621 000003F0 8B55F4                  	mov edx,FSWH
   622 000003F3 F7E2                    	mul edx
   623 000003F5 01C6                    	add esi,eax
   624 000003F7 8B45B4                  	mov eax,ix2
   625 000003FA 48                      	dec eax
   626 000003FB 01C6                    	add esi,eax
   627 000003FD 880E                    	mov [esi],CL
   628                                  
   629                                  	;--- Bottom iy1
   630 000003FF 8B45BC                  	mov eax,ix1
   631 00000402 0345B4                  	add eax,ix2
   632 00000405 D1E8                    	shr eax,1
   633 00000407 89459C                  	mov ixm,eax
   634                                  	
   635 0000040A 8B45AC                  	mov eax,cul1
   636 0000040D 0345A4                  	add eax,cul3
   637 00000410 D1E8                    	shr eax,1
   638 00000412 50                      	push eax
   639 00000413 E8B6000000              	CALL RandRough
   640 00000418 58                      	pop eax
   641 00000419 01D0                    	add eax,edx
   642 0000041B 25FF000000              	and eax,0FFh		; culav AND 255
   643 00000420 89C1                    	mov ecx,eax			; ecx = culav AND 255
   644 00000422 8B75F0                  	mov esi,ptFS
   645 00000425 8B45B8                  	mov eax,iy1
   646 00000428 48                      	dec eax
   647 00000429 8B55F4                  	mov edx,FSWH
   648 0000042C F7E2                    	mul edx
   649 0000042E 01C6                    	add esi,eax
   650 00000430 8B459C                  	mov eax,ixm
   651 00000433 48                      	dec eax
   652 00000434 01C6                    	add esi,eax
   653 00000436 880E                    	mov [esi],CL
   654                                  	
   655                                  	;--- Top iy2
   656 00000438 8B45A8                  	mov eax,cul2
   657 0000043B 0345A0                  	add eax,cul4
   658 0000043E D1E8                    	shr eax,1
   659 00000440 50                      	push eax
   660 00000441 E888000000              	CALL RandRough
   661 00000446 58                      	pop eax
   662 00000447 01D0                    	add eax,edx
   663 00000449 25FF000000              	and eax,0FFh		; culav AND 255
   664 0000044E 89C1                    	mov ecx,eax			; ecx = culav AND 255
   665 00000450 8B75F0                  	mov esi,ptFS
   666 00000453 8B45B0                  	mov eax,iy2
   667 00000456 48                      	dec eax
   668 00000457 8B55F4                  	mov edx,FSWH
   669 0000045A F7E2                    	mul edx
   670 0000045C 01C6                    	add esi,eax
   671 0000045E 8B459C                  	mov eax,ixm
   672 00000461 48                      	dec eax
   673 00000462 01C6                    	add esi,eax
   674 00000464 880E                    	mov [esi],CL
   675                                  
   676                                  	;--- Center ixm,iym
   677 00000466 8B45AC                  	mov eax,cul1
   678 00000469 0345A8                  	add eax,cul2
   679 0000046C 0345A4                  	add eax,cul3
   680 0000046F 0345A0                  	add eax,cul4
   681 00000472 C1E802                  	shr eax,2
   682 00000475 50                      	push eax
   683 00000476 E853000000              	CALL RandRough
   684 0000047B 58                      	pop eax
   685 0000047C 01D0                    	add eax,edx
   686 0000047E 25FF000000              	and eax,0FFh		; culav AND 255
   687 00000483 89C1                    	mov ecx,eax			; ecx = culav AND 255
   688 00000485 8B75F0                  	mov esi,ptFS
   689 00000488 8B4598                  	mov eax,iym
   690 0000048B 48                      	dec eax
   691 0000048C 8B55F4                  	mov edx,FSWH
   692 0000048F F7E2                    	mul edx
   693 00000491 01C6                    	add esi,eax
   694 00000493 8B459C                  	mov eax,ixm
   695 00000496 48                      	dec eax
   696 00000497 01C6                    	add esi,eax
   697 00000499 880E                    	mov [esi],CL
   698                                  	
   699                                  	;=========================
   700 0000049B 59                      	POP ecx
   701 0000049C 8B45C0                  	mov eax,StepSize
   702 0000049F 01C8                    	add eax,ecx
   703 000004A1 40                      	inc eax				; = ecx + StepSize +1
   704 000004A2 3B45F4                  	cmp eax,FSWH
   705 000004A5 7F08                    	jg  TestIY			; ecx + StepSize +1 > FSWH
   706 000004A7 48                      	dec eax
   707 000004A8 89C1                    	mov ecx,eax			; ecx + StepSize
   708 000004AA E946FEFFFF              	jmp near NEXTIX
   709                                  
   710                                  TestIY:
   711 000004AF 8B45C0                  	mov eax,StepSize
   712 000004B2 01D8                    	add eax,ebx
   713 000004B4 40                      	inc eax				; = ecx + StepSize +1
   714 000004B5 3B45F4                  	cmp eax,FSWH
   715 000004B8 7F08                    	jg  TestLEV			; ecx + StepSize +1 > FSWH
   716 000004BA 48                      	dec eax
   717 000004BB 89C3                    	mov ebx,eax			; ecx + StepSize
   718 000004BD E92EFEFFFF              	jmp near NEXTIY
   719                                  
   720                                  TestLEV:
   721                                  
   722 000004C2 59                      	POP ecx
   723 000004C3 41                      	inc ecx
   724 000004C4 3B4DC4                  	cmp ecx,LEVUP		; ie ecx-11 (for 2048)
   725 000004C7 0F8E0CFEFFFF            	jle near NEXTLEV
   726 000004CD C3                      RET
   727                                  
   728                                  ;###########################################
   729                                  RandRough:
   730                                  
   731                                  ;	Produces 16 * (Rnd - 0.5) in edx
   732                                  
   733 000004CE B80B180100              	mov eax,01180Bh		;71699
   734 000004D3 F7AD74FFFFFF            	imul dword irand
   735 000004D9 0509B20A00              	add eax,0AB209h		;700937
   736                                  	; Make odd
   737 000004DE D1D8                    	rcr eax,1
   738 000004E0 7201                    	jc ok
   739 000004E2 F9                      	stc
   740                                  ok:
   741 000004E3 D1D0                    	rcl eax,1
   742 000004E5 898574FFFFFF            	mov irand,eax
   743                                  	
   744 000004EB 31D2                    	xor edx,edx
   745 000004ED 88C2                    	mov dl,al			;0-255
   746                                  	
   747 000004EF 6681EA8000              	sub dx,128			;-128 -> +128
   748 000004F4 66C1FA03                	sar dx,3			;3 edx =+/- 0->16
   749                                  
   750 000004F8 C3                      RET
   751                                  ;###########################################
   752                                  SMOOTHING:
   753 000004F9 FC                      	cld					;cause edi to increment with stosd
   754 000004FA 8B7DF0                  	mov edi,ptFS
   755 000004FD B804080000              	mov eax,2052
   756 00000502 01C7                    	add edi,eax
   757 00000504 B9FCFB0F00              	mov ecx,1047548  ;9
   758                                  	
   759 00000509 0FEFFF                  	pxor mm7,mm7
   760 0000050C 0F6E47FC                	movd mm0,[edi-4]
   761                                  Smooth:
   762 00000510 0F6E4F04                	movd mm1,[edi+4]
   763 00000514 0F6E9700F8FFFF          	movd mm2,[edi-2048]
   764 0000051B 0F6E9F00080000          	movd mm3,[edi+2048]
   765                                  	
   766 00000522 0F60C7                  	punpcklbw mm0,mm7
   767 00000525 0F60CF                  	punpcklbw mm1,mm7
   768 00000528 0F60D7                  	punpcklbw mm2,mm7
   769 0000052B 0F60DF                  	punpcklbw mm3,mm7
   770                                  	
   771 0000052E 0FDDC1                  	paddusw mm0,mm1
   772 00000531 0FDDC2                  	paddusw mm0,mm2
   773 00000534 0FDDC3                  	paddusw mm0,mm3
   774                                  	
   775 00000537 0F71D002                	psrlw mm0,2
   776                                  	
   777 0000053B 0F67C7                  	packuswb mm0,mm7
   778                                  	
   779 0000053E 0F7EC0                  	movd eax,mm0
   780                                  	
   781 00000541 AB                      	stosd
   782                                  	
   783 00000542 81E904000000            	sub ecx,4
   784 00000548 75C6                    	jnz Smooth
   785 0000054A 0F77                    	emms
   786 0000054C C3                      RET
   787                                  ;###########################################
   788                                  BYTESMOOTHING:
   789                                  
   790 0000054D B905000000              MOV ecx,5
   791                                  
   792                                  NSmoothers:
   793                                  
   794 00000552 51                      PUSH ecx
   795                                  
   796                                  	; BL corner
   797 00000553 8B7DF0                  	mov edi,ptFS
   798 00000556 31D2                    	xor edx,edx
   799 00000558 8A8700080000            	mov AL,[edi+2048]
   800 0000055E 01C2                    	add edx,eax
   801 00000560 8A4701                  	mov AL,[edi+1]
   802 00000563 01C2                    	add edx,eax
   803 00000565 D1EA                    	shr edx,1
   804 00000567 8817                    	mov [edi],DL
   805                                  	
   806                                  	; Bottom line
   807 00000569 B8FF070000              	mov eax,2047
   808 0000056E BB00080000              	mov ebx,2048
   809 00000573 F7E3                    	mul ebx			; Byte span top to bottom
   810 00000575 89C3                    	mov ebx,eax  
   811                                  	
   812 00000577 B9FE070000              	mov ecx,2046
   813                                  NextBLine:
   814 0000057C 31D2                    	xor edx,edx
   815 0000057E 8A47FF                  	mov AL,[edi-1]
   816 00000581 01C2                    	add edx,eax
   817 00000583 8A4701                  	mov AL,[edi+1]
   818 00000586 01C2                    	add edx,eax
   819 00000588 8A041F                  	mov AL,[edi+ebx]
   820 0000058B 01C2                    	add edx,eax
   821 0000058D 43                      	inc ebx
   822 0000058E 8A041F                  	mov AL,[edi+ebx]
   823 00000591 4B                      	dec ebx
   824 00000592 01C2                    	add edx,eax
   825 00000594 C1EA02                  	shr edx,2
   826 00000597 8817                    	mov [edi],DL
   827 00000599 47                      	inc edi
   828 0000059A 49                      	dec ecx
   829 0000059B 75DF                    	jnz NextBLine
   830                                  	
   831 0000059D 8B7DF0                  	mov edi,ptFS
   832 000005A0 47                      	inc edi
   833 000005A1 B800080000              	mov eax,2048
   834 000005A6 01C7                    	add edi,eax
   835 000005A8 B9FCEF3F00              	mov ecx,4190204
   836 000005AD 31C0                    	xor eax,eax
   837                                  
   838                                  ByteSmooth:
   839 000005AF 31D2                    	xor edx,edx
   840 000005B1 8A47FF                  	mov AL,[edi-1]
   841 000005B4 01C2                    	add edx,eax
   842 000005B6 8A4701                  	mov AL,[edi+1]
   843 000005B9 01C2                    	add edx,eax
   844 000005BB 8A8700F8FFFF            	mov AL,[edi-2048]
   845 000005C1 01C2                    	add edx,eax
   846 000005C3 8A8700080000            	mov AL,[edi+2048]
   847 000005C9 01C2                    	add edx,eax
   848 000005CB C1EA02                  	shr edx,2
   849 000005CE 8817                    	mov [edi],DL
   850 000005D0 47                      	inc edi
   851 000005D1 49                      	dec ecx
   852 000005D2 75DB                    	jnz ByteSmooth
   853                                  
   854                                  	; TR corner
   855 000005D4 31D2                    	xor edx,edx
   856 000005D6 8A87FF070000            	mov AL,[edi+2047]
   857 000005DC 01C2                    	add edx,eax
   858 000005DE 8A07                    	mov AL,[edi]
   859 000005E0 01C2                    	add edx,eax
   860 000005E2 D1EA                    	shr edx,1
   861 000005E4 889700080000            	mov [edi+2048],DL
   862                                  	
   863 000005EA 81C7FF070000            	add edi,2047	; TL corner -1
   864 000005F0 F7DB                    	neg ebx
   865 000005F2 B9FE070000              	mov ecx,2046
   866                                  NextTLine:
   867 000005F7 31D2                    	xor edx,edx
   868 000005F9 8A4701                  	mov AL,[edi+1]
   869 000005FC 01C2                    	add edx,eax
   870 000005FE 8A47FF                  	mov AL,[edi-1]
   871 00000601 01C2                    	add edx,eax
   872 00000603 8A041F                  	mov AL,[edi+ebx]
   873 00000606 01C2                    	add edx,eax
   874 00000608 4B                      	dec ebx
   875 00000609 8A041F                  	mov AL,[edi+ebx]
   876 0000060C 43                      	inc ebx
   877 0000060D 01C2                    	add edx,eax
   878 0000060F C1EA02                  	shr edx,2
   879 00000612 8817                    	mov [edi],DL
   880 00000614 4F                      	dec edi
   881 00000615 49                      	dec ecx
   882 00000616 75DF                    	jnz NextTLine
   883                                  	
   884                                  	; TL corner
   885 00000618 31D2                    	xor edx,edx
   886 0000061A 8A8701080000            	mov AL,[edi+2049]
   887 00000620 01C2                    	add edx,eax
   888 00000622 8A07                    	mov AL,[edi]
   889 00000624 01C2                    	add edx,eax
   890 00000626 D1EA                    	shr edx,1
   891 00000628 889700080000            	mov [edi+2048],DL
   892                                  
   893 0000062E 59                      POP ecx
   894 0000062F 49                      dec ecx
   895 00000630 0F851CFFFFFF            jnz near NSmoothers
   896                                  
   897                                  
   898 00000636 C3                      RET
   899                                  ;###########################################
   900                                  ;;;;;;;;;;;;;;;;;;;;
   901                                  ;pop ecx
   902                                  ;mov eax,ebx 
   903                                  ;RET
   904                                  ;;;;;;;;;;;;;;;;;;;;
   905                                  
   906                                  
