mirror of
https://github.com/OpenSourcedGames/Heretic.git
synced 2026-09-22 12:30:16 +02:00
inital import
This commit is contained in:
@@ -0,0 +1,258 @@
|
||||
.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
|
||||
|
||||
|
||||
;=================================
|
||||
|
||||
|
||||
.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
|
||||
|
||||
|
||||
|
||||
;============================================================================
|
||||
;
|
||||
; 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
|
||||
Reference in New Issue
Block a user