123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- README - DOOM assembly code
- Okay, I add the DOS assembly module for the historically
- inclined here (may rec.games.programmer suffer). If anyone
- feels the urge to port these to GNU GCC; either inline or
- as separate modules including Makefile support, be my guest.
- Module tmap.S includes the inner loops for texture mapping,
- the interesting one being the floor/ceiling span rendering.
- There was another module in the source dump, fpfunc.S, that
- had both texture mapping and fixed point functions. It
- contained implementations both for i386 and M68k. For
- brevity, I include only the i386 fixed point stuff below.
- //====================================================
- // tmap.S as of January 10th, 1997
- //================
- //
- // R_DrawColumn
- //
- //================
- .data
- loopcount .long 0
- pixelcount .long 0
- .text
- .align 16
- .globl _R_DrawColumn
- _R_DrawColumn:
- pushad
- movl ebp,[_dc_yl]
- movl ebx,ebp
- movl edi,[_ylookup+ebx*4]
- movl ebx,[_dc_x]
- addl edi,[_columnofs + ebx*4]
- movl eax,[_dc_yh]
- incl eax
- subl eax,ebp // pixel count
- movl [pixelcount],eax // save for final pixel
- js done // nothing to scale
- shrl eax,1 // double pixel count
- movl [loopcount],eax
-
- movl ecx,[_dc_iscale]
- movl eax,[_centery]
- subl eax,ebp
- imull ecx
- movl ebp,[_dc_texturemid]
- subl ebp,eax
- shll ebp,9 // 7 significant bits, 25 frac
- movl esi,[_dc_source]
-
- movl ebx,[_dc_iscale]
- shll ebx,9
- movl eax,OFFSET patch1+2 // convice tasm to modify code...
- movl [eax],ebx
- movl eax,OFFSET patch2+2 // convice tasm to modify code...
- movl [eax],ebx
-
- // eax aligned colormap
- // ebx aligned colormap
- // ecx,edx scratch
- // esi virtual source
- // edi moving destination pointer
- // ebp frac
-
- movl ecx,ebp // begin calculating first pixel
- addl ebp,ebx // advance frac pointer
- shrl ecx,25 // finish calculation for first pixel
- movl edx,ebp // begin calculating second pixel
- addl ebp,ebx // advance frac pointer
- shrl edx,25 // finish calculation for second pixel
- movl eax,[_dc_colormap]
- movl ebx,eax
- movb al,[esi+ecx] // get first pixel
- movb bl,[esi+edx] // get second pixel
- movb al,[eax] // color translate first pixel
- movb bl,[ebx] // color translate second pixel
-
- testl [pixelcount],0fffffffeh
- jnz doubleloop // at least two pixels to map
- jmp checklast
-
- .align 16
- doubleloop:
- movl ecx,ebp // begin calculating third pixel
- patch1:
- addl ebp,12345678h // advance frac pointer
- movb [edi],al // write first pixel
- shrl ecx,25 // finish calculation for third pixel
- movl edx,ebp // begin calculating fourth pixel
- patch2:
- addl ebp,12345678h // advance frac pointer
- movl [edi+SCREENWIDTH],bl // write second pixel
- shrl edx,25 // finish calculation for fourth pixel
- movb al,[esi+ecx] // get third pixel
- addl edi,SCREENWIDTH*2 // advance to third pixel destination
- movb bl,[esi+edx] // get fourth pixel
- decl [loopcount] // done with loop?
- movb al,[eax] // color translate third pixel
- movb bl,[ebx] // color translate fourth pixel
- jnz doubleloop
-
- // check for final pixel
- checklast:
- testl [pixelcount],1
- jz done
- movb [edi],al // write final pixel
-
- done:
- popad
- ret
-
- //================
- //
- // R_DrawSpan
- //
- // Horizontal texture mapping
- //
- //================
- .align 16
- .globl _R_DrawSpan
- _R_DrawSpan:
- pushad
- //
- // find loop count
- //
- movl eax,[_ds_x2]
- incl eax
- subl eax,[_ds_x1] // pixel count
- movl [pixelcount],eax // save for final pixel
- js hdone // nothing to scale
- shrl eax,1 // double pixel count
- movl [loopcount],eax
- //
- // build composite position
- //
- movl ebp,[_ds_xfrac]
- shll ebp,10
- andl ebp,0ffff0000h
- movl eax,[_ds_yfrac]
- shrl eax,6
- andl eax,0ffffh
- orl ebp,eax
- movl esi,[_ds_source]
- //
- // calculate screen dest
- //
- movl edi,[_ds_y]
- movl edi,[_ylookup+edi*4]
- movl eax,[_ds_x1]
- addl edi,[_columnofs+eax*4]
- //
- // build composite step
- //
- movl ebx,[_ds_xstep]
- shll ebx,10
- andl ebx,0ffff0000h
- movl eax,[_ds_ystep]
- shrl eax,6
- andl eax,0ffffh
- orl ebx,eax
- movl eax,OFFSET hpatch1+2 // convice tasm to modify code...
- movl [eax],ebx
- movl eax,OFFSET hpatch2+2 // convice tasm to modify code...
- movl [eax],ebx
-
- // eax aligned colormap
- // ebx aligned colormap
- // ecx,edx scratch
- // esi virtual source
- // edi moving destination pointer
- // ebp frac
-
- shldl ecx,ebp,22 // begin calculating third pixel (y units)
- shldl ecx,ebp,6 // begin calculating third pixel (x units)
- addl ebp,ebx // advance frac pointer
- andl ecx,4095 // finish calculation for third pixel
- shldl edx,ebp,22 // begin calculating fourth pixel (y units)
- shldl edx,ebp,6 // begin calculating fourth pixel (x units)
- addl ebp,ebx // advance frac pointer
- andl edx,4095 // finish calculation for fourth pixel
- movl eax,[_ds_colormap]
- movl ebx,eax
- movb al,[esi+ecx] // get first pixel
- movb bl,[esi+edx] // get second pixel
- movb al,[eax] // color translate first pixel
- movb bl,[ebx] // color translate second pixel
-
- testl [pixelcount],0fffffffeh
- jnz hdoubleloop // at least two pixels to map
- jmp hchecklast
-
- .align 16
- hdoubleloop:
- shldl ecx,ebp,22 // begin calculating third pixel (y units)
- shldl ecx,ebp,6 // begin calculating third pixel (x units)
- hpatch1:
- addl ebp,12345678h // advance frac pointer
- movb [edi],al // write first pixel
- andl ecx,4095 // finish calculation for third pixel
- shldl edx,ebp,22 // begin calculating fourth pixel (y units)
- shldl edx,ebp,6 // begin calculating fourth pixel (x units)
- hpatch2:
- addl ebp,12345678h // advance frac pointer
- movb [edi+1],bl // write second pixel
- andl edx,4095 // finish calculation for fourth pixel
- movb al,[esi+ecx] // get third pixel
- addl edi,2 // advance to third pixel destination
- movb bl,[esi+edx] // get fourth pixel
- decl [loopcount] // done with loop?
- movb al,[eax] // color translate third pixel
- movb bl,[ebx] // color translate fourth pixel
- jnz hdoubleloop
- // check for final pixel
- hchecklast:
- testl [pixelcount],1
- jz hdone
- movb [edi],al // write final pixel
-
- hdone:
- popad
- ret
- //====================================================
- // fpfunc.S as of January 10th, 1997 (parts)
- #ifdef i386
- .text
- .align 4
- .globl _FixedMul
- _FixedMul:
- pushl %ebp
- movl %esp,%ebp
- movl 8(%ebp),%eax
- imull 12(%ebp)
- shrdl $16,%edx,%eax
- popl %ebp
- ret
- .align 4
- .globl _FixedDiv2
- _FixedDiv2:
- pushl %ebp
- movl %esp,%ebp
- movl 8(%ebp),%eax
- cdq
- shldl $16,%eax,%edx
- sall $16,%eax
- idivl 12(%ebp)
- popl %ebp
- ret
- #endif
|