From: nasm-bot f. C. G. <gor...@gm...> - 2018-10-17 18:44:23
|
Commit-ID: 2e1bf723a9e3da2adf9aaee25200b06887cc2aa8 Gitweb: http://repo.or.cz/w/nasm.git?a=commitdiff;h=2e1bf723a9e3da2adf9aaee25200b06887cc2aa8 Author: Cyrill Gorcunov <gor...@gm...> AuthorDate: Wed, 25 Apr 2018 00:34:00 +0300 Committer: Cyrill Gorcunov <gor...@gm...> CommitDate: Wed, 17 Oct 2018 21:40:14 +0300 test: travis -- Add some of converted tests Signed-off-by: Cyrill Gorcunov <gor...@gm...> --- travis/test/_file_.asm | 4 + travis/test/_file_.bin.t | Bin 0 -> 56 bytes travis/test/_file_.json | 8 + travis/test/_version.json | 7 + travis/test/_version.stdout | 1 + travis/test/a32offs.asm | 7 + travis/test/a32offs.bin.t | 1 + travis/test/a32offs.json | 18 + {test => travis/test}/absolute.asm | 3 - travis/test/absolute.bin.t | 1 + travis/test/absolute.json | 8 + {test => travis/test}/addr64x.asm | 3 - travis/test/addr64x.bin.t | Bin 0 -> 56 bytes travis/test/addr64x.json | 25 + travis/test/addr64x.stderr | 4 + travis/test/align13.asm | 16 + travis/test/align13.json | 25 + travis/test/align13.stderr | 4 + test/tmap.nas => travis/test/tmap.asm | 2889 +++++++++++++++++---------------- travis/test/tmap.json | 10 + travis/test/tmap.o.stderr | 1 + travis/test/tmap.o.t | Bin 0 -> 6752 bytes {test => travis/test}/weirdpaste.asm | 3 - travis/test/weirdpaste.bin.t | Bin 0 -> 42 bytes travis/test/weirdpaste.i.t | 30 + travis/test/weirdpaste.json | 18 + 26 files changed, 1633 insertions(+), 1453 deletions(-) diff --git a/travis/test/_file_.asm b/travis/test/_file_.asm new file mode 100644 index 0000000..e349e2c --- /dev/null +++ b/travis/test/_file_.asm @@ -0,0 +1,4 @@ + db __FILE__, `\r\n` + db __FILE__, `\r\n` + dw __LINE__ + dw __LINE__ diff --git a/travis/test/_file_.bin.t b/travis/test/_file_.bin.t new file mode 100644 index 0000000..2ba4aa2 Binary files /dev/null and b/travis/test/_file_.bin.t differ diff --git a/travis/test/_file_.json b/travis/test/_file_.json new file mode 100644 index 0000000..cf16822 --- /dev/null +++ b/travis/test/_file_.json @@ -0,0 +1,8 @@ +{ + "description": "Check the __FILE__ preprocessor directive", + "format": "bin", + "source": "_file_.asm", + "target": [ + { "output": "_file_.bin" } + ] +} diff --git a/travis/test/_version.json b/travis/test/_version.json new file mode 100644 index 0000000..f84a8c8 --- /dev/null +++ b/travis/test/_version.json @@ -0,0 +1,7 @@ +{ + "description": "Check the NASM version", + "target": [ + { "option": "-v", "stdout": "_version.stdout" } + ], + "error": "over" +} diff --git a/travis/test/_version.stdout b/travis/test/_version.stdout new file mode 100644 index 0000000..935c7d0 --- /dev/null +++ b/travis/test/_version.stdout @@ -0,0 +1 @@ +NASM version 2.14rc0 compiled on Apr 25 2018 diff --git a/travis/test/a32offs.asm b/travis/test/a32offs.asm new file mode 100644 index 0000000..82df66c --- /dev/null +++ b/travis/test/a32offs.asm @@ -0,0 +1,7 @@ + bits 16 +foo: a32 loop foo +bar: loop bar, ecx + + bits 32 +baz: a16 loop baz +qux: loop qux, cx diff --git a/travis/test/a32offs.bin.t b/travis/test/a32offs.bin.t new file mode 100644 index 0000000..44d38d2 --- /dev/null +++ b/travis/test/a32offs.bin.t @@ -0,0 +1 @@ +gggg \ No newline at end of file diff --git a/travis/test/a32offs.json b/travis/test/a32offs.json new file mode 100644 index 0000000..cb8ac1f --- /dev/null +++ b/travis/test/a32offs.json @@ -0,0 +1,18 @@ +[ + { + "description": "Check a16/a32 address prefix (-Ox)", + "id": "a32offs", + "format": "bin", + "source": "a32offs.asm", + "option": "-Ox", + "target": [ + { "output": "a32offs.bin" } + ] + }, + { + "description": "Check a16/a32 address prefix (-O0)", + "ref": "a32offs", + "option": "-O0", + "update": false + } +] diff --git a/test/absolute.asm b/travis/test/absolute.asm similarity index 71% copy from test/absolute.asm copy to travis/test/absolute.asm index 969a85e..38532ec 100644 --- a/test/absolute.asm +++ b/travis/test/absolute.asm @@ -1,7 +1,4 @@ -;Testname=bin; Arguments=-fbin -oabsolute.bin; Files=stdout stderr absolute.bin -%ifmacro org org 7c00h -%endif init_foo: jmp init_bar nop diff --git a/travis/test/absolute.bin.t b/travis/test/absolute.bin.t new file mode 100644 index 0000000..b132e69 --- /dev/null +++ b/travis/test/absolute.bin.t @@ -0,0 +1 @@ + |f| \ No newline at end of file diff --git a/travis/test/absolute.json b/travis/test/absolute.json new file mode 100644 index 0000000..6a6a946 --- /dev/null +++ b/travis/test/absolute.json @@ -0,0 +1,8 @@ +{ + "description": "Check absolute addressing", + "format": "bin", + "source": "absolute.asm", + "target": [ + { "output": "absolute.bin" } + ] +} diff --git a/test/addr64x.asm b/travis/test/addr64x.asm similarity index 55% copy from test/addr64x.asm copy to travis/test/addr64x.asm index c7a64f5..1fbec45 100644 --- a/test/addr64x.asm +++ b/travis/test/addr64x.asm @@ -1,6 +1,3 @@ -;Testname=O0; Arguments=-O0 -fbin -oaddr64.bin; Files=stdout stderr addr64.bin -;Testname=O1; Arguments=-O1 -fbin -oaddr64.bin; Files=stdout stderr addr64.bin -;Testname=Ox; Arguments=-Ox -fbin -oaddr64.bin; Files=stdout stderr addr64.bin bits 64 mov rdx,[rax] mov eax,[byte rsp+0x01] diff --git a/travis/test/addr64x.bin.t b/travis/test/addr64x.bin.t new file mode 100644 index 0000000..b9166a2 Binary files /dev/null and b/travis/test/addr64x.bin.t differ diff --git a/travis/test/addr64x.json b/travis/test/addr64x.json new file mode 100644 index 0000000..e642ce6 --- /dev/null +++ b/travis/test/addr64x.json @@ -0,0 +1,25 @@ +[ + { + "description": "Check 64-bit addressing (-Ox)", + "id": "addr64x", + "format": "bin", + "source": "addr64x.asm", + "option": "-Ox", + "target": [ + { "output": "addr64x.bin" }, + { "stderr": "addr64x.stderr" } + ] + }, + { + "description": "Check 64-bit addressing (-O1)", + "ref": "addr64x", + "option": "-O1", + "update": "false" + }, + { + "description": "Check 64-bit addressing (-O0)", + "ref": "addr64x", + "option": "-O0", + "update": "false" + } +] diff --git a/travis/test/addr64x.stderr b/travis/test/addr64x.stderr new file mode 100644 index 0000000..5d1b318 --- /dev/null +++ b/travis/test/addr64x.stderr @@ -0,0 +1,4 @@ +./travis/test/addr64x.asm:5: warning: byte data exceeds bounds [-w+number-overflow] +./travis/test/addr64x.asm:5: warning: byte data exceeds bounds [-w+number-overflow] +./travis/test/addr64x.asm:6: warning: byte data exceeds bounds [-w+number-overflow] +./travis/test/addr64x.asm:6: warning: byte data exceeds bounds [-w+number-overflow] diff --git a/travis/test/align13.asm b/travis/test/align13.asm new file mode 100644 index 0000000..556373f --- /dev/null +++ b/travis/test/align13.asm @@ -0,0 +1,16 @@ +; Test of non-power-of-2 alignment + + bits 32 + + inc eax + inc eax + align 13 + inc eax + inc eax + align 13 + inc eax + inc eax + align 13 + align 13 ;should do nothing + inc eax + inc eax diff --git a/travis/test/align13.json b/travis/test/align13.json new file mode 100644 index 0000000..7375023 --- /dev/null +++ b/travis/test/align13.json @@ -0,0 +1,25 @@ +[ + { + "description": "Test of non-power-of-2 alignment (-Ox)", + "id": "align13", + "format": "bin", + "source": "align13.asm", + "option": "-Ox -o align13.bin", + "target": [ + { "stderr": "align13.stderr" } + ], + "error": "expected" + }, + { + "description": "Test of non-power-of-2 alignment (-O1)", + "ref": "align13", + "option": "-O1 -o align13.bin", + "update": "false" + }, + { + "description": "Test of non-power-of-2 alignment (-O0)", + "ref": "align13", + "option": "-O0 -o align13.bin", + "update": "false" + } +] diff --git a/travis/test/align13.stderr b/travis/test/align13.stderr new file mode 100644 index 0000000..31d6e31 --- /dev/null +++ b/travis/test/align13.stderr @@ -0,0 +1,4 @@ +./travis/test/align13.asm:7: error: segment alignment `13' is not power of two +./travis/test/align13.asm:10: error: segment alignment `13' is not power of two +./travis/test/align13.asm:13: error: segment alignment `13' is not power of two +./travis/test/align13.asm:14: error: segment alignment `13' is not power of two diff --git a/test/tmap.nas b/travis/test/tmap.asm similarity index 96% copy from test/tmap.nas copy to travis/test/tmap.asm index 51b477f..a634e1b 100644 --- a/test/tmap.nas +++ b/travis/test/tmap.asm @@ -1,1447 +1,1448 @@ -;; NASM note: this file abuses the section flags in such a way that -;; NASM 0.98.37 broke when this was compiled with: -;; nasm -o tmap.o -f elf -DLINUX tmap.nas - -;;----------------------------------------------------------------------------- -;; -;; $Id$ -;; -;; Copyright (C) 1998-2000 by DooM Legacy Team. -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 2 -;; of the License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; +;; NASM note: this file abuses the section flags in such a way that +;; NASM 0.98.37 broke when this was compiled with: +;; nasm -o tmap.o -f elf -DLINUX tmap.nas + +;;----------------------------------------------------------------------------- +;; +;; $Id$ +;; +;; Copyright (C) 1998-2000 by DooM Legacy Team. +;; +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License +;; as published by the Free Software Foundation; either version 2 +;; of the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; ;; $Log$ ;; Revision 1.2 2003/09/10 23:33:38 hpa ;; Use the version of tmap.nas that actually caused problems -;; -;; Revision 1.10 2001/02/24 13:35:21 bpereira -;; no message -;; -;; Revision 1.9 2001/02/10 15:24:19 hurdler -;; Apply Rob's patch for Linux version -;; -;; Revision 1.8 2000/11/12 09:48:15 bpereira -;; no message -;; -;; Revision 1.7 2000/11/06 20:52:16 bpereira -;; no message -;; -;; Revision 1.6 2000/11/03 11:48:40 hurdler -;; Fix compiling problem under win32 with 3D-Floors and FragglScript (to verify!) -;; -;; Revision 1.5 2000/11/03 03:27:17 stroggonmeth -;; Again with the bug fixing... -;; -;; Revision 1.4 2000/11/02 17:50:10 stroggonmeth -;; Big 3Dfloors & FraggleScript commit!! -;; -;; Revision 1.3 2000/04/24 20:24:38 bpereira -;; no message -;; -;; Revision 1.2 2000/02/27 00:42:11 hurdler -;; fix CR+LF problem -;; -;; Revision 1.1.1.1 2000/02/22 20:32:32 hurdler -;; Initial import into CVS (v1.29 pr3) -;; -;; -;; DESCRIPTION: -;; assembler optimised rendering code for software mode -;; draw floor spans, and wall columns. -;; -;;----------------------------------------------------------------------------- - - -[BITS 32] - -%ifdef LINUX -%macro cextern 1 -[extern %1] -%endmacro - -%macro cglobal 1 -[global %1] -%endmacro - -%define CODE_SEG .data -%else -%macro cextern 1 -%define %1 _%1 -[extern %1] -%endmacro - -%macro cglobal 1 -%define %1 _%1 -[global %1] -%endmacro - -%define CODE_SEG .text -%endif - - -;; externs -;; columns -cextern dc_x -cextern dc_yl -cextern dc_yh -cextern ylookup -cextern columnofs -cextern dc_source -cextern dc_texturemid -cextern dc_iscale -cextern centery -cextern dc_colormap -cextern dc_transmap -cextern colormaps - -;; spans -cextern ds_x1 -cextern ds_x2 -cextern ds_y -cextern ds_xfrac -cextern ds_yfrac -cextern ds_xstep -cextern ds_ystep -cextern ds_source -cextern ds_colormap -;cextern ds_textureheight - -; polygon edge rasterizer -cextern prastertab - - -;;---------------------------------------------------------------------- -;; -;; R_DrawColumn -;; -;; New optimised version 10-01-1998 by D.Fabrice and P.Boris -;; TO DO: optimise it much farther... should take at most 3 cycles/pix -;; once it's fixed, add code to patch the offsets so that it -;; works in every screen width. -;; -;;---------------------------------------------------------------------- - -[SECTION .data] - -;;.align 4 -loopcount dd 0 -pixelcount dd 0 -tystep dd 0 - -[SECTION CODE_SEG write] - -;---------------------------------------------------------------------------- -;fixed_t FixedMul (fixed_t a, fixed_t b) -;---------------------------------------------------------------------------- -cglobal FixedMul -; align 16 -FixedMul: - mov eax,[esp+4] - imul dword [esp+8] - shrd eax,edx,16 - ret - -;---------------------------------------------------------------------------- -;fixed_t FixedDiv2 (fixed_t a, fixed_t b); -;---------------------------------------------------------------------------- -cglobal FixedDiv2 -; align 16 -FixedDiv2: - mov eax,[esp+4] - mov edx,eax ;; these two instructions allow the next - sar edx,31 ;; two to pair, on the Pentium processor. - shld edx,eax,16 - sal eax,16 - idiv dword [esp+8] - ret - -;---------------------------------------------------------------------------- -; void ASM_PatchRowBytes (int rowbytes); -;---------------------------------------------------------------------------- -cglobal ASM_PatchRowBytes -; align 16 -ASM_PatchRowBytes: - mov eax,[esp+4] - mov [p1+2],eax - mov [p2+2],eax - mov [p3+2],eax - mov [p4+2],eax - mov [p5+2],eax - mov [p6+2],eax - mov [p7+2],eax - mov [p8+2],eax - mov [p9+2],eax - mov [pa+2],eax - mov [pb+2],eax - mov [pc+2],eax - mov [pd+2],eax - mov [pe+2],eax - mov [pf+2],eax - mov [pg+2],eax - mov [ph+2],eax - mov [pi+2],eax - mov [pj+2],eax - mov [pk+2],eax - mov [pl+2],eax - mov [pm+2],eax - mov [pn+2],eax - mov [po+2],eax - mov [pp+2],eax - mov [pq+2],eax - add eax,eax - mov [q1+2],eax - mov [q2+2],eax - mov [q3+2],eax - mov [q4+2],eax - mov [q5+2],eax - mov [q6+2],eax - mov [q7+2],eax - mov [q8+2],eax - ret - - -;---------------------------------------------------------------------------- -; 8bpp column drawer -;---------------------------------------------------------------------------- - -cglobal R_DrawColumn_8 -; align 16 -R_DrawColumn_8: - push ebp ;; preserve caller's stack frame pointer - push esi ;; preserve register variables - push edi - push ebx -;; -;; dest = ylookup[dc_yl] + columnofs[dc_x]; -;; - mov ebp,[dc_yl] - mov ebx,ebp - mov edi,[ylookup+ebx*4] - mov ebx,[dc_x] - add edi,[columnofs+ebx*4] ;; edi = dest -;; -;; pixelcount = yh - yl + 1 -;; - mov eax,[dc_yh] - inc eax - sub eax,ebp ;; pixel count - mov [pixelcount],eax ;; save for final pixel - jle near vdone ;; nothing to scale -;; -;; frac = dc_texturemid - (centery-dc_yl)*fracstep; -;; - mov ecx,[dc_iscale] ;; fracstep - mov eax,[centery] - sub eax,ebp - imul eax,ecx - mov edx,[dc_texturemid] - sub edx,eax - mov ebx,edx - shr ebx,16 ;; frac int. - and ebx,0x7f - shl edx,16 ;; y frac up - - mov ebp,ecx - shl ebp,16 ;; fracstep f. up - shr ecx,16 ;; fracstep i. ->cl - and cl,0x7f - mov esi,[dc_source] -;; -;; lets rock :) ! -;; - mov eax,[pixelcount] - mov dh,al - shr eax,2 - mov ch,al ;; quad count - mov eax,[dc_colormap] - test dh,0x3 - je near v4quadloop -;; -;; do un-even pixel -;; - test dh,0x1 - je two_uneven - - mov al,[esi+ebx] ;; prep un-even loops - add edx,ebp ;; ypos f += ystep f - adc bl,cl ;; ypos i += ystep i - mov dl,[eax] ;; colormap texel - and bl,0x7f ;; mask 0-127 texture index - mov [edi],dl ;; output pixel -p1: add edi,0x12345678 -;; -;; do two non-quad-aligned pixels -;; -two_uneven: - test dh,0x2 - je f3 - - mov al,[esi+ebx] ;; fetch source texel - add edx,ebp ;; ypos f += ystep f - adc bl,cl ;; ypos i += ystep i - mov dl,[eax] ;; colormap texel - and bl,0x7f ;; mask 0-127 texture index - mov [edi],dl ;; output pixel - mov al,[esi+ebx] - add edx,ebp ;; fetch source texel - adc bl,cl ;; ypos f += ystep f - mov dl,[eax] ;; ypos i += ystep i - and bl,0x7f ;; colormap texel -p2: add edi,0x12345678 ;; mask 0-127 texture index - mov [edi],dl -p3: add edi,0x12345678 ;; output pixel -;; -;; test if there was at least 4 pixels -;; -f3: - test ch,0xff ;; test quad count - je near vdone -;; -;; ebp : ystep frac. upper 16 bits -;; edx : y frac. upper 16 bits -;; ebx : y i. lower 7 bits, masked for index -;; ecx : ch = counter, cl = y step i. -;; eax : colormap aligned 256 -;; esi : source texture column -;; edi : dest screen -;; -v4quadloop: - mov dh,0x7f ;; prep mask -align 4 -vquadloop: - mov al,[esi+ebx] ;; prep loop - add edx,ebp ;; ypos f += ystep f - adc bl,cl ;; ypos i += ystep i - mov dl,[eax] ;; colormap texel - mov [edi],dl ;; output pixel - and bl,0x7f ;; mask 0-127 texture index - - mov al,[esi+ebx] ;; fetch source texel - add edx,ebp - adc bl,cl -p4: add edi,0x12345678 - mov dl,[eax] - and bl,0x7f - mov [edi],dl - - mov al,[esi+ebx] ;; fetch source texel - add edx,ebp - adc bl,cl -p5: add edi,0x12345678 - mov dl,[eax] - and bl,0x7f - mov [edi],dl - - mov al,[esi+ebx] ;; fetch source texel - add edx,ebp - adc bl,cl -p6: add edi,0x12345678 - mov dl,[eax] - and bl,0x7f - mov [edi],dl - -p7: add edi,0x12345678 - - dec ch - jne vquadloop - -vdone: - pop ebx ;; restore register variables - pop edi - pop esi - pop ebp ;; restore caller's stack frame pointer - ret - -;;---------------------------------------------------------------------- -;;13-02-98: -;; R_DrawSkyColumn : same as R_DrawColumn but: -;; -;; - wrap around 256 instead of 127. -;; this is needed because we have a higher texture for mouselook, -;; we need at least 200 lines for the sky. -;; -;; NOTE: the sky should never wrap, so it could use a faster method. -;; for the moment, we'll still use a wrapping method... -;; -;; IT S JUST A QUICK CUT N PASTE, WAS NOT OPTIMISED AS IT SHOULD BE !!! -;; -;;---------------------------------------------------------------------- - -cglobal R_DrawSkyColumn_8 -; align 16 -R_DrawSkyColumn_8: - push ebp - push esi - push edi - push ebx -;; -;; dest = ylookup[dc_yl] + columnofs[dc_x]; -;; - mov ebp,[dc_yl] - mov ebx,ebp - mov edi,[ylookup+ebx*4] - mov ebx,[dc_x] - add edi,[columnofs+ebx*4] ;; edi = dest -;; -;; pixelcount = yh - yl + 1 -;; - mov eax,[dc_yh] - inc eax - sub eax,ebp ;; pixel count - mov [pixelcount],eax ;; save for final pixel - jle near vskydone ;; nothing to scale -;; -;; frac = dc_texturemid - (centery-dc_yl)*fracstep; -;; - mov ecx,[dc_iscale] ;; fracstep - mov eax,[centery] - sub eax,ebp - imul eax,ecx - mov edx,[dc_texturemid] - sub edx,eax - mov ebx,edx - shr ebx,16 ;; frac int. - and ebx,0xff - shl edx,16 ;; y frac up - mov ebp,ecx - shl ebp,16 ;; fracstep f. up - shr ecx,16 ;; fracstep i. ->cl - mov esi,[dc_source] -;; -;; lets rock :) ! -;; - mov eax,[pixelcount] - mov dh,al - shr eax,0x2 - mov ch,al ;; quad count - mov eax,[dc_colormap] - test dh,0x3 - je vskyquadloop -;; -;; do un-even pixel -;; - test dh,0x1 - je f2 - mov al,[esi+ebx] ;; prep un-even loops - add edx,ebp ;; ypos f += ystep f - adc bl,cl ;; ypos i += ystep i - mov dl,[eax] ;; colormap texel - mov [edi],dl ;; output pixel -p8: add edi,0x12345678 -;; -;; do two non-quad-aligned pixels -;; -f2: test dh,0x2 - je skyf3 - - mov al,[esi+ebx] ;; fetch source texel - add edx,ebp ;; ypos f += ystep f - adc bl,cl ;; ypos i += ystep i - mov dl,[eax] ;; colormap texel - mov [edi],dl ;; output pixel - - mov al,[esi+ebx] ;; fetch source texel - add edx,ebp ;; ypos f += ystep f - adc bl,cl ;; ypos i += ystep i - mov dl,[eax] ;; colormap texel -p9: add edi,0x12345678 - mov [edi],dl ;; output pixel - -pa: add edi,0x12345678 -;; -;; test if there was at least 4 pixels -;; -skyf3: test ch,0xff ;; test quad count - je vskydone -;; -;; ebp : ystep frac. upper 24 bits -;; edx : y frac. upper 24 bits -;; ebx : y i. lower 7 bits, masked for index -;; ecx : ch = counter, cl = y step i. -;; eax : colormap aligned 256 -;; esi : source texture column -;; edi : dest screen -;; -align 4 -vskyquadloop: - mov al,[esi+ebx] ;; prep loop - add edx,ebp ;; ypos f += ystep f - mov dl,[eax] ;; colormap texel - adc bl,cl ;; ypos i += ystep i - mov [edi],dl ;; output pixel - - mov al,[esi+ebx] ;; fetch source texel - add edx,ebp - adc bl,cl -pb: add edi,0x12345678 - mov dl,[eax] - mov [edi],dl - - mov al,[esi+ebx] ;; fetch source texel - add edx,ebp - adc bl,cl -pc: add edi,0x12345678 - mov dl,[eax] - mov [edi],dl - - mov al,[esi+ebx] ;; fetch source texel - add edx,ebp - adc bl,cl -pd: add edi,0x12345678 - mov dl,[eax] - mov [edi],dl - -pe: add edi,0x12345678 - - dec ch - jne vskyquadloop -vskydone: - pop ebx - pop edi - pop esi - pop ebp - ret - - -;;---------------------------------------------------------------------- -;; R_DrawTranslucentColumn_8 -;; -;; Vertical column texture drawer, with transparency. Replaces Doom2's -;; 'fuzz' effect, which was not so beautiful. -;; Transparency is always impressive in some way, don't know why... -;;---------------------------------------------------------------------- - -cglobal R_DrawTranslucentColumn_8 -R_DrawTranslucentColumn_8: - push ebp ;; preserve caller's stack frame pointer - push esi ;; preserve register variables - push edi - push ebx -;; -;; dest = ylookup[dc_yl] + columnofs[dc_x]; -;; - mov ebp,[dc_yl] - mov ebx,ebp - mov edi,[ylookup+ebx*4] - mov ebx,[dc_x] - add edi,[columnofs+ebx*4] ;; edi = dest -;; -;; pixelcount = yh - yl + 1 -;; - mov eax,[dc_yh] - inc eax - sub eax,ebp ;; pixel count - mov [pixelcount],eax ;; save for final pixel - jle near vtdone ;; nothing to scale -;; -;; frac = dc_texturemid - (centery-dc_yl)*fracstep; -;; - mov ecx,[dc_iscale] ;; fracstep - mov eax,[centery] - sub eax,ebp - imul eax,ecx - mov edx,[dc_texturemid] - sub edx,eax - mov ebx,edx - - shr ebx,16 ;; frac int. - and ebx,0x7f - shl edx,16 ;; y frac up - - mov ebp,ecx - shl ebp,16 ;; fracstep f. up - shr ecx,16 ;; fracstep i. ->cl - and cl,0x7f - push cx - mov ecx,edx - pop cx - mov edx,[dc_colormap] - mov esi,[dc_source] -;; -;; lets rock :) ! -;; - mov eax,[pixelcount] - shr eax,0x2 - test byte [pixelcount],0x3 - mov ch,al ;; quad count - mov eax,[dc_transmap] - je vt4quadloop -;; -;; do un-even pixel -;; - test byte [pixelcount],0x1 - je trf2 - - mov ah,[esi+ebx] ;; fetch texel : colormap number - add ecx,ebp - adc bl,cl - mov al,[edi] ;; fetch dest : index into colormap - and bl,0x7f - mov dl,[eax] - mov dl,[edx] - mov [edi],dl -pf: add edi,0x12345678 -;; -;; do two non-quad-aligned pixels -;; -trf2: test byte [pixelcount],0x2 - je trf3 - - mov ah,[esi+ebx] ;; fetch texel : colormap number - add ecx,ebp - adc bl,cl - mov al,[edi] ;; fetch dest : index into colormap - and bl,0x7f - mov dl,[eax] - mov dl,[edx] - mov [edi],dl -pg: add edi,0x12345678 - - mov ah,[esi+ebx] ;; fetch texel : colormap number - add ecx,ebp - adc bl,cl - mov al,[edi] ;; fetch dest : index into colormap - and bl,0x7f - mov dl,[eax] - mov dl,[edx] - mov [edi],dl -ph: add edi,0x12345678 -;; -;; test if there was at least 4 pixels -;; -trf3: test ch,0xff ;; test quad count - je near vtdone - -;; -;; ebp : ystep frac. upper 24 bits -;; edx : y frac. upper 24 bits -;; ebx : y i. lower 7 bits, masked for index -;; ecx : ch = counter, cl = y step i. -;; eax : colormap aligned 256 -;; esi : source texture column -;; edi : dest screen -;; -vt4quadloop: - mov ah,[esi+ebx] ;; fetch texel : colormap number - mov [tystep],ebp -pi: add edi,0x12345678 - mov al,[edi] ;; fetch dest : index into colormap -pj: sub edi,0x12345678 - mov ebp,edi -pk: sub edi,0x12345678 - jmp short inloop -align 4 -vtquadloop: - add ecx,[tystep] - adc bl,cl -q1: add ebp,0x23456789 - and bl,0x7f - mov dl,[eax] - mov ah,[esi+ebx] ;; fetch texel : colormap number - mov dl,[edx] - mov [edi],dl - mov al,[ebp] ;; fetch dest : index into colormap -inloop: - add ecx,[tystep] - adc bl,cl -q2: add edi,0x23456789 - and bl,0x7f - mov dl,[eax] - mov ah,[esi+ebx] ;; fetch texel : colormap number - mov dl,[edx] - mov [ebp+0x0],dl - mov al,[edi] ;; fetch dest : index into colormap - - add ecx,[tystep] - adc bl,cl -q3: add ebp,0x23456789 - and bl,0x7f - mov dl,[eax] - mov ah,[esi+ebx] ;; fetch texel : colormap number - mov dl,[edx] - mov [edi],dl - mov al,[ebp] ;; fetch dest : index into colormap - - add ecx,[tystep] - adc bl,cl -q4: add edi,0x23456789 - and bl,0x7f - mov dl,[eax] - mov ah,[esi+ebx] ;; fetch texel : colormap number - mov dl,[edx] - mov [ebp],dl - mov al,[edi] ;; fetch dest : index into colormap - - dec ch - jne vtquadloop -vtdone: - pop ebx - pop edi - pop esi - pop ebp - ret - - -;;---------------------------------------------------------------------- -;; R_DrawShadeColumn -;; -;; for smoke..etc.. test. -;;---------------------------------------------------------------------- -cglobal R_DrawShadeColumn_8 -R_DrawShadeColumn_8: - push ebp ;; preserve caller's stack frame pointer - push esi ;; preserve register variables - push edi - push ebx - -;; -;; dest = ylookup[dc_yl] + columnofs[dc_x]; -;; - mov ebp,[dc_yl] - mov ebx,ebp - mov edi,[ylookup+ebx*4] - mov ebx,[dc_x] - add edi,[columnofs+ebx*4] ;; edi = dest -;; -;; pixelcount = yh - yl + 1 -;; - mov eax,[dc_yh] - inc eax - sub eax,ebp ;; pixel count - mov [pixelcount],eax ;; save for final pixel - jle near shdone ;; nothing to scale -;; -;; frac = dc_texturemid - (centery-dc_yl)*fracstep; -;; - mov ecx,[dc_iscale] ;; fracstep - mov eax,[centery] - sub eax,ebp - imul eax,ecx - mov edx,[dc_texturemid] - sub edx,eax - mov ebx,edx - shr ebx,16 ;; frac int. - and ebx,byte +0x7f - shl edx,16 ;; y frac up - - mov ebp,ecx - shl ebp,16 ;; fracstep f. up - shr ecx,16 ;; fracstep i. ->cl - and cl,0x7f - - mov esi,[dc_source] -;; -;; lets rock :) ! -;; - mov eax,[pixelcount] - mov dh,al - shr eax,2 - mov ch,al ;; quad count - mov eax,[colormaps] - test dh,3 - je sh4quadloop -;; -;; do un-even pixel -;; - test dh,0x1 - je shf2 - - mov ah,[esi+ebx] ;; fetch texel : colormap number - add edx,ebp - adc bl,cl - mov al,[edi] ;; fetch dest : index into colormap - and bl,0x7f - mov dl,[eax] - mov [edi],dl -pl: add edi,0x12345678 -;; -;; do two non-quad-aligned pixels -;; -shf2: - test dh,0x2 - je shf3 - - mov ah,[esi+ebx] ;; fetch texel : colormap number - add edx,ebp - adc bl,cl - mov al,[edi] ;; fetch dest : index into colormap - and bl,0x7f - mov dl,[eax] - mov [edi],dl -pm: add edi,0x12345678 - - mov ah,[esi+ebx] ;; fetch texel : colormap number - add edx,ebp - adc bl,cl - mov al,[edi] ;; fetch dest : index into colormap - and bl,0x7f - mov dl,[eax] - mov [edi],dl -pn: add edi,0x12345678 -;; -;; test if there was at least 4 pixels -;; -shf3: - test ch,0xff ;; test quad count - je near shdone - -;; -;; ebp : ystep frac. upper 24 bits -;; edx : y frac. upper 24 bits -;; ebx : y i. lower 7 bits, masked for index -;; ecx : ch = counter, cl = y step i. -;; eax : colormap aligned 256 -;; esi : source texture column -;; edi : dest screen -;; -sh4quadloop: - mov dh,0x7f ;; prep mask - mov ah,[esi+ebx] ;; fetch texel : colormap number - mov [tystep],ebp -po: add edi,0x12345678 - mov al,[edi] ;; fetch dest : index into colormap -pp: sub edi,0x12345678 - mov ebp,edi -pq: sub edi,0x12345678 - jmp short shinloop - -align 4 -shquadloop: - add edx,[tystep] - adc bl,cl - and bl,dh -q5: add ebp,0x12345678 - mov dl,[eax] - mov ah,[esi+ebx] ;; fetch texel : colormap number - mov [edi],dl - mov al,[ebp] ;; fetch dest : index into colormap -shinloop: - add edx,[tystep] - adc bl,cl - and bl,dh -q6: add edi,0x12345678 - mov dl,[eax] - mov ah,[esi+ebx] ;; fetch texel : colormap number - mov [ebp],dl - mov al,[edi] ;; fetch dest : index into colormap - - add edx,[tystep] - adc bl,cl - and bl,dh -q7: add ebp,0x12345678 - mov dl,[eax] - mov ah,[esi+ebx] ;; fetch texel : colormap number - mov [edi],dl - mov al,[ebp] ;; fetch dest : index into colormap - - add edx,[tystep] - adc bl,cl - and bl,dh -q8: add edi,0x12345678 - mov dl,[eax] - mov ah,[esi+ebx] ;; fetch texel : colormap number - mov [ebp],dl - mov al,[edi] ;; fetch dest : index into colormap - - dec ch - jne shquadloop - -shdone: - pop ebx ;; restore register variables - pop edi - pop esi - pop ebp ;; restore caller's stack frame pointer - ret - - - -;;---------------------------------------------------------------------- -;; -;; R_DrawSpan -;; -;; Horizontal texture mapping -;; -;;---------------------------------------------------------------------- - - -[SECTION .data] - -oldcolormap dd 0 - -[SECTION CODE_SEG write] - -cglobal R_DrawSpan_8 -R_DrawSpan_8: - push ebp ;; preserve caller's stack frame pointer - push esi ;; preserve register variables - push edi - push ebx -;; -;; initilise registers -;; - - mov edx, [ds_xfrac] - mov eax, [ds_ystep] - ror edx, 14 - ror eax, 15 - mov bl, dl - mov ecx, [ds_xstep] - mov dh, al - mov ax, 1 - mov [tystep], eax - - - mov eax, [ds_yfrac] - ror ecx, 13 - ror eax, 16 - mov dl, cl - mov bh, al - xor cx, cx - and ebx, 0x3fff - mov [pixelcount],ecx - - mov ecx, [ds_x2] - mov edi, [ds_y] - mov esi, [ds_x1] - mov edi, [ylookup+edi*4] - mov ebp, ebx - add edi, [columnofs+esi*4] - sub esi, ecx ;; pixel count - shr ebp, 2 - mov ecx, [ds_colormap] - mov ax, si - mov esi, [ds_source] - sar ax,1 - jnc near .midloop ;; check parity - -; summary -; edx = high16bit xfrac[0..13], ah=ystep[16..24] al=xtep[14..21] -; ebx = high16bit =0, bh=yfrac[16..24], bl=xfrac[14..21] -; ecx = colormap table cl=0 (colormap is aligned 8 bits) -; eax = high16bit yfrac[0..15], dx = count -; esi = flat texture source -; edi = screeen buffer destination -; ebp = work register -; pixelcount = high16bit xstep[0..13] rest to 0 -; tystep = high16bit ystep[0..15] low 16 bit = 2 (increment of count) - -align 4 -.loop - add eax, [tystep] - mov cl, [esi+ebp] - adc bh, dh - mov cl, [ecx] - and bh, 0x3f - mov [edi], cl - mov ebp, ebx - inc edi - shr ebp, 2 - -.midloop: - add edx, [pixelcount] - mov cl, [esi+ebp] - adc bl, dl - mov cl, [ecx] - mov ebp, ebx - mov [edi], cl - inc edi - shr ebp, 2 - - test eax, 0xffff - jnz near .loop - -.hdone: pop ebx ;; restore register variables - pop edi - pop esi - pop ebp ;; restore caller's stack frame pointer - ret - - -[SECTION .data] - -obelix dd 0 -etaussi dd 0 - -[SECTION CODE_SEG] - -cglobal R_DrawSpan_8_old -R_DrawSpan_8_old: - push ebp ;; preserve caller's stack frame pointer - push esi ;; preserve register variables - push edi - push ebx -;; -;; find loop count -;; - mov eax,[ds_x2] - inc eax - sub eax,[ds_x1] ;; pixel count - mov [pixelcount],eax ;; save for final pixel - js near .hdone ;; nothing to scale - shr eax,0x1 ;; double pixel count - mov [loopcount],eax -;; -;; build composite position -;; - mov ebp,[ds_xfrac] - shl ebp,10 - and ebp,0xffff0000 - mov eax,[ds_yfrac] - shr eax,6 - and eax,0xffff - mov edi,[ds_y] - or ebp,eax - - mov esi,[ds_source] -;; -;; calculate screen dest -;; - mov edi,[ylookup+edi*4] - mov eax,[ds_x1] - add edi,[columnofs+eax*4] -;; -;; build composite step -;; - mov ebx,[ds_xstep] - shl ebx,10 - and ebx,0xffff0000 - mov eax,[ds_ystep] - shr eax,6 - and eax,0xffff - or ebx,eax - - mov [obelix],ebx - mov [etaussi],esi - -;; %eax aligned colormap -;; %ebx aligned colormap -;; %ecx,%edx scratch -;; %esi virtual source -;; %edi moving destination pointer -;; %ebp frac - - mov eax,[ds_colormap] - mov ecx,ebp - add ebp,ebx ;; advance frac pointer - shr cx,10 - rol ecx,6 - and ecx,4095 ;; finish calculation for third pixel - mov edx,ebp - shr dx,10 - rol edx,6 - add ebp,ebx ;; advance frac pointer - and edx,4095 ;; finish calculation for fourth pixel - mov ebx,eax - mov al,[esi+ecx] ;; get first pixel - mov bl,[esi+edx] ;; get second pixel - - test dword [pixelcount],0xfffffffe - - mov dl,[eax] ;; color translate first pixel - -;; movw $0xf0f0,%dx ;;see visplanes start - - je .hchecklast - - mov dh,[ebx] ;; color translate second pixel - mov esi,[loopcount] -align 4 -.hdoubleloop: - mov ecx,ebp - shr cx,10 - rol ecx,6 - add ebp,[obelix] ;; advance frac pointer - mov [edi],dx ;; write first pixel - and ecx,4095 ;; finish calculation for third pixel - mov edx,ebp - shr dx,10 - rol edx,6 - add ecx,[etaussi] - and edx,4095 ;; finish calculation for fourth pixel - mov al,[ecx] ;; get third pixel - add ebp,[obelix] ;; advance frac pointer - add edx,[etaussi] - mov bl,[edx] ;; get fourth pixel - mov dl,[eax] ;; color translate third pixel - add edi,byte +0x2 ;; advance to third pixel destination - dec esi ;; done with loop? - mov dh,[ebx] ;; color translate fourth pixel - jne .hdoubleloop -;; check for final pixel -.hchecklast: - test dword [pixelcount],0x1 - je .hdone - mov [edi],dl ;; write final pixel -.hdone: pop ebx ;; restore register variables - pop edi - pop esi - pop ebp ;; restore caller's stack frame pointer - ret - - -;; ======================================================================== -;; Rasterization des segments d'un polygne textur de manire LINEAIRE. -;; Il s'agit donc d'interpoler les coordonnes aux bords de la texture en -;; mme temps que les abscisses minx/maxx pour chaque ligne. -;; L'argument 'dir' indique quels bords de la texture sont interpols: -;; 0 : segments associs aux bord SUPERIEUR et INFERIEUR ( TY constant ) -;; 1 : segments associs aux bord GAUCHE et DROITE ( TX constant ) -;; ======================================================================== -;; -;; void rasterize_segment_tex( LONG x1, LONG y1, LONG x2, LONG y2, LONG tv1, LONG tv2, LONG tc, LONG dir ); -;; ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 ARG8 -;; -;; Pour dir = 0, (tv1,tv2) = (tX1,tX2), tc = tY, en effet TY est constant. -;; -;; Pour dir = 1, (tv1,tv2) = (tY1,tY2), tc = tX, en effet TX est constant. -;; -;; -;; Uses: extern struct rastery *_rastertab; -;; - -[SECTION CODE_SEG write] - -MINX EQU 0 -MAXX EQU 4 -TX1 EQU 8 -TY1 EQU 12 -TX2 EQU 16 -TY2 EQU 20 -RASTERY_SIZEOF EQU 24 - -cglobal rasterize_segment_tex -rasterize_segment_tex: - push ebp - mov ebp,esp - - sub esp,byte +0x8 ;; alloue les variables locales - - push ebx - push esi - push edi - o16 mov ax,es - push eax - -;; #define DX [ebp-4] -;; #define TD [ebp-8] - - mov eax,[ebp+0xc] ;; y1 - mov ebx,[ebp+0x14] ;; y2 - cmp ebx,eax - je near .L_finished ;; special (y1==y2) segment horizontal, exit! - - jg near .L_rasterize_right - -;;rasterize_left: ;; on rasterize un segment la GAUCHE du polygne - - mov ecx,eax - sub ecx,ebx - inc ecx ;; y1-y2+1 - - mov eax,RASTERY_SIZEOF - mul ebx ;; * y2 - mov esi,[prastertab] - add esi,eax ;; point into rastertab[y2] - - mov eax,[ebp+0x8] ;; ARG1 - sub eax,[ebp+0x10] ;; ARG3 - shl eax,0x10 ;; ((x1-x2)<<PRE) ... - cdq - idiv ecx ;; dx = ... / (y1-y2+1) - mov [ebp-0x4],eax ;; DX - - mov eax,[ebp+0x18] ;; ARG5 - sub eax,[ebp+0x1c] ;; ARG6 - shl eax,0x10 - cdq - idiv ecx ;; tdx =((tx1-tx2)<<PRE) / (y1-y2+1) - mov [ebp-0x8],eax ;; idem tdy =((ty1-ty2)<<PRE) / (y1-y2+1) - - mov eax,[ebp+0x10] ;; ARG3 - shl eax,0x10 ;; x = x2<<PRE - - mov ebx,[ebp+0x1c] ;; ARG6 - shl ebx,0x10 ;; tx = tx2<<PRE d0 - ;; ty = ty2<<PRE d1 - mov edx,[ebp+0x20] ;; ARG7 - shl edx,0x10 ;; ty = ty<<PRE d0 - ;; tx = tx<<PRE d1 - push ebp - mov edi,[ebp-0x4] ;; DX - cmp dword [ebp+0x24],byte +0x0 ;; ARG8 direction ? - - mov ebp,[ebp-0x8] ;; TD - je .L_rleft_h_loop -;; -;; TY varie, TX est constant -;; -.L_rleft_v_loop: - mov [esi+MINX],eax ;; rastertab[y].minx = x - add ebx,ebp - mov [esi+TX1],edx ;; .tx1 = tx - add eax,edi - mov [esi+TY1],ebx ;; .ty1 = ty - - ;;addl DX, %eax // x += dx - ;;addl TD, %ebx // ty += tdy - - add esi,RASTERY_SIZEOF ;; next raster line into rastertab[] - dec ecx - jne .L_rleft_v_loop - pop ebp - jmp .L_finished -;; -;; TX varie, TY est constant -;; -.L_rleft_h_loop: - mov [esi+MINX],eax ;; rastertab[y].minx = x - add eax,edi - mov [esi+TX1],ebx ;; .tx1 = tx - add ebx,ebp - mov [esi+TY1],edx ;; .ty1 = ty - - ;;addl DX, %eax // x += dx - ;;addl TD, %ebx // tx += tdx - - add esi,RASTERY_SIZEOF ;; next raster line into rastertab[] - dec ecx - jne .L_rleft_h_loop - pop ebp - jmp .L_finished -;; -;; on rasterize un segment la DROITE du polygne -;; -.L_rasterize_right: - mov ecx,ebx - sub ecx,eax - inc ecx ;; y2-y1+1 - - mov ebx,RASTERY_SIZEOF - mul ebx ;; * y1 - mov esi,[prastertab] - add esi,eax ;; point into rastertab[y1] - - mov eax,[ebp+0x10] ;; ARG3 - sub eax,[ebp+0x8] ;; ARG1 - shl eax,0x10 ;; ((x2-x1)<<PRE) ... - cdq - idiv ecx ;; dx = ... / (y2-y1+1) - mov [ebp-0x4],eax ;; DX - - mov eax,[ebp+0x1c] ;; ARG6 - sub eax,[ebp+0x18] ;; ARG5 - shl eax,0x10 - cdq - idiv ecx ;; tdx =((tx2-tx1)<<PRE) / (y2-y1+1) - mov [ebp-0x8],eax ;; idem tdy =((ty2-ty1)<<PRE) / (y2-y1+1) - - mov eax,[ebp+0x8] ;; ARG1 - shl eax,0x10 ;; x = x1<<PRE - - mov ebx,[ebp+0x18] ;; ARG5 - shl ebx,0x10 ;; tx = tx1<<PRE d0 - ;; ty = ty1<<PRE d1 - mov edx,[ebp+0x20] ;; ARG7 - shl edx,0x10 ;; ty = ty<<PRE d0 - ;; tx = tx<<PRE d1 - push ebp - mov edi,[ebp-0x4] ;; DX - - cmp dword [ebp+0x24], 0 ;; direction ? - - mov ebp,[ebp-0x8] ;; TD - je .L_rright_h_loop -;; -;; TY varie, TX est constant -;; -.L_rright_v_loop: - - mov [esi+MAXX],eax ;; rastertab[y].maxx = x - add ebx,ebp - mov [esi+TX2],edx ;; .tx2 = tx - add eax,edi - mov [esi+TY2],ebx ;; .ty2 = ty - - ;;addl DX, %eax // x += dx - ;;addl TD, %ebx // ty += tdy - - add esi,RASTERY_SIZEOF - dec ecx - jne .L_rright_v_loop - - pop ebp - - jmp short .L_finished -;; -;; TX varie, TY est constant -;; -.L_rright_h_loop: - mov [esi+MAXX],eax ;; rastertab[y].maxx = x - add eax,edi - mov [esi+TX2],ebx ;; .tx2 = tx - add ebx,ebp - mov [esi+TY2],edx ;; .ty2 = ty - - ;;addl DX, %eax // x += dx - ;;addl TD, %ebx // tx += tdx - - add esi,RASTERY_SIZEOF - dec ecx - jne .L_rright_h_loop - - pop ebp - -.L_finished: - pop eax - o16 mov es,ax - pop edi - pop esi - pop ebx - - mov esp,ebp - pop ebp - ret - - -;;; this version can draw 64x64 tiles, but they would have to be arranged 4 per row, -;; so that the stride from one line to the next is 256 -;; -;; .data -;;xstep dd 0 -;;ystep dd 0 -;;texwidth dd 64 ;; texture width -;; .text -;; this code is kept in case we add high-detail floor textures for example (256x256) -; align 16 -;_R_DrawSpan_8: -; push ebp ;; preserve caller's stack frame pointer -; push esi ;; preserve register variables -; push edi -; push ebx -;; -;; find loop count -;; -; mov eax,[ds_x2] -; inc eax -; sub eax,[ds_x1] ;; pixel count -; mov [pixelcount],eax ;; save for final pixel -; js near .hdone ;; nothing to scale -;; -;; calculate screen dest -;; -; mov edi,[ds_y] -; mov edi,[ylookup+edi*4] -; mov eax,[ds_x1] -; add edi,[columnofs+eax*4] -;; -;; prepare registers for inner loop -;; -; xor eax,eax -; mov edx,[ds_xfrac] -; ror edx,16 -; mov al,dl -; mov ecx,[ds_yfrac] -; ror ecx,16 -; mov ah,cl -; -; mov ebx,[ds_xstep] -; ror ebx,16 -; mov ch,bl -; and ebx,0xffff0000 -; mov [xstep],ebx -; mov ebx,[ds_ystep] -; ror ebx,16 -; mov dh,bl -; and ebx,0xffff0000 -; mov [ystep],ebx -; -; mov esi,[ds_source] -; -;;; %eax Yi,Xi in %ah,%al -;;; %ebx aligned colormap -;;; %ecx Yfrac upper, dXi in %ch, %cl is counter (upto 1024pels, =4x256) -;;; %edx Xfrac upper, dYi in %dh, %dl receives mapped pixels from (ebx) -;;; ystep dYfrac, add to %ecx, low word is 0 -;;; xstep dXfrac, add to %edx, low word is 0 -;;; %ebp temporary register serves as offset like %eax -;;; %esi virtual source -;;; %edi moving destination pointer -; -; mov ebx,[pixelcount] -; shr ebx,0x2 ;; 4 pixels per loop -; test bl,0xff -; je near .hchecklast -; mov cl,bl -; -; mov ebx,[dc_colormap] -;;; -;;; prepare loop with first pixel -;;; -; add ecx,[ystep] ;;pra1 -; adc ah,dh -; add edx,[xstep] -; adc al,ch -; and eax,0x3f3f -; mov bl,[esi+eax] ;;prb1 -; mov dl,[ebx] ;;prc1 -; -; add ecx,[ystep] ;;a2 -; adc ah,dh -; -;.hdoubleloop: -; mov [edi+1],dl -; add edx,[xstep] -; adc al,ch -; add edi,byte +0x2 -; mov ebp,eax -; add ecx,[ystep] -; adc ah,dh -; and ebp,0x3f3f -; add edx,[xstep] -; mov bl,[esi+ebp] -; adc al,ch -; mov dl,[ebx] -; and eax,0x3f3f -; mov [edi],dl -; mov bl,[esi+eax] -; add ecx,[ystep] -; adc ah,dh -; add edx,[xstep] -; adc al,ch -; mov dl,[ebx] -; mov ebp,eax -; mov [edi+1],dl -; and ebp,0x3f3f -; add ecx,[ystep] -; adc ah,dh -; mov bl,[esi+ebp] -; add edi,byte +0x2 -; add edx,[xstep] -; adc al,ch -; mov dl,[ebx] -; and eax,0x3f3f -; mov [edi],dl -; mov bl,[esi+eax] -; add ecx,[ystep] -; adc ah,dh -; mov dl,[ebx] -; dec cl -; jne near .hdoubleloop -;;; check for final pixel -;.hchecklast: -;;; to do -;.hdone: -; pop ebx -; pop edi -; pop esi -; pop ebp -; ret +;; +;; Revision 1.10 2001/02/24 13:35:21 bpereira +;; no message +;; +;; Revision 1.9 2001/02/10 15:24:19 hurdler +;; Apply Rob's patch for Linux version +;; +;; Revision 1.8 2000/11/12 09:48:15 bpereira +;; no message +;; +;; Revision 1.7 2000/11/06 20:52:16 bpereira +;; no message +;; +;; Revision 1.6 2000/11/03 11:48:40 hurdler +;; Fix compiling problem under win32 with 3D-Floors and FragglScript (to verify!) +;; +;; Revision 1.5 2000/11/03 03:27:17 stroggonmeth +;; Again with the bug fixing... +;; +;; Revision 1.4 2000/11/02 17:50:10 stroggonmeth +;; Big 3Dfloors & FraggleScript commit!! +;; +;; Revision 1.3 2000/04/24 20:24:38 bpereira +;; no message +;; +;; Revision 1.2 2000/02/27 00:42:11 hurdler +;; fix CR+LF problem +;; +;; Revision 1.1.1.1 2000/02/22 20:32:32 hurdler +;; Initial import into CVS (v1.29 pr3) +;; +;; +;; DESCRIPTION: +;; assembler optimised rendering code for software mode +;; draw floor spans, and wall columns. +;; +;;----------------------------------------------------------------------------- + + +[BITS 32] + +%ifdef LINUX +%macro cextern 1 +[extern %1] +%endmacro + +%macro cglobal 1 +[global %1] +%endmacro + +%define CODE_SEG .data +%else +%macro cextern 1 +%define %1 _%1 +[extern %1] +%endmacro + +%macro cglobal 1 +%define %1 _%1 +[global %1] +%endmacro + +%define CODE_SEG .text +%endif + + +;; externs +;; columns +cextern dc_x +cextern dc_yl +cextern dc_yh +cextern ylookup +cextern columnofs +cextern dc_source +cextern dc_texturemid +cextern dc_iscale +cextern centery +cextern dc_colormap +cextern dc_transmap +cextern colormaps + +;; spans +cextern ds_x1 +cextern ds_x2 +cextern ds_y +cextern ds_xfrac +cextern ds_yfrac +cextern ds_xstep +cextern ds_ystep +cextern ds_source +cextern ds_colormap +;cextern ds_textureheight + +; polygon edge rasterizer +cextern prastertab + + +;;---------------------------------------------------------------------- +;; +;; R_DrawColumn +;; +;; New optimised version 10-01-1998 by D.Fabrice and P.Boris +;; TO DO: optimise it much farther... should take at most 3 cycles/pix +;; once it's fixed, add code to patch the offsets so that it +;; works in every screen width. +;; +;;---------------------------------------------------------------------- + +[SECTION .data] + +;;.align 4 +loopcount dd 0 +pixelcount dd 0 +tystep dd 0 + +[SECTION CODE_SEG write] + +;---------------------------------------------------------------------------- +;fixed_t FixedMul (fixed_t a, fixed_t b) +;---------------------------------------------------------------------------- +cglobal FixedMul +; align 16 +FixedMul: + mov eax,[esp+4] + imul dword [esp+8] + shrd eax,edx,16 + ret + +;---------------------------------------------------------------------------- +;fixed_t FixedDiv2 (fixed_t a, fixed_t b); +;---------------------------------------------------------------------------- +cglobal FixedDiv2 +; align 16 +FixedDiv2: + mov eax,[esp+4] + mov edx,eax ;; these two instructions allow the next + sar edx,31 ;; two to pair, on the Pentium processor. + shld edx,eax,16 + sal eax,16 + idiv dword [esp+8] + ret + +;---------------------------------------------------------------------------- +; void ASM_PatchRowBytes (int rowbytes); +;---------------------------------------------------------------------------- +cglobal ASM_PatchRowBytes +; align 16 +ASM_PatchRowBytes: + mov eax,[esp+4] + mov [p1+2],eax + mov [p2+2],eax + mov [p3+2],eax + mov [p4+2],eax + mov [p5+2],eax + mov [p6+2],eax + mov [p7+2],eax + mov [p8+2],eax + mov [p9+2],eax + mov [pa+2],eax + mov [pb+2],eax + mov [pc+2],eax + mov [pd+2],eax + mov [pe+2],eax + mov [pf+2],eax + mov [pg+2],eax + mov [ph+2],eax + mov [pi+2],eax + mov [pj+2],eax + mov [pk+2],eax + mov [pl+2],eax + mov [pm+2],eax + mov [pn+2],eax + mov [po+2],eax + mov [pp+2],eax + mov [pq+2],eax + add eax,eax + mov [q1+2],eax + mov [q2+2],eax + mov [q3+2],eax + mov [q4+2],eax + mov [q5+2],eax + mov [q6+2],eax + mov [q7+2],eax + mov [q8+2],eax + ret + + +;---------------------------------------------------------------------------- +; 8bpp column drawer +;---------------------------------------------------------------------------- + +cglobal R_DrawColumn_8 +; align 16 +R_DrawColumn_8: + push ebp ;; preserve caller's stack frame pointer + push esi ;; preserve register variables + push edi + push ebx +;; +;; dest = ylookup[dc_yl] + columnofs[dc_x]; +;; + mov ebp,[dc_yl] + mov ebx,ebp + mov edi,[ylookup+ebx*4] + mov ebx,[dc_x] + add edi,[columnofs+ebx*4] ;; edi = dest +;; +;; pixelcount = yh - yl + 1 +;; + mov eax,[dc_yh] + inc eax + sub eax,ebp ;; pixel count + mov [pixelcount],eax ;; save for final pixel + jle near vdone ;; nothing to scale +;; +;; frac = dc_texturemid - (centery-dc_yl)*fracstep; +;; + mov ecx,[dc_iscale] ;; fracstep + mov eax,[centery] + sub eax,ebp + imul eax,ecx + mov edx,[dc_texturemid] + sub edx,eax + mov ebx,edx + shr ebx,16 ;; frac int. + and ebx,0x7f + shl edx,16 ;; y frac up + + mov ebp,ecx + shl ebp,16 ;; fracstep f. up + shr ecx,16 ;; fracstep i. ->cl + and cl,0x7f + mov esi,[dc_source] +;; +;; lets rock :) ! +;; + mov eax,[pixelcount] + mov dh,al + shr eax,2 + mov ch,al ;; quad count + mov eax,[dc_colormap] + test dh,0x3 + je near v4quadloop +;; +;; do un-even pixel +;; + test dh,0x1 + je two_uneven + + mov al,[esi+ebx] ;; prep un-even loops + add edx,ebp ;; ypos f += ystep f + adc bl,cl ;; ypos i += ystep i + mov dl,[eax] ;; colormap texel + and bl,0x7f ;; mask 0-127 texture index + mov [edi],dl ;; output pixel +p1: add edi,0x12345678 +;; +;; do two non-quad-aligned pixels +;; +two_uneven: + test dh,0x2 + je f3 + + mov al,[esi+ebx] ;; fetc... [truncated message content] |