From 39adfff2a9f73919dd09593efc38884dc2a05f40 Mon Sep 17 00:00:00 2001 From: inmarket Date: Tue, 24 Dec 2013 01:00:14 +1000 Subject: demo - DOOM the game. Runs but not quite functional yet (requires user input to be completed). Shareware WAD file. Please read README.txt and DOOMLIC.txt --- demos/3rdparty/doom/README.asm | 283 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 283 insertions(+) create mode 100644 demos/3rdparty/doom/README.asm (limited to 'demos/3rdparty/doom/README.asm') diff --git a/demos/3rdparty/doom/README.asm b/demos/3rdparty/doom/README.asm new file mode 100644 index 00000000..89629769 --- /dev/null +++ b/demos/3rdparty/doom/README.asm @@ -0,0 +1,283 @@ + +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 + -- cgit v1.2.3