123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- .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
|