     1                                  ;TunInc.asm  by Robert Rayment
     2                                  
     3                                  ;VB
     4                                  ;res& = CallWindowProc(ptmc&, ptbuff&, 2&, 3&, 4&)
     5                                  ;                             8        12  16  20
     6                                  ;Fill BITDATA structure
     7                                  ;Private Type BITDATA
     8                                  ; bmp.bmWidth = 256          'Pixel width
     9                                  ; bmp.bmHeight = 256         'Pixel height
    10                                  ; bmp.ptrDrawSurf = VarPtr(DrawSurf(257)) 'Pointer to drawing surface
    11                                  ; bmp.ptrRendSurf = VarPtr(RendSurf(1))   ' Pointer to rendering surface
    12                                  ;Dim bmp As BITDATA
    13                                  
    14                                  %macro movab 2		;name & num of parameters
    15                                    push dword %2		;2nd param
    16                                    pop dword %1		;1st param
    17                                  %endmacro			;use  movab %1,%2
    18                                  ;Allows eg	movab bmW,[ebx+4]
    19                                  
    20                                  %define bmW   [ebp-4]	;eg 300
    21                                  %define bmH   [ebp-8]	;eg 300
    22                                  %define bmDS  [ebp-12]	;pointer to Draw Surface
    23                                  %define bmRS  [ebp-16]	;pointer to Render Surface
    24                                  
    25                                  %define lo32 [ebp-20]
    26                                  %define hi32 [ebp-24]
    27                                  
    28                                  %define irand [ebp-28]	;random number 0-255
    29                                  
    30                                  ;%define ix    [ebp-20]
    31                                  ;%define iy    [ebp-24]
    32                                  ;%define cul   [ebp-28]
    33                                  ;%define rads  [ebp-32]
    34                                  ;%define xcen  [ebp-36]
    35                                  ;%define ycen  [ebp-40]
    36                                  
    37                                  [bits 32]
    38                                  
    39 00000000 55                      	push ebp
    40 00000001 89E5                    	mov ebp,esp
    41 00000003 81EC1C000000            	sub esp,28
    42 00000009 57                      	push edi
    43 0000000A 56                      	push esi
    44 0000000B 53                      	push ebx
    45                                  
    46                                  	;Fill bmp structure
    47 0000000C 8B5D08                  	mov ebx,[ebp+8]
    48                                  	movab bmW,[ebx]
    49 0000000F FF33                <1>   push dword %2
    50 00000011 8F45FC              <1>   pop dword %1
    51                                  	movab bmH,[ebx+4]
    52 00000014 FF7304              <1>   push dword %2
    53 00000017 8F45F8              <1>   pop dword %1
    54                                  	movab bmDS,[ebx+8]
    55 0000001A FF7308              <1>   push dword %2
    56 0000001D 8F45F4              <1>   pop dword %1
    57                                  	movab bmRS,[ebx+12]
    58 00000020 FF730C              <1>   push dword %2
    59 00000023 8F45F0              <1>   pop dword %1
    60                                  	
    61                                  
    62                                  	;mov eax,bmW			
    63                                  	;shr eax,1
    64                                  	;mov xcen,eax
    65                                  	
    66                                  	;mov eax,bmH			
    67                                  	;shr eax,1
    68                                  	;mov ycen,eax
    69                                  	
    70 00000026 8B4514                  	mov eax,[ebp+20]	;Get Type	1,2,4,8,16,
    71 00000029 D1D8                    	rcr eax,1
    72 0000002B 730A                    	jnc TestType2
    73                                  
    74 0000002D E883000000              	CALL MMXDec
    75 00000032 E95E000000              	jmp GETOUT
    76                                  
    77                                  TestType2:
    78 00000037 D1D8                    	rcr eax,1
    79 00000039 730F                    	jnc TestType4
    80                                  
    81 0000003B E875000000              	CALL MMXDec
    82 00000040 E8A6000000              	CALL AvDrawSurface
    83 00000045 E94B000000              	jmp GETOUT
    84                                  
    85                                  TestType4:
    86 0000004A D1D8                    	rcr eax,1
    87 0000004C 730A                    	jnc TestType8
    88                                  
    89 0000004E E808010000              	CALL MMXUpScroller
    90 00000053 E93D000000              	jmp GETOUT
    91                                  
    92                                  
    93                                  TestType8:
    94                                  
    95 00000058 D1D8                    	rcr eax,1
    96 0000005A 730A                    	jnc TestType16
    97                                  
    98 0000005C E850010000              	CALL MMXDnScroller
    99 00000061 E92F000000              	jmp GETOUT
   100                                  	
   101                                  TestType16:
   102                                  
   103 00000066 D1D8                    	rcr eax,1
   104 00000068 730A                    	jnc TestType32
   105                                  
   106 0000006A E884010000              	CALL MMXLeftScroller
   107 0000006F E921000000              	jmp GETOUT
   108                                  
   109                                  TestType32:
   110 00000074 D1D8                    	rcr eax,1
   111 00000076 730A                    	jnc TestType64
   112                                  
   113 00000078 E8A3010000              	CALL MMXRightScroller
   114 0000007D E913000000              	jmp GETOUT
   115                                  	
   116                                  TestType64:
   117 00000082 D1D8                    	rcr eax,1
   118 00000084 730F                    	jnc TestType128
   119                                  	
   120                                  ;------------------------------------------------------------
   121 00000086 E440                    	in al,040h          ;Seed from timer
   122 00000088 8945E4                  	mov irand,eax
   123                                  ;------------------------------------------------------------
   124                                  
   125 0000008B E8C7010000              	CALL FIRE
   126 00000090 E900000000              	jmp GETOUT
   127                                  	
   128                                  TestType128:
   129                                  
   130                                  GETOUT:
   131                                  
   132 00000095 5B                      	pop ebx
   133 00000096 5E                      	pop esi
   134 00000097 5F                      	pop edi
   135 00000098 89EC                    	mov esp,ebp
   136 0000009A 5D                      	pop ebp
   137 0000009B C21000                  	ret 16
   138                                  
   139                                  ;--- Retrace  Slows things down
   140                                  ;--- No good because only small
   141                                  ;--- part of the total screen update
   142                                  ;--- Also  mov dx,03DAh in NT doubtful.
   143                                  
   144                                  ;mov   dx,03DAh    ;Status register 
   145                                  ;WaitForOFF:      
   146                                  ;in    al,dx     
   147                                  ;test  al,8	  ;Is scan OFF
   148                                  ;jnz   WaitForOFF  ;No, keep waiting
   149                                  
   150                                  ;WaitForON:
   151                                  ;in    al,dx     
   152                                  ;test  al,8	  ;Is scan ON
   153                                  ;jz    WaitForON	  ;No, keep waiting
   154                                  
   155                                  
   156                                  ;############################################################
   157                                  ;	CPU DECREMENT COLOR NUMBER EVERWHERE ON DRAW SURFACE
   158                                  ;	TUNNEL EFFECT	NOT USED
   159                                  DecrementColor:
   160 0000009E 8B7DF4                  	mov edi,bmDS	;->Draw surface
   161 000000A1 8B5DF8                  	mov ebx,bmH
   162 000000A4 29DF                    	sub edi,ebx
   163 000000A6 43                      	inc ebx			;ie 258 lines
   164 000000A7 43                      	inc ebx			;ie 258 lines
   165                                  LOOPY:
   166 000000A8 8B4DFC                  	mov ecx,bmW
   167                                  LOOPX:
   168 000000AB FE0F                    	dec Byte[edi]
   169 000000AD 47                      	inc edi
   170 000000AE 49                      	dec ecx
   171 000000AF 75FA                    	jnz LOOPX
   172                                  	
   173 000000B1 4B                      	dec ebx
   174 000000B2 75F4                    	jnz LOOPY
   175 000000B4 C3                      ret
   176                                  
   177                                  
   178                                  ;############################################################
   179                                  ;	MMX DECREMENT COLOR NUMBER EVERWHERE ON DRAW SURFACE
   180                                  ;	TUNNEL EFFECT
   181                                  MMXDec:
   182 000000B5 8B7DF4                  	mov edi,bmDS	;->Draw surface Line 2
   183                                  	
   184 000000B8 8B55F8                  	mov edx,bmH		;Number of lines
   185 000000BB 29D7                    	sub edi,edx		;->Line 1
   186 000000BD 42                      	inc edx			;ie 257 lines
   187 000000BE 42                      	inc edx			;ie 258 lines
   188                                  	
   189 000000BF B801010101              	mov eax,01010101h	;Make 8 bytes
   190 000000C4 8945EC                  	mov lo32,eax		;to sub 1 from each byte
   191 000000C7 8945E8                  	mov hi32,eax
   192 000000CA 0F6F4DE8                	movq mm1,hi32
   193                                  
   194 000000CE BB08000000              	mov ebx,8
   195                                  	
   196 000000D3 B820000000              	mov eax,32
   197 000000D8 F7E2                    	mul edx	;32*258
   198                                  LMMXY:
   199 000000DA 0F6F07                  	movq mm0,[edi]
   200 000000DD 0FF8C1                  	psubb mm0,mm1		;sub 8 bytes at a time
   201 000000E0 0F7F07                  	movq [edi],mm0		;with overlap ie 0->255
   202                                  	
   203 000000E3 01DF                    	add edi,ebx
   204                                  	
   205 000000E5 48                      	dec eax
   206 000000E6 75F2                    	jnz LMMXY
   207 000000E8 0F77                    	emms			;Clear FP/MMX stack
   208 000000EA C3                      ret
   209                                  
   210                                  ;############################################################
   211                                  ;	AVERAGE DRAW SURFACE - BOILING BUBBLES
   212                                  AvDrawSurface:
   213 000000EB 8B7DF4                  	mov edi,bmDS	;->Draw Surface
   214 000000EE 8B55F8                  	mov edx,bmH
   215                                  AVERY:
   216 000000F1 8B4DFC                  	mov ecx,bmW
   217                                  AVERX:
   218 000000F4 660FB65F01              	movzx bx,Byte[edi+1]	;byte to ebx & zero extend
   219 000000F9 660FB68700FFFFFF        	movzx ax,Byte[edi-256]	;Assumes bmW=256!
   220 00000101 6601C3                  	add bx,ax
   221 00000104 8A47FF                  	mov al,Byte[edi-1]
   222 00000107 6601C3                  	add bx,ax
   223 0000010A 8A8700010000            	mov al,Byte[edi+256]	;Assumes bmW=256!
   224 00000110 6601C3                  	add bx,ax
   225 00000113 66C1EB02                	shr bx,2				;/4
   226 00000117 881F                    	mov [edi],bl			;Store average value
   227                                  
   228 00000119 47                      	inc edi
   229 0000011A 49                      	dec ecx
   230 0000011B 75D7                    	jnz AVERX
   231                                  	
   232 0000011D 4A                      	dec edx
   233 0000011E 75D1                    	jnz AVERY
   234 00000120 C3                      ret
   235                                  ;############################################################
   236                                  
   237                                  ;	AVERAGE DRAW SURFACE TO RENDER SURFACE NOT USED
   238                                  RendSurface:
   239 00000121 8B75F4                  	mov esi,bmDS	;->Draw Surface
   240 00000124 8B7DF0                  	mov edi,bmRS	;->RenderSurface
   241 00000127 8B55F8                  	mov edx,bmH
   242                                  RENDY:
   243 0000012A 8B4DFC                  	mov ecx,bmW
   244                                  RENDX:
   245 0000012D 660FB65E01              	movzx bx,Byte[esi+1]	;byte to ebx & zero extend
   246 00000132 660FB68600FFFFFF        	movzx ax,Byte[esi-256]	;Assumes bmW=256!
   247 0000013A 6601C3                  	add bx,ax
   248 0000013D 8A46FF                  	mov al,Byte[esi-1]
   249 00000140 6601C3                  	add bx,ax
   250 00000143 8A8600010000            	mov al,Byte[esi+256]	;Assumes bmW=256!
   251 00000149 6601C3                  	add bx,ax
   252 0000014C 66C1EB02                	shr bx,2				;/4
   253 00000150 881F                    	mov [edi],bl			;Store average value
   254 00000152 46                      	inc esi
   255 00000153 47                      	inc edi
   256 00000154 49                      	dec ecx
   257 00000155 75D6                    	jnz RENDX
   258                                  	
   259 00000157 4A                      	dec edx
   260 00000158 75D0                    	jnz RENDY
   261 0000015A C3                      ret
   262                                  
   263                                  ;############################################################
   264                                  
   265                                  ;	MMX UP SCROLLER
   266                                  
   267                                  MMXUpScroller:
   268 0000015B 8B7DF4                  	mov edi,bmDS	;->Draw surface line 2
   269 0000015E B800000100              	mov eax,65536	;256*256
   270 00000163 01C7                    	add edi,eax		;-> top line 258
   271 00000165 57                      	push edi		;Save pointer
   272 00000166 89FE                    	mov esi,edi 	
   273 00000168 B800010000              	mov eax,256
   274 0000016D 29C6                    	sub esi,eax		;->Line257
   275                                  	
   276                                  	;Move 256 lines up
   277 0000016F BB08000000              	mov ebx,8		;8 64-bit mmx regs = 256 bytes
   278 00000174 B900010000              	mov ecx,256		;Number of lines = 256
   279                                  UPMOVER:
   280 00000179 56                      	push esi
   281 0000017A 57                      	push edi
   282 0000017B B820000000              	mov eax,32
   283                                  MOVE1LINEUP:
   284 00000180 0F6F06                  	movq mm0,[esi]	;   Line 257, 256,, 2,1
   285 00000183 0F7F07                  	movq [edi],mm0	;to Line 258, 257,, 3,2
   286 00000186 01DE                    	add esi,ebx
   287 00000188 01DF                    	add edi,ebx
   288 0000018A 48                      	dec eax
   289 0000018B 75F3                    	jnz MOVE1LINEUP
   290                                  	
   291 0000018D 5F                      	pop edi
   292 0000018E 5E                      	pop esi
   293 0000018F B800010000              	mov eax,256
   294 00000194 29C6                    	sub esi,eax
   295 00000196 29C7                    	sub edi,eax
   296 00000198 49                      	dec ecx
   297 00000199 75DE                    	jnz UPMOVER
   298                                  	
   299                                  	;edi->line 2
   300                                  	
   301                                  	;Move Line 258 to Line 2
   302 0000019B 5E                      	pop esi		;-> Line 258
   303 0000019C B920000000              	mov ecx,32
   304                                  Top2Bottom:
   305 000001A1 0F6F06                  	movq mm0,[esi]
   306 000001A4 0F7F07                  	movq [edi],mm0
   307 000001A7 01DE                    	add esi,ebx
   308 000001A9 01DF                    	add edi,ebx
   309 000001AB 49                      	dec ecx
   310 000001AC 75F3                    	jnz Top2Bottom
   311 000001AE 0F77                    	emms			;Clear FP/MMX stack
   312 000001B0 C3                      ret
   313                                  
   314                                  ;############################################################
   315                                  
   316                                  ;	MMX DOWN SCROLLER
   317                                  
   318                                  MMXDnScroller:
   319 000001B1 8B75F4                  	mov esi,bmDS	;->Draw surface line 2
   320 000001B4 89F7                    	mov edi,esi 	
   321 000001B6 B800010000              	mov eax,256
   322 000001BB 29C7                    	sub edi,eax		;->Line1
   323 000001BD 57                      	push edi		;save pointer to Line 1
   324                                  	
   325                                  	;Move 256 lines down
   326 000001BE BB08000000              	mov ebx,8		;8 64-bit mmx regs = 256 bytes
   327 000001C3 B900010000              	mov ecx,256		;Number of lines = 256
   328                                  DNMOVER:
   329 000001C8 B820000000              	mov eax,32
   330                                  MOVE1LINEDN:
   331 000001CD 0F6F06                  	movq mm0,[esi]	;   Line 2, 3,, 257
   332 000001D0 0F7F07                  	movq [edi],mm0	;to Line 1, 2,, 256
   333 000001D3 01DE                    	add esi,ebx
   334 000001D5 01DF                    	add edi,ebx
   335 000001D7 48                      	dec eax
   336 000001D8 75F3                    	jnz MOVE1LINEDN
   337                                  	
   338 000001DA 49                      	dec ecx
   339 000001DB 75EB                    	jnz DNMOVER
   340                                  	
   341                                  	;edi->line 257
   342                                  	
   343                                  	;Move Line 1 to Line 257
   344 000001DD 5E                      	pop esi		;-> Line 1
   345 000001DE B920000000              	mov ecx,32
   346                                  Bottom2Top:
   347 000001E3 0F6F06                  	movq mm0,[esi]
   348 000001E6 0F7F07                  	movq [edi],mm0
   349 000001E9 01DE                    	add esi,ebx
   350 000001EB 01DF                    	add edi,ebx
   351 000001ED 49                      	dec ecx
   352 000001EE 75F3                    	jnz Bottom2Top
   353 000001F0 0F77                    	emms			;Clear FP/MMX stack
   354 000001F2 C3                      ret
   355                                  
   356                                  ;############################################################
   357                                  
   358                                  ;	MMX LEFT SCROLLER
   359                                  
   360                                  MMXLeftScroller:
   361 000001F3 8B7DF4                  	mov edi,bmDS	;->Draw surface line 2
   362                                  	
   363                                  	;Shift 256 lines left
   364 000001F6 BB08000000              	mov ebx,8		;8 64-bit mmx regs = 256 bytes
   365 000001FB B900010000              	mov ecx,256		;Number of lines = 256
   366                                  LEMOVER:
   367 00000200 8A17                    	mov dl,[edi]	;left byte
   368 00000202 47                      	inc edi
   369 00000203 B820000000              	mov eax,32
   370                                  MOVE1LINELE:
   371 00000208 0F6F07                  	movq mm0,[edi]	;pick up 8 bytes
   372 0000020B 4F                      	dec edi
   373 0000020C 0F7F07                  	movq [edi],mm0	;place 8 bytes 1 byte to left
   374 0000020F 47                      	inc edi
   375 00000210 01DF                    	add edi,ebx
   376 00000212 48                      	dec eax
   377 00000213 75F3                    	jnz MOVE1LINELE
   378                                  	
   379 00000215 4F                      	dec edi
   380 00000216 4F                      	dec edi
   381 00000217 8817                    	mov [edi],dl
   382 00000219 47                      	inc edi
   383 0000021A 49                      	dec ecx
   384 0000021B 75E3                    	jnz LEMOVER
   385 0000021D 0F77                    	emms			;Clear FP/MMX stack
   386 0000021F C3                      ret
   387                                  
   388                                  ;############################################################
   389                                  
   390                                  ;	MMX RIGHT SCROLLER
   391                                  
   392                                  MMXRightScroller:
   393 00000220 8B7DF4                  	mov edi,bmDS	;->Draw surface line 2
   394 00000223 B800000100              	mov eax,65536	;256*256
   395 00000228 01C7                    	add edi,eax		;-> top line 258
   396 0000022A 4F                      	dec edi			;-> end line 257
   397                                  	
   398                                  	;Shift 256 lines right
   399 0000022B BB08000000              	mov ebx,8		;8 64-bit mmx regs = 256 bytes
   400 00000230 B900010000              	mov ecx,256		;Number of lines = 256
   401                                  RIMOVER:
   402 00000235 8A17                    	mov dl,[edi]	;right byte
   403 00000237 29DF                    	sub edi,ebx		;back 8 bytes
   404 00000239 B820000000              	mov eax,32
   405                                  MOVE1LINERI:
   406 0000023E 0F6F07                  	movq mm0,[edi]	;pick up 8 bytes
   407 00000241 47                      	inc edi
   408 00000242 0F7F07                  	movq [edi],mm0	;place 8 bytes 1 byte to right
   409 00000245 4F                      	dec edi
   410 00000246 29DF                    	sub edi,ebx
   411 00000248 48                      	dec eax
   412 00000249 75F3                    	jnz MOVE1LINERI
   413                                  	
   414 0000024B 01DF                    	add edi,ebx
   415 0000024D 47                      	inc edi
   416 0000024E 8817                    	mov [edi],dl
   417 00000250 4F                      	dec edi
   418 00000251 49                      	dec ecx
   419 00000252 75E1                    	jnz RIMOVER
   420 00000254 0F77                    	emms			;Clear FP/MMX stack
   421 00000256 C3                      ret
   422                                  
   423                                  ;############################################################
   424                                  
   425                                  ;	FIRE
   426                                  FIRE:
   427                                  
   428 00000257 8B7DF4                  	mov edi,bmDS	;->Draw surface line 2
   429 0000025A B800010000              	mov eax,256
   430 0000025F 01C7                    	add edi,eax		;->Line 3
   431                                  
   432 00000261 B8F0000000              	mov eax,240		;Do 240 lines then into black
   433 00000266 BB00010000              	mov ebx,256
   434 0000026B F7E3                    	mul ebx
   435 0000026D 89C1                    	mov ecx,eax		;Total number of cells used
   436                                  
   437                                  	;Pick up colors from below & move them up
   438                                  	;Very subtle this, small changes make huge
   439                                  	;changes to display. Also the palette is
   440                                  	;very critical
   441                                  
   442                                  MigrateUP:
   443 0000026F 6631D2                    	xor dx,dx             ;Sum up 4 colors
   444                                   	
   445 00000272 8A97FFFEFFFF              	mov dl,[edi-257]      ;Line 2, below left
   446 00000278 6689D0                    	mov ax,dx             ;ax = dx
   447 0000027B 8A9700FFFFFF              	mov dl,[edi-256]      ;Line 2, below
   448 00000281 6601D0                    	add ax,dx             ;sum
   449 00000284 8A9701FFFFFF              	mov dl,[edi-255]      ;Line 2, below right
   450 0000028A 6601D0                    	add ax,dx             ;sum
   451 0000028D 8A9700FEFFFF              	mov dl,[edi-512]      ;Line 1, below
   452 00000293 6601D0                    	add ax,dx             ;sum
   453 00000296 66C1E802                  	shr ax,2              ;/4 average
   454                                    
   455 0000029A 7402                      	jz StoreCul           ;ax=0 color num?
   456 0000029C 6648                      	dec ax                ;no move towards 0 ie black
   457                                  StoreCul:
   458                                  
   459 0000029E 8807                      	mov [edi],al          ; put the new pixel value back in the array.
   460 000002A0 47                        	inc edi               ; go to the next one.
   461 000002A1 49                      	dec ecx
   462 000002A2 75CB                    	jnz MigrateUP
   463                                  
   464 000002A4 C3                      ret
