[nasm:macho-unify] test: travis -- Add some of converted tests

nasm-bot for Cyrill Gorcunov gorcunov at gmail.com
Tue Jun 30 17:02:53 PDT 2020


Commit-ID:  a3afa40d832855c5d167bb31e65de9a27d47a4af
Gitweb:     http://repo.or.cz/w/nasm.git?a=commitdiff;h=a3afa40d832855c5d167bb31e65de9a27d47a4af
Author:     Cyrill Gorcunov <gorcunov at gmail.com>
AuthorDate: Wed, 25 Apr 2018 00:34:00 +0300
Committer:  Cyrill Gorcunov <gorcunov at gmail.com>
CommitDate: Wed, 9 May 2018 18:03:50 +0300

test: travis -- Add some of converted tests

Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>


---
 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    |    6 +-
 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, 1635 insertions(+), 1454 deletions(-)

diff --git a/travis/test/_file_.asm b/travis/test/_file_.asm
new file mode 100644
index 00000000..e349e2c3
--- /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 00000000..2ba4aa2d
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 00000000..cf168220
--- /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 00000000..f84a8c8a
--- /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 00000000..935c7d04
--- /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 00000000..82df66c6
--- /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 00000000..44d38d29
--- /dev/null
+++ b/travis/test/a32offs.bin.t
@@ -0,0 +1 @@
+gâýgâýgâýgâý
\ No newline at end of file
diff --git a/travis/test/a32offs.json b/travis/test/a32offs.json
new file mode 100644
index 00000000..cb8ac1f7
--- /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 74%
copy from test/absolute.asm
copy to travis/test/absolute.asm
index 31c8178c..38532ec9 100644
--- a/test/absolute.asm
+++ b/travis/test/absolute.asm
@@ -1,4 +1,3 @@
-;Testname=bin; Arguments=-fbin -oabsolute.bin; Files=stdout stderr absolute.bin
 	org 7c00h
 init_foo:
 	jmp init_bar
@@ -15,7 +14,7 @@ init_foo:
 	nop
 	nop
 	nop
-	
+
 init_bar:
 	mov [b1],dl
 	mov [b2],edx
@@ -33,8 +32,7 @@ init_bar:
 	nop
 	nop
 	ret
-		
+
 	absolute init_bar+7
 b1:	resb 1
 b2:	resd 6
-
diff --git a/travis/test/absolute.bin.t b/travis/test/absolute.bin.t
new file mode 100644
index 00000000..b132e69c
--- /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 00000000..6a6a9468
--- /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 c7a64f5d..1fbec453 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 00000000..b9166a2d
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 00000000..e642ce66
--- /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 00000000..5d1b3184
--- /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 00000000..556373fc
--- /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 00000000..7375023a
--- /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 00000000..31d6e310
--- /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 51b477fd..a634e1b0 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 polyg“ne textur‚ de maniŠre LINEAIRE.
-;;  Il s'agit donc d'interpoler les coordonn‚es aux bords de la texture en
-;;  mˆme temps que les abscisses minx/maxx pour chaque ligne.
-;;  L'argument 'dir' indique quels bords de la texture sont interpolés:
-;;    0 : segments associ‚s aux bord SUPERIEUR et INFERIEUR ( TY constant )
-;;    1 : segments associ‚s 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 polyg“ne
-
-        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 polyg“ne
-;;
-.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]                 ;;pr‚a1
-;       adc ah,dh
-;       add edx,[xstep]
-;       adc al,ch
-;       and eax,0x3f3f
-;       mov bl,[esi+eax]                ;;pr‚b1
-;       mov dl,[ebx]                    ;;pr‚c1
-;
-;       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]            ;; 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 polyg“ne textur‚ de maniŠre LINEAIRE.
+;;  Il s'agit donc d'interpoler les coordonn‚es aux bords de la texture en
+;;  mˆme temps que les abscisses minx/maxx pour chaque ligne.
+;;  L'argument 'dir' indique quels bords de la texture sont interpolés:
+;;    0 : segments associ‚s aux bord SUPERIEUR et INFERIEUR ( TY constant )
+;;    1 : segments associ‚s 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 polyg“ne
+
+        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 polyg“ne
+;;
+.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]                 ;;pr‚a1
+;       adc ah,dh
+;       add edx,[xstep]
+;       adc al,ch
+;       and eax,0x3f3f
+;       mov bl,[esi+eax]                ;;pr‚b1
+;       mov dl,[ebx]                    ;;pr‚c1
+;
+;       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
+
diff --git a/travis/test/tmap.json b/travis/test/tmap.json
new file mode 100644
index 00000000..3978d998
--- /dev/null
+++ b/travis/test/tmap.json
@@ -0,0 +1,10 @@
+{
+	"description": "Test abuse the section flags which breaks NASM 0.98.37",
+	"format": "elf",
+	"source": "tmap.asm",
+	"option": "-DLINUX",
+	"target": [
+		{ "output": "tmap.o" },
+		{ "stderr": "tmap.o.stderr" }
+	]
+}
diff --git a/travis/test/tmap.o.stderr b/travis/test/tmap.o.stderr
new file mode 100644
index 00000000..da75c8fb
--- /dev/null
+++ b/travis/test/tmap.o.stderr
@@ -0,0 +1 @@
+./travis/test/tmap.asm:938: warning: label alone on a line without a colon might be in error [-w+orphan-labels]
diff --git a/travis/test/tmap.o.t b/travis/test/tmap.o.t
new file mode 100644
index 00000000..8ac43ab5
Binary files /dev/null and b/travis/test/tmap.o.t differ
diff --git a/test/weirdpaste.asm b/travis/test/weirdpaste.asm
similarity index 65%
copy from test/weirdpaste.asm
copy to travis/test/weirdpaste.asm
index 46bfa90a..353ef8a8 100644
--- a/test/weirdpaste.asm
+++ b/travis/test/weirdpaste.asm
@@ -1,6 +1,3 @@
-;Testname=preproc; Arguments=-E; Files=stdout stderr
-;Testname=bin; Arguments=-fbin -oweirdpaste.bin; Files=stdout stderr weirdpaste.bin
-
 	%define foo xyzzy
 %define bar 1e+10
 
diff --git a/travis/test/weirdpaste.bin.t b/travis/test/weirdpaste.bin.t
new file mode 100644
index 00000000..db0468ed
Binary files /dev/null and b/travis/test/weirdpaste.bin.t differ
diff --git a/travis/test/weirdpaste.i.t b/travis/test/weirdpaste.i.t
new file mode 100644
index 00000000..ac7ddf08
--- /dev/null
+++ b/travis/test/weirdpaste.i.t
@@ -0,0 +1,30 @@
+%line 3+1 ./travis/test/weirdpaste.asm
+
+
+
+%line 10+1 ./travis/test/weirdpaste.asm
+
+ dw 25
+
+%line 18+1 ./travis/test/weirdpaste.asm
+
+ dd 2067830734
+%line 19+0 ./travis/test/weirdpaste.asm
+ dd 1e+36
+%line 20+1 ./travis/test/weirdpaste.asm
+ dd 1664279731
+%line 20+0 ./travis/test/weirdpaste.asm
+ dd 33e+20
+%line 21+1 ./travis/test/weirdpaste.asm
+ dd 0
+%line 21+0 ./travis/test/weirdpaste.asm
+ dd 0e+2
+%line 22+1 ./travis/test/weirdpaste.asm
+ dd 1206542336
+%line 22+0 ./travis/test/weirdpaste.asm
+ dd 1.2e+5
+%line 23+1 ./travis/test/weirdpaste.asm
+
+
+
+ dd 1e+5, 1e+5
diff --git a/travis/test/weirdpaste.json b/travis/test/weirdpaste.json
new file mode 100644
index 00000000..566a567b
--- /dev/null
+++ b/travis/test/weirdpaste.json
@@ -0,0 +1,18 @@
+[
+	{
+		"description": "Check preprocessor paste operator (compile mode)",
+		"format": "bin",
+		"source": "weirdpaste.asm",
+		"target": [
+			{ "output": "weirdpaste.bin" }
+		]
+	},
+	{
+		"description": "Check preprocessor paste operator (preprocessor mode)",
+		"source": "weirdpaste.asm",
+		"option": "-E",
+		"target": [
+			{ "output": "weirdpaste.i" }
+		]
+	}
+]


More information about the Nasm-commits mailing list