summaryrefslogtreecommitdiff
path: root/src/hexen/linear.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/hexen/linear.asm')
-rw-r--r--src/hexen/linear.asm349
1 files changed, 349 insertions, 0 deletions
diff --git a/src/hexen/linear.asm b/src/hexen/linear.asm
new file mode 100644
index 00000000..d57c0cfa
--- /dev/null
+++ b/src/hexen/linear.asm
@@ -0,0 +1,349 @@
+ .386
+ .MODEL small
+ INCLUDE defs.inc
+
+
+;============================================================================
+;
+; unwound vertical scaling code
+;
+; eax light table pointer, 0 lowbyte overwritten
+; ebx all 0, low byte overwritten
+; ecx fractional step value
+; edx fractional scale value
+; esi start of source pixels
+; edi bottom pixel in screenbuffer to blit into
+;
+; ebx should be set to 0 0 0 dh to feed the pipeline
+;
+; The graphics wrap vertically at 128 pixels
+;============================================================================
+
+.DATA
+
+EXTRN _centery:DWORD
+
+SCALEDEFINE MACRO number
+ dd vscale&number
+ENDM
+
+ ALIGN 4
+scalecalls LABEL
+LINE = 0
+REPT SCREENHEIGHT+1
+ SCALEDEFINE %LINE
+LINE = LINE+1
+ENDM
+
+FUZZSCALEDEFINE MACRO number
+ dd fuzzvscale&number
+ENDM
+
+ ALIGN 4
+fuzzscalecalls LABEL
+LINE = 0
+REPT SCREENHEIGHT+1
+ FUZZSCALEDEFINE %LINE
+LINE = LINE+1
+ENDM
+
+calladdr dd ?
+
+;=================================
+
+
+.CODE
+
+;================
+;
+; R_DrawColumn
+;
+;================
+
+PROC R_DrawColumn_
+PUBLIC R_DrawColumn_
+ PUSHR
+
+ mov ebp,[_dc_yh]
+ mov ebx,ebp
+ mov edi,[_ylookup+ebx*4]
+ mov ebx,[_dc_x]
+ add edi,[_columnofs + ebx*4]
+
+ mov eax,[_dc_yl]
+ sub ebp,eax ; ebp = pixel count
+ or ebp,ebp
+ js done
+
+ mov ecx,[_dc_iscale]
+
+ sub eax,[_centery]
+ imul ecx
+ mov edx,[_dc_texturemid]
+ add edx,eax
+ shl edx,9 ; 7 significant bits, 25 frac
+
+ shl ecx,9 ; 7 significant bits, 25 frac
+ mov esi,[_dc_source]
+
+ mov eax,[_dc_colormap]
+
+ xor ebx,ebx
+ shld ebx,edx,7 ; get address of first location
+ call [scalecalls+4+ebp*4]
+
+done:
+ POPR
+ ret
+
+;============ HIGH DETAIL ============
+
+SCALELABEL MACRO number
+vscale&number:
+ENDM
+
+LINE = SCREENHEIGHT
+REPT SCREENHEIGHT-1
+ SCALELABEL %LINE
+ mov al,[esi+ebx] ; get source pixel
+ add edx,ecx ; calculate next location
+ mov al,[eax] ; translate the color
+; xor ebx,ebx
+; shld ebx,edx,7 ; get address of next location
+ mov ebx,edx
+ shr ebx,25
+ mov [edi-(LINE-1)*SCREENWIDTH],al ; draw a pixel to the buffer
+LINE = LINE-1
+ENDM
+vscale1:
+ mov al,[esi+ebx]
+ mov al,[eax]
+ mov [edi],al
+vscale0:
+ ret
+
+ENDP
+
+
+;================
+;
+; R_DrawFuzz
+;
+;================
+
+PROC R_DrawFuzzColumn_
+PUBLIC R_DrawFuzzColumn_
+ PUSHR
+
+ mov ebp,[_dc_yh]
+ mov ebx,ebp
+ mov edi,[_ylookup+ebx*4]
+ mov ebx,[_dc_x]
+ add edi,[_columnofs + ebx*4]
+
+ mov eax,[_dc_yl]
+ sub ebp,eax ; ebp = pixel count
+ or ebp,ebp
+ js fuzzdone
+
+ mov ecx,[_dc_iscale]
+
+ sub eax,[_centery]
+ imul ecx
+ mov edx,[_dc_texturemid]
+ add edx,eax
+ shl edx,9 ; 7 significant bits, 25 frac
+
+ shl ecx,9 ; 7 significant bits, 25 frac
+ mov esi,[_dc_source]
+ mov eax,[_dc_colormap]
+ xor ebx,ebx
+ shld ebx,edx,7 ;get address of first location
+
+ mov ebp, [fuzzscalecalls+4+ebp*4]
+ mov calladdr, ebp
+ mov ebp, ecx
+ xor ecx, ecx
+
+ call [calladdr]
+
+fuzzdone:
+ POPR
+ ret
+
+
+FUZZSCALELABEL MACRO number
+fuzzvscale&number:
+ENDM
+
+LINE = SCREENHEIGHT
+REPT SCREENHEIGHT-1
+ FUZZSCALELABEL %LINE
+ mov al, byte ptr [esi+ebx] ; get source pixel
+ add edx, ebp ; calculate next location
+
+ mov cl, byte ptr [edi-(LINE-1)*SCREENWIDTH]
+ mov ch, [eax]
+ add ecx, [_tinttable]
+ mov ebx, edx
+ shr ebx, 25
+ mov al, [ecx]
+ mov [edi-(LINE-1)*SCREENWIDTH],al ; draw a pixel to the buffer
+ xor ecx, ecx
+LINE = LINE-1
+ENDM
+fuzzvscale1:
+ mov al,[esi+ebx]
+ mov cl, byte ptr [edi-(LINE-1)*SCREENWIDTH]
+ mov ch, [eax]
+ add ecx, [_tinttable]
+ mov al, [ecx]
+ mov [edi],al
+fuzzvscale0:
+ ret
+
+ENDP
+
+;============================================================================
+;
+; unwound horizontal texture mapping code
+;
+; eax lighttable
+; ebx scratch register
+; ecx position 6.10 bits x, 6.10 bits y
+; edx step 6.10 bits x, 6.10 bits y
+; esi start of block
+; edi dest
+; ebp fff to mask bx
+;
+; ebp should by preset from ebx / ecx before calling
+;============================================================================
+
+OP_SHLD = 0fh
+
+
+.DATA
+
+
+MAPDEFINE MACRO number
+ dd hmap&number
+ENDM
+
+ ALIGN 4
+mapcalls LABEL
+LINE = 0
+REPT SCREENWIDTH+1
+ MAPDEFINE %LINE
+LINE = LINE+1
+ENDM
+
+
+callpoint dd 0
+returnpoint dd 0
+
+
+.CODE
+
+;================
+;
+; R_DrawSpan
+;
+; Horizontal texture mapping
+;
+;================
+
+
+PROC R_DrawSpan_
+PUBLIC R_DrawSpan_
+ PUSHR
+
+IFE SKIPPRIMITIVES
+
+ mov eax,[_ds_x1]
+ mov ebx,[_ds_x2]
+ mov eax,[mapcalls+eax*4]
+ mov [callpoint],eax ; spot to jump into unwound
+ mov eax,[mapcalls+4+ebx*4]
+ mov [returnpoint],eax ; spot to patch a ret at
+ mov BYTE PTR [eax], OP_RET
+
+;
+; build composite position
+;
+ mov ecx,[_ds_xfrac]
+ shl ecx,10
+ and ecx,0ffff0000h
+ mov eax,[_ds_yfrac]
+ shr eax,6
+ and eax,0ffffh
+ or ecx,eax
+
+;
+; build composite step
+;
+ mov edx,[_ds_xstep]
+ shl edx,10
+ and edx,0ffff0000h
+ mov eax,[_ds_ystep]
+ shr eax,6
+ and eax,0ffffh
+ or edx,eax
+
+ mov esi,[_ds_source]
+
+ mov edi,[_ds_y]
+ mov edi,[_ylookup+edi*4]
+ add edi,[_columnofs]
+
+ mov eax,[_ds_colormap]
+
+;
+; feed the pipeline and jump in
+;
+ mov ebp,0fffh ; used to mask off slop high bits from position
+ shld ebx,ecx,22 ; shift y units in
+ shld ebx,ecx,6 ; shift x units in
+ and ebx,ebp ; mask off slop bits
+ call [callpoint]
+
+ mov ebx,[returnpoint]
+ mov BYTE PTR [ebx],OP_MOVAL ; remove the ret patched in
+
+ENDIF
+ POPR
+ ret
+
+
+;============= HIGH DETAIL ============
+
+.CODE
+
+MAPLABEL MACRO number
+hmap&number:
+ENDM
+
+LINE = 0
+PCOL = 0
+REPT SCREENWIDTH/4
+PLANE = 0
+REPT 4
+ MAPLABEL %LINE
+LINE = LINE + 1
+
+ mov al,[esi+ebx] ; get source pixel
+ shld ebx,ecx,22 ; shift y units in
+ shld ebx,ecx,6 ; shift x units in
+ mov al,[eax] ; translate color
+ and ebx,ebp ; mask off slop bits
+ add ecx,edx ; position += step
+ mov [edi+PLANE+PCOL*4],al ; write pixel
+PLANE = PLANE + 1
+ENDM
+PCOL = PCOL + 1
+ENDM
+hmap320:
+ ret
+
+ENDP
+
+END