From 0df2cb80cf03d7259746834220d209b306a8c503 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Thu, 4 Sep 2008 23:15:36 +0000 Subject: Add GPLed Heretic/Hexen source. Subversion-branch: /branches/raven-branch Subversion-revision: 1195 --- src/hexen/linear.asm | 349 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 349 insertions(+) create mode 100644 src/hexen/linear.asm (limited to 'src/hexen/linear.asm') 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 -- cgit v1.2.3