aboutsummaryrefslogtreecommitdiffstats
path: root/demos/3rdparty/doom/README.asm
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2013-12-24 01:00:14 +1000
committerinmarket <andrewh@inmarket.com.au>2013-12-24 01:00:14 +1000
commit39adfff2a9f73919dd09593efc38884dc2a05f40 (patch)
treef0fdf8c70ce4a1396e33927f9033049de370c56a /demos/3rdparty/doom/README.asm
parent57d9c4854beefd22aa367f6a44b5da4a586632b1 (diff)
downloaduGFX-39adfff2a9f73919dd09593efc38884dc2a05f40.tar.gz
uGFX-39adfff2a9f73919dd09593efc38884dc2a05f40.tar.bz2
uGFX-39adfff2a9f73919dd09593efc38884dc2a05f40.zip
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
Diffstat (limited to 'demos/3rdparty/doom/README.asm')
-rw-r--r--demos/3rdparty/doom/README.asm283
1 files changed, 283 insertions, 0 deletions
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
+