From 51fa952968ebef4302248c1154a5ce1504d26607 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Wed, 9 Dec 2015 12:03:06 -0600 Subject: [PATCH] trying to translate that lib into open watcom... --- 16.exe | Bin 77502 -> 77503 bytes 16/x/MAKEFILE | 2 +- 16/x/makefile | 2 +- 16/x/makefile.wat | 59 - 16/x_/MODEX.BAK | Bin 0 -> 59392 bytes 16/x_/default.fnt | 260 +++ 16/x_/makefile | 82 + 16/x_/modex.def | 154 ++ 16/x_/modex.h | 153 ++ 16/x_/modex.lbr | 38 + 16/x_/modex.pas | 194 ++ 16/x_/modex/DEMO01.EXE | Bin 0 -> 10208 bytes 16/x_/modex/DEMO01.PAS | 126 ++ 16/x_/modex/DEMO02.EXE | Bin 0 -> 24688 bytes 16/x_/modex/DEMO02.PAS | 125 ++ 16/x_/modex/DEMO03.EXE | Bin 0 -> 14256 bytes 16/x_/modex/DEMO03.PAS | 152 ++ 16/x_/modex/DEMO04.DAT | Bin 0 -> 37662 bytes 16/x_/modex/DEMO04.EXE | Bin 0 -> 24384 bytes 16/x_/modex/DEMO04.PAS | 198 ++ 16/x_/modex/DEMO05.EXE | Bin 0 -> 22528 bytes 16/x_/modex/DEMO05.PAS | 131 ++ 16/x_/modex/DEMO06.DAT | Bin 0 -> 77568 bytes 16/x_/modex/DEMO06.EXE | Bin 0 -> 10864 bytes 16/x_/modex/DEMO06.PAS | 135 ++ 16/x_/modex/DEMO07.EXE | Bin 0 -> 7440 bytes 16/x_/modex/DEMO07.PAS | 68 + 16/x_/modex/MATH.INC | 34 + 16/x_/modex/PLASMA.PAS | 103 + 16/x_/modex/QIX2.EXE | Bin 0 -> 10336 bytes 16/x_/modex/QIX2.PAS | 210 ++ 16/x_/modex/README.TXT | 8 + 16/x_/modex/SINCOS.INC | 518 +++++ 16/x_/modex/THREED.ASM | 872 ++++++++ 16/x_/modex/THREED.H | 32 + 16/x_/modex/THREED.PAS | 40 + 16/x_/mxbb.asm | 278 +++ 16/x_/mxcc.asm | 644 ++++++ 16/x_/mxcg.asm | 69 + 16/x_/mxcl.asm | 151 ++ 16/x_/mxcr.asm | 380 ++++ 16/x_/mxel.asm | 167 ++ 16/x_/mxfb.asm | 194 ++ 16/x_/mxfp.asm | 326 +++ 16/x_/mxgc.asm | 54 + 16/x_/mxgi.asm | 132 ++ 16/x_/mxgm.asm | 63 + 16/x_/mxgp.asm | 56 + 16/x_/mxgv.asm | 25 + 16/x_/mxhl.asm | 76 + 16/x_/mxit.asm | 98 + 16/x_/mxll.asm | 82 + 16/x_/mxln.asm | 414 ++++ 16/x_/mxot.asm | 330 +++ 16/x_/mxpb.asm | 22 + 16/x_/mxpf.asm | 420 ++++ 16/x_/mxpg.asm | 589 ++++++ 16/x_/mxpi.asm | 267 +++ 16/x_/mxpn.asm | 60 + 16/x_/mxpp.asm | 121 ++ 16/x_/mxra.asm | 37 + 16/x_/mxrp.asm | 101 + 16/x_/mxsa.asm | 44 + 16/x_/mxsc.asm | 50 + 16/x_/mxsi.asm | 317 +++ 16/x_/mxsl.asm | 62 + 16/x_/mxsm.asm | 508 +++++ 16/x_/mxsp.asm | 57 + 16/x_/mxss.asm | 72 + 16/x_/mxtl.asm | 169 ++ 16/x_/mxvs.asm | 110 + 16/x_/mxwd.asm | 28 + 16/x_/mxwm.asm | 39 + 16/x_/mxwp.asm | 62 + 16/x_/mxwr.asm | 28 + 16/x_/readme.txt | 8 + 16/xw/makefile | 4 +- 16/xw_/makefile | 6 +- 16/xw_/mxbb.asm | 207 ++ 16/xw_/mxcc.asm | 628 ++++++ 16/xw_/mxcg.asm | 42 + 16/xw_/mxcl.asm | 110 + 16/xw_/mxcr.asm | 243 +++ 16/xw_/mxel.asm | 0 16/xw_/mxfb.asm | 133 ++ 16/xw_/mxfp.asm | 219 ++ 16/xw_/mxgc.asm | 30 + 16/xw_/mxgi.asm | 98 + 16/xw_/mxgm.asm | 68 + 16/xw_/mxgp.asm | 32 + 16/xw_/mxgv.asm | 8 + 16/xw_/mxhl.asm | 45 + 16/xw_/mxit.asm | 98 + 16/xw_/mxll.asm | 50 + 16/xw_/mxln.asm | 332 +++ 16/xw_/mxot.asm | 1330 ++++++++++++ 16/xw_/mxot_.asm | 333 ++++ 16/xw_/mxpb.asm | 4102 +++++++++++++++++++++++++++++++++++++ 16/xw_/mxpf.asm | 327 +++ 16/xw_/mxpg.asm | 457 +++++ 16/xw_/mxpi.asm | 218 ++ 16/xw_/mxpn.asm | 34 + 16/xw_/mxpp.asm | 84 + 16/xw_/mxra.asm | 17 + 16/xw_/mxrp.asm | 72 + 16/xw_/mxsa.asm | 22 + 16/xw_/mxsc.asm | 26 + 16/xw_/mxsi.asm | 220 ++ 16/xw_/mxsl.asm | 36 + 16/xw_/mxsm.asm | 449 +++++ 16/xw_/mxsp.asm | 33 + 16/xw_/mxss.asm | 44 + 16/xw_/mxtl.asm | 122 ++ 16/xw_/mxvs.asm | 68 + 16/xw_/mxwd.asm | 12 + 16/xw_/mxwm.asm | 18 + 16/xw_/mxwp.asm | 30 + 16/xw_/mxwr.asm | 12 + 16/xw_/xw.bat | 39 + 16/xw__/default.fnt | 260 +++ 16/xw__/makefile | 132 ++ 16/xw__/makefile.bcc | 81 + 16/xw__/modex.bak | Bin 0 -> 25600 bytes 16/xw__/modex.def | 163 ++ 16/xw__/modex.h | 153 ++ 16/xw__/modex.lbr | 39 + 16/xw__/modex.pas | 194 ++ 16/xw__/modex/DEMO01.EXE | Bin 0 -> 10208 bytes 16/xw__/modex/DEMO01.PAS | 126 ++ 16/xw__/modex/DEMO02.EXE | Bin 0 -> 24688 bytes 16/xw__/modex/DEMO02.PAS | 125 ++ 16/xw__/modex/DEMO03.EXE | Bin 0 -> 14256 bytes 16/xw__/modex/DEMO03.PAS | 152 ++ 16/xw__/modex/DEMO04.DAT | Bin 0 -> 37662 bytes 16/xw__/modex/DEMO04.EXE | Bin 0 -> 24384 bytes 16/xw__/modex/DEMO04.PAS | 198 ++ 16/xw__/modex/DEMO05.EXE | Bin 0 -> 22528 bytes 16/xw__/modex/DEMO05.PAS | 131 ++ 16/xw__/modex/DEMO06.DAT | Bin 0 -> 77568 bytes 16/xw__/modex/DEMO06.EXE | Bin 0 -> 10864 bytes 16/xw__/modex/DEMO06.PAS | 135 ++ 16/xw__/modex/DEMO07.EXE | Bin 0 -> 7440 bytes 16/xw__/modex/DEMO07.PAS | 68 + 16/xw__/modex/MATH.INC | 34 + 16/xw__/modex/PLASMA.PAS | 103 + 16/xw__/modex/QIX2.EXE | Bin 0 -> 10336 bytes 16/xw__/modex/QIX2.PAS | 210 ++ 16/xw__/modex/README.TXT | 8 + 16/xw__/modex/SINCOS.INC | 518 +++++ 16/xw__/modex/THREED.ASM | 872 ++++++++ 16/xw__/modex/THREED.H | 32 + 16/xw__/modex/THREED.PAS | 40 + 16/xw__/modex/demo01.c | 125 ++ 16/{ => xw__}/mxbb.asm | 0 16/xw__/mxcc.asm | 629 ++++++ 16/xw__/mxcg.asm | 43 + 16/xw__/mxcl.asm | 111 ++ 16/xw__/mxcr.asm | 244 +++ 16/xw__/mxel.asm | 0 16/xw__/mxfb.asm | 134 ++ 16/xw__/mxfp.asm | 220 ++ 16/xw__/mxgc.asm | 31 + 16/xw__/mxgi.asm | 99 + 16/xw__/mxgm.asm | 69 + 16/xw__/mxgp.asm | 33 + 16/xw__/mxgv.asm | 9 + 16/xw__/mxhl.asm | 45 + 16/xw__/mxit.asm | 92 + 16/xw__/mxll.asm | 51 + 16/xw__/mxln.asm | 333 ++++ 16/xw__/mxot.asm | 1310 ++++++++++++ 16/xw__/mxot_.asm | 333 ++++ 16/xw__/mxpb.asm | 4103 ++++++++++++++++++++++++++++++++++++++ 16/xw__/mxpf.asm | 328 +++ 16/xw__/mxpg.asm | 458 +++++ 16/xw__/mxpi.asm | 219 ++ 16/xw__/mxpn.asm | 35 + 16/xw__/mxpp.asm | 85 + 16/xw__/mxra.asm | 18 + 16/xw__/mxrp.asm | 73 + 16/xw__/mxsa.asm | 23 + 16/xw__/mxsc.asm | 27 + 16/xw__/mxsi.asm | 221 ++ 16/xw__/mxsl.asm | 37 + 16/xw__/mxsm.asm | 450 +++++ 16/xw__/mxsp.asm | 34 + 16/xw__/mxss.asm | 45 + 16/xw__/mxtl.asm | 123 ++ 16/xw__/mxvs.asm | 69 + 16/xw__/mxwd.asm | 13 + 16/xw__/mxwm.asm | 19 + 16/xw__/mxwp.asm | 31 + 16/xw__/mxwr.asm | 13 + 16/xw__/readme.txt | 8 + 16/xw__/xw.bat | 39 + exmmtest.exe | Bin 60943 -> 60947 bytes makefile | 8 +- planrpcx.exe | Bin 53345 -> 53349 bytes scroll.exe | Bin 94514 -> 94514 bytes test.exe | Bin 49369 -> 49370 bytes tesuto.exe | Bin 8612 -> 19486 bytes 201 files changed, 34955 insertions(+), 73 deletions(-) delete mode 100755 16/x/makefile.wat create mode 100755 16/x_/MODEX.BAK create mode 100755 16/x_/default.fnt create mode 100755 16/x_/makefile create mode 100755 16/x_/modex.def create mode 100755 16/x_/modex.h create mode 100755 16/x_/modex.lbr create mode 100755 16/x_/modex.pas create mode 100755 16/x_/modex/DEMO01.EXE create mode 100755 16/x_/modex/DEMO01.PAS create mode 100755 16/x_/modex/DEMO02.EXE create mode 100755 16/x_/modex/DEMO02.PAS create mode 100755 16/x_/modex/DEMO03.EXE create mode 100755 16/x_/modex/DEMO03.PAS create mode 100755 16/x_/modex/DEMO04.DAT create mode 100755 16/x_/modex/DEMO04.EXE create mode 100755 16/x_/modex/DEMO04.PAS create mode 100755 16/x_/modex/DEMO05.EXE create mode 100755 16/x_/modex/DEMO05.PAS create mode 100755 16/x_/modex/DEMO06.DAT create mode 100755 16/x_/modex/DEMO06.EXE create mode 100755 16/x_/modex/DEMO06.PAS create mode 100755 16/x_/modex/DEMO07.EXE create mode 100755 16/x_/modex/DEMO07.PAS create mode 100755 16/x_/modex/MATH.INC create mode 100755 16/x_/modex/PLASMA.PAS create mode 100755 16/x_/modex/QIX2.EXE create mode 100755 16/x_/modex/QIX2.PAS create mode 100755 16/x_/modex/README.TXT create mode 100755 16/x_/modex/SINCOS.INC create mode 100755 16/x_/modex/THREED.ASM create mode 100755 16/x_/modex/THREED.H create mode 100755 16/x_/modex/THREED.PAS create mode 100755 16/x_/mxbb.asm create mode 100755 16/x_/mxcc.asm create mode 100755 16/x_/mxcg.asm create mode 100755 16/x_/mxcl.asm create mode 100755 16/x_/mxcr.asm create mode 100755 16/x_/mxel.asm create mode 100755 16/x_/mxfb.asm create mode 100755 16/x_/mxfp.asm create mode 100755 16/x_/mxgc.asm create mode 100755 16/x_/mxgi.asm create mode 100755 16/x_/mxgm.asm create mode 100755 16/x_/mxgp.asm create mode 100755 16/x_/mxgv.asm create mode 100755 16/x_/mxhl.asm create mode 100755 16/x_/mxit.asm create mode 100755 16/x_/mxll.asm create mode 100755 16/x_/mxln.asm create mode 100755 16/x_/mxot.asm create mode 100755 16/x_/mxpb.asm create mode 100755 16/x_/mxpf.asm create mode 100755 16/x_/mxpg.asm create mode 100755 16/x_/mxpi.asm create mode 100755 16/x_/mxpn.asm create mode 100755 16/x_/mxpp.asm create mode 100755 16/x_/mxra.asm create mode 100755 16/x_/mxrp.asm create mode 100755 16/x_/mxsa.asm create mode 100755 16/x_/mxsc.asm create mode 100755 16/x_/mxsi.asm create mode 100755 16/x_/mxsl.asm create mode 100755 16/x_/mxsm.asm create mode 100755 16/x_/mxsp.asm create mode 100755 16/x_/mxss.asm create mode 100755 16/x_/mxtl.asm create mode 100755 16/x_/mxvs.asm create mode 100755 16/x_/mxwd.asm create mode 100755 16/x_/mxwm.asm create mode 100755 16/x_/mxwp.asm create mode 100755 16/x_/mxwr.asm create mode 100755 16/x_/readme.txt create mode 100755 16/xw_/mxbb.asm create mode 100755 16/xw_/mxcc.asm create mode 100755 16/xw_/mxcg.asm create mode 100755 16/xw_/mxcl.asm create mode 100755 16/xw_/mxcr.asm create mode 100755 16/xw_/mxel.asm create mode 100755 16/xw_/mxfb.asm create mode 100755 16/xw_/mxfp.asm create mode 100755 16/xw_/mxgc.asm create mode 100755 16/xw_/mxgi.asm create mode 100755 16/xw_/mxgm.asm create mode 100755 16/xw_/mxgp.asm create mode 100755 16/xw_/mxgv.asm create mode 100755 16/xw_/mxhl.asm create mode 100755 16/xw_/mxit.asm create mode 100755 16/xw_/mxll.asm create mode 100755 16/xw_/mxln.asm create mode 100755 16/xw_/mxot.asm create mode 100755 16/xw_/mxot_.asm create mode 100755 16/xw_/mxpb.asm create mode 100755 16/xw_/mxpf.asm create mode 100755 16/xw_/mxpg.asm create mode 100755 16/xw_/mxpi.asm create mode 100755 16/xw_/mxpn.asm create mode 100755 16/xw_/mxpp.asm create mode 100755 16/xw_/mxra.asm create mode 100755 16/xw_/mxrp.asm create mode 100755 16/xw_/mxsa.asm create mode 100755 16/xw_/mxsc.asm create mode 100755 16/xw_/mxsi.asm create mode 100755 16/xw_/mxsl.asm create mode 100755 16/xw_/mxsm.asm create mode 100755 16/xw_/mxsp.asm create mode 100755 16/xw_/mxss.asm create mode 100755 16/xw_/mxtl.asm create mode 100755 16/xw_/mxvs.asm create mode 100755 16/xw_/mxwd.asm create mode 100755 16/xw_/mxwm.asm create mode 100755 16/xw_/mxwp.asm create mode 100755 16/xw_/mxwr.asm create mode 100755 16/xw_/xw.bat create mode 100755 16/xw__/default.fnt create mode 100755 16/xw__/makefile create mode 100755 16/xw__/makefile.bcc create mode 100755 16/xw__/modex.bak create mode 100755 16/xw__/modex.def create mode 100755 16/xw__/modex.h create mode 100755 16/xw__/modex.lbr create mode 100755 16/xw__/modex.pas create mode 100755 16/xw__/modex/DEMO01.EXE create mode 100755 16/xw__/modex/DEMO01.PAS create mode 100755 16/xw__/modex/DEMO02.EXE create mode 100755 16/xw__/modex/DEMO02.PAS create mode 100755 16/xw__/modex/DEMO03.EXE create mode 100755 16/xw__/modex/DEMO03.PAS create mode 100755 16/xw__/modex/DEMO04.DAT create mode 100755 16/xw__/modex/DEMO04.EXE create mode 100755 16/xw__/modex/DEMO04.PAS create mode 100755 16/xw__/modex/DEMO05.EXE create mode 100755 16/xw__/modex/DEMO05.PAS create mode 100755 16/xw__/modex/DEMO06.DAT create mode 100755 16/xw__/modex/DEMO06.EXE create mode 100755 16/xw__/modex/DEMO06.PAS create mode 100755 16/xw__/modex/DEMO07.EXE create mode 100755 16/xw__/modex/DEMO07.PAS create mode 100755 16/xw__/modex/MATH.INC create mode 100755 16/xw__/modex/PLASMA.PAS create mode 100755 16/xw__/modex/QIX2.EXE create mode 100755 16/xw__/modex/QIX2.PAS create mode 100755 16/xw__/modex/README.TXT create mode 100755 16/xw__/modex/SINCOS.INC create mode 100755 16/xw__/modex/THREED.ASM create mode 100755 16/xw__/modex/THREED.H create mode 100755 16/xw__/modex/THREED.PAS create mode 100755 16/xw__/modex/demo01.c rename 16/{ => xw__}/mxbb.asm (100%) create mode 100755 16/xw__/mxcc.asm create mode 100755 16/xw__/mxcg.asm create mode 100755 16/xw__/mxcl.asm create mode 100755 16/xw__/mxcr.asm create mode 100755 16/xw__/mxel.asm create mode 100755 16/xw__/mxfb.asm create mode 100755 16/xw__/mxfp.asm create mode 100755 16/xw__/mxgc.asm create mode 100755 16/xw__/mxgi.asm create mode 100755 16/xw__/mxgm.asm create mode 100755 16/xw__/mxgp.asm create mode 100755 16/xw__/mxgv.asm create mode 100755 16/xw__/mxhl.asm create mode 100755 16/xw__/mxit.asm create mode 100755 16/xw__/mxll.asm create mode 100755 16/xw__/mxln.asm create mode 100755 16/xw__/mxot.asm create mode 100755 16/xw__/mxot_.asm create mode 100755 16/xw__/mxpb.asm create mode 100755 16/xw__/mxpf.asm create mode 100755 16/xw__/mxpg.asm create mode 100755 16/xw__/mxpi.asm create mode 100755 16/xw__/mxpn.asm create mode 100755 16/xw__/mxpp.asm create mode 100755 16/xw__/mxra.asm create mode 100755 16/xw__/mxrp.asm create mode 100755 16/xw__/mxsa.asm create mode 100755 16/xw__/mxsc.asm create mode 100755 16/xw__/mxsi.asm create mode 100755 16/xw__/mxsl.asm create mode 100755 16/xw__/mxsm.asm create mode 100755 16/xw__/mxsp.asm create mode 100755 16/xw__/mxss.asm create mode 100755 16/xw__/mxtl.asm create mode 100755 16/xw__/mxvs.asm create mode 100755 16/xw__/mxwd.asm create mode 100755 16/xw__/mxwm.asm create mode 100755 16/xw__/mxwp.asm create mode 100755 16/xw__/mxwr.asm create mode 100755 16/xw__/readme.txt create mode 100755 16/xw__/xw.bat diff --git a/16.exe b/16.exe index 55a5ccab0edafd9a04689b3f84c2022ebc5b039b..fab7ff9f868797abacba1083dc40956d24e85c17 100755 GIT binary patch delta 31021 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 WNTLA*tgU5#;{gCB{mj4K>-_&7IKE^6 diff --git a/16/x/MAKEFILE b/16/x/MAKEFILE index d3ad8b71..8ad2f244 100755 --- a/16/x/MAKEFILE +++ b/16/x/MAKEFILE @@ -63,7 +63,7 @@ LIBC = tlib .asm.obj: $(ASMC) $(ASMO) $< -target: modex.lib +target: modex.lib # modex.tpu modex.tpp #modex.tpu: $(LIBOBJS) modex.pas diff --git a/16/x/makefile b/16/x/makefile index d3ad8b71..8ad2f244 100755 --- a/16/x/makefile +++ b/16/x/makefile @@ -63,7 +63,7 @@ LIBC = tlib .asm.obj: $(ASMC) $(ASMO) $< -target: modex.lib +target: modex.lib # modex.tpu modex.tpp #modex.tpu: $(LIBOBJS) modex.pas diff --git a/16/x/makefile.wat b/16/x/makefile.wat deleted file mode 100755 index 7d76eadb..00000000 --- a/16/x/makefile.wat +++ /dev/null @@ -1,59 +0,0 @@ -!ifdef __LINUX__ -REMOVECOMMAND=rm -f -COPYCOMMAND=cp -f -DIRSEP=/ -OBJ=o -!else -REMOVECOMMAND=del -COPYCOMMAND=copy /y -DIRSEP=\ -OBJ=obj -!endif - -TARGET_OS = dos - -DISS=wdis -a -REDR=">" ..$(DIRSEP)xw_$(DIRSEP) - -all: - @beep - -pee: .symbolic -$(DISS) MXBB.OBJ $(REDR)mxbb.asm -$(DISS) MXCC.OBJ $(REDR)mxcc.asm -$(DISS) MXCG.OBJ $(REDR)mxcg.asm -$(DISS) MXCL.OBJ $(REDR)mxcl.asm -$(DISS) MXCR.OBJ $(REDR)mxcl.asm -$(DISS) MXFB.OBJ $(REDR)mxfb.asm -$(DISS) MXFP.OBJ $(REDR)mxfp.asm -$(DISS) MXGC.OBJ $(REDR)mxgc.asm -$(DISS) MXGI.OBJ $(REDR)mxgi.asm -$(DISS) MXGM.OBJ $(REDR)mxgm.asm -$(DISS) MXGP.OBJ $(REDR)mxgp.asm -$(DISS) MXGV.OBJ $(REDR)mxgv.asm -$(DISS) MXHL.OBJ $(REDR)mxhl.asm -$(DISS) MXIT.OBJ $(REDR)mxit.asm -$(DISS) MXLL.OBJ $(REDR)mxll.asm -$(DISS) MXLN.OBJ $(REDR)mxln.asm -$(DISS) MXOT.OBJ $(REDR)mxot.asm -$(DISS) MXPB.OBJ $(REDR)mxpb.asm -$(DISS) MXPF.OBJ $(REDR)mxpf.asm -$(DISS) MXPG.OBJ $(REDR)mxpg.asm -$(DISS) MXPI.OBJ $(REDR)mxpi.asm -$(DISS) MXPN.OBJ $(REDR)mxpn.asm -$(DISS) MXPP.OBJ $(REDR)mxpp.asm -$(DISS) MXRA.OBJ $(REDR)mxra.asm -$(DISS) MXRP.OBJ $(REDR)mxrp.asm -$(DISS) MXSA.OBJ $(REDR)mxsa.asm -$(DISS) MXSC.OBJ $(REDR)mxsc.asm -$(DISS) MXSI.OBJ $(REDR)mxsi.asm -$(DISS) MXSL.OBJ $(REDR)mxsl.asm -$(DISS) MXSM.OBJ $(REDR)mxsm.asm -$(DISS) MXSP.OBJ $(REDR)mxsp.asm -$(DISS) MXSS.OBJ $(REDR)mxss.asm -$(DISS) MXTL.OBJ $(REDR)mxtl.asm -$(DISS) MXVS.OBJ $(REDR)mxvs.asm -$(DISS) MXWD.OBJ $(REDR)mxwd.asm -$(DISS) MXWM.OBJ $(REDR)mxwm.asm -$(DISS) MXWP.OBJ $(REDR)mxwp.asm -$(DISS) MXWR.OBJ $(REDR)mxwr.asm diff --git a/16/x_/MODEX.BAK b/16/x_/MODEX.BAK new file mode 100755 index 0000000000000000000000000000000000000000..923d02e969692cfc167d30edfb4314432c257f1a GIT binary patch literal 59392 zcmeFa30PHC+dq8YYwvU12T{?~oKkX5j1(sn2gU;^0s;wAr^u6`|ucz<&u8+goXYYHBd!Mz| zJ*?llcX2hMqeMD+{<7?(_e~2A@0;TfN~4r%lSfSS51TS&^g|=YkDl!BpE`Q-lyMU$ z_;(0w|4fb_g%;h_e0QYr(2Nly0*6m|C_kqrNPX_hjdt`+h>S`LjEr(d{Jb%d1nBzG*{KqS8|I2qgP;MHL$R0t=0k7uKUX$^FA)5|UyECB&zM#l^+ON5#fF z6R12#r_iJILl)Me8pxa)8yS_592MO+Dn5k@Rh&<6Ph9xGl&Ivys3e(}KJ>&bsX@dB zZY?$?JT3+Ib}`3Bp~o6gXPMwdenMWJ)+s8-pwJWb$WCo+IS!oGN8098L!CE}=UgqP zD(DSy-VDK4T{TiyI#p3ucc?2Shq`L4u56^MGMbP<4SZOg`;(vshLK~Z&|jD+E~gfS zo-{&3%|@bTZb6&mV?JpQ4UI~RO_8Kl6lP}VK=pH~BTf$ujcX@k#?dw}p}izz(Z4K0 zgi5iHUhxuCikIkdi;$#JyiXIn1eIbprCBYAOo)$?#U4Phw>0W|S|lIfsl)WJ**JMp z2aT&58k!iE5)l)ZkdP?zo+I+oNv$ZF?xGmFn-Y<`A95#AS4u{%6r}D?;gm{IG!Q8U zQ5@Y%@iYV}ha$x=N~7VRjKI}soQp(sA}E zO{K?hl}Xbni)PSldW7bJIuF$OltDQ(lkyPjqB*n>F^egioM2qMZr2H2xp;wXmby`YqAjd{pMsL$o^e%F}k6a(pv$Ta)(Z}>0ZAA&& z=>^J1DLZKm?LtYrX&rrm()Q5Hv==4rqYZQbC4Nh<(RcJFeNP|IVcJALp`@dam8Y~9AG_5pJqU zdf?TTM6PtdedqR_(~39m(Kgw_&X?wmIqUQD)JB^Nw2k7tOdaEj_emYFPAk?*VyBf1 z9pa334e_0Kcxp2w*(7SHGy(apR3vikzNFIip7z_&A=)MFM&6jyD6HT_MO>xChM5C(b(_)#7?<`O7^zon1Bd6G8a_5!3&U159FXPc&ab;dEi@!MSU-@fS zg-}7G6fS6%!r49S%muyeEDBQXtQE|VhgI@WC=aEGC^T?Z*hn7k$6;e01d6F-$}15O zeg2}nGIFGpSGN6qd1by0^2*phlQ{lVQt>4Rq?m}f*u=EfZO~WveMN0wbhEAVKhIp(Yb@?w!I(8}1+|c`~*+L5qRicEC zZLD=2B-wav+kMt`2YKypOSG;#%Ih|^DC@eDyzXM_VqJHZ*I~A{)^!(o-PhK{x(=4t z18lV|F~Jg^=Gu-b@nF79{q{;cF#CcO54J5^YnQW)n>vC;b)wT?@@F6#oCTBr6=K0T zhy)kF=r2&b_G$_aR@7qv{+F7L`b~xgXumNz{mw!J_(uMWsT1 z96)z*8U^ru6v#uso`z979!~9fB-qqwu&FU%Q)4Lv;#^ODfFk%oisFYTh9`hUO$2+I zL`nQG*wbVh#8beUrqNJN2V0s>_wx*}rANV*9s^s-ps75Q(m50CXclEc8qDH(G?(X7 zHs{bh&ZYV6q6Pdo!>`Z*UQgff>vV|UpznAiea~;v zVSa~x;P>bVzfZ^c13JZ*hROA WoEnPVbcgto{KXz>CcdK9VlTB3`{-`5pMt~z>L|XWF5-I%7C%r| z@gsE;M<_%brJmv#MTp}RC4QzD@eB14Cn-^!q9oy_{-THmiPJP#oTZ`SR~jMC(f#5) zjT6N*URpVrjUEwKC{tXeEKx#p#Wl(i*C|ijpv9t;o)FB-gy5%y&dY_3 zpB7bkg)sP8;o#N6hhG%F{F11~>qT{bUDV(=g&)5yYVrr77Jn#e^GBi%e=6#7fw-M_ zhMq$fcqk|1R2dndrdfq7ziE&TP}Vu#XnZzFIe~p@ncQtvlbY_2BwiFK(oTauY3_ zn`#l+0fT=HGLh|&|l_S`YU|9zMkvruX98F4ZcHvlbh%pxw-xpx76R}*7`f#Mt_&v z>hE!&{yw+UKj2RKChn|%%w6CN zAJ&iX6#XdA(2wz>`f<+CPjIIGGiT|)@ErXlXX~dpS9f!s{wurmbNsk|o)_!IyiC8q z%k_)ALche%=$Cnw{u@89U*XmIRenh?;g|K_`4zp4|D~7nt2&8|I*Ye;A>P$B@xHE$ zO}b5N*6rdWy^7eT8)Ca&P2}sbHsgdTsHwUPpYZ*A<8K z+r^K1J@J!%hd81)7RU4^;)L!m-1?p3wBA&l)tiZPdUH{%w-6Wgmg2JBN?g-hi|cx* zxS@xMQawVH>5)RSMG2eDDGXbT@Ug{;8n)h|rme52ZHpK6Z3&{GEm1VKB?*69vS?vT z5v^pV0xW_h7w6_fsoos_e7u$WJyKRW*X&WxWY$JrzHd4gcMu|SQF`}>SevxDw zD^hF^iUGFqVxa9IG1xXi46{uXqimDJINQVGLEB_8$u>nywoMgNZPP@$EnPffn=T%+ z%@8wfkBC{eN5yR0V`7diQ_Qu^64|yaG0(O>=Qb&F!;TT1l+Zsh*$1qSXk1PWP;H>L zYbPn8^p=;>UQtr%880PBQO46;FQucRWYI%jN+(5GPN`l>XGM99dU+|qin5jN@>04g z${uRqrGzQU53qkIYehsvin3$4$H{hzr!$ zOHd-iWs30XHWbd~L>%}u?8FiE%*CLd+*h=^$4&TMNS zXH}5Q`)S7`tZeO7^MlyeOHi%t#8tcm)!Gm)_Yzd&Vz}5#P>mbP2fYNOQ@s<@M{=4x0mcgp>a?!;qI#`t>v>-1*-FFSGxtE~&LnEz@m!SGXQ?0s}pgL<; z?TS@#S5I3KwcrYp*_I?N$;#GMwIxM6>LsYEhil#r(p6PGL)+v{p=w&Jz2Ggjv-u!i z*M7A~VV=rA&_1gmnU#O2ov=y@Q=Zy zLn}(|XO-+i5z<8CBa`;?mi&r7qoU+~6(#5ET1CnIJS88|zsjkLGH%iirE%qkK6mwZ z8aN1SMhL0ofH|_fTwZ4(EXVb0>e>#2ogL;r8~vcJWtz(2EcBxb(3vhnH_|bi*ThVE zCkNrI6G8|=48l-^@i2nr;rlc+j_1_(yS$Bm;3IrRUCEf!koq0MUxYvok3q0LLvfxi zR*07>(N5Dx;(#a@LaU*jrbb#*t*e%Tv*8Fc5Eg4&v|acl=f>hKy$z5x!C0H?Mbt-sJUud z(d)v!K@{B(?scAW&J=}f?x#H$Ke;=Z8D{P;Iw;&(o^o~;3C%slbFta|8_rPi%r}bO z5%PYEmI(Lbp!Gx>FSuX8nY`m)ii(6g-6YTYzG$6rj}t|kg?pqY ze$mW2>qB>QkmW;sQ?)Mh<)VAc!dH0<|D4??aDld?@Q-nZ`^h|9^ccH!v+!Aa-4i^i z3yM~;8#1*@{h@n+NuK2?TyyXDq+3-qmDMBa$L@I0)FUd&V0V~#G3)0d7rQ%h(Z}o# z^u+IT55}2%ggc8~X7}x$l$+hdJ>)lv7OO(t1*GmN^J39Oaz~i4vrf5x0T~tH!K@|s zD3Hwuv)q%qps0Y{x#mU2hwiGLd}uqKPp0O68BwzKRYg$l@bkJK@npPMBSa!N5n>Q}Bg7%ZBP1duA*3LrBBUV< zLKuuN1YsD$2!v4xV-Ut7Jb*ABVFJP=gvkg~5z-N6AUukYfsl!ig)j#p8(}^|4niKn zLWD&KOAwYKEJIk1uma&3gjER7BdkVv5n&y|%LwZcHXyu)@CL$0gtrmiMR*@!6T)VM zj}SgV*ov?np#WhA!Y+i*5xzj!gRmE2Kf>1t-y$4B_#WX0gr5+OA{+#Roo$7qC2g`iWXQ|qGGeVfye_Srn`OjKdDtf}f02jtG8WcQ z+m0Hz+)*E~J6g)icJfRXze5(k1I24QP`tKdqCB8@`;PfC;&FNQygYkVp1mjYZkLBI zB<(wSI3XiW%fn?{?v!TNopq38XKQ&DBx$|mWvo0KgmgP$kG1c7SjJ|`Lyo+BO2)n* z&t8^?jq-AvJllhVbM<=+CEGK6&kS^zp~qqb%-ZLU^K|6GGeh0WJpFi!yR%8nc+2ee zn)^#nvggkPyLJTR2fFGK1suG3+Eo;A{_5}Ap+FZ#S4sY##%&AOY34hCeCGnrAYVzK z3j+-K{wyv(V27D+AM%|KC_=vCKo^>ie18_VGhmyU?_1E z5*UKp%e2kiW1R6(=QFjrdvx{4BvnW%>X%f^6mp8N&)$s>+nPH9(Ncp4oSd|STXwbS+OefjrY%THdljtVsV z_yy>GwgTDx3R=j+J@|PGI?F?-yzGl^P%uOu#>sS#%ELSvfi7+@SR>QDEe{{dBrfN>jU@8^?{H7{`x>S!ur66OKL;Fs@69xA|WmzDJ3B~DQqAbm7)yt z|6S;TGRRAafoI{~T4b+J2^Pt+k+-8@Wh3uKwdDPqHgfemq>cRJWg~G~D^ho( zHn6X^g?;^QEWHOp0&RyS_m1?OGUVITGNZW!>I>Obk4y}U^Ti5i)f{!1tS)`2#KZ~Q z^qkG5z}r{%l*SRY6i9L@&=qe#ac5z=Z$YL}y5;GrEb1O+;)`L|hae5dQ;R zTcUKDC?t)e0!edAH@}1WSlv7xxFe~5&7_kS$pVoqq+$zkB3GLGrzFOvMa9X)Ptyuh zFAEJtj5SgY(i$~V4$;(#k)nQSIZ`$)>jMZt0G>))jFdp=QTI?)^zZ5z88tC7Zo|l^ zgHcfrqu~yWh9(#ZcVZ+o!$@d>)uz^fm9)W#Xp0dMh*hWd0HSoj%2Ow-Jaxg!Q#Y(U zbqCy}C&eOFZ=~phm^e`Tf)bCj1RN9b=?ADv5+EwcGyq_gfjGMtdfpIRNodLlP(}f? zGKK~NjB+2ezaapl3PXMIyG*UkUfXZ{o@gj1p13=|p$n`4p$&G-pyiIce4ao*9WFBB3^PyEP0Q4i5 zcA%us08;q^rR@PwWgkE)`vFq<2H=!~)Y6&}Fq1YBcGxndHPN0F78%<=S)w9Fm^g=l z5fTxx%)Cg$g)cp6W{r%BO9}H4W#wO5paHYnnlnYg>L0u_g=m~QpaWK_jZGQ_>nsag1Wp=qb=HHf9j+tpiR9XG^$S6bN9tuvA2n_QlcOQHq%}?%db&ZIw z9tuta$>l7Yw>6`hYv;bB`;OkN(_PN81lJCEVZ$1vv&?zs2_O?pV1hx~5MRw{vh$1% zimT6RtJru(3-vXtvAL+fTY>_#Ls-S%BzXVNYPH^JcC-l`^4&=BkB1*;{$eMPd` zH^4m$AOhM8KEm?*uQ$(ha<=pG&!p~ub-tS{=exK6{(N^(;sF~jtVz}7Iyq2+7TB-Z zO-tRLmG0QSVbM_mOmC{`2TR>cATTk2g3(ba(q@tr6&;%pe+;6QH9uJifOV-zu$t&@ zZvsD*;9aB-(ur27C?ASha#K`$JSH^_9J@7YV0%II{2%5T7z7b)r8lZ3>XMij*_7~v zv>c|rDo);sr!vo-j3vPT94IgPKT*Q^QJns5)%5|!o{J!qy0V1H}Ij);kh=u=?? z>&*36_#iWiSu25Qr*^Wn>!+i?}k7g@!7+*UUDVqpb|GtqL|J3(Dq)toB*= zkj+;ulGWt-z$(hy%He#o$@0VlYrLh&&vK#F0$E^1lV4|t)qT?EUO3kgZZ=oi)sx9 z)D|qN9avOHFrr`&i|PRu6$XYB1@;sRrW6PElnBO@f@2z3)4gC#Lvb}6Y-t48%vdm^ z@nAI*z<4GC_c#qKB^~VKF|d=F_+){d%mq7{kFy0}CwX8ekAt!ZSjQ*8MwWqvJO#>1 zP@Vw;S`Dn?%V0vU;PV=-2Qu+rU_l$`JuswAplksG@)IB+KSj)TFsMR$3kbxw!HV7m zD|(N<0vd837}f!#{u-$d0mJw`FpP&mJq8AK3e+Mnsb7J7EC!>xgcMhSfV_?rzr$3@ zz#!UzL97A{q7NShhVd9oqsM_=JOOaX&(r`o#5;gPyp!F)FBSp6$Q%Hy;N8Fq2C<+wOPv8YZffo$t>Kw^6*vU1yH`n3>zK#3A?3&DVIECwSD&Nj& zT#pCw9q9Lsc{n%Wk?hZ-VVJ$2oANkr#t(9Heu!K0WNyXNxivq+ckyG~2H3>_U>Dm0 zw|FY2Zk|$pWsB`82j;4oWxI~=4ZJ-uSV@J@&I0k z7QDm*`4zO{UwkjW%EK5Pm*3_Q{4QGaK9Ax}XwhaK!yoZj7=p*~4t{`lp=F=*c;1cH zeaRE}E1t;vcq$*@Y5X->`VG(EZ~0@z%avg~IVCKmf3lPfG*dRP0Fri^VoCrWfTV$m zMF|gomH<=MNd|z@hrW|o?UM}rq%R$+oY5CmJzS||UnE{{CLZW3s?z~aMqg12^SN5I z^@6_4Mcee7r~}(esz7URN*g4pI%=v+9jK^wptaSUg>pUfe3~l6zWj(G$_I`iO>Ta1-a3 zajPNyd*W^q8)V!u+G0MP$^wU6Jqf@Xs9Kt-;NFs)!^>80XSC6yc`EU7jUTxh*CJQ- z+T^NRm$G0jn_6Ry0iq9xK%dsFj=73*8w<*I0=w}5`6%@EyUhJ-1 zYKN_B4O)v5oJP!A6ymhUtgVi@iV~~4v&vOI{ibHPoW5((5~t5vw8d#?PT!cdXpz$n z2{UGGT|yPzd72H`!^%5sRRtKH0_+0zgkduC zXq-rU_(TM0`+hBo0Hh z(*cFW=AZw^?Ln4E?2L_zgCN}k3q?|tk<#)%DehK<(0+?WqAJ~|gsfWB&6Eq}$t`JW zo2J53ji{ZOMxNY~rV(s_8x@uAU<%&%} z5o%F<3r)9Dn7e|$qW)IBmfUz2qPV9imfU!Wrm3cs1C?VL4$Y1v<;G8!xnK^FTcaAo zSkr`bNRDkrJz=tlfXTuM$ubrui#V7p z5@51Of`pk02{R3bjzQRKb1&fJ!ys*rhO{{ra_0k(JIBM6F#-E+CPDg4hx|DM^5>(F zKW9Sz%!K?o7bc7xNTPtzLgLJU!6FyCY4SWW=t9V!kHZYI2s>vMLlRwr-7?D{i#`Pj zbUCEYry+H&fV8<1(&jUeG@pf(xe7aFo`;nA0wm1UFpaFi&X^a~ew)uA!|p~2Um*8a zkYD$sgs&mLehc~aJCt-7^6L+fUyq^0pHbpTdIxgp2LLZ`qVq7eT!h?u38nr9Y4;jE zYZ^!r5~X$ZDN~41R_Z1&rL3qd<^1sm6H7d*PTzRNBR~3DbqVh#k0vm-6w0oE4I))tcNrl6Mpv8eYYQh7I{SRkZJqU(a`4 z&1;^cJC9$>&ugVfCHaaE8_KRc#1H#Jfo@0;T+%NbKDw@NJ9 zy68~pPUrQiw9{FFtt3u+cWrv3?liUD-lOu9cXXpBcUB-tBblTY<&7!BevsQe`$6P7 z7dDr;j^sIw^3?0msPIH{#K~PHAi0j9`T?#R<*6lz3DjV->OHM^sFvxQH>R}GwvtZ@07yliDtg?K41;&+czveQjkCF zbLO1im2NY;eP}2|SCvOvC?c^RRSBnxtO}LnLEs4WFet0Tm>rdp8kQ6r79JOsETbL- zZ}8*@#}=>1WOKvi8W>bPlYQT?*m#+;7);|9R^$sD-z_Ym2e(lyA)0lwrSjyKY<;+q zN;3glIMp(hJn`&=Rkxye(iG0SiKw7sGdSBE*P)?mx0!6%EPm?N8uCyee)3bxfKF63 z$dg-I@hpF#(yZfGWRYssYmDlJl6k$gY$S{xFC3{c!9LW|9gM zMjDRyf|(446@3^!!<9i}6qwK$uob!8^Fc76iC`_0a5h!3mq}nG55tTx85Z#=U>{Rq z{hkJPkq%?Vbg&D{p8hCULl)S^6KzqP|_JRR@4F+@w4CqHNpd+Z|7+BT`Friam zLZ`umeg)GhMva$XK)HfiuYm!TqULfiAi=M}xbZp}{0590?_l@KyV#)l9yVvb597uM z)Q~^K&X>*PkDVRO`6F!1{1_WEKf%tIPqE`=8+G9A)P?hb4%+@`G0K-Q^7(E)n=y3=1y2jYN=@0bUo$P`EWg!eGkHdhnh+DuA(vp|Jh_Vz$ zlqX>*Sq4MN)7*tuz;v^cyYe#}0>emmZ1U^@)LTz%^z6kiz>Kq+!*~r$IcwS6?qmxO zkLw>L`Er5Dhr^?jqN2bd4TxoG-7`EXDpIoL8fN?e&oZemIn`)z41n&OloA^WlSOri zkg}&6NTj9>xeIicX*5Z7CVD1CX`yIn<_(vNs&b;dQ_%0q{&&(5F4tW>wCnTD%;9nc zIW``<{F{ohYppz)B{3PhKAVctYxh@5s9M-mT))=9(_}TUeMHH%$22!f!Sw$?5P79+jq_{xyE4cel4hcs_~X_z?}<H8+EMQO zE7wAE=3l?IV}9v1-Z8)I8uC={K|EP2dY7P?<22oG6U+?G>bXu|nX70O1OQ*xwtYvn zT?_Xv+WPn>^t+Tiib2>>m|jaOF12=IUUm90P4#!7k{lE*>nKMSY-P1FVWaCh%FFc0 zI@K$0h>>-oS6;e3>twIII37G1ga`1|xb@?3Y{MafCHxGrlPf~b;f?jAJg zUa`FNTG^uO*QR|{rOD7Crk-Eg-{pR-&CV;QuUr#5H@wy+U!CRSY==7Av7zs@BlqR! z9o_uBc6Pln?FJ50Zydku+P!&~mRE2ty!85O=j7*j$&LKYJGFD+;iYFc$j|YTe1}Ka zF!kH$i0Hp4U)(?Pe~Ir1koxVeC2HZuTxOCG4=6W@l8gM8^-YUknRg}m)yK>FpsPdt zgQ8_ASyi#JTpj9C4X8_gP`GMB;i?UVs}2;d+o3)+fcd^5a2R($`SOPBYE z&=01FA1)1^7tQl%Y3wXA&y%FF^LtZ=P&0xLrjre(98vLXWjbr+w=4^9&}Jo^ZKkF2Cse}O{pu%`o&AGlx5Kh%jk7*D%GIlQh<*tW_!1%T^#g<=31VL|AQV#c8vxNS4T9f5*d8hX z6%PSWF%i~@$%vT>p>R6H!Wl^M7=*%1h=y4Z4Cg{H%!XjN0D@r-1Val{u^2g*L0o(a zLgLdXVFiT5l_=#|2#L=_NL-E5*1}5hGVBunLW!@T#5Z7_*oac!#bEv0>m14jh3b=X zbZ;|xx%!nV`Hhe(5>*vQ#_|wxrQH0bedX_5q1<0CUv5eWl^jJ}gog=Li^rKnarw)Y z<_uM}IcMCn`V;S*;b$t_zA#_ITY)RpZYtYLplsVY-Q%F)l7usA#qf5Z?Cx17w45Oq zZ*rLMDI6x;YdTCwNSJvUz7C3|uY*NSzq~OQmB)i#uFUF|mjgTe7Niby_-lsR?H6Sfymk6on_Iusa6={tue0KU=#;H zZEK4$d^g5!Ae6UzFlO6f%(lk}4ua~|5o5Iz#%gDb(=HgN-7ro=Fg_bs>aPD2P@7NSE`|hQHq*u!CIV^OgETYE)7(?8bPuFZ~1k!7GHQ`;yblhGkXpTLbTn zUsR)xl^(mNrRHNFyV{VCeN$`R{px=lZ!vLyb^af#P^bTk`9EGh-5xTfj{=n zSBoGBOSR`8a55v8%_=W<^#XeR7XHu|whhT2;>}e6B|VxC%;XRE;>KEHy{Q!jVQUP) zyD<3LVBocd@^m)_T_9ra0ks{@y5iUkTp|QRvO9)k4^VpIsu#|}ag2b}7>Q35?JL?>ls|G+T`Iu7ATDTurGT~wT@a#ExLf6JZO#|5DSvgo z7&rBQIbST7{rSEnaBs=>zG*2@NqwIr=oKE_+@iqT(gI z(*rBL$^T?mf*S={022Hc7nv1H>H!;I<=&qT=*ca;KL-+r?EO!|7p66BnUB|;wx;6| zwM6f2g}!?iw4OH5aRQ*(1VX>L2O5nf8FhqYR3R0Of-W@%BVio+{&0~=obO+K`6_m}M_H_dfk-y~qDUyX}8 zxz5r>L#{7u90D6)>DsPX{wtF!gk>H{ZFh&QyL+svM!P~V&K^U+GTgq(V-2jwqd&yO zb^VL{dA#BuZ~lG$+)s|T7yr!XnY9)dmk<^iCtZR@C8NRf)X4b<_=Xhb6rfHmf>{=c zCN#jZX(R!1o?_9%O|bT$hU;7*9tp6T9YpZ zRW%GMKMbmxU@3LLQf|lKYM|u1Ah4JYU@;w$vlDW4My@VM9gLJ+k*XU~g+K!A4wlmc zsd^#>I2@QvHw?5M7_z-E(84j$A~AHGU^&r>@$|;9>w|&Z7sF2O0r}aopI3VNk~t8? zuI?|t8mG!dV59uJTnOG|BjuxT(V*9?>pK`mp18!IG_|h#A^lW|q-xmi!I9Wu77QAwQthVQ6{!ZQRA0j= zRZ-SJx%B%Z%!3xGy;=NmdcP7$Wjs@{uOP9#S^Q;MTan5v{`X2vZJ(x!xAQp5iYWoA z*4z*PKR=%3Y7-kPo6;E$cPbNA&C$HBasg@W(-b+Cjml}wCQaq(HxX6Jc|5vu0R!8c zZC!%3YmbH2+#ld^w)`3=TeoGwwl>3mkY|D4**`8$Hdr=yD`zSpVLRuVzmz=jJWA_6 zf2tr^mX|C1u*!CoQ_O7gaE!ko!NLIEHLRZ;Fic@Ab zd2&m(SrsHJ+e-1J%Jz)d=>4_?q48>7k#qR#%bMxLJuz?hf_@&3xjF*+c_ilQD9qJP zr~}dDk6E<^=G9i1SzBXnZ3BU(EoRq1h)eBY1P+1`xD!OCZZIfyhe4?)jKHBVDuqMn ziG$0cHaSP}w!~ z0vMEYu>S9Y5qTlj_#X$VU=dISi?P1H6zls>Vr_pJKxOLzAp4ivCh-Bx${%{RNo@6O zlh_HE*=N8U>_)1+Fg5Q-%CE6i;yd6Eq}%5o0c1N0(dIZ{XB94=KLwItE1+oG;3Z}| zkOcX3g9@-sq7X=e9q<~n6KI0Z$ibfjNw6D!G`|3n;7h6lx6kl;2tS(pfF{_Ftr7>Y zRpM)GmH38Q!`*WLe@A!o_jC{3KDUS4=MLCv(HUDUf`QwX?w)&Mt3@b~1yR^$5e-y9 zEKmh~fGS7;s-Pbb1*t$341~Mq!9WxY0is|S5Cx-wD7YVpf^k3;OaP)_5)cKGfh3p; zBtbfm1T%mn$bhToOt^ZU3m4DxSOYRZ2P(i06hIXq01UWwc3}122P^+ovC{90RsL#N z<*&}`fjrm%)WK`mvhgO62X6s+@D7j%?*VnN8K{GgfI9dDsDn>|IM@or!8V`_wgY8Q z0F=QFpbT~aWw0A4gD2)=<0CBJhNlW?*Sfa{1Dt|DUD zNA%`uq7T;)aa>Ep^KBx5>xe|IEBbLgk;Dx}GB*|}>@WIrQ<2Io!~kw7()cbhhy%n> zZYzdypcu~W#0U-&Be|0p#a+Z`?kdJ`cX2=W6k|C|jN?f007r}Q93vj$-eLmBiHY1- zOyUIbF!vLaIYmt2{$eVpiD^7Yr1O1ZIu8?%@CcE~BgHHpEwcE2F`LJUIXqs>v52$9VxBLSaIScQ7mB64NIc0)#4>(T zJOv+~%i+6o1+NrO{3qC?G`_v=*?}4)u^BIUcA(=;jX(0+;!jWwNFGQg$j7j$_ zf=anXijnWY0id!og061G0$Fb7ji%&@2y?fM6?2tCO-5v8Nl26>wH3#_HJBMp`baU+ zoa+0g$x5ZJW>D|d&kM+|+tGR3ijhLuy=!6bE^rpEAr=_(NeRZBORfvc19r@`FSxMa z`>TiKhFNz+jIgLQQ~1KU2Tn4DuK~B*GGR|eMnar`Ynf`UTN)L1X3-c^Zkb;9MV znOC$!8x3>6anwdM3Uy_4588Src)jk)jV%`-o~f#Gnip3mT)CPFKU*8k=4Mpgh~}b- zSt4kwYT~qNK1b2ahs&jB5xH%{RdV&nzGJ!Z*Im2z9nE!?Y!vV}4nzu`dRR`Q*r~Ve zEtvZ)o!2t2XB2Dcmjg0O&baek*N_RRuS+ltG9f*3DHr8tCZv=(E}5A^jlg(4xg^Jov<~LiF1NH`89TQ`Lj)09E1#o1-1qt%-fLsWK!xFjwTDdy6 zNpC26!9lqv`xi+&C--Sz1+5T_(OxJ4xrGt(02eE^LZEVOg(GFec$ox#R`kNz@~}YC z7RkeNGV#kucV4Msrv8w0aFpRlMyb47Qv=XMD=$|Jhq# zK6gMX^Z%1w-V3o2q;DELF_`Fx!3u8Cpqph&z@mnHjf_N`t#{DVQoK7RH%5Ehu0Vme zqH`TUq*&3OE!7GAVTA}w`of@{-YAa&(34Xk;$M{-(JfgK@5Bpg>KWL8cS{sXm6i5& zV7<^2^RH|JahuV>T zs;}dUS)x3-MXFD8RIx}_LoyxazUo}ZX0JuY?4?qgU$-m-rtVOxXM|B>BZ8V3PHJvM zQ!68e?lSsNfB{ESMqg@g#8U?&kvbXusEdIYx){k6V&H`?243i5q>|GZK)sDLiZcdM zf-#7a40z5k0P-;Iqrt`y8e$Bk;l?l;Wele=#t0f`jG+gO`)PtPmL4|7(NyCBN;e*) zM~v~5VLU{c#sr#UOr-h7B+4-!CYLdpo-n4+lg3n9ZcL+q-Q96QLz zv6FlqpHVf(=TyV7n`$~Bi97aC9miKx&#{;4JN8in$9`($I6(f6Z>gyR9y%O&@rvU+ zYVG)*0vv}a&;d!@@goI0exe?ZqZHPrcHGHJ9L@PDM+;uzXvxnyTJiIayLgSG4ZrB<#_Js+{Dz|^Z*=tHcO9Ypfg_AR zbcFNAjtJiBh~n)ICl@%H-7JLt(f(nD!6f0LT*g{$pp+n zAT#K&c@AmK#|xg5ZY=x-m3?eVg&tgQ+3y?8w8;{Hcg$PHA8t*yBtAQK04oE#B@-HW z|5gP78wwmnF%W*;+2EZcMwWI5jQHOnyePwTDL) zhhG5HT1FQy)pPft);3~qrVf;8>l#jr>Y3A}Xj#u_Z>=L#<^(e8RilcP!NWf!^$R1f z5>?LslG+z@lxMTErx?kpWK6E(AuFa550f$L9fMZ8HAuDAU*_zWX1}y@c4lVz;qt?$ z$}`88m6c@#`;lL8hUeQar7Xp-OkS5|_?1z;?wOh0>rwfs{MobfPnA>mG2!83x>I@n z%8x%@nO|N-v(3oP&YqDmXU?1qzhJ*c`1tv?YuB@B&!$aVjv2OcQ1?@(x(`}Oe(fd| zPip5!SzC`5AKjYe7o6hfmlEt3BmZD%&Rn{5a;;jmsC(0T&70SY?5^6|vnR=9NLPji z$}=K$iEl$M(_!Q!|Io5ff0;TfE2|V=&BM#Xo6Bo?2l89pmON2^$c|Ewzqv|;uS|U4 zLM$aQxHj5DBGT~l52xVB;9<*hrjoyZsF}|{G&Iy7jKm-LC9QeA%zCm2KfeswEcJ&N ze9KmN{t%&~xX>)h*pavN#T^-V46*^iG$UKDHw+ENcd(v4gBmrD%r4WbQ)yO-F0W@~ zXO-ZwQmHNr@W*ww{FmPuI=)eHML@l>7JonaKu|sY<%Mh~$~WZwX3W|A@+Vo?bC{i7 zire`1#etwag~d zU{6^E;SI(Z5R3piCn(CX+IkEGb>Gb3J*GOWAjzOV;awXcz8|1L<93$ryl06I) zP%wHQy0w~)vtweupc%TAe*Ds9&AXG;iV_MfUf}7(H z*WLB*{;IQ5cl?3i{WGvMA^+sJp?(^9?ZJ8~oHI7-%-cFG6wv4%Op`^2tyT>! z8EfsvLR6KvKo~(kuk|t3);98<){LMlxpjSwtH;+?mlSvsscW3+x~aSz@4=gU!*6;Z z@YQp#`%iC~+t|mDDP8%tDzwinKPr=SB4WoY^L*DD$bFNmkj9=S8EgIIJN4GqvJxm~ zB(u*7IN5_ck;2Y)1NO9_pJ8~bZfM1xEln`b)%7z1*Z3N_^UHpRt+YO;%}Ces z8aeZ}?>jMBr##&VEbr_i55DqH%c$x_AV`-XsI71u z!UTjVDLijF>`sO2Z~;Fdg}afna34+%BAiA*DH+z9y=gB>4Da<9?M0K6|B&}`YX05* zHh7K7Wd7_|Lu-{}d)s>2-wvH=z&<{RobdD?Lm2R5kZj zE%EG;l3p4T6XFKmOW1h!&sf%)k+iItFNSUofwF;*dYkd_Q1nXt^l3h!0^eEi8#Y7Q zt4=hrrz9rC#;54y4~UKIFvmlY05&-+1(|6DykGgrcO{*;)0QH;xk@|NG=)i!Qe`Yg z6`EvSr%JnBUFvSWW+^l@B`91{?u4T%53C6k%jOmc9JqQt6y7Zzq%3|tuzAaq4iqaL zb~oK>XB!BFAs+Urd+CDNCV8UPdO}0{#>V#zOS3XBB)etsQz!()rpYEf1xrL_bON#{ z`b!m9D=WQ%S!{&+m|M~-`W6bkiEcp}^5M|I1GPx@-ibf2vhFxJMcEkx`8jVg?}Hi4 zlfB8pRk8=*(5n(~BTf-Fa?DLc1;+T8yHzHpsOSF+U-vc=*ouMH!#TqjDknBE9yP^x zHzl^v7;QxUO?1oV*-pG_nQ7&!oKj$J;5|D1mK)R(sGw2TlMJjM{X+TiO?KgvfaJv@> zx4}TT-G|zSpr#S1X(VbIg_=fFIM5Q29%nu=Kug2|DG>*JgyqmD1whnP=pqAvlNbo3 z#2{>#yB8bghQp`9Xl$4p3%tXF*f2MV)*;19z)-vl%)~2{1+>FF;2!dTbXW+a!(wcr zdlKk|r+{vF8t4Y;o@W)%4KD!Q@FK7fF9F@K9_WS*^bt~T#df=GNVy#;@@W&$3|rvM z_!D?q*b00^K3w(`(3ha@0re|T_tGw4B|eAK$S>(zASVvua|li)zk~mU@8P`XFr4@N zfH#l+h&Sr|1iuSMAa@=GQsNkX)#GFXnxP7OB>2KdLJdAewSZ!{9ljA70LgF%Pz?S+ zF*E~;p#@M3ErDWa1r)~5dJPI^J2G9(dKr_sS4~1+X8WsT2kOxPUj|0`P7^sG&Ks7uCRKp6O z8lC~F;RT=?)&SM87N~}ofNFRJsD=$dHM{{-!$zPQ-Uh1SU7#911gc>R5Dj=wB9Icn zKu2`toj^2v4&Mr2!MDPG_*OUwWW#qrHv9l&!!aNmPH-%c5WV>n?$8YfmS=F6XW_u| z92{6)z};Sg1IsJ8;~Sg;6hwb6$DK1!44N3ob|4uHaW9Y%cnab^t`1Z~O`sa;0@Y9t zsD=hWH8cXMp)pVm{y;P|1)`xj5DhJXXlM;YLmMC(0)b#?2LwYWAQ*yyUvv@P<^Zbl>fmeyuyjpl)^o?!pa;cz-&WI zLR@4N8g-?7mWSYZ6Z+-y`D!+=0@efX7byK=dDF@ilw4fi*~|nsq&#GtD}U6qwtFxb zXUjh`ui-xqelEr7^6$LY62Rdu_iS~S@j!Q+EdQY*KB&1k4wqMQb-=^=n^ftp9+b)4 z@2s*$-Iw%PC2!5d;MTBg=$44n2m}3IdTsRv0ddmh8&G2w!`D=#a19j!`Lk+d+~vxL zU&XmQ_1I}w&jhc$dco!Hu=VPNCpS};N!JeCRv0_&(wRnA5B))Gz=4J`_CC{pRb#cK zHr{XUH4R9KHliTYw=mt<={#LNYp3%hW$kpj<=Jt{>af41>yCXV_MOmva#aa&o}TH* zb)L>my_lO?9O68gY0q_@%uPM#iWVVG_e?F<=?-xo&&2of=^nYvynII^9(;+`-W_v`B`r5fW0A~Pv5pvFE2l{ zMLiu?dTCz#Y46+I%l1t;jenOuZ|jV1C;~YvxyRT?U6)4x* z^%K?9mpY)w>~)sSO+8I$V|jeZw6`jBYF|oQbuSg{1^A%gN8k<$E=b@)nVqW?Vvmq0 ztY>FK!WE3dCGr4Nf?oK6#3y_yW51C&2KW%GQg{uA9kp?}qXX2^9rpsgutUCCXqQK& z^5|31e|10VB=!E1|HXdP6&m!ZwEu7DQyz3gbVC26u>O%!rMidzF|fk_Ql;wk?g>NHuNN|4j92fPID@mCB=f zwV)3ym8z2J6@+Ein^mtcFvovay%MRnx#XyPwW$@(*m!4x6y)y%bVaV*>TuYp)IRB@ z&4ZALhzm-RX{J*>OW2nrOEt(Q&pR=ZH7Q8F%47vy^`->LO8E+Wad^tK)Qu0#_bHs( zLQj~_M4oumQPqw;SWNQVo2MBE$>XXS&PFR*aS6(%C!MDeg7;a^pi&$BJ#g}S;1SMF zp}(*^`9ocE7`OLoNYd}WrE8AkWjE73y5=K1=Vp3rywWMN+4BlbJRem~me??iCAM_Uw%XR4=+=)Pq^-BQNo8GgfOe=d z*-|QJYOmkgdlqWnDZ{}EO_{MwrPBKvsg28a+lb`?LMW8VFesJbP%7cD5O8|~N~8l| zd06J0nZ-><#IT-QH=yVe-z;Pqdhwp@5fTwSSXj{pj?X)LupT;wB;!2X{;Bl09bz|N_qw*twJf!0igf90_QKre!?dJ(0>wY z=Q1d+%b~2Ufa>`Sp!v^2{d^8i_+Eh0x&~_KS}3jS0Ly;`itDRTN8g0v`Zg5TccGTP z55@HZD6JntHQfxQbPJTyPoREogHoCgrL+)g=uW)j;4>(td!Ur=gGzb;O6k{7O2367 zdJu}JR8J2>5&aR0=n(+>kHJmg38<^T;ByKpYY~oT$PJ~n2oV1>P+ZT#Vc@S&UeDoe z2=?E`T7_aL19 zO@zb0Nl9axU zs{*CZ2QYSDD1OzU`1wKcs|Cfc4ivxJ#VW2Zo&$vcdAJ)_um6_|9vR2A3%xS z1SR%EP8OR1+us5u_9MXdKjy*W6CNTyg)+Mpu>Ea3Mr;RUKOd0&0-h*#@x$UXo+>_v zBD))k>=#gEzl0LI2TJT$JWuT91!5nR*!_U&AAkb;4Iuj8@^WzyO6(ziPJG8Nh{L=_ z{J?9)kGx*|#IK4Y{DwHe?}(rIeenx#5hwX$af-JJHy4T`-YL%UXW~5X7RCI9xX53L zOT1TH=KbO~{zhEkgW@WGFG~1`xW>oCbv_|(@Gs(bJ|)Wdv?%AZg2Xw&qF4xVQE1{f zp^Fk>6W4`Zl!_{NIk6#F^AWmMRX8+XQB|uZs%h0l4XuW#sriZ9v|6H$cAL0et1aql zbwoq0uDC-Ccv@T+t z7A(eVUBv{gn|N3Y5mU78B3g)=)lU~KORbZZ6JC7f9rvIR{t~WfwGpv zqF`BnrBz`IwXhbbDhc}1uy79_TfIsm%q+vgfPRTde_&iN{)2JB_*3J8;V~}Un>KJL zwE9{Z?ek7-gjFI+%-x9+ubc_L*&vYC@hzWU>ecNVy9gm0{e$2 z>D5F3A+fB`o7i=B?pcqqq_$}+iGi`i5B`<@?;1;@!*4N`9II?B`P#IFd|BC8vbD0Y z>h$14?+9z8PWEFu#5No6^P{Ssu2ys{1Drx`=SVVbBg(?;*3P@5w zL8at<|1;;@O{50jgZDm9Jh|u2%$alUnVJ9m|Nq~AIgj$>(7#ol+^&@;QCSmjn!7bh zlqViXd6I_mq|rj3$5x*7VV1W`ia34r^tTohDA02I^d@LT8lp?tWOON$uV99?OLCn) zB28UKS83JC@(Za}QX&ctblto#g?>@8H03Gi^2!h;i}p<^!>HnmzW?&8QldnaLU0Es zAXg35a@nn_l!VOg(sJ?MXe57Di^k+R(U@!zWy$-ZEcsG&C&$pIY$gA0)YiM?&rI5F zeVle%Y3$niny6CV7NrVWnaFLCeBIU^&5Gn~b{7Y5YWQ&dpRHd>>s492Uk78{aPfHm zB8k_2>;G7MO~->|jZzyf6L$Qg@ikEvJF=4_jMpHJNtiI+5LDEbp|g^bMC89pJ*Ne% z7OJ(8mgU60%IT!mt}b<~^a?gH^9t4Pz4oP>3hMy{u@ClX{h^odBLp*tEw zYE>=2%Sl*A;|RhO*3sSScvwf%RF3XwzS?3sl9RBG=3@zO7v&B%UhGRSst@b?cWSrp z=@G)e=tq*1u$~?<*%lA4QEN>bIk6FF9c;;Yo2S%w3mT$`si|Xz1V^}(@wn3Z(tnji zGj*;a)_M3HZ?NK=B4=1;Tc7I(U1Ys3tH_AU{t%}diXO+Gr8%Ooi5^!2A-5)e=(Q1a z>kwh2KEm#mAgK)zc&{SDh!exN8PP>rfU34a@NEsU+Lq`d9T0#!gRXV~%auS@-4TR) zAPD!uT(UR9a34hS>kx?hB9bQ{6el8zCnFF`WRWz4;=%lr?6TJ*80T=73;LRefINhf zVU!G~WCWslKBDb}Rz(IBI@L&7BC$l3#WLEhZu~PodRs5S;I(9n4S06mK<<|0JTg4?o)`vPa_IH14g?6F?b_la0y85a|p)I zBL=^K82ln4@Jk57_|zasA3~7+oGZTo13p4xm9OZbj5LD(M5q?;_S5wCEy(X#gzJCN z>p6N=c(xPQ5Da%G8161a-uF~2UhOsTYLCOKy$)XO^{fxomDWeZ&fg1`yALdPziL5j zi`LdBV7Ldsa6eOBt-q^o;J`htLwLCVLtO_J+z%{x0N(A1c(XC zli2y?>IQJ(JaFM5;KIYfg>M8GmU#K25XEms6u%Wwd>o?qctr6#5XFCmD1IlR_+5zN zlMuzHB8pE(6rYJ0J{vK7E@Jq6>u{+5i}o_HJv#sjgHz;*v&++d2bLK1k>3fXy86%v z0d~yU8tM%r1pKU+v)Z}ZjxT$nLR&YGizYcCN%z_mH1KgFnMf@Al&q$BK93HUJ({|X zRdh6{9f6`GRfaM1YUW4s9G~VGOk*@{ffpx3hp^!-R6j%8D9Xx_l4NL`(`cwE8pC_g zHYYUlRZ>%7n9?SdzrDUy(<+?14}N|0V4y+O;096W zY0xFOL1%x10#6^jkim@T5`?n+?E+6LWq&zkFvr>^jBj;`FHbs~yeKR*0Uuu{jBgYX z?={y{Xa}ZSID;_0sP1P;7~k@cFut!7#&@_0%Ey<&{=h9so< zlG1WnGQ)5g6QjHaeT>hpjyuZaBvw`~nHB9S6AOL7FkdoB9dg87pU`ts7d>c64D+=L z9=!@s9j^t3UF~Q$<5~C@;^`92Im6RL?E3XEOV1Eqi~h$Ie-w{k4%D z5V9o-@4rLyx$$F$X%aem=3xu&+LE7fH4sc|;1?6QE{+*qn;9;Vi5mi@G-jqZXYRLT zwzp-rw`aC@WZrjS#&=`x_k@e=1s8c8yk$Rl%OuVQayAIQG97MGvL{K-q&)sfxcq#$ z#!+yMW8e`b2GSkyh<8$Y7d+w=c*LpH&VWCh1%EgX{;+_Si)pz8-tZxK!=>W{5Mn?JzDN!)WE^S29k&$V}5XD*mUTO(*Q)>A}^ z^VEvs=L2iGaUSavhXe`dF};uem>JLRWI}1Q(H}FL5nFFe6#I@u2{A?@CJ>1ULsH=B zddT=6_!GJ26|xcOKCd->cE=aNn3c5CA2VC%el#7id&!K}@l34u4@oc+oGuo49KVJL zHDcLysJMPgwobx$Z-w(Q|SQNu0~7kc&VKvwbP|`uGB7|_Dw@<41LK- z=vztpa@Q!acYpEX_p5qBU-mokp>wi^IJ=S}ED!Vk67Mpy@|{)dtTyu-#iI7bB0Q!n zp$1p6+8VLrGzREw!miU4pwo+F*VQngf!`t1(@toVF*HzYCgQJ)8wO_FrakVGS_NYw z2sa}egG(g^?F07sWOu6U_-IP8=Hka^s*KOwPW;@QEOK=_8Toh({`ec0oUlqpzNi3U z)!y3JE)c8Pm!%^xi)7!LOp|tvF7stc1F6aRA)&ofeX9xWRPulOhu%+U*Jwg3n?MV& z?p6%@)eJj6n2^$15Zbzs(|Qov`jAv7{CiUvjDR5Dlh(ax-J6zuXmt&w_*#hXb&%q| zkYNcA+Mk*PY6eh~NKF!@$&{v0l1j-yN+dqD5#}=>%b5uC+5F2vi1+a~4TtGbbr)aop}Q{j8_Hcw2O z-qyX@{a(9|-6!)3x1U_S7(wG)R(@vTj(?q8UAM_15?V>f`|W2>u0GmGTAu#6-N({U zN_RL-q`=Y3MyZd277_y}|C#lan^4(!?GrS;`x)`t$)W4E{?p0V5yFR)Wa%B5#;E@nLbZ0O@0273vpLaQM5jlGuWSW#1bL_=bPr?D0yhtUuNSoiFTX z_+zz@@!I9^lthEj*eEl|A6n>=lRm>!`o~TGLK(N`imqYYgabWa?yy#j-PMpPlRM0j zizIK@Rhl&QB-t$t>^?q<~sZ{E#{cZ!_mgRvkKu_xWCFqg?m*j>`ChE9=l z*)620mCHt>+tfc-PQor5ZMmHy=dx**PBCzJy0yz(CMRK+O}CCZMb2dpS$p)|E|j0P z$ojy!%z-@$ES<^VuzdOngCB%= zrsxlV5Pc!y{UF?fAlifBQ_>L%Ga&DokoGJ{dN$<=6T;yr zgu|QRTqHC5ZE!1N;Zkmg7a0dvGM*lPNlzv-`wegul9_!3f?U3a2TW%6+YkwF2PPn- z78ZMVQ)@D_PetKB4KYzNv(HpSGXXM~hb7&7pn`>1(iH+1Eau-5Z18@|--m$>euwz@ z7-!27A&dF8lC#x_kWV5)K1Inh+Ny3PFu+s(T)b zx)-pfdlA6k6>R2S#hvRlT)F;$z1$zMnEMl!a<2mzya8aa8NlF8EaTn+FnAllpcGrV zEdT~vv6b5fVDJt^_|Jd^+W`x902J&5D0mm3;4i8cz(GBLg9ZQxjQ|ds+Tn0p0UAg+ z+_r?n?FcYH&{x$1V4yd^z%>8^*8&Xm1sF&G7)SybNC6l~0~i<#Adn6qkO?4gJ%B(i zfPfD`AP+!b7=XYp00i;@1V#Y}+yV$N8W3O%Ai(X|iv=}f`tOqUW%D@-+*5dXf;NgI9oBmqxxhT`Ltl*JIsLcW|ZW#xtWaS|Rj2y_td zoM>=|Hu-UFQo^B!a{=h#yMi4Kx{y)>5u7BK5gMr zk$3i7%6A%rIES|QRAI_DR^IWNDYYvyqbI!*03+fQ2#mP%q)m)2Fc({*_%_wg z$&2*mm%q}xR+it>`A*i!oWD4Ib`Rm_|8yaJ_7bvUS=BOzYDq?eAPUb5n2Jlxx%rjG zw&#X+Xpd93Y6|7<-(UL|v@yEv!#z}8c_-TXV1j-}A`z@B8p&@F4YlO4^CHPLLyBvO zuF9m%GAKzqB)Ik%%Oqb5|}R;mBl|M=yZ}l1OMnI{$qc< zzmAGyMkM=)q9{T_PI9W`u-mQCF+jBo$q7FmuEWu)p`Ff6lvME&H!;qwUUFue(_myU zCP(z3b-Dp=7XAk2db5Fm=Qgv``rNsctur6&9PC*F}&RsS%l+Gr81 z$)4zrhJwHz@??6uVjQCU9owsfXHNhvO!SqzE{lAlSINeppb^PhzxRQ4$g%0s`=Vph z)6})cY+dLI?PMFRU40#wrsT{dr?j(cnA6aaf-+t0og#<-9_EUb7jk&4>+gnbmlN9p zDdfIyx$LbqaNq5&W#_r?hprdGZ}OQ-CtEsP?iwCg|4C3oBh;PCmmck(Z83u6&%;CE*hwot_@&U}@9+<-qVGcir zDclEBxF4qQQ<%cfU%4v9E8B;lQ(jDtf8&JC&LCK!lwLmGJrGOSEjCe966I5%YDrGGsR4mo)0 z=i=m$XAN@=u|^O%AfLzqH{*h3 z^@i(7>n)r-N^$bof|JKq*VEQJIC*Tx$zumj9`EAhu?r`U-8gxC;CkNLgLB7+ICuON z=Z<|ickIWx<8L^3e1dbw0h~HM!>QvSP92}))NuqSjdGkczQIA`3=SIK@Jt|!A2>prfX+?%^(AI>7Q-1J|j zMunE!{kyEJuyWIX9jjYVInU3FlILk{wFoVb@2;Qc8ib;d``Ya@o$x^VJ@A}%`%x&4 z{OyC@+eGVtk(;Ewp7Gptu9awnH8B^%$^sw}S^0Xi3;1_ok(oAHFPNbZ-npe>tgE-V zpU$mp=B1REyFPKIWe7JRb#dCu`L3oO>K*iF*1gBB=#f9 z;$pPQ3VS9d&iiI!)U!yy zC(DkWsgR(eJtg>}^y9jsOsx3gD_$dz$mWyJIGx7K!h~ssQV!1M@`q;(dGIMW({;Y{ zyp?;<@F$GXPk3#uiKoksp8EIC0lL_61>P?n;y89(fytpimZKeglR%QRz`oG5Ah?LX z#m&n)SfvkQ_4g3R!yKzQp5$1^@e0Rl9Dm^0&LIIE|HAP%j!!v0<0$7i!Ep)+*v(Oe zBa)*oM}3Y49Bnux)?){bYdMH4xurix7RU7*xg0lhjOG}_L9od!WDwnQ564W7*&K5@ z=5fsDSjbVxv54aV4xWDt&%b3E$4ZVDk;J#W$H_S#yaGoAM=VE8jNXKHjIQ>tm%#Za>d{S&<(`?zBhq}=belH=U z>mPjm!$fJbqNtFUEJj8FrA;-4FBVnI6{uorp^B*kPGfSOw*|g!2a404)*TsWW8&8W z*{f+3uB~{A|^8abrj4|`YmtI-@&qS>Y`x*M56Ea_{3o3Yi0uZd7 z129(grKKlNa?*}V!XsM&V^=Ze1(#tC`ZbMVM5;f2Y0S^hBaPBRD;(3+7h2;n3D*aG zot%VS_ma{EG9lN!iHn&QfQUYtm8XRtN7b@b#fMip;YoJk3>|irqm9{v*dnTz6Dpt; zF{3SuXl+p{9Az6`Xj>J*)Q?8H8O!vKV}aCR30%nnX~^Ob>e!qm(1s<@o+Z!;4X5~5 z$>Qk6Qn-$V(VvAefWOHs2QkD-V_~FomIe5EJ;qqMl-vNMI)u_;0HMQyRDVJ3NFdcw zv>1(9)@_(%-A=3Vm}K3_zezx()3B7C2@pC5m~=iR1^7ZO1}0qsMEWog=_9ltUO!;w zJ;0kYfHx)D>2^TVop@R8 zqR01uOLqg8z7Kf12dmo;30d+H(CJ^f%YLBKPk>H8<8FuGR6pmAU*KzXOpOSI($1Gt z$AQwq^V%3=5y_1c9-w;gh=X9i_FzNJSvY-t8$uJWI984T>>;)xNlT=FaHv!V5 z&CgPzjiLUGnB8T&%iL!)ShQtw_1(XU;{Sro7%XmIB!S?zlxUAK(cjHAiI88L-< z5rvsiyT3fSX7}!stKHuZnp9pmBZmBOA1MKFJ_-OhF+n^rG1q_oO%GPrfzQQBCxsB| zC*$=4Fj2HJGi(AT`&)|K3kC+lrXTc%&! zemqm?>qPM%4mOV^`LhSV6Ey2TN%0=6i1E9uTp&B$5>Wvdg??UIj_-y9V(*HU+oMox zKvaZDblMlh$;W0<4H6ZovLy1VnHY|8Bv0c5@~ zu40or&vX##;ZcQ7b@)t>>Jh4c@l0tIoX_D^OU<4U)!(|SPxdB{0>7Rd)jK6(=#+NY z`nNn&;Yi>jh#L zTkln6y&rM-?_du#rSdP=x(W~1?qE3u3shFJzE89#W5@_m-|O*SkOofW28b87R`zL?;M#+)7O32 zbxl=iorX41w_d-p;OTnM|ErbyZ31{)#;<3zBm1Iy{AJ$5fB{}hWb1$d81s_fuV1Av zD>Wx!Salce5_7zB%QxcLK|J^6utXkO@aCz$MrcG+1x4p;g0s$jOhbHK;YwwYfghJ?dHrOLG ziEm=eAZF_$BNzj|=OvQ@IxF*_N3160d$5v)(UrN9>ec&6Zlbp=ntRIZ@Eca@6>6_} z(=S)#=6dzY&dc>C$3jc|{QUA*p}Z2YA~!iTBRNy(lZ?ID$&94GtD2PLr6nb21sciw J`ak;Le*p|8pOOFo literal 0 HcmV?d00001 diff --git a/16/x_/default.fnt b/16/x_/default.fnt new file mode 100755 index 00000000..12eb22cb --- /dev/null +++ b/16/x_/default.fnt @@ -0,0 +1,260 @@ +; +; MODEX library default font +; Copyright (c) 1993-1994 by Alessandro Scotti +; + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; #0 + DB 07Eh, 081h, 0A5h, 081h, 0A5h, 099h, 081h, 07Eh ; #1 + DB 07Eh, 0FFh, 0DBh, 0FFh, 0DBh, 0E7h, 0FFh, 07Eh ; #2 + DB 06Ch, 0FEh, 0FEh, 0FEh, 07Ch, 038h, 010h, 000h ; #3 + DB 010h, 038h, 07Ch, 0FEh, 07Ch, 038h, 010h, 000h ; #4 + DB 010h, 038h, 010h, 054h, 0FEh, 054h, 010h, 0FEh ; #5 + DB 010h, 038h, 07Ch, 0FEh, 0FEh, 07Ch, 010h, 0FEh ; #6 + DB 000h, 018h, 03Ch, 07Eh, 07Eh, 03Ch, 018h, 000h ; #7 + DB 0FFh, 0E7h, 0C3h, 081h, 081h, 0C3h, 0E7h, 0FFh ; #8 + DB 000h, 03Ch, 066h, 042h, 042h, 066h, 03Ch, 000h ; #9 + DB 0FFh, 0C3h, 099h, 0BDh, 0BDh, 099h, 0C3h, 0FFh ; #10 + DB 007h, 003h, 005h, 078h, 084h, 084h, 084h, 078h ; #11 + DB 07Ch, 082h, 082h, 082h, 07Ch, 010h, 038h, 010h ; #12 + DB 01Ch, 010h, 01Ch, 010h, 010h, 010h, 030h, 030h ; #13 + DB 03Eh, 022h, 03Eh, 022h, 022h, 026h, 066h, 060h ; #14 + DB 099h, 05Ah, 03Ch, 0E7h, 0E7h, 03Ch, 05Ah, 099h ; #15 + DB 000h, 010h, 030h, 070h, 0F0h, 070h, 030h, 010h ; #16 + DB 000h, 080h, 0C0h, 0E0h, 0F0h, 0E0h, 0C0h, 080h ; #17 + DB 010h, 038h, 054h, 010h, 010h, 054h, 038h, 010h ; #18 + DB 048h, 048h, 048h, 048h, 048h, 000h, 048h, 000h ; #19 + DB 07Eh, 092h, 092h, 072h, 012h, 012h, 012h, 000h ; #20 + DB 03Ch, 022h, 018h, 024h, 024h, 018h, 044h, 03Ch ; #21 + DB 000h, 000h, 000h, 000h, 000h, 03Eh, 03Eh, 000h ; #22 + DB 038h, 054h, 010h, 010h, 010h, 054h, 038h, 0FEh ; #23 + DB 000h, 010h, 038h, 054h, 010h, 010h, 010h, 000h ; #24 + DB 000h, 010h, 010h, 010h, 054h, 038h, 010h, 000h ; #25 + DB 000h, 008h, 004h, 0FEh, 004h, 008h, 000h, 000h ; #26 + DB 000h, 020h, 040h, 0FEh, 040h, 020h, 000h, 000h ; #27 + DB 000h, 000h, 080h, 080h, 080h, 0FCh, 000h, 000h ; #28 + DB 000h, 024h, 042h, 0FFh, 042h, 024h, 000h, 000h ; #29 + DB 000h, 000h, 010h, 038h, 07Ch, 0FEh, 000h, 000h ; #30 + DB 000h, 000h, 0FEh, 07Ch, 038h, 010h, 000h, 000h ; #31 + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; + DB 010h, 010h, 010h, 010h, 010h, 000h, 010h, 000h ; ! + DB 000h, 024h, 024h, 000h, 000h, 000h, 000h, 000h ; " + DB 024h, 024h, 07Eh, 024h, 07Eh, 024h, 024h, 000h ; # + DB 038h, 054h, 050h, 038h, 014h, 054h, 038h, 010h ; $ + DB 000h, 002h, 044h, 008h, 010h, 020h, 042h, 000h ; % + DB 038h, 044h, 038h, 060h, 094h, 088h, 074h, 000h ; & + DB 020h, 020h, 040h, 000h, 000h, 000h, 000h, 000h ; ' + DB 010h, 020h, 040h, 040h, 040h, 020h, 010h, 000h ; ( + DB 040h, 020h, 010h, 010h, 010h, 020h, 040h, 000h ; ) + DB 000h, 024h, 018h, 07Eh, 018h, 024h, 000h, 000h ; * + DB 000h, 010h, 010h, 07Ch, 010h, 010h, 000h, 000h ; + + DB 000h, 000h, 000h, 000h, 000h, 010h, 010h, 020h ; , + DB 000h, 000h, 000h, 0FCh, 000h, 000h, 000h, 000h ; - + DB 000h, 000h, 000h, 000h, 000h, 000h, 010h, 000h ; . + DB 000h, 004h, 008h, 010h, 020h, 040h, 080h, 000h ; / + DB 07Ch, 0C6h, 08Ah, 092h, 0A2h, 0C6h, 07Ch, 000h ; 0 + DB 010h, 030h, 010h, 010h, 010h, 010h, 038h, 000h ; 1 + DB 078h, 084h, 004h, 018h, 060h, 080h, 0FCh, 000h ; 2 + DB 078h, 084h, 004h, 038h, 004h, 084h, 078h, 000h ; 3 + DB 01Ch, 024h, 044h, 084h, 0FEh, 004h, 00Eh, 000h ; 4 + DB 0FCh, 080h, 0F8h, 004h, 004h, 084h, 078h, 000h ; 5 + DB 078h, 084h, 080h, 0F8h, 084h, 084h, 078h, 000h ; 6 + DB 0FCh, 004h, 004h, 008h, 010h, 020h, 020h, 000h ; 7 + DB 078h, 084h, 084h, 078h, 084h, 084h, 078h, 000h ; 8 + DB 078h, 084h, 084h, 07Ch, 004h, 084h, 078h, 000h ; 9 + DB 000h, 000h, 010h, 000h, 000h, 000h, 010h, 000h ; : + DB 000h, 000h, 010h, 000h, 000h, 010h, 010h, 020h ; ; + DB 008h, 010h, 020h, 040h, 020h, 010h, 008h, 000h ; < + DB 000h, 000h, 0FCh, 000h, 000h, 0FCh, 000h, 000h ; = + DB 040h, 020h, 010h, 008h, 010h, 020h, 040h, 000h ; > + DB 078h, 084h, 004h, 008h, 010h, 000h, 010h, 000h ; ? + DB 07Ch, 082h, 0BAh, 0A6h, 0BEh, 080h, 07Ch, 000h ; @ + DB 078h, 084h, 084h, 0FCh, 084h, 084h, 084h, 000h ; A + DB 0F8h, 084h, 084h, 0F8h, 084h, 084h, 0F8h, 000h ; B + DB 078h, 084h, 080h, 080h, 080h, 084h, 078h, 000h ; C + DB 0F0h, 088h, 084h, 084h, 084h, 088h, 0F0h, 000h ; D + DB 0FCh, 080h, 080h, 0F0h, 080h, 080h, 0FCh, 000h ; E + DB 0FCh, 080h, 080h, 0F0h, 080h, 080h, 080h, 000h ; F + DB 078h, 084h, 080h, 09Ch, 084h, 084h, 078h, 000h ; G + DB 084h, 084h, 084h, 0FCh, 084h, 084h, 084h, 000h ; H + DB 038h, 010h, 010h, 010h, 010h, 010h, 038h, 000h ; I + DB 01Ch, 008h, 008h, 008h, 088h, 088h, 070h, 000h ; J + DB 084h, 088h, 090h, 0E0h, 090h, 088h, 084h, 000h ; K + DB 080h, 080h, 080h, 080h, 080h, 080h, 0FCh, 000h ; L + DB 0C6h, 0AAh, 092h, 082h, 082h, 082h, 082h, 000h ; M + DB 082h, 0C2h, 0A2h, 092h, 08Ah, 086h, 082h, 000h ; N + DB 078h, 084h, 084h, 084h, 084h, 084h, 078h, 000h ; O + DB 0F8h, 084h, 084h, 0F8h, 080h, 080h, 080h, 000h ; P + DB 078h, 084h, 084h, 084h, 094h, 088h, 076h, 000h ; Q + DB 0F8h, 084h, 084h, 0F8h, 090h, 088h, 084h, 000h ; R + DB 078h, 084h, 080h, 078h, 004h, 084h, 078h, 000h ; S + DB 0FEh, 010h, 010h, 010h, 010h, 010h, 010h, 000h ; T + DB 084h, 084h, 084h, 084h, 084h, 084h, 078h, 000h ; U + DB 084h, 084h, 084h, 084h, 084h, 048h, 030h, 000h ; V + DB 082h, 082h, 082h, 082h, 092h, 0AAh, 0C6h, 000h ; W + DB 082h, 044h, 028h, 010h, 028h, 044h, 082h, 000h ; X + DB 044h, 044h, 044h, 038h, 010h, 010h, 010h, 000h ; Y + DB 0FEh, 004h, 008h, 010h, 020h, 040h, 0FEh, 000h ; Z + DB 078h, 040h, 040h, 040h, 040h, 040h, 078h, 000h ; [ + DB 000h, 080h, 040h, 020h, 010h, 008h, 004h, 000h ; \ + DB 078h, 008h, 008h, 008h, 008h, 008h, 078h, 000h ; ] + DB 010h, 028h, 044h, 082h, 000h, 000h, 000h, 000h ; ^ + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh ; _ + DB 020h, 020h, 010h, 000h, 000h, 000h, 000h, 000h ; ` + DB 000h, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; a + DB 000h, 040h, 040h, 078h, 044h, 044h, 078h, 000h ; b + DB 000h, 000h, 03Ch, 040h, 040h, 040h, 03Ch, 000h ; c + DB 000h, 004h, 004h, 03Ch, 044h, 044h, 03Ch, 000h ; d + DB 000h, 000h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; e + DB 000h, 00Ch, 010h, 03Ch, 010h, 010h, 010h, 000h ; f + DB 000h, 000h, 03Ch, 044h, 044h, 03Ch, 004h, 038h ; g + DB 000h, 040h, 040h, 078h, 044h, 044h, 044h, 000h ; h + DB 000h, 010h, 000h, 010h, 010h, 010h, 010h, 000h ; i + DB 000h, 004h, 000h, 004h, 004h, 004h, 044h, 038h ; j + DB 000h, 040h, 040h, 050h, 060h, 050h, 048h, 000h ; k + DB 000h, 030h, 010h, 010h, 010h, 010h, 010h, 000h ; l + DB 000h, 000h, 068h, 054h, 054h, 044h, 044h, 000h ; m + DB 000h, 000h, 078h, 044h, 044h, 044h, 044h, 000h ; n + DB 000h, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; o + DB 000h, 000h, 078h, 044h, 044h, 078h, 040h, 040h ; p + DB 000h, 000h, 03Ch, 044h, 044h, 03Ch, 004h, 004h ; q + DB 000h, 000h, 05Ch, 060h, 040h, 040h, 040h, 000h ; r + DB 000h, 000h, 038h, 040h, 07Ch, 004h, 07Ch, 000h ; s + DB 000h, 010h, 038h, 010h, 010h, 010h, 018h, 000h ; t + DB 000h, 000h, 044h, 044h, 044h, 044h, 038h, 000h ; u + DB 000h, 000h, 044h, 044h, 044h, 028h, 010h, 000h ; v + DB 000h, 000h, 044h, 044h, 054h, 054h, 06Ch, 000h ; w + DB 000h, 000h, 044h, 028h, 010h, 028h, 044h, 000h ; x + DB 000h, 000h, 044h, 044h, 044h, 03Ch, 004h, 07Ch ; y + DB 000h, 000h, 07Ch, 004h, 038h, 040h, 07Ch, 000h ; z + DB 000h, 008h, 010h, 010h, 030h, 010h, 010h, 008h ; { + DB 000h, 010h, 010h, 010h, 000h, 010h, 010h, 010h ; | + DB 000h, 020h, 010h, 010h, 018h, 010h, 010h, 020h ; } + DB 064h, 098h, 000h, 000h, 000h, 000h, 000h, 000h ; ~ + DB 000h, 010h, 028h, 044h, 082h, 082h, 0FEh, 000h ;  + DB 07Ch, 080h, 080h, 080h, 080h, 07Ch, 004h, 07Ch ; #128 + DB 000h, 028h, 000h, 044h, 044h, 044h, 038h, 000h ; #129 + DB 03Ch, 000h, 07Ch, 044h, 07Ch, 040h, 07Ch, 000h ; #130 + DB 07Eh, 081h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #131 + DB 024h, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #132 + DB 078h, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #133 + DB 018h, 018h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #134 + DB 000h, 000h, 078h, 080h, 080h, 078h, 008h, 038h ; #135 + DB 07Ch, 082h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; #136 + DB 048h, 000h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; #137 + DB 078h, 000h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; #138 + DB 000h, 028h, 000h, 010h, 010h, 010h, 010h, 000h ; #139 + DB 010h, 028h, 000h, 010h, 010h, 010h, 010h, 000h ; #140 + DB 000h, 030h, 000h, 010h, 010h, 010h, 010h, 000h ; #141 + DB 048h, 000h, 078h, 084h, 0FCh, 084h, 084h, 000h ; #142 + DB 030h, 030h, 078h, 084h, 0FCh, 084h, 084h, 000h ; #143 + DB 038h, 000h, 0FCh, 080h, 0F0h, 080h, 0FCh, 000h ; #144 + DB 000h, 000h, 07Eh, 008h, 07Eh, 048h, 07Eh, 000h ; #145 + DB 07Eh, 090h, 090h, 0FCh, 090h, 090h, 09Eh, 000h ; #146 + DB 07Ch, 082h, 038h, 044h, 044h, 044h, 038h, 000h ; #147 + DB 028h, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; #148 + DB 070h, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; #149 + DB 038h, 044h, 000h, 044h, 044h, 044h, 038h, 000h ; #150 + DB 070h, 000h, 044h, 044h, 044h, 044h, 038h, 000h ; #151 + DB 028h, 000h, 044h, 044h, 044h, 03Ch, 004h, 07Ch ; #152 + DB 048h, 000h, 078h, 084h, 084h, 084h, 078h, 000h ; #153 + DB 048h, 000h, 084h, 084h, 084h, 084h, 078h, 000h ; #154 + DB 000h, 010h, 038h, 040h, 040h, 040h, 038h, 010h ; #155 + DB 038h, 044h, 040h, 0E0h, 040h, 040h, 082h, 0FCh ; #156 + DB 044h, 07Ch, 010h, 07Ch, 010h, 07Ch, 010h, 000h ; #157 + DB 0F0h, 088h, 08Ah, 0F7h, 082h, 082h, 082h, 000h ; #158 + DB 00Ch, 012h, 010h, 018h, 030h, 010h, 090h, 060h ; #159 + DB 03Ch, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #160 + DB 000h, 018h, 000h, 010h, 010h, 010h, 010h, 000h ; #161 + DB 01Ch, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; #162 + DB 01Ch, 000h, 044h, 044h, 044h, 044h, 038h, 000h ; #163 + DB 07Ch, 000h, 078h, 044h, 044h, 044h, 044h, 000h ; #164 + DB 07Ch, 000h, 044h, 064h, 054h, 04Ch, 044h, 000h ; #165 + DB 018h, 024h, 024h, 01Eh, 000h, 03Eh, 000h, 000h ; #166 + DB 01Ch, 022h, 022h, 01Ch, 000h, 03Eh, 000h, 000h ; #167 + DB 010h, 000h, 010h, 020h, 040h, 042h, 03Ch, 000h ; #168 + DB 000h, 000h, 000h, 0FCh, 080h, 080h, 000h, 000h ; #169 + DB 000h, 000h, 000h, 0FCh, 004h, 004h, 000h, 000h ; #170 + DB 040h, 044h, 048h, 057h, 021h, 047h, 004h, 007h ; #171 + DB 040h, 044h, 048h, 052h, 026h, 04Ah, 01Fh, 002h ; #172 + DB 010h, 000h, 010h, 010h, 010h, 010h, 010h, 000h ; #173 + DB 000h, 024h, 048h, 090h, 048h, 024h, 000h, 000h ; #174 + DB 000h, 048h, 024h, 012h, 024h, 048h, 000h, 000h ; #175 + DB 022h, 088h, 022h, 088h, 022h, 088h, 022h, 088h ; #176 + DB 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh ; #177 + DB 0DBh, 077h, 0DBh, 0EEh, 0DBh, 077h, 0DBh, 0EEh ; #178 + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h ; #179 + DB 018h, 018h, 018h, 018h, 0F8h, 018h, 018h, 018h ; #180 + DB 018h, 018h, 0F8h, 018h, 0F8h, 018h, 018h, 018h ; #181 + DB 036h, 036h, 036h, 036h, 0F6h, 036h, 036h, 036h ; #182 + DB 000h, 000h, 000h, 000h, 0FEh, 036h, 036h, 036h ; #183 + DB 000h, 000h, 0F8h, 018h, 0F8h, 018h, 018h, 018h ; #184 + DB 036h, 036h, 0F6h, 006h, 0F6h, 036h, 036h, 036h ; #185 + DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h ; #186 + DB 000h, 000h, 0FEh, 006h, 0F6h, 036h, 036h, 036h ; #187 + DB 036h, 036h, 0F6h, 006h, 0FEh, 000h, 000h, 000h ; #188 + DB 036h, 036h, 036h, 036h, 0FEh, 000h, 000h, 000h ; #189 + DB 018h, 018h, 0F8h, 018h, 0F8h, 000h, 000h, 000h ; #190 + DB 000h, 000h, 000h, 000h, 0F8h, 018h, 018h, 018h ; #191 + DB 018h, 018h, 018h, 018h, 01Fh, 000h, 000h, 000h ; #192 + DB 018h, 018h, 018h, 018h, 0FFh, 000h, 000h, 000h ; #193 + DB 000h, 000h, 000h, 000h, 0FFh, 018h, 018h, 018h ; #194 + DB 018h, 018h, 018h, 018h, 01Fh, 018h, 018h, 018h ; #195 + DB 000h, 000h, 000h, 000h, 0FFh, 000h, 000h, 000h ; #196 + DB 018h, 018h, 018h, 018h, 0FFh, 018h, 018h, 018h ; #197 + DB 018h, 018h, 01Fh, 018h, 01Fh, 018h, 018h, 018h ; #198 + DB 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h ; #199 + DB 036h, 036h, 037h, 030h, 03Fh, 000h, 000h, 000h ; #200 + DB 000h, 000h, 03Fh, 030h, 037h, 036h, 036h, 036h ; #201 + DB 036h, 036h, 0F7h, 000h, 0FFh, 000h, 000h, 000h ; #202 + DB 000h, 000h, 0FFh, 000h, 0F7h, 036h, 036h, 036h ; #203 + DB 036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h ; #204 + DB 000h, 000h, 0FFh, 000h, 0FFh, 000h, 000h, 000h ; #205 + DB 036h, 036h, 0F7h, 000h, 0F7h, 036h, 036h, 036h ; #206 + DB 018h, 018h, 0FFh, 000h, 0FFh, 000h, 000h, 000h ; #207 + DB 036h, 036h, 036h, 036h, 0FFh, 000h, 000h, 000h ; #208 + DB 000h, 000h, 0FFh, 000h, 0FFh, 018h, 018h, 018h ; #209 + DB 000h, 000h, 000h, 000h, 0FFh, 036h, 036h, 036h ; #210 + DB 036h, 036h, 036h, 036h, 03Fh, 000h, 000h, 000h ; #211 + DB 018h, 018h, 01Fh, 018h, 01Fh, 000h, 000h, 000h ; #212 + DB 000h, 000h, 01Fh, 018h, 01Fh, 018h, 018h, 018h ; #213 + DB 000h, 000h, 000h, 000h, 03Fh, 036h, 036h, 036h ; #214 + DB 036h, 036h, 036h, 036h, 0FFh, 036h, 036h, 036h ; #215 + DB 018h, 018h, 0FFh, 018h, 0FFh, 018h, 018h, 018h ; #216 + DB 018h, 018h, 018h, 018h, 0F8h, 000h, 000h, 000h ; #217 + DB 000h, 000h, 000h, 000h, 01Fh, 018h, 018h, 018h ; #218 + DB 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ; #219 + DB 000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh ; #220 + DB 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h ; #221 + DB 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh ; #222 + DB 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 000h, 000h ; #223 + DB 000h, 000h, 062h, 094h, 088h, 094h, 062h, 000h ; #224 + DB 000h, 0F0h, 088h, 0F0h, 088h, 088h, 0F0h, 080h ; #225 + DB 000h, 0F8h, 088h, 080h, 080h, 080h, 080h, 000h ; #226 + DB 000h, 0FCh, 048h, 048h, 048h, 048h, 048h, 000h ; #227 + DB 0FCh, 084h, 040h, 020h, 040h, 084h, 0FCh, 000h ; #228 + DB 03Ch, 040h, 038h, 044h, 044h, 044h, 038h, 000h ; #229 + DB 000h, 000h, 044h, 044h, 044h, 078h, 040h, 040h ; #230 + DB 000h, 036h, 048h, 008h, 008h, 008h, 008h, 000h ; #231 + DB 038h, 010h, 038h, 044h, 044h, 038h, 010h, 038h ; #232 + DB 078h, 084h, 084h, 0FCh, 084h, 084h, 078h, 000h ; #233 + DB 078h, 084h, 084h, 084h, 048h, 048h, 0CCh, 000h ; #234 + DB 078h, 004h, 038h, 044h, 044h, 044h, 038h, 000h ; #235 + DB 000h, 000h, 06Ch, 092h, 092h, 06Ch, 000h, 000h ; #236 + DB 000h, 000h, 03Ah, 044h, 05Ah, 022h, 05Ch, 000h ; #237 + DB 018h, 020h, 040h, 078h, 040h, 020h, 018h, 000h ; #238 + DB 078h, 084h, 084h, 084h, 084h, 084h, 084h, 000h ; #239 + DB 000h, 0FCh, 000h, 0FCh, 000h, 0FCh, 000h, 000h ; #240 + DB 020h, 020h, 0F8h, 020h, 020h, 000h, 0F8h, 000h ; #241 + DB 020h, 010h, 008h, 010h, 020h, 000h, 07Ch, 000h ; #242 + DB 008h, 010h, 020h, 010h, 008h, 000h, 07Ch, 000h ; #243 + DB 00Ch, 012h, 010h, 010h, 010h, 010h, 010h, 010h ; #244 + DB 010h, 010h, 010h, 010h, 010h, 010h, 090h, 060h ; #245 + DB 000h, 010h, 000h, 07Ch, 000h, 010h, 000h, 000h ; #246 + DB 000h, 032h, 04Ch, 000h, 032h, 04Ch, 000h, 000h ; #247 + DB 038h, 044h, 044h, 038h, 000h, 000h, 000h, 000h ; #248 + DB 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h ; #249 + DB 000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h ; #250 + DB 00Eh, 008h, 008h, 008h, 048h, 028h, 018h, 008h ; #251 + DB 038h, 024h, 024h, 024h, 024h, 000h, 000h, 000h ; #252 + DB 03Ch, 004h, 03Ch, 020h, 03Ch, 000h, 000h, 000h ; #253 + DB 000h, 000h, 03Ch, 03Ch, 03Ch, 03Ch, 000h, 000h ; #254 + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; #255 diff --git a/16/x_/makefile b/16/x_/makefile new file mode 100755 index 00000000..eb7bf624 --- /dev/null +++ b/16/x_/makefile @@ -0,0 +1,82 @@ +# +# MODEX library makefile (for Borland MAKE) +# Copyright (c) 1993,1994 by Alessandro Scotti +# +LIBINCS = MODEX.DEF + +LIBOBJS = MXBB.OBJ \ + MXCC.OBJ \ + MXCG.OBJ \ + MXCL.OBJ \ + MXCR.OBJ \ + MXFB.OBJ \ + MXFP.OBJ \ + MXGC.OBJ \ + MXGI.OBJ \ + MXGM.OBJ \ + MXGP.OBJ \ + MXGV.OBJ \ + MXHL.OBJ \ + MXIT.OBJ \ + MXLL.OBJ \ + MXLN.OBJ \ + MXOT.OBJ \ + MXPB.OBJ \ + MXPF.OBJ \ + MXPG.OBJ \ + MXPI.OBJ \ + MXPN.OBJ \ + MXPP.OBJ \ + MXRA.OBJ \ + MXRP.OBJ \ + MXSA.OBJ \ + MXSC.OBJ \ + MXSI.OBJ \ + MXSL.OBJ \ + MXSM.OBJ \ + MXSP.OBJ \ + MXSS.OBJ \ + MXTL.OBJ \ + MXVS.OBJ \ + MXWD.OBJ \ + MXWM.OBJ \ + MXWP.OBJ \ + MXWR.OBJ + +# +# ASM compiler +# +ASMC = tasm +ASMO = /m5 /zi +#/p + +# +# PAS compiler +# +PASC = tpc +PASO = /m -$D- -$L- -$S- + +# +# LIB maker, uses response file +# +LIBC = tlib + +.asm.obj: + $(ASMC) $(ASMO) $< + +target: modex.lib +# modex.tpu modex.tpp + +#modex.tpu: $(LIBOBJS) modex.pas +# $(PASC) $(PASO) modex +# copy modex.tpu .. +# copy modex.pas .. + +#modex.tpp: $(LIBOBJS) modex.pas +# $(PASC) /cp $(PASO) modex +# copy modex.tpp .. + +modex.lib: modex.lbr $(LIBOBJS) + $(LIBC) modex.lib @modex.lbr + +$(LIBOBJS): modex.def diff --git a/16/x_/modex.def b/16/x_/modex.def new file mode 100755 index 00000000..9c6b75b5 --- /dev/null +++ b/16/x_/modex.def @@ -0,0 +1,154 @@ +;------------------------------------------------------------ +; +; MODEX.DEF - Include file +; Copyright (c) 1993-1994 by Alessandro Scotti +; +JUMPS +LOCALS + +TRUE EQU 1 ; Boolean constants +FALSE EQU 0 + +USE286 = FALSE ; TRUE enables 80286 instructions +USE386 = FALSE ; TRUE enables 80386 (and 80286) instructions + +IF USE286 EQ TRUE + P286 +ENDIF + +IF USE386 EQ TRUE + P386 + USE286 = TRUE +ENDIF + +MXVERSION EQU 0128h ; Library version (1.40) + +;------------------------------------------------------------ +; +; VGA definitions +; +MISC EQU 3C2h ; Miscellaneous output +TS EQU 3C4h ; Timing Sequencer index register +GDC EQU 3CEh ; Graphics Data Controller index register +CRTC EQU 3D4h ; CRTC index register +STATUS EQU 3DAh ; Input Status register one + +;------------------------------------------------------------ +; +; Raster operators +; +OP_SET EQU 0 +OP_MOVE EQU 0 ; Same as OP_SET +OP_AND EQU 1 +OP_OR EQU 2 +OP_XOR EQU 3 +OP_TRANS EQU 4 +OP_ADD EQU 5 ; Must be last op + +;------------------------------------------------------------ +; +; Polygon fill functions +; +POLYSCANBUFSIZE EQU 4*1024 + +;------------------------------------------------------------ +; Macro to push registers, variables or flags onto the stack +; Usage: .push "loc16"[,"loc16"...] +; where "loc16" is a 16-bit register, a word-sized variable or the +; keyword "FLAGS". +; Exmpl: .push ax, flags, var1 +; .pop ax, flags, var1 +; +.push MACRO r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 + IFNB + .ERROR <.PUSH has more than 10 arguments> + ENDIF + IRP $reg, + IFB <$reg> ;; Is argument blank? + EXITM ;; Yes, exit + ELSEIFIDNI <$reg>, ;; Is argument the keyword "FLAGS"? + pushf ;; Yes, push flags + ELSE + push $reg ;; Push argument + ENDIF + ENDM +ENDM + +;------------------------------------------------------------ +; Macro to pop registers, variables or flags from the stack +; Usage: .pop "loc16"[,"loc16"...] +; where "loc16" is a 16-bit register, a word-sized variable or the +; keyword "FLAGS". +; Exmpl: .push ax, flags, var1 +; .pop ax, flags, var1 +; +.pop MACRO r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 + IFNB + .ERROR <.POP has more than 10 arguments> + ENDIF + IRP $reg, + IFNB <$reg> ;; Is argument non-blank? + IFIDNI <$reg>, ;; Yes, is it the keyword "FLAGS"? + popf ;; Yes, pop flags + ELSE + pop $reg ;; Pop argument + ENDIF + ENDIF + ENDM +ENDM + +;------------------------------------------------------------ +; +.enter MACRO localsize + IF USE286 EQ TRUE + enter localsize, 0 + ELSE + push bp + mov bp, sp + sub sp, localsize + ENDIF +ENDM + +;------------------------------------------------------------ +; +.leave MACRO argsize + IF USE286 EQ TRUE + leave + ELSE + mov sp, bp + pop bp + ENDIF + IFNB + ret argsize + ELSE + ret + ENDIF +ENDM + +;------------------------------------------------------------ +; +.shr MACRO arg, count + IF USE286 EQ TRUE + shr arg, count + ELSE + $temp = count + WHILE $temp GT 0 + shr arg, 1 + $temp = $temp-1 + ENDM + ENDIF +ENDM + +;------------------------------------------------------------ +; +.shl MACRO arg, count + IF USE286 EQ TRUE + shl arg, count + ELSE + $temp = count + WHILE $temp GT 0 + shl arg, 1 + $temp = $temp-1 + ENDM + ENDIF +ENDM diff --git a/16/x_/modex.h b/16/x_/modex.h new file mode 100755 index 00000000..2c1f1ebe --- /dev/null +++ b/16/x_/modex.h @@ -0,0 +1,153 @@ +/* + MODEX.H - C/C++ include file for the MODEX library + Copyright (c) 1994 Alessandro Scotti +*/ + +#ifndef _MODEX_H_ // Avoid nested inclusions +#define _MODEX_H_ + +// +// Video modes +// +#define MX_TEXT 0 // 80x25 text +#define MX_320x175 1 // 320x175x256 +#define MX_320x200 2 // 320x200x256, 4 pages, aspect 6:5 +#define MX_320x240 3 // 320x240x256, 3 pages, aspect 1:1 +#define MX_320x350 4 // 320x350x256 +#define MX_320x400 5 // 320x400x256, 2 pages +#define MX_320x480 6 // 320x480x256, 1 page +#define MX_360x175 7 // 360x175x256 +#define MX_360x200 8 // 360x200x256, 3 pages +#define MX_360x240 9 // 360x240x256, 2 pages +#define MX_360x350 10 // 360x350x256 +#define MX_360x400 11 // 360x400x256, 1 page +#define MX_360x480 12 // 360x480x256, 1 page +#define MX_400x600 13 // 400x600x256, 1 page + +// +// Fade effects +// +#define MX_FADEIN 0 +#define MX_FADEOUT 1 + +// +// Raster ops +// +#define OP_SET 0 // No operator +#define OP_AND 1 // And +#define OP_OR 2 // Or +#define OP_XOR 3 // Xor +#define OP_TRANS 4 // Transparent +#define OP_ADD 5 // Additive +#define OP_MOVE 0 // Alias for OP_SET + +// +// Temporary definitions +// +#define MXBYTE unsigned char +#define MXBOOL short int +#define MXSINT short int +#define MXUINT unsigned short int +#define MXAPI far pascal +#define MXPTR void far * + +// Functions + +#ifdef __cplusplus // Avoid C++ name mangling +extern "C" { +#endif + +// +// Initialization +// +MXSINT MXAPI mxInit( void ); // Returns 0 if successful +void MXAPI mxTerm( void ); +MXUINT MXAPI mxGetVersion( void ); +// +// Mode setting +// +void MXAPI mxChangeMode( MXUINT mode ); +void MXAPI mxSetMode( MXUINT mode ); +void MXAPI mxGetAspect( MXUINT far *aspectx, MXUINT far *aspecty ); +void MXAPI mxGetScreenSize( MXUINT far *width, MXUINT far *height ); +// +// Hardware support +// +void MXAPI mxWriteMode( MXBYTE wm ); +void MXAPI mxSplitScreen( MXUINT line ); +void MXAPI mxStartAddress( MXUINT sa ); +void MXAPI mxStartLine( MXUINT sl ); +void MXAPI mxWaitDisplay( void ); +void MXAPI mxWaitRetrace( void ); +void MXAPI mxWritePlane( MXBYTE wp ); +void MXAPI mxReadPlane( MXBYTE rp ); +void MXAPI mxRowAddress( MXBYTE ra ); +// +// Virtual screen +// +void MXAPI mxGetVirtualScreen( MXUINT far *width, MXUINT far *height ); +void MXAPI mxSetVirtualScreen( MXUINT width, MXUINT height ); +void MXAPI mxPan( MXUINT x, MXUINT y ); +// +// Clipping +// +MXBOOL MXAPI mxGetClip( void ); +MXBOOL MXAPI mxGetClipRegion( MXSINT far *x, MXSINT far *y, MXSINT far *w, MXSINT far *h ); +MXBOOL MXAPI mxSetClip( MXBOOL ); +void MXAPI mxSetClipRegion( MXUINT x, MXUINT y, MXUINT width, MXUINT height ); +// +// Graphics +// +void MXAPI mxBitBlt( MXSINT sx, MXSINT sy, MXUINT width, MXUINT height, MXSINT dx, MXSINT dy ); +void MXAPI mxFillBox( MXSINT x, MXSINT y, MXUINT width, MXUINT height, MXUINT color, MXUINT op ); +MXBYTE MXAPI mxGetPixel( MXSINT x, MXSINT y ); +void MXAPI mxPutPixel( MXSINT x, MXSINT y, MXBYTE color ); +void MXAPI mxLine( MXSINT x1, MXSINT y1, MXSINT x2, MXSINT y2, MXUINT color, MXUINT op ); +void MXAPI mxGetImage( MXPTR img, MXSINT x, MXSINT y, MXUINT width, MXUINT height ); +void MXAPI mxPutImage( MXPTR img, MXSINT x, MXSINT y, MXUINT w, MXUINT h, MXUINT op ); +void MXAPI mxPutTile( MXPTR tile, MXSINT x, MXSINT y, MXUINT width, MXUINT height ); +void MXAPI mxTransPutTile( MXPTR tile, MXSINT x, MXSINT y, MXUINT w, MXUINT h ); +void MXAPI mxCircle( MXSINT x, MXSINT y, MXUINT radius, MXBYTE color ); +void MXAPI mxStretchImage( MXPTR img, MXSINT x, MXSINT y, MXUINT w, MXUINT h, MXUINT neww, MXUINT newh, MXUINT op ); +// +// Palette +// +void MXAPI mxColorToGray( MXPTR source, MXPTR dest, MXUINT count ); +void MXAPI mxGammaCorrect( MXPTR source, MXPTR dest, MXUINT count ); +void MXAPI mxGetColor( MXUINT index, MXSINT far *r, MXSINT far *g, MXSINT far *b ); +void MXAPI mxSetColor( MXUINT index, MXSINT red, MXSINT green, MXSINT blue ); +void MXAPI mxGetPalette( MXPTR palette, MXUINT index, MXUINT count ); +void MXAPI mxSetPalette( MXPTR palette, MXUINT index, MXUINT count ); +void MXAPI mxFadePalette( MXPTR, MXUINT, MXUINT, MXUINT, MXUINT, MXUINT, MXUINT ); +void MXAPI mxRotatePalette( MXPTR palette, MXUINT count, MXSINT step ); +// +// Text +// +MXSINT MXAPI mxSetFont( MXPTR font, MXUINT charwidth, MXUINT charheight ); +void MXAPI mxSetTextColor( MXUINT color, MXUINT op ); +void MXAPI mxGetTextStep( MXSINT far *deltax, MXSINT far *deltay ); +void MXAPI mxSetTextStep( MXSINT deltax, MXSINT deltay ); +void MXAPI mxOutChar( MXSINT x, MXSINT y, char c ); +void MXAPI mxOutText( MXSINT x, MXSINT y, char far *sz ); +// +// Convex polygons +// +void MXAPI mxFillPoly( MXUINT, MXPTR, MXPTR, MXUINT, MXUINT ); +void MXAPI mxGouraudPoly( MXUINT, MXPTR, MXPTR, MXPTR, MXUINT, MXUINT ); +void MXAPI mxTexturePoly( MXUINT, MXPTR, MXPTR, MXPTR, MXPTR, MXUINT, MXUINT ); + +#ifdef __cplusplus +} +#endif + +// +// Remove temporary defines +// +#undef MXBYTE +#undef MXBOOL +#undef MXSINT +#undef MXUINT +#undef MXPTR +#undef MXAPI + +#endif // _MODEX_H_ diff --git a/16/x_/modex.lbr b/16/x_/modex.lbr new file mode 100755 index 00000000..b1ec26b6 --- /dev/null +++ b/16/x_/modex.lbr @@ -0,0 +1,38 @@ ++-MXBB.OBJ & ++-MXCC.OBJ & ++-MXCG.OBJ & ++-MXCL.OBJ & ++-MXCR.OBJ & ++-MXFB.OBJ & ++-MXFP.OBJ & ++-MXGC.OBJ & ++-MXGI.OBJ & ++-MXGM.OBJ & ++-MXGP.OBJ & ++-MXGV.OBJ & ++-MXHL.OBJ & ++-MXIT.OBJ & ++-MXLL.OBJ & ++-MXLN.OBJ & ++-MXOT.OBJ & ++-MXPB.OBJ & ++-MXPF.OBJ & ++-MXPG.OBJ & ++-MXPI.OBJ & ++-MXPN.OBJ & ++-MXPP.OBJ & ++-MXRA.OBJ & ++-MXRP.OBJ & ++-MXSA.OBJ & ++-MXSC.OBJ & ++-MXSI.OBJ & ++-MXSL.OBJ & ++-MXSM.OBJ & ++-MXSP.OBJ & ++-MXSS.OBJ & ++-MXTL.OBJ & ++-MXVS.OBJ & ++-MXWD.OBJ & ++-MXWM.OBJ & ++-MXWP.OBJ & ++-MXWR.OBJ diff --git a/16/x_/modex.pas b/16/x_/modex.pas new file mode 100755 index 00000000..7d9d26ed --- /dev/null +++ b/16/x_/modex.pas @@ -0,0 +1,194 @@ +(* + Turbo Pascal interface to the MODEX library + Copyright (c) 1993,1994 by Alessandro Scotti +*) +unit ModeX; +interface + +const + (* Video modes *) + MX_TEXT = 0; + MX_320x175 = 1; + MX_320x200 = 2; + MX_320x240 = 3; + MX_320x350 = 4; + MX_320x400 = 5; + MX_320x480 = 6; + MX_360x175 = 7; + MX_360x200 = 8; + MX_360x240 = 9; + MX_360x350 = 10; + MX_360x400 = 11; + MX_360x480 = 12; + MX_400x600 = 13; + + (* Fade effects *) + MX_FADEIN = 0; + MX_FADEOUT = 1; + + (* Raster ops *) + OP_SET = 0; + OP_AND = 1; + OP_OR = 2; + OP_XOR = 3; + OP_TRANS = 4; + OP_ADD = 5; + OP_MOVE = 0; (* Alias for OP_SET *) + +procedure mxBitBlt( SX, SY: integer; Width, Height: word; DX, DY: integer ); +procedure mxCircle( CX, CY: integer; Radius: word; Color: byte ); +procedure mxChangeMode( Mode: word ); +procedure mxColorToGray( ColorPalette, GrayPalette: pointer; Count: word ); +procedure mxFadePalette( Palette: pointer; Cmd, Start, Count, R, G, B: word ); +procedure mxFillBox( X, Y: integer; Width, Height: word; Color: byte; Op: word ); +procedure mxGammaCorrect( ColorPalette, GammaPalette: pointer; Count: word ); +procedure mxGetAspect( var AspectX, AspectY: word ); +function mxGetClipRegion( var X1, Y1, Width, Height: word ): boolean; +function mxGetClip: boolean; +procedure mxGetImage( Image: pointer; X, Y: integer; Width, Height: word ); +procedure mxGetPalette( Palette: pointer; Start, Count: word ); +function mxGetPixel( X, Y: word ): byte; +procedure mxGetScreenSize( var Width, Height: word ); +procedure mxGetTextStep( var DeltaX, DeltaY: integer ); +function mxGetVersion: word; +procedure mxGetVirtualScreen( var Width, Height: word ); +procedure mxInit; +procedure mxLine( X1, Y1, X2, Y2: integer; Color, Op: word ); +procedure mxOutChar( X, Y: integer; C: char ); +procedure mxOutText( X, Y: integer; S: pointer ); +procedure mxPan( X, Y: word ); +procedure mxPutImage( Image: pointer; X, Y: integer; Width, Height, Op: word ); +procedure mxPutPixel( X, Y: word; C: byte ); +procedure mxPutTile( Tile: pointer; X, Y: integer; Width, Height: word ); +procedure mxReadPlane( Plane: byte ); +procedure mxRotatePalette( Palette: pointer; Count: word; Step: integer ); +procedure mxRowAddress( RowAddress: byte ); +function mxSetClip( Clip: boolean ): boolean; +procedure mxSetClipRegion( X1, Y1, Width, Height: word ); +procedure mxSetColor( Index, R, G, B: word ); +procedure mxSetFont( Font: pointer; Width, Height: word ); +procedure mxSetMode( Mode: word ); +procedure mxSetPalette( Palette: pointer; Start, Count: word ); +procedure mxSetTextColor( Color, Op: word ); +procedure mxSetTextStep( DeltaX, DeltaY: integer ); +procedure mxSetVirtualScreen( Width, Height: word ); +procedure mxStretchImage( Image: pointer; X, Y: integer; Width, Height, NewWidth, NewHeight, Op: word ); +procedure mxSplitScreen( Line: word ); +procedure mxStartAddress( StartAddress: word ); +procedure mxStartLine( Line: word ); +procedure mxTerm; +procedure mxTransPutTile( Tile: pointer; X, Y: integer; Width, Height: word ); +procedure mxWaitDisplay; +procedure mxWaitRetrace; +procedure mxWriteMode( Mode: byte ); +procedure mxWritePlane( Plane: byte ); + +procedure mxFillPoly( Count: word; var Map, Points; Color: word ); +procedure mxGouraudPoly( Count: word; var Map, Points, Colors; BaseColor: word ); +procedure mxTexturePoly( Count: word; var Map, Points, ImgPoints, Texture; Width: word ); + +procedure mxOutStr( X, Y: integer; S: string ); + +implementation + +procedure mxBitBlt; external; +procedure mxChangeMode( Mode: word ); external; +procedure mxCircle; external; +procedure mxColorToGray; external; +procedure mxFadePalette; external; +procedure mxFillBox; external; +procedure mxGammaCorrect; external; +procedure mxGetAspect( var AspectX, AspectY: word ); external; +function mxGetClipRegion; external; +function mxGetClip: boolean; external; +procedure mxGetImage; external; +procedure mxGetPalette( Palette: pointer; Start, Count: word ); external; +function mxGetPixel( X, Y: word ): byte; external; +procedure mxGetScreenSize( var Width, Height: word ); external; +procedure mxGetTextStep( var DeltaX, DeltaY: integer ); external; +function mxGetVersion: word; external; +procedure mxGetVirtualScreen( var Width, Height: word ); external; +procedure mxInit; external; +procedure mxLine( X1, Y1, X2, Y2: integer; Color, Op: word ); external; +procedure mxOutChar( X, Y: integer; C: char ); external; +procedure mxOutText( X, Y: integer; S: pointer ); external; +procedure mxPan( X, Y: word ); external; +procedure mxPutImage; external; +procedure mxPutPixel( X, Y: word; C: byte ); external; +procedure mxPutTile; external; +procedure mxReadPlane( Plane: byte ); external; +procedure mxRotatePalette; external; +procedure mxRowAddress( RowAddress: byte ); external; +function mxSetClip( Clip: boolean ): boolean; external; +procedure mxSetClipRegion( X1, Y1, Width, Height: word ); external; +procedure mxSetColor( Index, R, G, B: word ); external; +procedure mxSetFont( Font: pointer; Width, Height: word ); external; +procedure mxSetMode( Mode: word ); external; +procedure mxSetPalette( Palette: pointer; Start, Count: word ); external; +procedure mxSetTextColor( Color, Op: word ); external; +procedure mxSetTextStep( DeltaX, DeltaY: integer ); external; +procedure mxSetVirtualScreen( Width, Height: word ); external; +procedure mxSplitScreen( Line: word ); external; +procedure mxStartAddress( StartAddress: word ); external; +procedure mxStartLine; external; +procedure mxStretchImage; external; +procedure mxTerm; external; +procedure mxTransPutTile; external; +procedure mxWaitDisplay; external; +procedure mxWaitRetrace; external; +procedure mxWriteMode( Mode: byte ); external; +procedure mxWritePlane( Plane: byte ); external; + +procedure mxFillPoly; external; +procedure mxGouraudPoly; external; +procedure mxTexturePoly; external; +{$L MXPB} +{$L MXPF} +{$L MXPG} +{$L MXPT} + +{$L MXBB} +{$L MXCC} +{$L MXCG} +{$L MXCL} +{$L MXCR} +{$L MXFB} +{$L MXFP} +{$L MXGI} +{$L MXGM} +{$L MXGP} +{$L MXGV} +{$L MXHL} +{$L MXIT} +{$L MXLN} +{$L MXOT} +{$L MXPI} +{$L MXPN} +{$L MXPP} +{$L MXRA} +{$L MXRP} +{$L MXSA} +{$L MXSC} +{$L MXSI} +{$L MXSL} +{$L MXSM} +{$L MXSP} +{$L MXSS} +{$L MXTL} +{$L MXVS} +{$L MXWD} +{$L MXWM} +{$L MXWP} +{$L MXWR} + +(* + Prints a Turbo Pascal string. + Note: BP 7.0 supports ASCIIZ strings (PChar type). +*) +procedure mxOutStr; +begin + S := S + #0; + mxOutText( X, Y, @S[1] ); +end; + +end. diff --git a/16/x_/modex/DEMO01.EXE b/16/x_/modex/DEMO01.EXE new file mode 100755 index 0000000000000000000000000000000000000000..28caff88c58a0b8ce5a4d23c6544c00cda8482fc GIT binary patch literal 10208 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 320 ) then begin + S.X := 320; + S.DX := -S.DX; + end; + if( S.X < -16 ) then begin + S.X := -16; + S.DX := -S.DX; + end; + if( S.Y > 240 ) then begin + S.Y := 240; + S.DY := -S.DY; + end; + if( S.Y < -16 ) then begin + S.Y := -16; + S.DY := -S.DY; + end; + (* Draw the sprite, note the Page offset added to the *) + (* Y coordinate of the image *) + mxPutImage( @S.Image, S.X, Page+S.Y, S.W, S.H, OP_TRANS ); +end; + +begin + (* Initialize library *) + mxInit; + + (* Enter graphics mode *) + mxSetMode( MX_320x240 ); + + (* Print initialization message *) + mxSetTextColor( 15, OP_TRANS ); + mxOutStr( 4, 4, 'Initializing...' ); + + (* Initialize sprites *) + for I:=1 to MAX_SPRITE do sxInit( S[I] ); + + (* Draw background *) + for I:=1 to 192 do begin + mxCircle( 160, 480+120, I, I+63 ); + mxCircle( 161, 480+120, I, I+63 ); + end; + + (* Compute and set palette *) + for I:=1 to 192 do with Palette[I+63] do begin + R := 0; + G := 0; + B := 0; + if( I < 64 ) then + R := I shr 1+31 + else if( I < 128 ) then + G := (I-64) shr 1+31 + else + B := (I-128) shr 1+31; + end; + mxSetPalette( @Palette[64], 64, 192 ); + + (* Main loop *) + Page := 240; + while( not KeyPressed ) do begin + (* Set clip region to current page *) + mxSetClipRegion( 0, Page, 320, 240 ); + mxSetClip( TRUE ); + (* Restore background *) + mxBitBlt( 0, 480, 320, 240, 0, Page ); + (* Draw sprites *) + for I:=1 to MAX_SPRITE do sxMove( S[I] ); + (* Print message *) + mxOutStr( 4, Page+4, 'Some sprites moving...' ); + (* Flip page *) + mxStartLine( Page ); + Page := 240-Page; + (* Animate palette *) + mxSetPalette( @Palette[64], 64, 192 ); + mxRotatePalette( @Palette[64], 192, 3 ); + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x_/modex/DEMO02.EXE b/16/x_/modex/DEMO02.EXE new file mode 100755 index 0000000000000000000000000000000000000000..14e7dc72b16e421ae94767feaa07cb3988f49db1 GIT binary patch literal 24688 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 L6~S)>H$VReFZ-F@ literal 0 HcmV?d00001 diff --git a/16/x_/modex/DEMO02.PAS b/16/x_/modex/DEMO02.PAS new file mode 100755 index 00000000..6b4fb6f9 --- /dev/null +++ b/16/x_/modex/DEMO02.PAS @@ -0,0 +1,125 @@ +(* + DEMO02 - Texture mapping and palette rotation + (c) 1994 by Alessandro Scotti +*) +uses Crt, Modex, Plasma, Threed; + +const + LSIZE = 85; + Trans : TPoint = ( X:0; Y:0; Z:0 ); +type + T2DPoint = record + X, Y: integer; + end; + TTexture = record + Desc : array[ 0..3 ] of T2DPoint; + Width : word; + Data : array[ 1..64*64 ] of byte; + end; + TQuad = record + VtxCnt : word; + Vtx : array[ 0..3 ] of word; + Texture: word; + end; +var + Vtx : array[ 0..7 ] of TPoint; + XVtx : array[ 0..7 ] of TPoint; + VVtx : array[ 0..7 ] of T2DPoint; + Face : array[ 0..5 ] of TQuad; + Txts : array[ 0..5 ] of TTexture; + Nrm : array[ 0..5 ] of TPoint; + XNrm : array[ 0..5 ] of TPoint; + Page : word; + Palette: array[ byte ] of record R, G, B: byte; end; + +(* Make a 64x64 plasma to be used as texture *) +procedure MakeTexture( Idx: word ); +var + I: word; +begin + mxFillBox( 0, 0, 64, 64, 0, OP_SET ); + MakePlasma( 0, 0, 64, 64, 96, Random(192)+1, Random(192)+1, Random(192)+1 ); + mxGetImage( @Txts[Idx].Data, 0, 0, 64, 64 ); + (* Texture vertexes are 8:8 fixed, add $80 (0.5) for best results *) + with Txts[Idx] do begin + Desc[0].X := $80; Desc[0].Y := $80; + Desc[1].X := $80; Desc[1].Y := $3F80; + Desc[2].X := $3F80; Desc[2].Y := $3F80; + Desc[3].X := $3F80; Desc[3].Y := $80; + Width := 64; + end; +end; + +procedure Init; +var + I: integer; +begin + (* Build vertexes for a cube *) + with Vtx[0] do begin X:=-LSIZE; Y:=-LSIZE; Z:=-LSIZE; end; + with Vtx[1] do begin X:=+LSIZE; Y:=-LSIZE; Z:=-LSIZE; end; + with Vtx[2] do begin X:=-LSIZE; Y:=+LSIZE; Z:=-LSIZE; end; + with Vtx[3] do begin X:=+LSIZE; Y:=+LSIZE; Z:=-LSIZE; end; + with Vtx[4] do begin X:=-LSIZE; Y:=-LSIZE; Z:=+LSIZE; end; + with Vtx[5] do begin X:=+LSIZE; Y:=-LSIZE; Z:=+LSIZE; end; + with Vtx[6] do begin X:=-LSIZE; Y:=+LSIZE; Z:=+LSIZE; end; + with Vtx[7] do begin X:=+LSIZE; Y:=+LSIZE; Z:=+LSIZE; end; + for I:=0 to 7 do begin (* Make points 16:16 fixed *) + Vtx[I].X := Vtx[I].X*$10000; + Vtx[I].Y := Vtx[I].Y*$10000; + Vtx[I].Z := Vtx[I].Z*$10000; + end; + (* Build faces *) + with Face[0] do begin Vtx[0]:=0; Vtx[1]:=2; Vtx[2]:=3; Vtx[3]:=1; end; + with Face[1] do begin Vtx[0]:=4; Vtx[1]:=5; Vtx[2]:=7; Vtx[3]:=6; end; + with Face[2] do begin Vtx[0]:=0; Vtx[1]:=1; Vtx[2]:=5; Vtx[3]:=4; end; + with Face[3] do begin Vtx[0]:=1; Vtx[1]:=3; Vtx[2]:=7; Vtx[3]:=5; end; + with Face[4] do begin Vtx[0]:=2; Vtx[1]:=0; Vtx[2]:=4; Vtx[3]:=6; end; + with Face[5] do begin Vtx[0]:=7; Vtx[1]:=3; Vtx[2]:=2; Vtx[3]:=6; end; + for I:=0 to 5 do Face[I].Texture := I; + (* Build textures and palette *) + Randomize; + FillChar( Palette, SizeOf(Palette), 0 ); + MakePlasmaPalette( Palette, PAL_RGB ); + mxSetPalette( @Palette, 0, 193 ); + for I:=0 to 5 do MakeTexture( I ); +end; + +var + AX, AY, AZ: byte; + I: word; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + AX := 0; + AY := 0; + AZ := 0; + (* Init 3D transforms, perspective is intentionally exaggerated *) + tdSetTranslation( Trans ); + tdSetPerspective( 400*$10000, $10000, $10000 ); + (* Main loop, all magic here! *) + while( not KeyPressed ) do begin + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx, XVtx, 8 ); (* 3D transform points *) + tdTransformToImage( XVtx, VVtx, 8, 160, 120+Page ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 1 ); + Inc( AZ, 2 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + mxRotatePalette( @Palette[1], 192, 3 ); (* Rotate palette *) + (* Draw cube: backface culling is straighforward in this case, so *) + (* it can be handled by the polygon filling procedure *) + for I:=0 to 5 do + mxTexturePoly( 4, Face[I].Vtx, VVtx, Txts[I].Desc, Txts[I].Data, Txts[I].Width ); + mxStartLine( Page ); (* Flip pages *) + mxSetPalette( @Palette[1], 1, 192 ); (* Set new palette *) + Page := 240-Page; + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x_/modex/DEMO03.EXE b/16/x_/modex/DEMO03.EXE new file mode 100755 index 0000000000000000000000000000000000000000..c646c4b0283db932174d915432747c2176034195 GIT binary patch literal 14256 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 RADIUS*RADIUS ) then goto Retry; + Z := Toggle( Round( Sqrt( Abs( RADIUS*RADIUS-X*X-Y*Y ) ) ) ); + case Random(3) of + 0: Swap( X, Z ); + 1: Swap( Y, Z ); + end; + X := X * $10000; Y := Y * $10000; Z := Z * $10000; + end; + end; + (* Initialize morphing *) + Move( CubeVtx^, Vtx^, SizeOf(Vtx^) ); + Status := 0; + Count := WAITCOUNT; +end; + +procedure Morph; +var + I: integer; +begin + (* Fully unoptimized, slowest loop I could think of! *) + for I:=0 to MAXVTX-1 do begin + Vtx^[I].X := ((CubeVtx^[I].X * Morph1)+(SphereVtx^[I].X * Morph2)) div MS; + Vtx^[I].Y := ((CubeVtx^[I].Y * Morph1)+(SphereVtx^[I].Y * Morph2)) div MS; + Vtx^[I].Z := ((CubeVtx^[I].Z * Morph1)+(SphereVtx^[I].Z * Morph2)) div MS; + end; +end; + +var + AX, AY, AZ: byte; + I: word; + C: char; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + AX := 0; + AY := 0; + AZ := 0; + (* Init 3D transforms, perspective is intentionally exaggerated *) + tdSetTranslation( Trans ); + tdSetPerspective( 400*$10000, $10000, $10000 ); + C := #0; + repeat + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx^, XVtx^, MAXVTX ); (* 3D transform points *) + tdTransformToImage( XVtx^, VVtx, MAXVTX, 160, 120+Page ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 1 ); + Inc( AZ, 2 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + (* Draw points *) + for I:=0 to MAXVTX-1 do + mxPutPixel( VVtx[I].X, VVtx[I].Y, 128 + XVtx^[I].Z shr 18 ); + mxStartLine( Page ); (* Flip pages *) + Page := 240-Page; + (* Morph *) + if( Odd(Status) ) then begin + Morph; + Inc( Morph1, Delta1 ); + Inc( Morph2, Delta2 ); + if( Morph1 < 0 )or( Morph2 < 0 ) then Inc( Status ); + if( Status = 4 ) then Status := 0; + end + else begin + Dec( Count ); + if( Count < 0 ) then begin + Inc( Status ); + Count := WAITCOUNT; + Morph1 := InitMorph1[Status]; + Morph2 := InitMorph2[Status]; + Delta1 := InitDelta1[Status]; + Delta2 := InitDelta2[Status]; + end; + end; + until( KeyPressed ); + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x_/modex/DEMO04.DAT b/16/x_/modex/DEMO04.DAT new file mode 100755 index 0000000000000000000000000000000000000000..72aaad08ac55e4d161e7868374296a4e42554684 GIT binary patch literal 37662 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%0D)*4A2IO9KMZYD#oU43C^WOCfTg8_%RD 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�-ncKj8QX2BIutynAlnfJ{;J0ue86t5F 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 XG;Ye`)EVP3#M6mPm!(a=?*#mR$DZhs literal 0 HcmV?d00001 diff --git a/16/x_/modex/DEMO04.EXE b/16/x_/modex/DEMO04.EXE new file mode 100755 index 0000000000000000000000000000000000000000..1fec5e8aa383353d986ca1e4420838b09e61eef4 GIT binary patch literal 24384 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 Im202>1y)VB#{d8T literal 0 HcmV?d00001 diff --git a/16/x_/modex/DEMO04.PAS b/16/x_/modex/DEMO04.PAS new file mode 100755 index 00000000..1a946315 --- /dev/null +++ b/16/x_/modex/DEMO04.PAS @@ -0,0 +1,198 @@ +(* + DEMO04 - Multiple textures and triple buffering (3 pages) + (c) 1994 by Alessandro Scotti +*) +uses Crt, Modex, Threed; + +const + MAXVTX = 256; + MAXCUB = 2; + MAXTXT = 2; + Trans : TPoint = ( X:0; Y:0; Z:0 ); + TxtSunDial: array[ 0..7 ] of word = ( + $7F80,$0080, $0080,$0080, $0080,$7E80, $7F80,$7E80 ); + TxtSapphire : array[ 0..7 ] of word = ( + $0080,$0080, $0080,$1F80, $1F80,$1F80, $1F80,$0080 ); + TxtMarble: array[ 0..7 ] of word = ( + $0080,$8080, $0080,$FD80, $7F80,$FD80, $7F80,$8080 ); +type + T2DPoint = record + X, Y: integer; + end; + TTexture = record + Desc : array[ 0..3 ] of record X, Y: word end; + Width : word; + Data : pointer; + end; + TQuad = record + Vtx : array[ 0..3 ] of word; + Texture: word; + end; + TCube = record + Face : array[ 0..5 ] of TQuad; + Base : integer; + end; +var + Vtx, XVtx: array[ 0..MAXVTX ] of TPoint; + VVtx : array[ 0..MAXVTX ] of T2DPoint; + Cube : array[ 0..MAXCUB ] of TCube; + ZList : array[ 0..MAXCUB ] of integer; + VtxCnt : word; + Txts : array[ 0..MAXTXT ] of TTexture; + Page : word; + Palette : array[ byte ] of record R, G, B: byte; end; + TxtDat1, TxtDat2: pointer; + +(* Add a new entry to the vertex array *) +procedure AddVtx( PX, PY, PZ: longint ); +begin + with Vtx[VtxCnt] do begin X:=PX*$10000; Y:=PY*$10000; Z:=PZ*$10000; end; + Inc( VtxCnt ); +end; + +procedure MakeCube( var C: TCube; X1,Y1,Z1, X2,Y2,Z2, TX,TY,TZ, Texture: integer ); +const + FaceIdx: array[ 0..23 ] of integer = ( + 0,1,2,3, 0,4,5,1, 1,5,6,2, 2,6,7,3, 3,7,4,0, 6,5,4,7 ); +var + I, VC: integer; +begin + VC := VtxCnt; + C.Base := VC; + AddVtx( X1+TX, Y1+TY, Z1+TZ ); + AddVtx( X2+TX, Y1+TY, Z1+TZ ); + AddVtx( X2+TX, Y2+TY, Z1+TZ ); + AddVtx( X1+TX, Y2+TY, Z1+TZ ); + AddVtx( X1+TX, Y1+TY, Z2+TZ ); + AddVtx( X2+TX, Y1+TY, Z2+TZ ); + AddVtx( X2+TX, Y2+TY, Z2+TZ ); + AddVtx( X1+TX, Y2+TY, Z2+TZ ); + for I:=0 to 23 do C.Face[I shr 2].Vtx[I and 3] := VC+FaceIdx[I]; + for I:=0 to 5 do C.Face[I].Texture := Texture; +end; + +procedure MakeTexture( Idx: integer; var VtxData ); +var + P: ^word; + I: integer; +begin + P := @VtxData; + with Txts[Idx] do begin + for I:=0 to 3 do begin + Desc[I].X := P^; Inc( P ); + Desc[I].Y := P^; Inc( P ); + end; + Width := 129; + Data := TxtDat1; + end; +end; + +procedure Init; +var + I: integer; + V: integer; + F: file; + P: array[ 1..768 ] of byte; +begin + (* Initialize objects *) + VtxCnt := 0; + MakeCube( Cube[0], -64,-64,8, 64,64,-8, 0,0,0, 1 ); (* Sundial *) + Cube[0].Face[0].Texture := 0; + V := VtxCnt; + MakeCube( Cube[1], -16,-16,16, 16,16,-16, 0,0,0, 2 ); (* Sapphire *) + tdSetTranslation( Trans ); + tdSetRotation( 32, 32, 00 ); + tdRotate( Vtx[V], XVtx[V], 8 ); (* Got to rotate this cube *) + for I:=V to V+7 do begin + Vtx[I].X := XVtx[I].X; + Vtx[I].Y := XVtx[I].Y; + Vtx[I].Z := XVtx[I].Z + 100*$10000; + end; + MakeCube( Cube[2], -64,-4,48, 64,4,-48, 0,68,56, 1 ); (* Marble *) + (* Load texture and palette *) + Assign( F, 'DEMO04.DAT' ); + Reset( F, 1 ); + BlockRead( F, P, SizeOf(P) ); + mxSetPalette( @P, 0, 256 ); + GetMem( TxtDat1, 63*1024 ); + BlockRead( F, TxtDat1^, 129*286 ); + Close( F ); + TxtDat2 := Ptr( Seg(TxtDat1^), Ofs(TxtDat1^)+129*254 ); + (* Init textures *) + MakeTexture( 0, TxtSundial ); + MakeTexture( 1, TxtMarble ); + MakeTexture( 2, TxtSapphire ); + Txts[2].Data := TxtDat2; +end; + +(* Sort procedure, not worth optimizing with only a few objects *) +procedure SortObjects; +var + I, J, K: integer; + ZMax: array[ 0..MAXCUB ] of longint; + ZI: integer; + L: longint; +begin + for I:=0 to MAXCUB do begin + L := XVtx[Cube[I].Base].Z; + for J:=1 to 7 do + if( L > XVtx[Cube[I].Base+J].Z ) then L := XVtx[Cube[I].Base+J].Z; + ZMax[I] := L; + ZList[I] := I; + end; + for I:=0 to MAXCUB-1 do begin + ZI := I; + for J:=I+1 to MAXCUB do + if( ZMax[ZList[J]] > ZMax[ZList[ZI]] ) then ZI := J; + if( ZI <> I ) then begin + K := ZList[I]; + ZList[I] := ZList[ZI]; + ZList[ZI] := K; + end; + end; +end; + +var + AX, AY, AZ: byte; + I, J, K: word; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + (* Init 3D transforms, perspective is intentionally exaggerated *) + AX := 0; AY := 0; AZ := 0; + tdSetTranslation( Trans ); + tdSetPerspective( 600*$10000, $10000, $10000 ); + (* Main loop, all magic here! *) + while( not KeyPressed ) do begin + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx, XVtx, VtxCnt ); (* 3D transform points *) + tdTransformToImage( XVtx, VVtx, VtxCnt, 160, 120+Page ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 2 ); + Inc( AZ, 1 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + (* Draw objects *) + SortObjects; + for I:=0 to MAXCUB do with Cube[ZList[I]] do begin + for J:=0 to 5 do begin + K := Face[J].Texture; + mxTexturePoly( 4, Face[J].Vtx, VVtx, Txts[K].Desc, Txts[K].Data^, Txts[K].Width ); + end; + end; + (* Flip page: at 320x240 the Start Address Register Low is always zero *) + case Page of + 0 : begin PortW[$3D4] := $000C; Page := 240; end; + 240: begin PortW[$3D4] := $4B0C; Page := 480; end; + 480: begin PortW[$3D4] := $960C; Page := 0; end; + end; + mxWaitRetrace; (* If the frame rate seems low, try to remove this line *) + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x_/modex/DEMO05.EXE b/16/x_/modex/DEMO05.EXE new file mode 100755 index 0000000000000000000000000000000000000000..21a7c207f7134ed187a08530637509b96b37b19e GIT binary patch literal 22528 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 CoI~RP literal 0 HcmV?d00001 diff --git a/16/x_/modex/DEMO05.PAS b/16/x_/modex/DEMO05.PAS new file mode 100755 index 00000000..819c5cf3 --- /dev/null +++ b/16/x_/modex/DEMO05.PAS @@ -0,0 +1,131 @@ +(* + DEMO05 - A Gouraud-shaded rotating torus + (c) 1994 Alessandro Scotti +*) +uses Crt, Modex, Threed; + +(* Define ALTPAL for alternate palette *) +{$define ALTPAL} + +const + MAXVTX1 = 15; RADIUS1 = 70; (* MAXVTX1+1 must be multiple of 4 *) + MAXVTX2 = 15; RADIUS2 = 30; + MAXVTX = (MAXVTX1+1)*(MAXVTX2+1)-1; + MAXFACE = MAXVTX; + Trans : TPoint = ( X:0; Y:0; Z:0 ); (* Object translation *) + Light : TPoint = ( X:0; Y:0; Z:-63*$10000 ); (* Light direction *) +type + TQuad = record + QVtx : array[ 0..3 ] of integer; + end; +var + Vtx, XVtx : array[ 0..MAXVTX ] of TPoint; (* Points *) + VVtx : array[ 0..MAXVTX ] of record X, Y: integer end; + Face : array[ 0..MAXFACE ] of TQuad; (* Polys *) + Culled : array[ 0..MAXFACE ] of integer; + GNrm,XGNrm: array[ 0..MAXVTX ] of TVector; (* Gouraud normals *) + VtxLight : array[ 0..MAXVTX ] of integer; (* Points brightness *) + Page : word; + +function GetVtx( I1, I2: integer ): integer; +begin + GetVtx := (I1 mod (MAXVTX1+1))*(MAXVTX2+1) + I2 mod (MAXVTX2+1); +end; + +procedure Init; +var + R, N, X, Y, Z: real; + I, J, K, V: integer; +begin + (* Build vertexes *) + for I:=0 to MAXVTX1 do begin + K := (I + (MAXVTX1+1) shr 2) mod (MAXVTX1+1); + R := RADIUS1 + RADIUS2*Cos( 2*K*Pi / (MAXVTX1+1) ); + for J:=0 to MAXVTX2 do begin + V := I*(MAXVTX2+1)+J; (* Index of current vertex *) + (* Compute coordinates of current vertex *) + X := R*Cos(2*J*Pi / (MAXVTX2+1)); (* Get coordinates *) + Y := R*Sin(2*J*Pi / (MAXVTX2+1)); + Z := RADIUS2*Sin(2*K*Pi / (MAXVTX1+1)); + Vtx[V].X := Round( X )*$10000; (* Save coordinates *) + Vtx[V].Y := Round( Y )*$10000; + Vtx[V].Z := Round( Z )*$10000; + (* Compute direction of Gouraud normal thru current vertex *) + X := X - RADIUS1*Cos(2*J*Pi / (MAXVTX2+1)); + Y := Y - RADIUS1*Sin(2*J*Pi / (MAXVTX2+1)); + N := Sqrt( X*X + Y*Y + Z*Z ); (* Get vector length *) + GNrm[V].X := Trunc( X*$10000/N ); (* Save normal vector *) + GNrm[V].Y := Trunc( Y*$10000/N ); + GNrm[V].Z := Trunc( Z*$10000/N ); + end; + end; + (* Generate faces so that depth-sorting is not needed: there are still *) + (* some *very* little errors, but this is the best I could devise *) + J := 0; + K := 0; + for I:=0 to MAXFACE do with Face[I] do begin + QVtx[0] := GetVtx( J, K ); + QVtx[1] := GetVtx( J, K+1 ); + QVtx[2] := GetVtx( J+1, K+1 ); + QVtx[3] := GetVtx( J+1, K ); + Inc( K ); + if( K > MAXVTX2 ) then begin + K := 0; + Inc( J ); + end; + end; +{$ifndef ALTPAL} + for I:=0 to 63 do mxSetColor( I+64, 0, 0, I ); (* Blue palette *) +{$else} + for I:=0 to 31 do mxSetColor(I+64, 0, I shl 1, 0); (* Green neon palette *) + for I:=32 to 63 do mxSetColor ( I+64, (I-32) shl 1, 63, (I-32) shl 1 ); +{$endif} +end; + +var + AX, AY, AZ: byte; + I: word; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + AX := 0; + AY := 0; + AZ := 0; + (* Init 3D transforms, perspective is intentionally exaggerated *) + tdSetTranslation( Trans ); + tdSetLight( Light ); + tdSetPerspective( 400*$10000, $10000, $10000 ); + (* Main loop, all magic here! *) + while( not KeyPressed ) do begin + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx, XVtx, MAXVTX+1 ); (* 3D transform points *) + tdTransformToImage( XVtx, VVtx, MAXVTX+1, 160, 120+Page ); + tdRotate( GNrm, XGNrm, MAXVTX+1 ); (* Rotate Gouraud normals *) + tdTransformLight( XGNrm, VtxLight, MAXVTX+1 ); + (* Backplane culling is not really needed here! *) + FillChar( Culled, SizeOf(Culled), 0 ); + tdBackPlaneCull( Face, XVtx, Culled, MAXFACE+1, SizeOf(TQuad) ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 2 ); + Inc( AZ, 3 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + (* Draw polygons *) + for I:=0 to MAXFACE do with Face[I] do + if( Culled[I] >= 0 ) then mxGouraudPoly( 4, QVtx, VVtx, VtxLight, 64 ); + (* Flip page: at 320x240 the Start Address Register Low is always zero *) + case Page of + 0 : begin PortW[$3D4] := $000C; Page := 240; end; + 240: begin PortW[$3D4] := $4B0C; Page := 480; end; + 480: begin PortW[$3D4] := $960C; Page := 0; end; + end; + mxWaitRetrace; (* Uncomment this instruction if screen flickers *) + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x_/modex/DEMO06.DAT b/16/x_/modex/DEMO06.DAT new file mode 100755 index 0000000000000000000000000000000000000000..1ac2c2bb8f8c79a7cf1f3c968f75e8e5ac8cd705 GIT binary patch literal 77568 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 P3zel81wBCVexm$;I2yv& literal 0 HcmV?d00001 diff --git a/16/x_/modex/DEMO06.EXE b/16/x_/modex/DEMO06.EXE new file mode 100755 index 0000000000000000000000000000000000000000..f1308e8a536aa9d3d4574566fd018d698d5ef784 GIT binary patch literal 10864 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 G@BaZ%)XT^K literal 0 HcmV?d00001 diff --git a/16/x_/modex/DEMO06.PAS b/16/x_/modex/DEMO06.PAS new file mode 100755 index 00000000..f26af067 --- /dev/null +++ b/16/x_/modex/DEMO06.PAS @@ -0,0 +1,135 @@ +(* + DEMO06 - Magnifying glass + (c) 1994 Alessandro Scotti +*) +uses Crt, Modex; + +const + R = 40; (* Lens radius *) + K : real = 1.8; (* Magnifying factor, less makes a stronger lens *) +type + TLine = array[ 0..319 ] of byte; + PLine = ^TLine; + TScreen = array[ 0..239 ] of PLine; +var + VScreen: TScreen; (* Virtual screen *) + BallX : array[ 0..R, 0..R ] of integer; + BallY : array[ 0..R, 0..R ] of integer; + Sprite : array[ -R..R, -R..R ] of byte; + Page : word; + +(* Returns "lens-view" coordinates of X,Y *) +procedure GetCoords( var X, Y: integer ); +var + LR, Z, SinA, SinB, TgB, Q: real; +begin + LR := Sqrt( X*X + Y*Y ); + if( LR = 0 ) then Exit; + if( LR < R ) then begin + Z := Sqrt( R*R - LR*LR ); + SinA := LR / R; + SinB := SinA / K; + TgB := SinB / Sqrt( 1-SinB*SinB ); + Q := LR - TgB*Z; + X := Round( X * ( Q/LR ) ); + Y := Round( Y * ( Q/LR ) ); + end; +end; + +procedure Init; +var + F : file; + Palette: array[ 0..767 ] of record R, G, B: byte; end; + X, Y, + X2, Y2 : integer; +begin + (* Load background image *) + Assign( F, 'demo06.dat' ); + Reset( F, 1 ); + BlockRead( F, Palette, 768 ); + mxSetPalette( @Palette, 0, 256 ); + for Y:=0 to 239 do begin + New( VScreen[Y] ); + BlockRead( F, VScreen[Y]^, 320 ); + mxPutImage( VScreen[Y], 0, 480+Y, 320, 1, OP_MOVE ); + end; + Close( F ); + (* Build lens *) + for X:=0 to R do begin + for Y:=0 to R do begin + X2 := X; + Y2 := Y; + GetCoords( X2, Y2 ); + BallX[X, Y] := X2; + BallY[X, Y] := Y2; + end; + end; +end; + +procedure PutLens( OX, OY: integer ); +var + X, Y: integer; +begin + for X:=0 to R do begin + for Y:=0 to R do begin + Sprite[Y][X] := VScreen[ OY+BallY[X,Y] ]^[ OX+BallX[X,Y] ]; + Sprite[Y][-X] := VScreen[ OY+BallY[X,Y] ]^[ OX-BallX[X,Y] ]; + Sprite[-Y][X] := VScreen[ OY-BallY[X,Y] ]^[ OX+BallX[X,Y] ]; + Sprite[-Y][-X] := VScreen[ OY-BallY[X,Y] ]^[ OX-BallX[X,Y] ]; + end; + end; + (* Draw the sprite *) + mxPutImage( @Sprite, OX-R, OY-R+Page, 2*R+1, 2*R+1, OP_MOVE ); +end; + +function Delta: integer; +begin + Delta := Random(3)+2; +end; + +procedure Check( Cond: boolean; var Coord, DeltaC: integer; NewCoord, Sign: integer ); +begin + if( Cond ) then begin + Coord := NewCoord; + DeltaC := Sign*Delta; + end; +end; + +var + X, Y, DX, DY: integer; + C: char; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; + X := R; + Y := R; + Randomize; + DX := Delta; + DY := Delta; + + (* Main loop *) + repeat + (* Update video *) + mxBitBlt( 0, 480, 320, 240, 0, Page ); + PutLens( X, Y ); + mxCircle( X, Page+Y, R, 0 ); + (* Update lens coordinates *) + Inc( X, DX ); + Check( X+R >= 319, X, DX, 319-R, -1 ); + Check( X <= R, X, DX, R, +1 ); + Inc( Y, DY ); + Check( Y+R >= 239, Y, DY, 239-R, -1 ); + Check( Y <= R, Y, DY, R, +1 ); + (* Flip pages: double buffering, avoid wait for display *) + case Page of + 0 : begin PortW[$3D4] := $000C; Page := 240; end; + 240: begin PortW[$3D4] := $4B0C; Page := 0; end; + end; + mxWaitRetrace; (* Wait for hidden page to show *) + until( KeyPressed ); + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x_/modex/DEMO07.EXE b/16/x_/modex/DEMO07.EXE new file mode 100755 index 0000000000000000000000000000000000000000..8a401169bba312a0d668452c9df6086505c394a8 GIT binary patch literal 7440 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 639, X, DX, 319, -1 ); + Check( X < 0, X, DX, 0, +1 ); + Inc( Y, DY ); + Check( Y+200 >= 399, Y, DY, 199, -1 ); + Check( Y < 0, Y, DY, 0, +1 ); + mxPan( X, Y ); + mxWaitRetrace; + end; + + (* Shutdown *) + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x_/modex/MATH.INC b/16/x_/modex/MATH.INC new file mode 100755 index 00000000..742af410 --- /dev/null +++ b/16/x_/modex/MATH.INC @@ -0,0 +1,34 @@ +; +; MATH.INC - Include file for THREED.ASM +; + +; 3-dimensional point, coordinates in fixed format (16:16) +; +TPOINT STRUC + X DD ? + Y DD ? + Z DD ? +TPOINT ENDS + +; 2-dimensional point, coordinates in integer format +; +TIMAGEPOINT STRUC + IX DW ? + IY DW ? +TIMAGEPOINT ENDS + +; Fixed-point divide: EAX = EAX / arg +; +.xdiv MACRO arg + xor edx, edx + shld edx, eax, 16 + shl eax, 16 + idiv arg +ENDM + +; Fixed-point multiply: EAX = EAX * arg +; +.xmul MACRO arg + imul arg + shrd eax, edx, 16 +ENDM diff --git a/16/x_/modex/PLASMA.PAS b/16/x_/modex/PLASMA.PAS new file mode 100755 index 00000000..237e292a --- /dev/null +++ b/16/x_/modex/PLASMA.PAS @@ -0,0 +1,103 @@ +unit Plasma; +interface + +const + PAL_RGB = 0; + PAL_CLOUDS = 1; + PAL_LANDSCAPE = 2; + +procedure MakePlasma( X, Y: integer; W, H: word; C1, C2, C3, C4: byte ); +procedure MakePlasmaPalette( var Palette; What: word ); + +implementation uses Modex; + +procedure NewColor( XA, YA, X, Y, XB, YB: integer ); +var + Color: longint; +begin + Color := Abs( XA-XB )+Abs( YA-YB ); + Color := Random( Color shl 1 )-Color; + Color := (Color+mxGetPixel( XA, YA )+mxGetPixel( XB, YB )+1) shr 1; + if( Color < 1 ) then Color := 1; + if( Color > 192 ) then Color := 192; + if( mxGetPixel( X, Y ) = 0 ) then + mxPutPixel( X, Y, Lo(Color) ); +end; + +procedure Divide( X1, Y1, X2, Y2: integer ); +var + X, Y, Color: integer; +begin + if not( (X2-X1<2)and(Y2-Y1<2) ) then begin + X := (X1+X2) shr 1; + Y := (Y1+Y2) shr 1; + NewColor( X1, Y1, X, Y1, X2, Y1 ); + NewColor( X2, Y1, X2, Y, X2, Y2 ); + NewColor( X1, Y2, X, Y2, X2, Y2 ); + NewColor( X1, Y1, X1, Y, X1, Y2 ); + Color := (mxGetPixel( X1, Y1 )+mxGetPixel( X2, Y1 )+ + mxGetPixel( X2, Y2 )+mxGetPixel( X1, Y2 )) shr 2; + mxPutPixel( X, Y, Color ); + Divide( X1, Y1, X, Y ); + Divide( X, Y1, X2, Y ); + Divide( X, Y, X2, Y2 ); + Divide( X1, Y, X, Y2 ); + end; +end; + +procedure MakePlasma; +begin + Dec( W ); + Dec( H ); + mxPutPixel( X, Y, C1 ); + mxPutPixel( X, Y+H, C2 ); + mxPutPixel( X+W, Y+H, C3 ); + mxPutPixel( X+W, Y, C4 ); + Divide( X, Y, X+W, Y+H ); +end; + +procedure MakePlasmaPalette; +type + TPal = array[ byte ] of record R, G, B: byte end; +var + I: word; +begin + FillChar( TPal(Palette)[1], 192*3, 0 ); + case What of + PAL_CLOUDS: + for I:=1 to 192 do begin + TPal(Palette)[I].R := Abs( I-96 )*63 div 96; + TPal(Palette)[I].G := Abs( I-96 )*63 div 96; + TPal(Palette)[I].B := 63; + end; + PAL_LANDSCAPE: + begin + for I:=0 to 31 do begin + TPal(Palette)[I+1].R := I; + TPal(Palette)[I+1].G := I; + TPal(Palette)[I+1].B := I + I shr 1+15; + end; + for I:=32 to 63 do begin + TPal(Palette)[I+1].R := 0; + TPal(Palette)[I+1].G := I; + TPal(Palette)[I+1].B := 0; + end; + for I:=64 to 191 do begin + TPal(Palette)[I+1].R := (I-64) div 3 + 15; + TPal(Palette)[I+1].G := (I-64) div 3 + 15; + TPal(Palette)[I+1].B := (I-64) div 3 + 15; + end; + end; + else + for I:=1 to 64 do begin + TPal(Palette)[I].G := I-1; + TPal(Palette)[I].B := 64-I; + TPal(Palette)[I+64].R := I-1; + TPal(Palette)[I+64].G := 64-I; + TPal(Palette)[I+128].B := I-1; + TPal(Palette)[I+128].R := 64-I; + end; + end; +end; + +end. \ No newline at end of file diff --git a/16/x_/modex/QIX2.EXE b/16/x_/modex/QIX2.EXE new file mode 100755 index 0000000000000000000000000000000000000000..a10d7db5a0a62654c70c632d8ce6b078a520613c GIT binary patch literal 10336 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 DJ^3nG literal 0 HcmV?d00001 diff --git a/16/x_/modex/QIX2.PAS b/16/x_/modex/QIX2.PAS new file mode 100755 index 00000000..d1b59791 --- /dev/null +++ b/16/x_/modex/QIX2.PAS @@ -0,0 +1,210 @@ +{$E-,N+} +uses Crt, Modex; + +const + DEFVERT = 12; (* Vertex count *) + DEFREPL = 3; (* Repetition count *) + DEFQIXS = 2; (* Qixs *) + FADESPEED = 48; +type + TPoint = record + X, Y : integer; + end; + TRGB = record + R, G, B: byte; + end; + TQix = record + Color: integer; + Vert : array[ 0..DEFVERT-1, 0..DEFREPL-1 ] of TPoint; + Delta: array[ 0..DEFVERT-1 ] of TPoint; + end; +var + Page : integer; + MaxX, + MaxY : word; + Qix : array[ 0..DEFQIXS-1 ] of TQix; + Pal : array[ byte ] of TRGB; + +type + TReal = double; + TRPoint = record + X, Y: TReal; + end; + TMatrix = array[ 0..3, 0..3 ] of TReal; +var + M: TMatrix; + G: array[ 0..DEFVERT-1 ] of TRPoint; + C: array[ 0..DEFVERT-1 ] of TRPoint; + +procedure BumpPal( Idx, DR, DG, DB, Steps: integer ); +var + I: integer; +begin + for I:=1 to Steps do begin + Pal[Idx+1].R := Pal[Idx].R + DR; + Pal[Idx+1].G := Pal[Idx].G + DG; + Pal[Idx+1].B := Pal[Idx].B + DB; + Inc( Idx ); + end; +end; + +procedure InitPalette; +begin + with Pal[0] do begin R:=0; G:=0; B:=0; end; + with Pal[1] do begin R:=0; G:=0; B:=62; end; + BumpPal( 1, 0, 2, -2, 31 ); + BumpPal( 32, 2, -2, 0, 31 ); + BumpPal( 63, -2, 2, 2, 31 ); + BumpPal( 94, 2, 0, -2, 31 ); + BumpPal( 125, -2, -2, 2, 31 ); +end; + +procedure Init( var Qix: TQix; Color: integer ); +var + I: integer; +begin + FillChar( Qix.Vert, SizeOf(Qix.Vert), 0 ); + for I:=0 to DEFVERT-1 do begin + Qix.Vert[I, DEFREPL-1].X := Random( MaxX ); + Qix.Vert[I, DEFREPL-1].Y := Random( MaxY ); + Qix.Delta[I].X := Random(5)+1; + Qix.Delta[I].Y := Random(5)+1; + end; + Qix.Color := Color; + + (* Initialize matrix (Catmull-Rom) *) + M[0,0] := -1/2; M[0,1] := 3/2; M[0,2] := -3/2; M[0,3] := 1/2; + M[1,0] := 1; M[1,1] := -5/2; M[1,2] := 2; M[1,3] := -1/2; + M[2,0] := -1/2; M[2,1] := 0; M[2,2] := 1/2; M[2,3] := 0; + M[3,0] := 0; M[3,1] := 1; M[3,2] := 0; M[3,3] := 0; +end; + +procedure mxBezier( var Qix: TQix; I0, Idx, N: integer ); +var + I, J: integer; + T, T2, T3: TReal; + X0, Y0, X, Y: TReal; + Delta: TReal; +begin + (* Compute coefficients *) + for I:=0 to 3 do begin + C[I].X := 0; + for J:=0 to 3 do C[I].X := C[I].X + M[I,J]*Qix.Vert[(I0+J) mod DEFVERT,Idx].X; + C[I].Y := 0; + for J:=0 to 3 do C[I].Y := C[I].Y + M[I,J]*Qix.Vert[(I0+J) mod DEFVERT,Idx].Y; + end; + X0 := C[3].X; + Y0 := C[3].Y; + Delta := 1 / N; + T := 0; + for I:=1 to N do begin + T := T + Delta; + T2 := T*T; + T3 := T*T2; + X := C[0].X*T3 + C[1].X*T2 + C[2].X*T + C[3].X; + Y := C[0].Y*T3 + C[1].Y*T2 + C[2].Y*T + C[3].Y; + mxLine( Round(X0), Page+Round(Y0), Round(X), Page+Round(Y), Qix.Color, OP_SET ); + X0 := X; + Y0 := Y; + end; +end; + +procedure Plot( var Qix: TQix; Idx: integer ); +var + I, J: integer; +begin + for I:=0 to DEFVERT-1 do begin + mxBezier( Qix, I, Idx, 12 ); + end; +end; + +procedure Update( var Qix: TQix; Idx: integer ); +var + I: integer; +begin + for I:=0 to DEFVERT-1 do with Qix do begin + Inc( Vert[I,Idx].X, Delta[I].X ); + if( Vert[I,Idx].X < 0 ) then begin + Vert[I,Idx].X := 0; + Delta[I].X := Random( 5 )+1; + end; + if( Vert[I,Idx].X > MaxX ) then begin + Vert[I,Idx].X := MaxX; + Delta[I].X := -Random( 5 )-1; + end; + Inc( Vert[I,Idx].Y, Delta[I].Y ); + if( Vert[I,Idx].Y < 0 ) then begin + Vert[I,Idx].Y := 0; + Delta[I].Y := Random( 5 )+1; + end; + if( Vert[I,Idx].Y > MaxY ) then begin + Vert[I,Idx].Y := MaxY; + Delta[I].Y := -Random( 5 )-1; + end; + end; +end; + +procedure Copy( var Qix: TQix; Dest, Src: integer ); +var + I: integer; +begin + for I:=0 to DEFVERT-1 do with Qix do begin + Vert[I,Dest].X := Vert[I,Src].X; + Vert[I,Dest].Y := Vert[I,Src].Y; + end; +end; + +procedure AnimateQix; +var + Q, Idx, I, J, P, Count: integer; +begin + Count := 0; + P := DEFREPL-1; + I := 0; + J := 1; + repeat + mxSetClipRegion( 0, Page, MaxX+1, MaxY+1 ); + mxSetClip( TRUE ); + mxFillBox( 0, Page, MaxX+1, MaxY+1, 0, OP_SET ); + for Q:=0 to DEFQIXS-1 do begin + Copy( Qix[Q], I, P ); + Update( Qix[Q], I ); + for Idx:=0 to DEFREPL-1 do begin + Plot( Qix[Q], Idx ); + end; + end; + I := (I+1) mod DEFREPL; + J := (J+1) mod DEFREPL; + P := (P+1) mod DEFREPL; + Inc( Count ); + mxStartLine( Page ); + if( Count >= FADESPEED ) then begin + for Q:=0 to DEFQIXS-1 do begin + Inc( Qix[Q].Color ); + if( Qix[Q].Color > 156 ) then + Qix[Q].Color := 1; + end; + Count := 0; + end; + Page := 240-Page; + until( KeyPressed ); +end; + +var + I: integer; +begin + Randomize; + mxInit; + mxSetMode( MX_320x240 ); + mxGetScreenSize( MaxX, MaxY ); + for I:=0 to DEFQIXS-1 do + Init( Qix[I], (I*(155 div DEFQIXS)) mod 155 + 1 ); + InitPalette; + mxSetPalette( @Pal, 0, 157 ); + Page := 240; + Dec( MaxX ); + Dec( MaxY ); + AnimateQix; + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x_/modex/README.TXT b/16/x_/modex/README.TXT new file mode 100755 index 00000000..306e8b9a --- /dev/null +++ b/16/x_/modex/README.TXT @@ -0,0 +1,8 @@ +ModeX - A graphical library for DOS programs +Copyright (c) 1993-1994 Alessandro Scotti +http://www.ascotti.org/ + +Please look at the above site in the "Art of..." and +then in the "Old programs" section for more information. + + diff --git a/16/x_/modex/SINCOS.INC b/16/x_/modex/SINCOS.INC new file mode 100755 index 00000000..6986eeeb --- /dev/null +++ b/16/x_/modex/SINCOS.INC @@ -0,0 +1,518 @@ +; +; SINCOS.INC - Sin/cos tables for THREED.ASM +; + +tblSin LABEL DWORD + DD 0 + DD 411733 + DD 823219 + DD 1234209 + DD 1644455 + DD 2053710 + DD 2461729 + DD 2868265 + DD 3273072 + DD 3675909 + DD 4076531 + DD 4474698 + DD 4870169 + DD 5262706 + DD 5652074 + DD 6038037 + DD 6420363 + DD 6798821 + DD 7173184 + DD 7543226 + DD 7908725 + DD 8269459 + DD 8625213 + DD 8975771 + DD 9320922 + DD 9660458 + DD 9994176 + DD 10321873 + DD 10643353 + DD 10958422 + DD 11266890 + DD 11568571 + DD 11863283 + DD 12150850 + DD 12431097 + DD 12703856 + DD 12968963 + DD 13226258 + DD 13475586 + DD 13716797 + DD 13949745 + DD 14174291 + DD 14390298 + DD 14597637 + DD 14796184 + DD 14985817 + DD 15166424 + DD 15337895 + DD 15500126 + DD 15653022 + DD 15796488 + DD 15930439 + DD 16054795 + DD 16169479 + DD 16274424 + DD 16369565 + DD 16454846 + DD 16530216 + DD 16595628 + DD 16651044 + DD 16696429 + DD 16731757 + DD 16757007 + DD 16772163 + DD 16777216 + DD 16772163 + DD 16757007 + DD 16731757 + DD 16696429 + DD 16651044 + DD 16595628 + DD 16530216 + DD 16454846 + DD 16369565 + DD 16274424 + DD 16169479 + DD 16054795 + DD 15930439 + DD 15796488 + DD 15653022 + DD 15500126 + DD 15337895 + DD 15166424 + DD 14985817 + DD 14796184 + DD 14597637 + DD 14390298 + DD 14174291 + DD 13949745 + DD 13716797 + DD 13475586 + DD 13226258 + DD 12968963 + DD 12703856 + DD 12431097 + DD 12150850 + DD 11863283 + DD 11568571 + DD 11266890 + DD 10958422 + DD 10643353 + DD 10321873 + DD 9994176 + DD 9660458 + DD 9320922 + DD 8975771 + DD 8625213 + DD 8269459 + DD 7908725 + DD 7543226 + DD 7173184 + DD 6798821 + DD 6420363 + DD 6038037 + DD 5652074 + DD 5262706 + DD 4870169 + DD 4474698 + DD 4076531 + DD 3675909 + DD 3273072 + DD 2868265 + DD 2461729 + DD 2053710 + DD 1644455 + DD 1234209 + DD 823219 + DD 411733 + DD 0 + DD -411733 + DD -823219 + DD -1234209 + DD -1644455 + DD -2053710 + DD -2461729 + DD -2868265 + DD -3273072 + DD -3675909 + DD -4076531 + DD -4474698 + DD -4870169 + DD -5262706 + DD -5652074 + DD -6038037 + DD -6420363 + DD -6798821 + DD -7173184 + DD -7543226 + DD -7908725 + DD -8269459 + DD -8625213 + DD -8975771 + DD -9320922 + DD -9660458 + DD -9994176 + DD -10321873 + DD -10643353 + DD -10958422 + DD -11266890 + DD -11568571 + DD -11863283 + DD -12150850 + DD -12431097 + DD -12703856 + DD -12968963 + DD -13226258 + DD -13475586 + DD -13716797 + DD -13949745 + DD -14174291 + DD -14390298 + DD -14597637 + DD -14796184 + DD -14985817 + DD -15166424 + DD -15337895 + DD -15500126 + DD -15653022 + DD -15796488 + DD -15930439 + DD -16054795 + DD -16169479 + DD -16274424 + DD -16369565 + DD -16454846 + DD -16530216 + DD -16595628 + DD -16651044 + DD -16696429 + DD -16731757 + DD -16757007 + DD -16772163 + DD -16777216 + DD -16772163 + DD -16757007 + DD -16731757 + DD -16696429 + DD -16651044 + DD -16595628 + DD -16530216 + DD -16454846 + DD -16369565 + DD -16274424 + DD -16169479 + DD -16054795 + DD -15930439 + DD -15796488 + DD -15653022 + DD -15500126 + DD -15337895 + DD -15166424 + DD -14985817 + DD -14796184 + DD -14597637 + DD -14390298 + DD -14174291 + DD -13949745 + DD -13716797 + DD -13475586 + DD -13226258 + DD -12968963 + DD -12703856 + DD -12431097 + DD -12150850 + DD -11863283 + DD -11568571 + DD -11266890 + DD -10958422 + DD -10643353 + DD -10321873 + DD -9994176 + DD -9660458 + DD -9320922 + DD -8975771 + DD -8625213 + DD -8269459 + DD -7908725 + DD -7543226 + DD -7173184 + DD -6798821 + DD -6420363 + DD -6038037 + DD -5652074 + DD -5262706 + DD -4870169 + DD -4474698 + DD -4076531 + DD -3675909 + DD -3273072 + DD -2868265 + DD -2461729 + DD -2053710 + DD -1644455 + DD -1234209 + DD -823219 + DD -411733 +tblCos LABEL DWORD + DD 16777216 + DD 16772163 + DD 16757007 + DD 16731757 + DD 16696429 + DD 16651044 + DD 16595628 + DD 16530216 + DD 16454846 + DD 16369565 + DD 16274424 + DD 16169479 + DD 16054795 + DD 15930439 + DD 15796488 + DD 15653022 + DD 15500126 + DD 15337895 + DD 15166424 + DD 14985817 + DD 14796184 + DD 14597637 + DD 14390298 + DD 14174291 + DD 13949745 + DD 13716797 + DD 13475586 + DD 13226258 + DD 12968963 + DD 12703856 + DD 12431097 + DD 12150850 + DD 11863283 + DD 11568571 + DD 11266890 + DD 10958422 + DD 10643353 + DD 10321873 + DD 9994176 + DD 9660458 + DD 9320922 + DD 8975771 + DD 8625213 + DD 8269459 + DD 7908725 + DD 7543226 + DD 7173184 + DD 6798821 + DD 6420363 + DD 6038037 + DD 5652074 + DD 5262706 + DD 4870169 + DD 4474698 + DD 4076531 + DD 3675909 + DD 3273072 + DD 2868265 + DD 2461729 + DD 2053710 + DD 1644455 + DD 1234209 + DD 823219 + DD 411733 + DD 0 + DD -411733 + DD -823219 + DD -1234209 + DD -1644455 + DD -2053710 + DD -2461729 + DD -2868265 + DD -3273072 + DD -3675909 + DD -4076531 + DD -4474698 + DD -4870169 + DD -5262706 + DD -5652074 + DD -6038037 + DD -6420363 + DD -6798821 + DD -7173184 + DD -7543226 + DD -7908725 + DD -8269459 + DD -8625213 + DD -8975771 + DD -9320922 + DD -9660458 + DD -9994176 + DD -10321873 + DD -10643353 + DD -10958422 + DD -11266890 + DD -11568571 + DD -11863283 + DD -12150850 + DD -12431097 + DD -12703856 + DD -12968963 + DD -13226258 + DD -13475586 + DD -13716797 + DD -13949745 + DD -14174291 + DD -14390298 + DD -14597637 + DD -14796184 + DD -14985817 + DD -15166424 + DD -15337895 + DD -15500126 + DD -15653022 + DD -15796488 + DD -15930439 + DD -16054795 + DD -16169479 + DD -16274424 + DD -16369565 + DD -16454846 + DD -16530216 + DD -16595628 + DD -16651044 + DD -16696429 + DD -16731757 + DD -16757007 + DD -16772163 + DD -16777216 + DD -16772163 + DD -16757007 + DD -16731757 + DD -16696429 + DD -16651044 + DD -16595628 + DD -16530216 + DD -16454846 + DD -16369565 + DD -16274424 + DD -16169479 + DD -16054795 + DD -15930439 + DD -15796488 + DD -15653022 + DD -15500126 + DD -15337895 + DD -15166424 + DD -14985817 + DD -14796184 + DD -14597637 + DD -14390298 + DD -14174291 + DD -13949745 + DD -13716797 + DD -13475586 + DD -13226258 + DD -12968963 + DD -12703856 + DD -12431097 + DD -12150850 + DD -11863283 + DD -11568571 + DD -11266890 + DD -10958422 + DD -10643353 + DD -10321873 + DD -9994176 + DD -9660458 + DD -9320922 + DD -8975771 + DD -8625213 + DD -8269459 + DD -7908725 + DD -7543226 + DD -7173184 + DD -6798821 + DD -6420363 + DD -6038037 + DD -5652074 + DD -5262706 + DD -4870169 + DD -4474698 + DD -4076531 + DD -3675909 + DD -3273072 + DD -2868265 + DD -2461729 + DD -2053710 + DD -1644455 + DD -1234209 + DD -823219 + DD -411733 + DD 0 + DD 411733 + DD 823219 + DD 1234209 + DD 1644455 + DD 2053710 + DD 2461729 + DD 2868265 + DD 3273072 + DD 3675909 + DD 4076531 + DD 4474698 + DD 4870169 + DD 5262706 + DD 5652074 + DD 6038037 + DD 6420363 + DD 6798821 + DD 7173184 + DD 7543226 + DD 7908725 + DD 8269459 + DD 8625213 + DD 8975771 + DD 9320922 + DD 9660458 + DD 9994176 + DD 10321873 + DD 10643353 + DD 10958422 + DD 11266890 + DD 11568571 + DD 11863283 + DD 12150850 + DD 12431097 + DD 12703856 + DD 12968963 + DD 13226258 + DD 13475586 + DD 13716797 + DD 13949745 + DD 14174291 + DD 14390298 + DD 14597637 + DD 14796184 + DD 14985817 + DD 15166424 + DD 15337895 + DD 15500126 + DD 15653022 + DD 15796488 + DD 15930439 + DD 16054795 + DD 16169479 + DD 16274424 + DD 16369565 + DD 16454846 + DD 16530216 + DD 16595628 + DD 16651044 + DD 16696429 + DD 16731757 + DD 16757007 + DD 16772163 diff --git a/16/x_/modex/THREED.ASM b/16/x_/modex/THREED.ASM new file mode 100755 index 00000000..5ecd3ba3 --- /dev/null +++ b/16/x_/modex/THREED.ASM @@ -0,0 +1,872 @@ +COMMENT / + Fixed-point math functions and 3D transforms + Copyright (c) 1993,94 by Alessandro Scotti +/ +WARN PRO +P386 +JUMPS +LOCALS + +INCLUDE MATH.INC + +PUBLIC tdFixedMul +PUBLIC tdGetNormal +PUBLIC tdRotate +PUBLIC tdGetSurfaceLight +PUBLIC tdSetLight +PUBLIC tdSetRotation +PUBLIC tdSetTranslation +PUBLIC tdTransform +PUBLIC tdTransformToImage +PUBLIC tdTransformLight +PUBLIC tdBackPlaneCull +PUBLIC tdSetPerspective + +;----------------------------------------------------------- +; +; Data segment +; +MATH_DATA SEGMENT USE16 PARA PUBLIC 'DATA' + ASSUME ds:MATH_DATA + +INCLUDE SINCOS.INC ; Fixed 8:24 sin/cos table + +XRotation TPOINT <> ; 3x3 rotation matrix +YRotation TPOINT <> +ZRotation TPOINT <> + +Translation TPOINT <> ; Translation vector + +Light TPOINT <> ; Light vector +AmbientLight DW 00 ; Ambient light + +XScale DD 10000h ; Scaling factor for X coordinate +YScale DD 10000h ; Scaling factor for Y coordinate +PerspectiveDistance DD 20000000h + +MATH_DATA ENDS + +;----------------------------------------------------------- +; +; Code segment +; +MATH_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MATH_TEXT, es:NOTHING, fs:NOTHING + +tdSetPerspective PROC PASCAL FAR + ARG Perspective:DWORD, \ + ScaleX:DWORD, \ + ScaleY:DWORD + USES ds + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + mov eax, [Perspective] + mov [PerspectiveDistance], eax + mov eax, [ScaleX] + mov [XScale], eax + mov eax, [ScaleY] + mov [YScale], eax + + ret +tdSetPerspective ENDP + + +;----------------------------------------------------------- +; +; Sets the rotation matrix. +; +; Input: +; RX = X-axis rotation angle +; RY = X-axis rotation angle +; RZ = X-axis rotation angle +; Output: +; none +; +tdSetRotation PROC PASCAL FAR + ARG RX:WORD, \ + RY:WORD, \ + RZ:WORD + USES ds, si, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + mov bx, [RZ] + mov si, [RY] + mov di, [RX] + shl bx, 2 + shl si, 2 + shl di, 2 + + push ebp ; We use EBP as a scratch register + +; Set X rotation + mov eax, tblCos[bx] + imul tblCos[si] + mov [XRotation.X], edx + + mov eax, tblSin[bx] + imul tblCos[si] + mov [XRotation.Y], edx + + mov eax, tblSin[si] + sar eax, 8 ; Convert fixed 8:24 to fixed 16:16 + mov [XRotation.Z], eax + +; Set Y rotation + mov eax, tblCos[bx] + imul tblSin[si] ; EDX:EAX = fixed 16:48 + shrd eax, edx, 24 ; EAX = fixed 8:24 + imul tblSin[di] ; EDX:EAX = fixed 16:48 + mov ebp, eax + mov ecx, edx + mov eax, tblSin[bx] + imul tblCos[di] + add eax, ebp + adc edx, ecx ; EDX:EAX = fixed 16:48 + neg edx + mov [YRotation.X], edx + + mov eax, tblSin[bx] + imul tblSin[si] + shrd eax, edx, 24 + imul tblSin[di] + mov ebp, eax + mov ecx, edx + mov eax, tblCos[bx] + imul tblCos[di] + sub eax, ebp + sbb edx, ecx + mov [YRotation.Y], edx + + mov eax, tblCos[si] + imul tblSin[di] + mov [YRotation.Z], edx + +; Set Z rotation + mov eax, tblCos[bx] + imul tblSin[si] + shrd eax, edx, 24 + imul tblCos[di] + mov ebp, eax + mov ecx, edx + mov eax, tblSin[bx] + imul tblSin[di] + sub eax, ebp + sbb edx, ecx + mov [ZRotation.X], edx + + mov eax, tblSin[bx] + imul tblSin[si] + shrd eax, edx, 24 + imul tblCos[di] + mov ebp, eax + mov ecx, edx + mov eax, tblCos[bx] + imul tblSin[di] + add eax, ebp + add edx, ecx + neg edx + mov [ZRotation.Y], edx + + mov eax, tblCos[si] + imul tblCos[di] + mov [ZRotation.Z], edx + + pop ebp ; Restore EBP + + ret +tdSetRotation ENDP + +;----------------------------------------------------------- +; +; Sets the translation vector. +; +; Input: +; TV = pointer to translation vector +; Output: +; none +; +tdSetTranslation PROC PASCAL FAR + ARG TV:DWORD + USES ds, es, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + les di, [TV] + mov eax, es:[di].X + mov [Translation.X], eax + mov eax, es:[di].Y + mov [Translation.Y], eax + mov eax, es:[di].Z + mov [Translation.Z], eax + + ret +tdSetTranslation ENDP + +;----------------------------------------------------------- +; +; Transforms an array of TPOINT. +; +; Input: +; Source = pointer to source array of TPOINT +; Dest = pointer to destination array of TPOINT +; Count = number of entries to transform +; Output: +; none +; +tdTransform PROC PASCAL FAR + ARG Source:DWORD, \ + Dest:DWORD, \ + Count:WORD + LOCAL Adjust:DWORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + lfs si, [Source] + les di, [Dest] + + ALIGN DWORD +@@Loop: +; Transform Z coordinate + mov eax, fs:[si].X + imul [ZRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [ZRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [ZRotation.Z] + add eax, ecx + adc edx, ebx + mov ebx, eax + shrd eax, edx, 16 + add eax, [Translation.Z] ; EAX = new Z coord (fixed 16:16) + mov es:[di].Z, eax +; Get perspective factor + mov ebx, [PerspectiveDistance] + sub eax, ebx + neg eax ; EAX = PD - Z + xor edx, edx + shld edx, eax, 16 + shl eax, 16 + idiv ebx ; EAX = fixed 16:16 result + mov [Adjust], eax + +; Transform X coordinate + mov eax, fs:[si].X + imul [XRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [XRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [XRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + add eax, [Translation.X] + imul [Adjust] + shrd eax, edx, 16 + mov es:[di].X, eax + +; Transform Y coordinate + mov eax, fs:[si].X + imul [YRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [YRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [YRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + add eax, [Translation.Y] + imul [Adjust] + shrd eax, edx, 16 + mov es:[di].Y, eax + + add si, SIZE TPOINT + add di, SIZE TPOINT + dec [Count] + jnz @@Loop + + ret +tdTransform ENDP + +;----------------------------------------------------------- +; +; Transforms an array of TPOINT into an array of TIMAGEPOINT. +; +; Input: +; Source = pointer to source array of TPOINT +; Dest = pointer to destination array of TIMAGEPOINT +; Count = number of entries to transform +; DeltaX = translation distance for the X coordinate +; DeltaY = translation distance for the Y coordinate +; Output: +; the maximum Z value +; +tdTransformToImage PROC PASCAL FAR + ARG Source:DWORD, \ + Dest:DWORD, \ + Count:WORD, \ + DeltaX:WORD, \ + DeltaY:WORD + LOCAL Adjust:DWORD, \ + Max:DWORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + lfs si, [Source] + les di, [Dest] + mov [Max], 80000000h + +@@Loop: +; Check max Z + mov eax, fs:[si].Z + cmp eax, [Max] + jle @@1 + mov [Max], eax +@@1: + +; Transform X coordinate + mov ax, WORD PTR fs:[si].X[2] + add ax, [DeltaX] + mov es:[di].IX, ax + +; Transform Y coordinate + mov ax, WORD PTR fs:[si].Y[2] + add ax, [DeltaY] + mov es:[di].IY, ax + + add si, SIZE TPOINT + add di, SIZE TIMAGEPOINT + dec [Count] + jnz @@Loop + + mov eax, [Max] + shld edx, eax, 16 + ret +tdTransformToImage ENDP + +;----------------------------------------------------------- +; +; Sets the light source. +; +; Input: +; Light = pointer to light vector +; Output: +; none +; +tdSetLight PROC PASCAL FAR + ARG L:DWORD + USES ds, es, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + les di, [L] + mov eax, es:[di].X + mov [Light.X], eax + mov eax, es:[di].Y + mov [Light.Y], eax + mov eax, es:[di].Z + mov [Light.Z], eax + + ret +tdSetLight ENDP + +;----------------------------------------------------------- +; +; Computes light intensity for an array of surfaces. +; +; Input: +; Normals = pointer to an array of surface normals +; Lights = pointer to an array of integer to be filled with +; light intensity +; Count = number of elements to transform +; Output: +; none +; +tdTransformLight PROC PASCAL FAR + ARG Normals:DWORD, \ + Lights:DWORD, \ + Count:WORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov fs, ax + ASSUME fs:MATH_DATA + + lds si, [Normals] + les di, [Lights] + ASSUME ds:NOTHING + +; Intensity is given by the dot product between the Light vector and +; the surface normal +@@Loop: + mov eax, ds:[si].Z + imul [Light.Z] + mov ebx, eax + mov ecx, edx + mov eax, ds:[si].Y + imul [Light.Y] + add ebx, eax + adc ecx, edx + mov eax, ds:[si].X + imul [Light.X] + add eax, ebx + adc edx, ecx ; EDX:EAX = fixed 32:32 intensity + add dx, [AmbientLight] + test dx, dx + jg @@1 + xor dx, dx ; Return 0 for no light +@@1: + mov es:[di], dx + inc di + inc di + add si, SIZE TPOINT + dec [Count] + jnz @@Loop + + ASSUME fs:NOTHING + ret +tdTransformLight ENDP + +;----------------------------------------------------------- +; +; Returns the light value given the normal to a surface. +; +; Input: +; Normal = pointer to TPOINT surface normal vector +; Output: +; AX = light intensity (>=0) +; Notes: +; the normal is rotated according to the current setting. +; +tdGetSurfaceLight PROC PASCAL FAR + ARG Normal:DWORD + USES ds, esi, es, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + les di, [Normal] + +; Transform Z coordinate + mov eax, es:[di].X + imul [ZRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, es:[di].Y + imul [ZRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, es:[di].Z + imul [ZRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + imul [Light.Z] + shrd eax, edx, 16 + mov esi, eax + +; Transform X coordinate + mov eax, es:[di].X + imul [XRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, es:[di].Y + imul [XRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, es:[di].Z + imul [XRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + imul [Light.X] + shrd eax, edx, 16 + add esi, eax + +; Transform Y coordinate + mov eax, es:[di].X + imul [YRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, es:[di].Y + imul [YRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, es:[di].Z + imul [YRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + imul [Light.X] + shrd eax, edx, 16 + add eax, esi + shr eax, 16 + +; Add ambient light + add ax, [AmbientLight] + test ax, ax + jge @@Exit + xor ax, ax + +@@Exit: + ret +tdGetSurfaceLight ENDP + +;----------------------------------------------------------- +; +; Rotates an array of TPOINT. +; +; Input: +; Source = pointer to source array of TPOINT +; Dest = pointer to destination array of TPOINT +; Count = number of entries to transform +; Output: +; none +; +tdRotate PROC PASCAL FAR + ARG Source:DWORD, \ + Dest:DWORD, \ + Count:WORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + lfs si, [Source] + les di, [Dest] + +@@Loop: +; Transform Z coordinate + mov eax, fs:[si].X + imul [ZRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [ZRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [ZRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + mov es:[di].Z, eax + +; Transform X coordinate + mov eax, fs:[si].X + imul [XRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [XRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [XRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + mov es:[di].X, eax + +; Transform Y coordinate + mov eax, fs:[si].X + imul [YRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [YRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [YRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + mov es:[di].Y, eax + + add si, SIZE TPOINT + add di, SIZE TPOINT + dec [Count] + jnz @@Loop + + ret +tdRotate ENDP + +tdFixedMul PROC PASCAL FAR + ARG F1:DWORD, \ + F2:DWORD + + mov eax, [F1] + imul [F2] + shr eax, 16 + + ret +tdFixedMul ENDP + +;----------------------------------------------------------- +; +; Returns in EAX the square root of EDX:EAX. +; +subSqrt PROC NEAR + push esi + push edi + + add eax, eax + adc edx, 0 + mov eax, edx ; Just discard the low bits + + mov esi, eax + xor edi, edi + shld edi, esi, 16 + shl esi, 16 +@@Loop: + mov ebx, eax + mul eax + add eax, esi + adc edx, edi + shrd eax, edx, 1 + shr edx, 1 + div ebx + cmp eax, ebx + jne @@Loop + +; Adjust EAX + shl eax, 8 + + pop edi + pop esi + ret +subSqrt ENDP + +;----------------------------------------------------------- +; +; Finds the unitary normal to a given surface. +; +; Input: +; Dest = pointer to TPOINT (vector) result +; P1, P2, P3 = pointer to TPOINT points on surface +; Output: +; none +; Notes: +; the normal is given by the cross-product between (P3-P1) and +; (P2-P1), so its orientation depends on the parameters order. +; +tdGetNormal PROC PASCAL FAR + ARG Dest:DWORD, \ + P1:DWORD, \ + P2:DWORD, \ + P3:DWORD + LOCAL V1:TPOINT, \ + V2:TPOINT, \ + N:TPOINT + USES ds, si, es, di + +; Get vector V1 + lds si, [P1] + les di, [P3] + mov eax, es:[di].X + sub eax, ds:[si].X + mov [V1.X], eax + mov eax, es:[di].Y + sub eax, ds:[si].Y + mov [V1.Y], eax + mov eax, es:[di].Z + sub eax, ds:[si].Z + mov [V1.Z], eax + +; Get vector V2 + les di, [P2] + mov eax, es:[di].X + sub eax, ds:[si].X + mov [V2.X], eax + mov eax, es:[di].Y + sub eax, ds:[si].Y + mov [V2.Y], eax + mov eax, es:[di].Z + sub eax, ds:[si].Z + mov [V2.Z], eax + +; Get normal vector (V1 x V2) + mov eax, [V1.Z] + imul [V2.Y] + mov ebx, eax + mov ecx, edx + mov eax, [V1.Y] + imul [V2.Z] + sub eax, ebx + sbb edx, ecx + shrd eax, edx, 16 + mov [N.X], eax + + mov eax, [V1.X] + imul [V2.Z] + mov ebx, eax + mov ecx, edx + mov eax, [V1.Z] + imul [V2.X] + sub eax, ebx + sbb edx, ecx + shrd eax, edx, 16 + mov [N.Y], eax + + mov eax, [V1.Y] + imul [V2.X] + mov ebx, eax + mov ecx, edx + mov eax, [V1.X] + imul [V2.Y] + sub eax, ebx + sbb edx, ecx + shrd eax, edx, 16 + mov [N.Z], eax + +; Get normal length + mov eax, [N.X] + imul eax + mov ebx, eax + mov ecx, edx + mov eax, [N.Y] + imul eax + add ebx, eax + adc ecx, edx + mov eax, [N.Z] + imul eax + add eax, ebx + adc edx, ecx ; EDX:EAX = N.X*N.X + N.Y*N.Y + N.Z*N.Z + call subSqrt ; EAX = normal length + mov ebx, eax + +; Adjust vector and save it + les di, [Dest] + mov eax, [N.X] + cdq + shld edx, eax, 16 + shl eax, 16 + idiv ebx + mov es:[di].X, eax + mov eax, [N.Y] + cdq + shld edx, eax, 16 + shl eax, 16 + idiv ebx + mov es:[di].Y, eax + mov eax, [N.Z] + cdq + shld edx, eax, 16 + shl eax, 16 + idiv ebx + mov es:[di].Z, eax + + ret +tdGetNormal ENDP + +TPOLY STRUC + Vtx DW 4 DUP(?) +TPOLY ENDS + +;----------------------------------------------------------- +; +; Performs surface removal on an array of polygons. +; +; Input: +; Poly = pointer to an array of TPOLY +; Vertex = pointer to an array of TPOINT +; Dest = pointer to an array of integer +; Count = number of polygons to check +; Step = size of TPOLY structure +; Output: +; if the n-th polygon is invisible the n-th entry of the +; Dest array is set to -1, other entries are not modified +; (so it's possible to use the Light array for Dest, because +; the light intensity is always >= 0) +; +tdBackPlaneCull PROC PASCAL FAR + ARG Step:WORD, \ + Poly:DWORD, \ + Vertex:DWORD, \ + Dest:DWORD, \ + Count:WORD + USES ds, si, es, di, fs + ASSUME ds:NOTHING + + mov ds, WORD PTR Vertex[2] + les di, [Poly] + mov fs, WORD PTR Dest[2] + +@@Loop: + mov ax, es:[di].Vtx[2] ; Index of 2nd vertex + shl ax, 2 + mov bx, ax + shl ax, 1 + add bx, ax ; BX = index*SIZE TPOINT + add bx, WORD PTR [Vertex] ; BX = offset of 2nd vertex + mov ax, es:[di].Vtx[4] ; Index of 3rd vertex + shl ax, 2 + mov si, ax + shl ax, 1 + add si, ax + add si, WORD PTR [Vertex] ; SI = offset of 3rd vertex + mov ecx, ds:[si].X + sub ecx, ds:[bx].X ; ECX = V3.X-V2.X + mov edx, ds:[si].Y + sub edx, ds:[bx].Y ; EDX = V3.Y-V2.Y + mov ax, es:[di].Vtx[0] ; Index of 1st vertex + shl ax, 2 + mov si, ax + shl ax, 1 + add si, ax + add si, WORD PTR [Vertex] ; SI = offset of 1st vertex + mov eax, ds:[si].X + sub eax, ds:[bx].X ; EAX = V1.X-V2.X + mov esi, ds:[si].Y + sub esi, ds:[bx].Y ; ESI = V1.Y-V2.Y + imul edx + mov ebx, eax + xchg ecx, edx ; ECX:EBX = (V1.X-V2.X)*(V3.Y-V2.Y) + mov eax, esi + imul edx ; EDX:EAX = (V1.Y-V2.Y)*(V3.X-V2.X) + sub eax, ebx + sbb edx, ecx + jl @@Next ; Polygon is visible + mov bx, WORD PTR [Dest] ; FS:BX -> current Dest entry + mov WORD PTR fs:[bx], -1 ; Remove polygon +@@Next: + add WORD PTR [Dest], 2 ; Next entry for dest + add di, [Step] ; Next polygon + dec [Count] + jnz @@Loop + + ret +tdBackPlaneCull ENDP + +MATH_TEXT ENDS +END diff --git a/16/x_/modex/THREED.H b/16/x_/modex/THREED.H new file mode 100755 index 00000000..b993ef86 --- /dev/null +++ b/16/x_/modex/THREED.H @@ -0,0 +1,32 @@ +typedef struct { + long x, y, z; +} TVECTOR; + +#define PVECTOR TVECTOR far * + +#define TPOINT TVECTOR +#define PPOINT PVECTOR + +#define VPTR void far * + +#ifdef __cplusplus +extern "C" { +#endif + +long far pascal tdFixedMul( long, long ); +int far pascal tdGetSurfaceLight( PPOINT ); +long far pascal tdTransformToImage( VPTR, VPTR, short, short, short ); + +void far pascal tdBackPlaneCull( VPTR, VPTR, VPTR, short, short ); +void far pascal tdGetNormal( VPTR, PPOINT, PPOINT, PPOINT ); +void far pascal tdRotate( VPTR, VPTR, short ); +void far pascal tdSetLight( PVECTOR ); +void far pascal tdSetRotation( short, short, short ); +void far pascal tdSetTranslation( PVECTOR ); +void far pascal tdSetPerspective( long, long, long ); +void far pascal tdTransform( VPTR, VPTR, short ); +void far pascal tdTransformLight( VPTR, VPTR, short ); + +#ifdef __cplusplus +} +#endif diff --git a/16/x_/modex/THREED.PAS b/16/x_/modex/THREED.PAS new file mode 100755 index 00000000..8b712c9d --- /dev/null +++ b/16/x_/modex/THREED.PAS @@ -0,0 +1,40 @@ +unit ThreeD; +interface + +type + TVector = record + X, Y, Z : longint; + end; + TPoint = TVector; + +function tdFixedMul( F1, F2: longint ): longint; +function tdGetSurfaceLight( var Normal: TPoint ): integer; +function tdTransformToImage( var Source, Dest; Count, DeltaX, DeltaY: integer ): longint; + +procedure tdBackPlaneCull( var Poly, Vertex, Dest; Count, Step: word ); +procedure tdGetNormal( var Dest, P1, P2, P3: TVector ); +procedure tdRotate( var Source, Dest; Count: word ); +procedure tdSetLight( var Light: TVector ); +procedure tdSetRotation( RX, RY, RZ: word ); +procedure tdSetTranslation( var TV: TVector ); +procedure tdSetPerspective( PD, XF, YF: longint ); +procedure tdTransform( var Source, Dest; Count: word ); +procedure tdTransformLight( var Source, Dest; Count: word ); + +implementation + +function tdGetSurfaceLight; external; +procedure tdSetRotation( RX, RY, RZ: word ); external; +procedure tdGetNormal; external; +procedure tdSetTranslation( var TV: TVector ); external; +procedure tdTransform( var Source, Dest; Count: word ); external; +procedure tdRotate; external; +function tdTransformToImage; external; +procedure tdSetLight( var Light: TVector ); external; +procedure tdSetPerspective; external; +procedure tdTransformLight; external; +function tdFixedMul( F1, F2: longint ): longint; external; +procedure tdBackPlaneCull; external; +{$L THREED} + +end. diff --git a/16/x_/mxbb.asm b/16/x_/mxbb.asm new file mode 100755 index 00000000..ac6668ce --- /dev/null +++ b/16/x_/mxbb.asm @@ -0,0 +1,278 @@ +;----------------------------------------------------------- +; +; MXBB.ASM - Bit block transfer +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxBitBlt + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN subHorizontalLineInfo : NEAR + +EXTRN mx_VideoSegment : WORD +EXTRN mx_BytesPerLine : WORD + +;----------------------------------------------------------- +; +; Moves a block of video memory. +; +; Input: +; SX, SY = source coordinates +; Width = source width +; Height = source height +; DX, DY = destination coordinates +; Output: +; none +; +; Note: overlapping regions are not allowed. +; +mxBitBlt PROC FAR + ARG DestY:WORD, \ + DestX:WORD, \ + Height:WORD, \ + Width:WORD, \ + SY:WORD, \ + SX:WORD = ARG_SIZE + LOCAL PlaneWidth:WORD:4, \ + SourceOffset:WORD, \ + DestOffset:WORD, \ + Count:BYTE, \ + ReadPlane:BYTE, \ + WritePlane:BYTE, \ + LeftMask:BYTE, \ + RightMask:BYTE = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + +; Exit now if null width + cmp [Width], 0 + je @@Exit + +; Calls the proper procedure to handle transfer + mov ax, [SX] + and al, 03h ; AL = source plane + mov dx, [DestX] + and dl, 03h ; DL = destination plane + mov bx, OFFSET subPlaneBlt + cmp al, dl ; Same source and destination plane? + jne @@BitBlt ; No, use slow procedure + mov bx, OFFSET subMoveBlt +@@BitBlt: + call bx + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE + +;----------------------------------------------------------- +; Uses write mode 1 for maximum speed. Only works if source +; and destination are plane-aligned. +; +subMoveBlt PROC NEAR +; Get horizontal line info and address of destination + mov bx, [DestX] + mov ax, [DestY] + mov cx, [Width] + call subHorizontalLineInfo + mov [LeftMask], al + mov [RightMask], ah + mov [Width], cx + +; Setup segments + mov ax, [mx_VideoSegment] + mov ds, ax + mov es, ax + +; Get address of source pixel + mov ax, [SY] + mul [mx_BytesPerLine] + mov si, [SX] + .shr si, 2 + add si, ax + +; Set write mode 1 + mov dx, GDC + mov ax, 4105h + out dx, ax + cld + +; Move left block +@@L0: + mov ah, [LeftMask] + or ah, ah + jz @@C0 + mov dx, TS + mov al, 02h + out dx, ax ; Set write plane mask + mov ax, [mx_BytesPerLine] + dec ax + mov cx, [Height] + .push si, di +@@L1: + movsb + add si, ax + add di, ax + dec cx + jnz @@L1 + .pop si, di + inc si + inc di + +; Move center block +@@C0: + mov bx, [Width] + test bx, bx + jz @@R0 + mov dx, TS + mov ax, 0F02h + out dx, ax ; Enable all planes + mov ax, [mx_BytesPerLine] + sub ax, bx + mov dx, [Height] + .push si, di +@@C1: + mov cx, bx ; CX = image width + rep movsb ; Cannot use "movsw" here! + add si, ax ; Next scan line + add di, ax ; Next scan line + dec dx ; All lines processed? + jnz @@C1 ; No, continue + .pop si, di + add si, bx + add di, bx + +; Move right block +@@R0: + mov ah, [RightMask] + or ah, ah + jz @@Done + mov dx, TS + mov al, 02h + out dx, ax ; Set write plane mask + mov ax, [mx_BytesPerLine] + dec ax + mov cx, [Height] +@@R1: + movsb + add si, ax + add di, ax + dec cx + jnz @@R1 + +@@Done: + mov dx, GDC + mov ax, 4005h + out dx, ax ; Restore write mode 0 + +@@Exit: + ret +subMoveBlt ENDP + +;----------------------------------------------------------- +; Moves one plane at a time. +; +subPlaneBlt PROC NEAR +; Compute extra bytes and width count for each plane + mov cx, [Width] + mov bx, cx + shr bx, 1 + shr bx, 1 ; Width for each plane + and cl, 03h + mov al, 00001000b + shr al, cl + mov si, 3 SHL 1 +@@PatchLoop: + mov PlaneWidth[si], bx + shr al, 1 + adc bx, 0 + dec si + dec si + jge @@PatchLoop + +; Get pixel addresses + mov ax, [mx_VideoSegment] + mov ds, ax + mov es, ax + mov ax, [SY] + mul [mx_BytesPerLine] + mov si, [SX] + shr si, 1 + shr si, 1 + add si, ax ; DS:SI points to source + mov [SourceOffset], si + mov ax, [DestY] + mul [mx_BytesPerLine] + mov di, [DestX] + shr di, 1 + shr di, 1 + add di, ax ; ES:DI points to destination + mov [DestOffset], di + +; Adjust plane for output to VGA registers + mov ax, [SX] + and al, 03h + mov [ReadPlane], al + mov cx, [DestX] + and cl, 03h + mov al, 00010001b + shl al, cl + mov [WritePlane], al + +; Ready to move now + cld + mov [Count], 4 ; Four planes + lea bx, PlaneWidth ; SS:[BX] = width in bytes for plane +@@PlaneLoop: + cmp WORD PTR ss:[bx], 0 + je @@Done + mov ah, [WritePlane] + and ah, 0Fh + mov al, 02h + mov dx, TS + out dx, ax ; Select write plane + mov ah, [ReadPlane] + mov al, 04h + mov dx, GDC + out dx, ax ; Select read plane + mov dx, [Height] + mov ax, [mx_BytesPerLine] + sub ax, ss:[bx] ; AX = extra bytes per line +@@Loop: + mov cx, ss:[bx] + shr cx, 1 + rep movsw + rcl cx, 1 + rep movsb + add si, ax + add di, ax + dec dx + jnz @@Loop ; Repeat for all lines + inc bx + inc bx ; Select width for next plane + inc [ReadPlane] + and [ReadPlane], 03h ; Should be faster on 386 using + jnz @@ReadPlaneOk ; BTR and ADC... + inc [SourceOffset] +@@ReadPlaneOk: + rol [WritePlane], 1 + adc [DestOffset], 0 + mov si, [SourceOffset] + mov di, [DestOffset] + dec [Count] + jnz @@PlaneLoop ; Repeat for all planes + +@@Done: + ret +subPlaneBlt ENDP + +mxBitBlt ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxcc.asm b/16/x_/mxcc.asm new file mode 100755 index 00000000..4f78adb9 --- /dev/null +++ b/16/x_/mxcc.asm @@ -0,0 +1,644 @@ +;----------------------------------------------------------- +; +; MXCC.ASM - Fast clip line function +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC xsubClipLine + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD + +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD + +tblGroups LABEL WORD + DW 10, tbl00 + DW 10, tbl10 + DW 9, tbl20 + DW -1, 0 + DW 10, tbl40 + DW 10, tbl50 + DW 9, tbl60 + DW -1, 0 + DW 6, tbl80 + DW 6, tbl90 + DW 5, tblA0 + DW -1, 0 + DW -1, 0 + DW -1, 0 + DW -1, 0 + DW -1, 0 +tbl00 DW cc00, cc01, cc02, ccFF, cc04, cc05, cc06, ccFF, cc08, cc09, cc0A +tbl10 DW cc10, ccFF, cc12, ccFF, cc14, ccFF, cc16, ccFF, cc18, ccFF, cc1A +tbl20 DW cc20, cc21, ccFF, ccFF, cc24, cc25, ccFF, ccFF, cc28, cc29 +tbl40 DW cc40, cc41, cc42, ccFF, ccFF, ccFF, ccFF, ccFF, cc48, cc49, cc4A +tbl50 DW cc50, ccFF, cc52, ccFF, ccFF, ccFF, ccFF, ccFF, cc58, ccFF, cc5A +tbl60 DW cc60, cc61, ccFF, ccFF, ccFF, ccFF, ccFF, ccFF, cc68, cc69 +tbl80 DW cc80, cc81, cc82, ccFF, cc84, cc85, cc86 +tbl90 DW cc90, ccFF, cc92, ccFF, cc94, ccFF, cc96 +tblA0 DW ccA0, ccA1, ccFF, ccFF, ccA4, ccA5 + +ccTT: clc + ret +ccFF: stc + ret + +; Group 00 ------------------------------------------------- +; +cc00: + clc + ret +cc01: + jmp ClipQLeft +cc02: + jmp ClipQRight +cc04: + jmp ClipQTop +cc05: + call ClipQLeft + cmp si, [mx_ClipY1] + jge ccTT + jmp ClipQTop +cc06: + call ClipQRight + cmp si, [mx_ClipY1] + jge ccTT + jmp ClipQTop +cc08: + jmp ClipQBottom +cc09: + call ClipQLeft + cmp si, [mx_ClipY2] + jle ccTT + jmp ClipQBottom +cc0A: + call ClipQRight + cmp si, [mx_ClipY2] + jle ccTT + jmp ClipQBottom + +; Group 10 ------------------------------------------------- +; +cc10FF: + stc + ret +cc10TT: + clc + ret +cc10: + jmp ClipPLeft +cc12: + call ClipPLeft + jmp ClipQRight +cc14: + call ClipPLeft + cmp bx, [mx_ClipY1] + jl cc10FF + jmp ClipQTop +cc16: + call ClipPLeft + cmp bx, [mx_ClipY1] + jl cc10FF + call ClipQTop + cmp cx, [mx_ClipX2] + jle cc10TT + jmp ClipQRight +cc18: + call ClipPLeft + cmp bx, [mx_ClipY2] + jg cc10FF + jmp ClipQBottom +cc1A: + call ClipPLeft + cmp bx, [mx_ClipY2] + jg cc10FF + call ClipQBottom + cmp cx, [mx_ClipX2] + jle cc10TT + jmp ClipQRight + +; Group 20 ------------------------------------------------- +; +cc20TT: + clc + ret +cc20FF: + stc + ret +cc20: + jmp ClipPRight +cc21: + call ClipPRight + jmp ClipQLeft +cc24: + call ClipPRight + cmp bx, [mx_ClipY1] + jl cc20FF + jmp ClipQTop +cc25: + call ClipPRight + cmp bx, [mx_ClipY1] + jl cc20FF + call ClipQTop + cmp cx, [mx_ClipX1] + jge cc20TT + jmp ClipQLeft +cc28: + call ClipPRight + cmp bx, [mx_ClipY2] + jg cc20FF + jmp ClipQBottom +cc29: + call ClipPRight + cmp bx, [mx_ClipY2] + jg cc20FF + call ClipQBottom + cmp cx, [mx_ClipX1] + jge cc20TT + jmp ClipQLeft + +; Group 40 ------------------------------------------------- +; +cc40TT: + clc + ret +cc40FF: + stc + ret +cc40: + jmp ClipPTop +cc41: + call ClipPTop + cmp di, [mx_ClipX1] + jl cc40FF + call ClipQLeft + cmp si, [mx_ClipY1] + jge cc40TT + jmp ClipQTop +cc42: + call ClipPTop + cmp di, [mx_ClipX2] + jg cc40FF + jmp ClipQRight +cc48: + call ClipPTop + jmp ClipQBottom +cc49: + call ClipPTop + cmp di, [mx_ClipX1] + jl cc40FF + call ClipQLeft + cmp si, [mx_ClipY2] + jle cc40TT + jmp ClipQBottom +cc4A: + call ClipPTop + cmp di, [mx_ClipX2] + jg cc40FF + call ClipQRight + cmp si, [mx_ClipY2] + jle cc40TT + jmp ClipQBottom + + +; Group 50 ------------------------------------------------- +; +cc50TT: + clc + ret +cc50FF: + stc + ret +cc50: + call ClipPLeft + cmp bx, [mx_ClipY1] + jge cc50TT + jmp ClipPTop +cc52: + call ClipQRight + cmp si, [mx_ClipY1] + jl cc50FF + call ClipPTop + cmp di, [mx_ClipX1] + jge cc50TT + jmp ClipPLeft +cc58: + call ClipQBottom + cmp cx, [mx_ClipX1] + jl cc50FF + call ClipPTop + cmp di, [mx_ClipX1] + jge cc50TT + jmp ClipPLeft +cc5A: + call ClipPLeft + cmp bx, [mx_ClipY2] + jg cc50FF + call ClipQRight + cmp bx, [mx_ClipY1] + jl cc50FF + cmp si, [mx_ClipY2] + jle cc50TT + jmp ClipQBottom + +; Group 60 ------------------------------------------------- +; +cc60TT: + clc + ret +cc60FF: + stc + ret +cc60: + call ClipPRight + cmp bx, [mx_ClipY1] + jge cc60TT + jmp ClipPTop +cc61: + call ClipQLeft + cmp si, [mx_ClipY2] + jl cc60FF + call ClipPTop + cmp di, [mx_ClipX2] + jle cc60TT + jmp ClipPRight +cc68: + call ClipQBottom + cmp cx, [mx_ClipX2] + jg cc60FF + call ClipPRight + cmp bx, [mx_ClipY1] + jge cc60TT + jmp ClipPTop +cc69: + call ClipQLeft + cmp si, [mx_ClipY1] + jl cc60FF + call ClipPRight + cmp bx, [mx_ClipY2] + jg cc60FF + cmp si, [mx_ClipY2] + jle cc69_1 + call ClipQBottom +cc69_1: + cmp bx, [mx_ClipY1] + jge cc60TT + jmp ClipPTop + +; Group 80 ------------------------------------------------- +; +cc80TT: + clc + ret +cc80FF: + stc + ret +cc80: + jmp ClipPBottom +cc81: + call ClipPBottom + cmp di, [mx_ClipX1] + jl cc80FF + jmp ClipQLeft +cc82: + call ClipPBottom + cmp di, [mx_ClipX2] + jg cc80FF + jmp ClipQRight +cc84: + call ClipPBottom + jmp ClipQTop +cc85: + call ClipPBottom + cmp di, [mx_ClipX1] + jl cc80FF + call ClipQLeft + cmp si, [mx_ClipY1] + jge cc80FF + jmp ClipQTop +cc86: + call ClipPBottom + cmp di, [mx_ClipX2] + jg cc80FF + call ClipQRight + cmp si, [mx_ClipY1] + jge cc80TT + jmp ClipQTop + +; Group 90 ------------------------------------------------- +; +cc90TT: + clc + ret +cc90FF: + stc + ret +cc90: + call ClipPLeft + cmp bx, [mx_ClipY2] + jle cc90TT + jmp ClipPBottom +cc92: + call ClipQRight + cmp si, [mx_ClipY2] + jg cc90FF + call ClipPBottom + cmp di, [mx_ClipX1] + jge cc90TT + jmp ClipPLeft +cc94: + call ClipQTop + cmp cx, [mx_ClipX1] + jl cc90FF + call ClipPLeft + cmp bx, [mx_ClipY2] + jle cc90TT + jmp ClipPBottom +cc96: + call ClipPLeft + cmp bx, [mx_ClipY1] + jl cc90FF + call ClipQRight + cmp si, [mx_ClipY2] + jg cc90FF + cmp bx, [mx_ClipY2] + jle cc96_1 + call ClipPBottom +cc96_1: + cmp si, [mx_ClipY1] + jge cc90TT + jmp ClipQTop + +; Group A0 ------------------------------------------------- +; +ccA0TT: + clc + ret +ccA0FF: + stc + ret +ccA0: + call ClipPRight + cmp bx, [mx_ClipY2] + jle ccA0TT + jmp ClipPBottom +ccA1: + call ClipQLeft + cmp si, [mx_ClipY2] + jg ccA0FF + call ClipPBottom + cmp di, [mx_ClipX2] + jle ccA0TT + jmp ClipPRight +ccA4: + call ClipQTop + cmp cx, [mx_ClipX2] + jg ccA0FF + call ClipPRight + cmp bx, [mx_ClipY2] + jle ccA0TT + jmp ClipPBottom +ccA5: + call ClipQLeft + cmp si, [mx_ClipY2] + jg ccA0FF + call ClipPRight + cmp bx, [mx_ClipY1] + jl ccA0FF + cmp si, [mx_ClipY1] + jge ccA5_1 + call ClipQTop +ccA5_1: + cmp bx, [mx_ClipY2] + jle ccA0TT + jmp ClipPBottom + +; Y1 = (Y2-Y1)*(mx_ClipX1-X1)/(X2-X1)+Y1 = (SI-BX)*(mx_ClipX1-DI)/(CX-DI)+BX +; X1 = mx_ClipX1 +ClipPLeft: + mov ax, si + sub ax, bx + mov dx, [mx_ClipX1] + sub dx, di + imul dx + mov bp, cx + sub bp, di + idiv bp + add bx, ax + mov di, [mx_ClipX1] + clc + ret + +; Y1 = (Y2-Y1)*(mx_ClipX2-X1)/(X2-X1)+Y1 = (SI-BX)*(mx_ClipX2-DI)/(CX-DI)+BX +; X1 = mx_ClipX2 +ClipPRight: + mov ax, si + sub ax, bx + mov dx, [mx_ClipX2] + sub dx, di + imul dx + mov bp, cx + sub bp, di + idiv bp + add bx, ax + mov di, [mx_ClipX2] + clc + ret + +; X1 = (X2-X1)*(mx_ClipY2-Y1)/(Y2-Y1)+X1 = (CX-DI)*(mx_ClipY2-BX)/(SI-BX)+DI +; Y1 = mx_ClipY2 +ClipPBottom: + mov ax, cx + sub ax, di + mov dx, [mx_ClipY2] + sub dx, bx + imul dx + mov bp, si + sub bp, bx + idiv bp + add di, ax + mov bx, [mx_ClipY2] + clc + ret + +; X1 = (X2-X1)*(mx_ClipY1-Y1)/(Y2-Y1)+X1 = (CX-DI)*(mx_ClipY1-BX)/(SI-BX)+DI +; Y1 = mx_ClipY1 +ClipPTop: + mov ax, cx + sub ax, di + mov dx, [mx_ClipY1] + sub dx, bx + imul dx + mov bp, si + sub bp, bx + idiv bp + add di, ax + mov bx, [mx_ClipY1] + clc + ret + +; Y2 = (Y1-Y2)*(mx_ClipX1-X2)/(X1-X2)+Y2 = (BX-SI)*(mx_ClipX1-CX)/(DI-CX)+SI +; X2 = mx_ClipX1 +ClipQLeft: + mov ax, bx + sub ax, si + mov dx, [mx_ClipX1] + sub dx, cx + imul dx + mov bp, di + sub bp, cx + idiv bp + add si, ax + mov cx, [mx_ClipX1] + clc + ret + +; Y2 = (Y1-Y2)*(mx_ClipX2-X2)/(X1-X2)+Y2 = (BX-SI)*(mx_ClipX2-CX)/(DI-CX)+SI +; X2 = mx_ClipX1 +ClipQRight: + mov ax, bx + sub ax, si + mov dx, [mx_ClipX2] + sub dx, cx + imul dx + mov bp, di + sub bp, cx + idiv bp + add si, ax + mov cx, [mx_ClipX2] + clc + ret + +; X2 = (X1-X2)*(mx_ClipY2-Y2)/(Y1-Y2)+X2 = (DI-CX)*(mx_ClipY2-SI)/(BX-SI)+CX +; Y2 = mx_ClipY1 +ClipQBottom: + mov ax, di + sub ax, cx + mov dx, [mx_ClipY2] + sub dx, si + imul dx + mov bp, bx + sub bp, si + idiv bp + add cx, ax + mov si, [mx_ClipY2] + clc + ret + +; X2 = (X1-X2)*(mx_ClipY1-Y2)/(Y1-Y2)+X2 = (DI-CX)*(mx_ClipY1-SI)/(BX-SI)+CX +; Y2 = mx_ClipY1 +ClipQTop: + mov ax, di + sub ax, cx + mov dx, [mx_ClipY1] + sub dx, si + imul dx + mov bp, bx + sub bp, si + idiv bp + add cx, ax + mov si, [mx_ClipY1] + clc + ret + +;----------------------------------------------------------- +; +; Checks the coordinates of a line against the active +; clip region. +; Uses the Sobkow-Pospisil-Yang (SPY) algorithm: this was +; supposed to be twice as fast as Cohen-Sutherland, but my +; tests show only a very small increase in speed and a noticeable +; increase of the program size! Maybe this is caused by the +; slow speed of VGA cards, so probably a better test should +; be performed with lines drawn in RAM. +; +; Input: +; AX, BX = X1, Y1 +; CX, DX = X2, Y2 +; Output: +; CF = set if line is full clipped +; AX, BX = clipped X1, Y1 +; CX, DX = clipped X2, Y2 +; Note: +; destroys SI, DI +; +xsubClipLine PROC NEAR + push bp + xor si, si ; SPY code + + cmp dx, [mx_ClipY2] + jle @@1 + or si, 08h + jmp @@2 +@@1: + cmp dx, [mx_ClipY1] + jge @@2 + or si, 04h +@@2: + + cmp cx, [mx_ClipX2] + jle @@3 + or si, 02h + jmp @@4 +@@3: + cmp cx, [mx_ClipX1] + jge @@4 + or si, 01h +@@4: + + cmp bx, [mx_ClipY2] + jle @@5 + or si, 80h + jmp @@6 +@@5: + cmp bx, [mx_ClipY1] + jge @@6 + or si, 40h +@@6: + + cmp ax, [mx_ClipX2] + jle @@7 + or si, 20h + jmp @@8 +@@7: + cmp ax, [mx_ClipX1] + jge @@8 + or si, 10h +@@8: + + mov di, si + and di, 000Fh ; Index of procedure + and si, 00F0h + .shr si, 2 ; Index of group (times 4) + cmp di, cs:tblGroups[si] ; Is index within range? + jg @@Exit ; No, line is full clipped + mov si, cs:tblGroups[si+2] ; Get offset of group table + shl di, 1 ; We must index word elements + add si, di ; Make full offset + mov di, ax ; Move X1 to DI and free AX + mov si, cs:[si] ; Get subroutine address + xchg dx, si ; Move Y2 to SI and free DX + call dx ; Call the proper subroutine + mov ax, di ; Restore AX to X1 + mov dx, si ; Restore DX to Y2 + pop bp + ret + +@@Exit: + pop bp + stc + ret +xsubClipLine ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxcg.asm b/16/x_/mxcg.asm new file mode 100755 index 00000000..42163d7a --- /dev/null +++ b/16/x_/mxcg.asm @@ -0,0 +1,69 @@ +;----------------------------------------------------------- +; +; MXCG.ASM - Color to gray conversion +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxColorToGray + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Converts RGB colors to gray shades. +; +; Input: +; CPal = pointer to color palette +; GPal = pointer to destination (gray) palette +; Count = number of colors to convert +; Output: +; none +; +; Note: CPal and GPal may point to the same buffer. +; +mxColorToGray PROC FAR + ARG Count:WORD, \ + DPal:DWORD, \ + SPal:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + + mov cx, [Count] + jcxz @@Exit + lds si, [SPal] + les di, [DPal] + cld +; We use the standard formula +; gray=(red*30 + green*59 + blue*11)/100 +; in the equivalent form +; gray=(red*77 + green*151 + blue*28)/256 +; which doesn't need the last divide. + mov bx, 77 SHL 8 + 151 +@@Loop: + lodsb ; Red + mul bh + mov dx, ax + lodsb ; Green + mul bl + add dx, ax + lodsb ; Blue + mov ah, 28 + mul ah + add ax, dx + mov al, ah + stosw ; Save new RGB + stosb + loop @@Loop + +@@Exit: + .pop ds, si, es, di + .leave ARG_SIZE +mxColorToGray ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxcl.asm b/16/x_/mxcl.asm new file mode 100755 index 00000000..aaa0bac3 --- /dev/null +++ b/16/x_/mxcl.asm @@ -0,0 +1,151 @@ +;----------------------------------------------------------- +; +; MXCL.ASM - Bresenham circle +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxCircle + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD + +;----------------------------------------------------------- +; +; Draws a circle using the Bresenham algorithm. +; +; Input: +; XC, YC = center coordinates +; Radius = circle radius +; Color = circle color +; Output: +; none +; Note: +; computes only points in the first octant, all other +; points are obtained by symmetry. +; +mxCircle PROC FAR + ARG Color:BYTE:2, \ + Radius:WORD, \ + YC:WORD, \ + XC:WORD = ARG_SIZE + LOCAL Delta:WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, di + + xor si, si ; X + mov di, [Radius] ; Y + mov ax, 3 + sub ax, di + sub ax, di + mov [Delta], ax ; Delta = 3-R*2 + + mov ds, [mx_VideoSegment] + +@@Loop: + cmp si, di ; + jg @@Done ; Exit when X > Y +; Draw points + mov ax, si + mov bx, di + call @@subPutPixel + mov ax, si + neg ax + mov bx, di + call @@subPutPixel + mov ax, si + mov bx, di + neg bx + call @@subPutPixel + mov ax, si + neg ax + mov bx, di + neg bx + call @@subPutPixel + mov ax, di + mov bx, si + call @@subPutPixel + mov ax, di + neg ax + mov bx, si + call @@subPutPixel + mov ax, di + mov bx, si + neg bx + call @@subPutPixel + mov ax, di + neg ax + mov bx, si + neg bx + call @@subPutPixel +; Moves coordinates to next point + mov ax, [Delta] + test ax, ax + jl @@Next + mov ax, di + .shl ax, 2 + sub ax, 4 + sub [Delta], ax + dec di +@@Next: + mov ax, si + .shl ax, 2 + add ax, 6 + add [Delta], ax + inc si + jmp @@Loop + +@@Done: + xor ax, ax + .pop ds, si, di + .leave ARG_SIZE + +;--------------------------------------- +; Put pixel function. +; Input: +; BX = X coordinate (relative to center) +; AX = Y coordinate (relative to center) +; DS = video segment +@@subPutPixel: + add bx, [XC] ; Get absolute coordinates + add ax, [YC] + + cmp bx, [mx_ClipX1] ; Clip pixel + jl @@subExit + cmp bx, [mx_ClipX2] + jg @@subExit + cmp ax, [mx_ClipY1] + jl @@subExit + cmp ax, [mx_ClipY2] + jg @@subExit + + mul [mx_BytesPerLine] ; Get pixel offset + mov cx, bx ; Save X coordinate + .shr bx, 2 + add bx, ax ; DS:BX = pixel offset + + and cl, 3 ; Set write plane + mov ax, 0102h + shl ah, cl + mov dx, TS + out dx, ax + + mov al, [Color] ; Write pixel + mov ds:[bx], al + +@@subExit: + retn +mxCircle ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxcr.asm b/16/x_/mxcr.asm new file mode 100755 index 00000000..ca1fa7bb --- /dev/null +++ b/16/x_/mxcr.asm @@ -0,0 +1,380 @@ +;----------------------------------------------------------- +; +; MXCR.ASM - Clip functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxSetSysClipRegion +PUBLIC mxGetClipRegion +PUBLIC mxSetClipRegion +PUBLIC mxSetClip +PUBLIC mxGetClip + +PUBLIC subClipBox +PUBLIC subClipImage + +PUBLIC mx_ClipX1 +PUBLIC mx_ClipY1 +PUBLIC mx_ClipX2 +PUBLIC mx_ClipY2 + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_CodeSegment : WORD + +mx_ClipX1 DW ? ; Clip coordinates +mx_ClipY1 DW ? +mx_ClipX2 DW ? +mx_ClipY2 DW ? + +mx_SysClipX1 DW ? ; System clip coordinates +mx_SysClipY1 DW ? ; (active when mx_ClipStatus is FALSE) +mx_SysClipX2 DW ? +mx_SysClipY2 DW ? + +mx_UserClipX1 DW ? ; User clip coordinates +mx_UserClipY1 DW ? ; (active when mx_ClipStatus is TRUE) +mx_UserClipX2 DW ? +mx_UserClipY2 DW ? + +mx_ClipStatus DB ? + +;----------------------------------------------------------- +; +; Toggles clipping between user and system regions. +; +; Input: +; ClipStatus = TRUE (FALSE) to enable (disable) clipping +; Output: +; AX = old clip status +; +mxSetClip PROC FAR + ARG ClipStatus:BYTE:2 = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [mx_UserClipX1] + mov bx, [mx_UserClipY1] + mov cx, [mx_UserClipX2] + mov dx, [mx_UserClipY2] + cmp [ClipStatus], TRUE + je @@Done + mov ax, [mx_SysClipX1] + mov bx, [mx_SysClipY1] + mov cx, [mx_SysClipX2] + mov dx, [mx_SysClipY2] +@@Done: + mov [mx_ClipX1], ax + mov [mx_ClipY1], bx + mov [mx_ClipX2], cx + mov [mx_ClipY2], dx + + mov al, [ClipStatus] + xchg al, [mx_ClipStatus] + xor ah, ah + + .pop ds + .leave ARG_SIZE +mxSetClip ENDP + +;----------------------------------------------------------- +; +; Returns the current clipping status. +; +; Input: +; none +; Output: +; TRUE (FALSE) if clipping enabled (disabled) +; +mxGetClip PROC FAR + ASSUME ds:NOTHING + mov al, [mx_ClipStatus] + xor ah, ah + ret +mxGetClip ENDP + +;----------------------------------------------------------- +; +; Sets the system clip region and disables user clipping. +; +; Input: +; Width = width in pixels of clip region +; Height = height in pixels of clip region +; Output: +; old clip status. +; +mxSetSysClipRegion PROC FAR + ARG Height:WORD, \ + Width:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + xor ax, ax ; Sys clip region always starts at (0,0) + mov [mx_SysClipX1], ax + mov [mx_SysClipY1], ax + mov ax, [Width] + dec ax + mov [mx_SysClipX2], ax + mov ax, [Height] + dec ax + mov [mx_SysClipY2], ax + + IF USE286 EQ TRUE + push FALSE + ELSE + mov ax, FALSE + push ax + ENDIF + call mxSetClip + + .pop ds + .leave ARG_SIZE +mxSetSysClipRegion ENDP + +;----------------------------------------------------------- +; +; Sets the clip region. +; +; Input: +; X, Y = coordinates of top left corner of clip region +; Width = width in pixels of clip region +; Height = height in pixels of clip region +; Output: +; none (no checking on parameters) +; +mxSetClipRegion PROC FAR + ARG Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [X] + mov [mx_UserClipX1], ax + mov ax, [Y] + mov [mx_UserClipY1], ax + mov ax, [Width] + add ax, [X] + dec ax + mov [mx_UserClipX2], ax + mov ax, [Height] + add ax, [Y] + dec ax + mov [mx_UserClipY2], ax + + mov al, [mx_ClipStatus] + cmp al, TRUE + jne @@Exit + push ax + call mxSetClip + +@@Exit: + xor ax, ax + .pop ds + .leave ARG_SIZE +mxSetClipRegion ENDP + +;----------------------------------------------------------- +; +; Returns the current user clip region. +; +; Input: +; X, Y = pointers to integer coordinates of top left corner +; Width = pointer to word width of clip region +; Height = pointer to word height of clip region +; Output: +; AX = current clip status +; +mxGetClipRegion PROC FAR + ARG Height:DWORD, \ + Width:DWORD, \ + Y:DWORD, \ + X:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push es, di + + mov ax, [mx_UserClipX1] + les di, [X] + mov es:[di], ax + mov ax, [mx_UserClipY1] + les di, [Y] + mov es:[di], ax + + mov ax, [mx_UserClipX2] + sub ax, [mx_UserClipX1] + inc ax + les di, [Width] + mov es:[di], ax + mov ax, [mx_UserClipY2] + sub ax, [mx_UserClipY1] + inc ax + les di, [Height] + mov es:[di], ax + + mov al, [mx_ClipStatus] + xor ah, ah + .pop es, di + .leave ARG_SIZE +mxGetClipRegion ENDP + +;----------------------------------------------------------- +; +; Internal use: checks the coordinates of a rectangle against +; the active clip region. +; This function assumes that a "raw" image has to be clipped, +; so it returns in SI the number of "raw" bytes to skip if +; X, Y were clipped. +; +; Input: +; BX, AX = X, Y coordinates of rectangle (signed) +; CX = box width +; DX = box height +; Output: +; CF = set if rectangle is full clipped +; BX, AX = new X, Y coordinates of rectangle +; CX, DX = clipped width and height +; SI = number of bytes to skip before copying a buffer +; DI destroyed +; +subClipImage PROC NEAR + ASSUME ds:NOTHING + xor si, si + +; Check clip height + mov di, [mx_ClipY1] + cmp ax, di + jge @@CheckBottom + sub di, ax ; Number of lines to clip + sub dx, di ; New box height + jle @@Exit + mov ax, di + mov di, dx ; Save box height into DI + mul cx ; DX:AX = number of bytes to skip + mov si, ax + mov dx, di ; Restore box height + mov ax, [mx_ClipY1] +@@CheckBottom: + mov di, [mx_ClipY2] + cmp ax, di + jg @@Exit + inc di + sub di, dx + sub di, ax + jge @@DoneHeight ; None, continue + add dx, di ; Clip lines +@@DoneHeight: + +; Check clip width +@@CheckLeft: + mov di, [mx_ClipX1] + cmp bx, di + jge @@CheckRight + sub di, bx ; Number of columns to clip left + sub cx, di + jle @@Exit + add si, di ; Update skip count + mov bx, [mx_ClipX1] +@@CheckRight: + mov di, [mx_ClipX2] + cmp bx, di + jg @@Exit + inc di + sub di, bx + sub di, cx + jge @@DoneWidth ; None, exit + add cx, di ; New box width +@@DoneWidth: + +; Set return flag and exit +@@Done: + clc + ret +@@Exit: + stc + ret +subClipImage ENDP + +;----------------------------------------------------------- +; +; Internal use: checks the coordinates of a rectangle against +; the active clip region. +; +; Input: +; BX, AX = X, Y coordinates of rectangle (signed) +; CX = box width +; DX = box height +; Output: +; CF = set if rectangle is full clipped +; BX, AX = new X, Y coordinates of rectangle +; CX, DX = clipped width and height +; DI destroyed +; +subClipBox PROC NEAR + ASSUME ds:NOTHING + +; Check clip height + mov di, [mx_ClipY1] + cmp ax, di + jge @@CheckBottom + sub di, ax ; Number of lines to clip + sub dx, di ; New box height + jle @@Exit + mov ax, [mx_ClipY1] +@@CheckBottom: + mov di, [mx_ClipY2] + cmp ax, di + jg @@Exit + inc di + sub di, dx + sub di, ax ; Clipped some point? + jge @@DoneHeight ; No, continue + add dx, di ; Clip lines (DI is negative) +@@DoneHeight: + +; Check clip width +@@CheckLeft: + mov di, [mx_ClipX1] + cmp bx, di + jge @@CheckRight + sub di, bx ; Number of columns to clip left + sub cx, di + jle @@Exit + mov bx, [mx_ClipX1] +@@CheckRight: + mov di, [mx_ClipX2] + cmp bx, di + jg @@Exit + inc di + sub di, bx + sub di, cx ; Clipped some point? + jge @@DoneWidth ; No, exit + add cx, di ; New box width (DI is negative) +@@DoneWidth: + +; Set return flag and exit +@@Done: + clc + ret +@@Exit: + stc + ret +subClipBox ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxel.asm b/16/x_/mxel.asm new file mode 100755 index 00000000..2c9dda2a --- /dev/null +++ b/16/x_/mxel.asm @@ -0,0 +1,167 @@ +;----------------------------------------------------------- +; +; MXEL.ASM - Mid-point ellipse +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxEllipse + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD + +;----------------------------------------------------------- +; +; Draws an ellipse using the mid-point algorithm. +; +; Input: +; XC, YC = center coordinates +; A = horizontal radius +; B = vertical radius +; Color = ellipse color +; Output: +; none +; Note: +; computes only points in the first quadrant, all other +; points are obtained by symmetry. +; +mxEllipse PROC FAR + ARG Color:BYTE:2, \ + B:WORD, \ + A:WORD, \ + YC:WORD, \ + XC:WORD = ARG_SIZE + LOCAL A2:DWORD, \ + B2:DWORD, \ + CC:DWORD, \ + DD:DWORD, \ + X:DWORD, \ + Y:DWORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, di + + .chk386 mxEllipse, @@Exit + +; Initialize variables + xor eax, eax + mov [X], ax ; X = 0 + mov ax, [A] + mul eax ; EAX = A*A + mov [DD], eax ; DD = A*A + shl eax, 1 + mov [CC], eax ; CC = 2*A*A + shl eax, 1 + mov [A2], eax ; A2 = 4*A*A + movzx edx, [B] + mov [Y], edx + mul edx ; EAX = 4*A*A*B + sub [DD], eax ; DD = A*A - 4*A*A*B + movzx eax, [B] + mul eax ; EAX = B*B + shl eax, 2 ; EAX = 4*B*B + mov [B2], eax ; B2 = 4*B*B + add [CC], eax ; CC = 2*A*A + 4*B*B + add [D1], eax ; DD = A*A - 4*A*A*B + 4*B*B + +; Draw initial points + call subPlot4 + +; First loop +@@Loop1: + mov eax, [X] ; Check slope + mul [B2] + mov ecx, eax + mov eax, [Y] + mul [A2] + sub eax, ecx + sub eax, [CC] ; EAX = Y*A2 - X*B2 - CC + jle @@Done1 ; Crossed critical point, jump to next loop + + mov ecx, [DD] ; Get error + test ecx, ecx ; Positive? + jl @@Draw1 ; No, use default step + + mov eax, 1 + sub eax, [Y] + mul [A2] + shl eax, 1 + add ecx, eax ; Bump error + dec WORD PTR [Y] ; Decrement Y coordinate + +@@Draw1: + mov eax, [X] + shl eax, 1 + add eax, 3 + mul [B2] + add ecx, eax ; Bump error + mov [DD], ecx ; Save error + inc WORD PTR [X] ; Increment X coordinate + + call subPlot4 ; Draw points + jmp @@Loop1 +@@Done1: + +; Initialize variables + shr [B2], 2 + mov eax, [X] + mul eax + add [X] + shl eax, 2 + inc eax + mul [B2] + mov [DD], eax + mov eax, [Y] + mul eax + add [Y] + dec eax + add [Y] + sub eax, [B2] + add [DD], eax + shl [B2], 3 + inc WORD PTR [X] + +; Second loop +@@Loop2: + cmp WORD PTR [Y], 0 + ja @@Done2 + + mov ecx, [DD] + test ecx, ecx + jge @@Draw2 + + mov eax, [X] + inc eax + mul [B2] + add ecx, eax + inc WORD PTR [X] + +@@Draw2: + mov eax, [Y] + shl eax, 1 + sub eax, 3 + neg eax + imul [A2] + add ecx, eax + dec WORD PTR [Y] + + call subPlot4 + jmp @@Loop2 +@@Done2: + +@@Exit: + xor ax, ax + .leave ARG_SIZE +mxEllipse ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxfb.asm b/16/x_/mxfb.asm new file mode 100755 index 00000000..41ea5deb --- /dev/null +++ b/16/x_/mxfb.asm @@ -0,0 +1,194 @@ +;----------------------------------------------------------- +; +; MXFB.ASM - Fill box function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxFillBox + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD +EXTRN subClipBox : NEAR +EXTRN subHorizontalLineInfo : NEAR + +;----------------------------------------------------------- +; +; Raster op functions. Raster op is limited to OP_MOVE, +; OP_AND, OP_OR and OP_XOR. The VGA hardware is used to +; perform the selected logical functions on up to four +; pixel at a time. +; +subRepFill PROC NEAR + mov ah, al + shr cx, 1 + rep stosw + rcl cx, 1 + rep stosb + ret +subRepFill ENDP +; +subFill PROC NEAR +@@Loop: + mov ds:[bx], al + add bx, dx + loop @@Loop + ret +subFill ENDP +; +subRepMove PROC NEAR + mov si, di +@@Loop: + mov ah, ds:[si] ; Dummy read to latch the data + mov ds:[si], al + inc si + loop @@Loop + ret +subRepMove ENDP +; +subMove PROC NEAR +@@Loop: + mov ah, ds:[bx] ; Dummy read to latch the data + mov ds:[bx], al + add bx, dx + loop @@Loop + ret +subMove ENDP + +;----------------------------------------------------------- +; +; Fills a rectangle with a specified color. +; +; Input: +; X, Y = X, Y coordinates of rectangle +; Width = width of rectangle +; Height = height of rectangle +; Color = fill color +; Op = raster operator +; Output: +; none +; +; Note: raster op is limited to OP_MOVE, OP_AND, OP_OR and OP_XOR. +; +mxFillBox PROC FAR + ARG Op:WORD, \ + Color:BYTE:2, \ + Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD = ARG_SIZE + LOCAL LeftMask:BYTE, \ + RightMask:BYTE, \ + FillFunction:WORD, \ + RepFillFunction:WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + ASSUME ds:NOTHING + +; Clip rectangle + mov bx, [X] + mov ax, [Y] + mov cx, [Width] + mov dx, [Height] + call subClipBox + jc @@Exit ; Full clipped + + mov [Height], dx ; Save clipped height + call subHorizontalLineInfo ; Get additional info, init DI + mov [Width], cx + mov [LeftMask], al + mov [RightMask], ah + +; Initialize segments + mov ax, [mx_VideoSegment] + mov es, ax ; ES:DI points to pixel + mov ds, ax + cld ; Clear direction flag + +; Select fill functions + mov [FillFunction], OFFSET subFill + mov [RepFillFunction], OFFSET subRepFill + mov ax, [Op] ; Get raster op + cmp al, OP_XOR + ja @@1 ; Assume it's a fill + cmp al, OP_MOVE + je @@1 + .shl al, 3 + mov ah, al + mov al, 03h + mov dx, GDC + out dx, ax ; Set GDC logical function + mov [FillFunction], OFFSET subMove + mov [RepFillFunction], OFFSET subRepMove +@@1: + +; Fill left block +@@L0: + mov ah, [LeftMask] + or ah, ah + jz @@C0 ; Nothing to do, go to center block + mov dx, TS + mov al, 02h + out dx, ax ; Set write plane mask + mov dx, [mx_BytesPerLine] + mov cx, [Height] + mov bx, di + mov al, [Color] + call [FillFunction] ; Fill this column + inc di ; Update starting video offset + +; Fill center block +@@C0: + mov cx, [Width] + jcxz @@R0 ; Nothing to do, go to right block + mov dx, TS + mov ax, 0F02h + out dx, ax ; Write to all planes + mov al, [Color] + mov bx, di + mov dx, [Height] + push di ; Save pixel address +@@C1: + mov di, bx ; Update video offset + call [RepFillFunction] ; Fill current scan line + mov cx, [Width] ; Restore byte count + add bx, [mx_BytesPerLine] ; Bump to next scan line + dec dx ; Done all lines? + jnz @@C1 ; No, continue + pop di ; Restore pixel address + add di, [Width] ; Go to right block + +; Fill right block +@@R0: + mov ah, [RightMask] + or ah, ah + jz @@Done ; Nothing to do, exit + mov dx, TS + mov al, 02h + out dx, ax ; Set write plane mask + mov dx, [mx_BytesPerLine] + mov cx, [Height] + mov bx, di + mov al, [Color] + call [FillFunction] ; Fill this column + +; Restore VGA registers +@@Done: + mov dx, GDC + mov ax, 0003h + out dx, ax ; Set logical function to "move" + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxFillBox ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxfp.asm b/16/x_/mxfp.asm new file mode 100755 index 00000000..8eea25be --- /dev/null +++ b/16/x_/mxfp.asm @@ -0,0 +1,326 @@ +;----------------------------------------------------------- +; +; MXFP.ASM - Fade palette function +; Copyright (c) 1992-1994 ARTIS s.r.l. +; Author: Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxFadePalette + +MAXCOLOR EQU 256 +FADE_IN EQU 0 +FADE_OUT EQU 1 + +; The actual speed of fading depends on the number of passes (FADE_SPEED) and +; the delay between two consecutive passes (FADE_DELAY). Below are the +; default values, used when no parameters are specified. +; +FADE_DELAY EQU 1 ; Vert. retraces between video updates +FADE_SPEED EQU 48 ; Speed of effect (max 127) + +; Bit field record for fade commands +; +FADE_COMMAND RECORD fpDELAY:8,fpSPEED:7,fpDIRECTION:1 + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +DB 'Copyright (c) 1992-1994 ARTIS s.r.l. All rights reserved.' + +;----------------------------------------------------------- +; +; Fades a VGA palette. +; +; Input: +; Buffer = pointer to source/destination palette +; Command = fading direction and optional parameters +; Start = index of first color to fade +; Count = number of color to fade +; Red = destination red +; Green = destination green +; Blue = destination blue +; Output: +; none +; Notes: +; - about 1.5 Kbytes of stack space are needed for internal buffers; +; - the Command argument usually is 0 to fade in and 1 to fade out, +; however additional parameters may be specified. To set the effect +; speed, i.e. the number of iterations needed to completely fade a +; palette, shift the value one bit left and "or" it with the +; direction bit (range is 0..127). To set the delay between two +; consecutive passes, shift it eight bits left (range is 0..255). +; +mxFadePalette PROC FAR + ARG bBlue:WORD, \ + bGreen:WORD, \ + bRed:WORD, \ + wCount:WORD, \ + wStartIdx:WORD, \ + wCommand:WORD, \ + vfpPalette:DWORD = ARG_SIZE + LOCAL bSPalette:BYTE:MAXCOLOR*3, \ + bDPalette:BYTE:MAXCOLOR*3, \ + bLoopIndex:BYTE, \ + bLoopStep:BYTE, \ + bLoopCount:BYTE, \ + wDelay:WORD, \ + wSpeed:WORD = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push si, di, ds, es ; Save registers +; +; Check parameters and setup variables +; +@@GetDelay: + mov [wDelay], FADE_DELAY ; Set default delay + mov ax, [wCommand] ; Get command word + and ax, MASK fpDELAY ; Mask delay command + jz @@GetSpeed ; No command, get speed + IF USE286 EQ TRUE + shr ax, fpDELAY + ELSE + mov cl, fpDELAY ; Get size of delay field + shr ax, cl ; Right justify the field + ENDIF + mov [wDelay], ax ; Set new delay + +@@GetSpeed: + mov ax, [wCommand] ; Get command + and ax, MASK fpSPEED ; Mask speed + IF USE286 EQ TRUE + shr ax, fpSPEED + ELSE + mov cl, fpSPEED ; Get size of speed field + shr ax, cl ; Right justify the field + ENDIF + or ax, ax ; Any speed specified? + jnz @@SetVariables ; Yes, set variables + mov ax, FADE_SPEED ; Set default speed + +@@SetVariables: + mov [wSpeed], ax ; Set speed + inc ax ; Number of iterations + mov [bLoopCount], al ; Set loop count + mov [bLoopStep], 1 ; Assume we're fading in + mov [bLoopIndex], 0 +; +; Check bounds for bad values +; + mov ax, [wStartIdx] ; Get first index + cmp ax, MAXCOLOR ; Is in the valid range? + jae @@Exit ; No, exit + add ax, [wCount] ; Get last index + cmp ax, MAXCOLOR ; Is in the valid range? + jbe @@BoundsOk ; Yes, continue + mov ax, MAXCOLOR + sub ax, [wStartIdx] + mov [wCount], ax ; Set count to maximum value + or ax, ax + jz @@Exit ; Nothing to do, exit +@@BoundsOk: +; +; Copy the source palette in a local array: if we fade in it's ready to +; use, otherwise we'll overwrite it later +; + mov cx, [wCount] + mov ax, cx + shl ax, 1 + add cx, ax ; CX = wCount * 3 + mov ax, ss + mov es, ax + lea di, [bSPalette] ; ES:DI points to local palette + mov ax, [wStartIdx] + mov si, ax + shl ax, 1 + add ax, si + lds si, [vfpPalette] ; DS:SI points to user palette + add si, ax ; Skip unused entries + cld + shr cx, 1 + rep movsw + rcl cx, 1 + rep movsb +; +; Check direction +; + test [wCommand], MASK fpDIRECTION ; Are we fading in? + jz @@Main ; Yes, ok to continue + mov ax, [wSpeed] ; Get speed + mov [bLoopIndex], al ; Exchange first and last index + mov [bLoopStep], -1 ; Move backward + mov ax, ss ; Overwrite our copy of + mov ds, ax ; user palette with the + mov es, ax ; current active palette + lea di, [bSPalette] + mov ax, [wStartIdx] + mov cx, [wCount] + call ReadPalette ; Read current palette +; +; Prepare variables and registers for fading +; +@@Main: + mov bh, BYTE PTR [bRed] ; Destination red + and bh, 00111111b ; Be sure it's a valid VGA value + mov bl, BYTE PTR [bGreen] ; Destination green + and bl, 00111111b ; Be sure it's a valid VGA value + mov dh, BYTE PTR [bBlue] ; Destination blue + and dh, 00111111b ; Be sure it's a valid VGA value + mov dl, [bLoopIndex] ; Loop index + mov ax, ss ; All tables are stored + mov ds, ax ; in the stack segment, + mov es, ax ; set DS and ES +; +; Main loop +; +@@Loop: + mov ax, [wCount] ; Store count in AX + mov cx, [wSpeed] ; Set maximum speed in CX + lea si, [bSPalette] ; DS:SI points to source palette + lea di, [bDPalette] ; ES:DI points to dest. palette + call RecalcPalette ; Build a faded palette + + .push bx, dx ; Save registers we need + lea si, [bDPalette] ; DS:SI points to palette + mov ax, [wStartIdx] ; First index to write + mov bx, [wCount] ; Total entries to write + mov cx, [wDelay] ; Fade delay between updates + call WritePalette ; Write palette + .pop bx, dx ; Restore BX and DX + + add dl, [bLoopStep] ; Change fade intensity + dec [bLoopCount] ; Done? + jnz @@Loop ; No, loop again + +@@Exit: + .pop si, di, ds, es ; Restore registers + .leave ARG_SIZE +mxFadePalette ENDP + +;------- INTERNAL USE ONLY ------------------------------------------------ +; +; Calculates a partially faded palette. +; +; Input: +; AX = number of entries in palette +; CX = maximum fade intensity (same as fade speed) +; DS:SI = pointer to source palette +; ES:DI = pointer to destination palette +; BH = destination red +; BL = destination green +; DH = destination blue +; DL = relative intensity of destination palette +; Note: +; it's important that a new palette can be calculated in less +; than 1/70th of second. Fading to any RGB value requires use +; of "imul" instructions: "idiv" may be replaced with faster +; "sar", but only when the number of passes is a power of two, +; thus reducing the range of selectable speeds. +; In both cases an extimate of CPU cycles required by this +; procedure shows that it's too slow to run on a 4.77 Mhz 8086 +; CPU and a 256 color palette, so we keep "idiv" and hope +; the target machine to be at least a 6 Mhz 80286 (that's not +; asking too much...). +; +RecalcPalette PROC NEAR + cld + push bp ; Save BP + mov bp, ax ; Copy counter in BP +@@Loop: + lodsb ; Red: read value + sub al, bh ; Subtract destination value + imul dl ; Scale to desired weight + idiv cl ; Put value in AL + add al, bh ; Add destination value... + stosb ; ...and store it + lodsb ; Green: read value + sub al, bl ; Subtract destination value + imul dl ; Scale to desired weight + idiv cl ; Put value in AL + add al, bl ; Add destination value... + stosb ; ...and store it + lodsb ; Blue: read value + sub al, dh ; Subtract destination value + imul dl ; Scale to desired weight + idiv cl ; Put value in AL + add al, dh ; Add destination value... + stosb ; ...and store it + dec bp + jnz @@Loop + pop bp ; Restore BP + ret +RecalcPalette ENDP + +;------- INTERNAL USE ONLY ------------------------------------------------ +; +; Writes a 256 color palette. +; +; Input: +; AX = index of first color to write +; BX = number of colors to write (each color is an RGB triplet) +; CX = number of vertical retraces to wait before writing to DACs +; DS:SI = pointer to first entry of palette +; +WritePalette PROC NEAR + ASSUME ds:NOTHING + mov ah, al ; Save index + mov dx, 03DAh ; Input status register +@@Delay1: + in al, dx + test al, 08h + jnz @@Delay1 ; Wait for display mode +@@Delay2: + in al, dx + test al, 08h + jz @@Delay2 ; Wait for vertical retrace mode + loop @@Delay1 ; Repeat CX times +@@Write: + mov cx, bx ; Get number of colors + mov dx, 03C8h ; PEL write address register + mov al, ah ; Restore index + out dx, al ; Select index of first color + inc dx ; PEL data register + cld ; Move forward + cli ; Disable interrupts +@@Loop: + lodsb + out dx, al ; Red + lodsb + out dx, al ; Green + lodsb + out dx, al ; Blue + loop @@Loop ; Loop until done + sti ; Enable interrupts + ret +WritePalette ENDP + +;------- INTERNAL USE ONLY ------------------------------------------------ +; +; Reads the current palette. +; +; Input: +; AX = index of first color to read +; CX = number of colors +; ES:DI = pointer to destination buffer +; +ReadPalette PROC NEAR + mov dx, 03C7h + out dx, al + inc dx + inc dx + cld +@@Loop: + in al, dx + stosb + in al, dx + stosb + in al, dx + stosb + loop @@Loop + ret +ReadPalette ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxgc.asm b/16/x_/mxgc.asm new file mode 100755 index 00000000..85edf7a6 --- /dev/null +++ b/16/x_/mxgc.asm @@ -0,0 +1,54 @@ +;----------------------------------------------------------- +; +; MXGC.ASM - Get color function +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxGetColor + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Returns the current setting of the selected DAC register. +; +; Input: +; Index = color index (0-255) +; R, G, B = byte pointers to red, green and blue +; Output: +; none +; +mxGetColor PROC FAR + ARG B:DWORD, \ + G:DWORD, \ + R:DWORD, \ + Index:WORD = ARG_SIZE + .enter 0 + .push ds, si + + mov ax, [Index] + mov dx, 3C7h ; PEL read address register + out dx, al + inc dx + inc dx + + lds si, [R] + in al, dx + mov ds:[si], al + lds si, [G] + in al, dx + mov ds:[si], al + lds si, [B] + in al, dx + mov ds:[si], al + + .pop ds, si + .leave ARG_SIZE +mxGetColor ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxgi.asm b/16/x_/mxgi.asm new file mode 100755 index 00000000..7037d411 --- /dev/null +++ b/16/x_/mxgi.asm @@ -0,0 +1,132 @@ +;----------------------------------------------------------- +; +; MXGI.ASM - Get image +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxGetImage + +EXTRN subClipImage : NEAR + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_BytesPerLine : WORD + +;----------------------------------------------------------- +; +; Copies an image from screen to memory. +; +; Input: +; Image = pointer to buffer for image +; X, Y = coordinates of image on screen +; Width = width of image in pixels +; Height = height of image in pixels +; Output: +; none +; +mxGetImage PROC FAR + ARG Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD, \ + Image:DWORD = ARG_SIZE + LOCAL PlaneWidth:WORD:4, \ + PixelOffset:WORD, \ + MoveFunction:WORD, \ + ReadPlane:BYTE, \ + Count:BYTE = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + +; Clip image + mov bx, [X] + mov ax, [Y] + mov cx, [Width] + mov dx, [Height] + call subClipImage + jc @@Exit ; Full clipped + mov [Height], dx + add WORD PTR Image[0], si ; Skip clipped pixels + +; Get pixel address + mul [mx_BytesPerLine] + mov si, bx + shr si, 1 + shr si, 1 + add si, ax + mov [PixelOffset], si + mov ds, [mx_VideoSegment] ; DS:SI points to pixel + and bl, 03h + mov [ReadPlane], bl + +; Compute extra bytes and width count for each plane + mov bx, cx + shr bx, 1 + shr bx, 1 ; Width for each plane + and cl, 03h + mov al, 00001000b + shr al, cl + mov di, 3 SHL 1 +@@PatchLoop: + mov PlaneWidth[di], bx + shr al, 1 + adc bx, 0 + dec di + dec di + jge @@PatchLoop + +; Get image + cld + mov [Count], 4 ; Four planes + lea bx, PlaneWidth ; SS:[BX] = width in bytes for plane + mov es, WORD PTR Image[2] ; ES:DI will point to image + mov ah, [ReadPlane] +@@PlaneLoop: + cmp WORD PTR ss:[bx], 0 ; Exit if nothing more to do + je @@Exit ; (also, never try to move zero bytes!) + mov di, WORD PTR Image[0] + mov al, 04h + mov dx, GDC + out dx, ax ; Select read plane + mov dx, [Height] + mov si, [PixelOffset] ; DS:SI points to video memory +@@Loop: + .push si, di + mov cx, WORD PTR ss:[bx] ; Number of bytes to move +@@MoveLoop: + movsb + add di, 3 + dec cx + jnz @@MoveLoop + .pop si, di + add di, [Width] ; Go to next image line + add si, [mx_BytesPerLine] ; Go to next screen row + dec dx + jnz @@Loop ; Repeat for all lines + inc bx + inc bx ; Select width for next plane + inc ah + test ah, 04h ; Plane wraparound? + jz @@PlaneOk ; No + inc [PixelOffset] ; Yes, bump video pointer + and ah, 03h +@@PlaneOk: + inc WORD PTR Image[0] + dec [Count] + jnz @@PlaneLoop ; Repeat for all planes + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxGetImage ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxgm.asm b/16/x_/mxgm.asm new file mode 100755 index 00000000..a67476a0 --- /dev/null +++ b/16/x_/mxgm.asm @@ -0,0 +1,63 @@ +;----------------------------------------------------------- +; +; MXGM.ASM - Gamma correction +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxGammaCorrect + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +mx_tblGamma LABEL BYTE + DB 00, 10, 14, 17, 19, 21, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34 + DB 35, 36, 37, 37, 38, 39, 40, 41, 41, 42, 43, 44, 44, 45, 46, 46 + DB 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55 + DB 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63 + +;----------------------------------------------------------- +; +; Correct palette colors (gamma is 2.3). +; +; Input: +; CPal = pointer to color palette +; GPal = pointer to destination (gamma corrected) palette +; Count = number of colors to convert +; Output: +; none +; +; Note: CPal and GPal may point to the same buffer. +; +mxGammaCorrect PROC FAR + ARG Count:WORD, \ + DPal:DWORD, \ + SPal:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + + mov cx, [Count] + jcxz @@Exit ; Exit now if nothing to do + lds si, [SPal] + les di, [DPal] + mov bx, OFFSET mx_tblGamma ; Setup BX for XLAT instruction + cld + mov ax, cx ; AX = Count + add cx, cx ; CX = Count*2 + add cx, ax ; CX = Count*3 +@@Loop: + lodsb + xlat mx_tblGamma + stosb + loop @@Loop + +@@Exit: + .pop ds, si, es, di + .leave ARG_SIZE +mxGammaCorrect ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxgp.asm b/16/x_/mxgp.asm new file mode 100755 index 00000000..6c143173 --- /dev/null +++ b/16/x_/mxgp.asm @@ -0,0 +1,56 @@ +;----------------------------------------------------------- +; +; MXGP.ASM - Get palette function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxGetPalette + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Returns the current setting of the VGA palette. +; +; Input: +; Buffer = pointer to palette data (R,G,B) +; Start = index of first color to get +; Count = number of color to get +; Output: +; none +; +mxGetPalette PROC FAR + ARG Count:WORD, \ + Start:WORD, \ + Buffer:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push es, di + + les di, [Buffer] + mov cx, [Count] + mov ax, [Start] + mov dx, 3C7h ; PEL read address register + out dx, al + inc dx + inc dx + cld +@@Loop: + in al, dx + stosb + in al, dx + stosb + in al, dx + stosb + loop @@Loop ; Loop until done + + .pop es, di + .leave ARG_SIZE +mxGetPalette ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxgv.asm b/16/x_/mxgv.asm new file mode 100755 index 00000000..2a54b1d0 --- /dev/null +++ b/16/x_/mxgv.asm @@ -0,0 +1,25 @@ +;----------------------------------------------------------- +; +; MXGV.ASM - Get version function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxGetVersion + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Returns the library version. +; +mxGetVersion PROC FAR + mov ax, MXVERSION + ret +mxGetVersion ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxhl.asm b/16/x_/mxhl.asm new file mode 100755 index 00000000..049a0566 --- /dev/null +++ b/16/x_/mxhl.asm @@ -0,0 +1,76 @@ +;----------------------------------------------------------- +; +; MXHL.ASM - Horizontal line mask utility +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC subHorizontalLineInfo + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD + +tblLeftSize DW 00h, 03h, 02h, 01h +tblLeftMask DB 00h, 0Eh, 0Ch, 08h +tblRightMask DB 00h, 01h, 03h, 07h +tblPatchMask DB 02h, 06h + +;----------------------------------------------------------- +; +; Prepares register for fast horizontal line drawing. +; +; Input: +; BX, AX = X, Y address of left pixel +; CX = line width +; Output: +; DI = left pixel offset in video memory +; AL = left block write plane mask (0 = none) +; AH = right block write plane mask (0 = none) +; CX = center block width in 4-pixel blocks +; +subHorizontalLineInfo PROC NEAR + ASSUME ds:NOTHING + + mul [mx_BytesPerLine] + mov di, bx + shr di, 1 + shr di, 1 + add di, ax ; Offset of left pixel + + and bx, 03h + mov al, tblLeftMask[bx] + shl bx, 1 + sub cx, tblLeftSize[bx] + jge @@1 ; Ok to continue + +; Special case: start and end in the middle of a 4-pixel block. +; There are only three cases: +; Pixels Left mask CX CX+2 Patch mask Result +; 1) ..o. ..xx -1 1 .xx. ..x. +; 2) .oo. .xxx -1 1 .xx. .xx. +; 3) .o.. .xxx -2 0 .x.. .x.. +; All other cases are automatically handled with the standard masks. + mov bx, cx + inc bx + inc bx + and al, tblPatchMask[bx] ; Combine masks + xor ah, ah ; No right block + xor cx, cx ; No center block + jmp @@Exit + +@@1: + mov bx, cx + and bx, 03h + mov ah, tblRightMask[bx] + shr cx, 2 + +@@Exit: + ret +subHorizontalLineInfo ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxit.asm b/16/x_/mxit.asm new file mode 100755 index 00000000..c0d9cedd --- /dev/null +++ b/16/x_/mxit.asm @@ -0,0 +1,98 @@ +;----------------------------------------------------------- +; +; MXIT.ASM - Initialization/termination functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxInit +PUBLIC mxTerm + +PUBLIC mx_VideoSegment +PUBLIC mx_CodeSegment + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +DB 'MODEX library - Copyright (c) 1992-1994 Alessandro Scotti' + +mx_VideoSegment DW 0A000h +mx_CodeSegment DW SEG MX_TEXT + +;----------------------------------------------------------- +; +; Initialization. +; +; Input: +; none +; Output: +; AX = 0 on success +; +mxInit PROC FAR + LOCAL Result:WORD, \ + VideoSeg:WORD, \ + CStoDSalias:WORD = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + + mov [Result], -1 ; Assume an error + mov [VideoSeg], 0A000h ; Real mode video segment + mov [CStoDSalias], cs ; Real mode data alias for CS + +; Check if running in protected mode under DPMI + mov ax, 1686h + int 2Fh + or ax, ax + jnz @@1 ; DPMI not found, continue in real mode + +; Get a data alias for CS + mov ax, 000Ah ; DMPI: create data alias + mov bx, cs + int 31h + jc @@Exit ; Exit if service failed + mov [CStoDSalias], ax ; Save data alias for CS +; Get a protected-mode selector for the video segment + mov ax, 0002h + mov bx, 0A000h ; Real mode segment of video + int 31h ; DPMI: get segment selector + jc @@Exit ; Exit if service failed + mov [VideoSeg], ax ; Save protected mode video selector + +; Initialize variables +@@1: + mov ds, [CStoDSalias] + ASSUME ds:MX_TEXT + mov [mx_CodeSegment], ds + mov ax, [VideoSeg] + mov [mx_VideoSegment], ax + +; Don't bother with VGA check for now... + + mov [Result], 0 + +@@Exit: + mov ax, [Result] + .pop ds, si, es, di + .leave +mxInit ENDP + +;----------------------------------------------------------- +; +; Termination. +; +; Input: +; none +; Output: +; always 0. +; +mxTerm PROC FAR + ASSUME ds:NOTHING + xor ax, ax + ret +mxTerm ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxll.asm b/16/x_/mxll.asm new file mode 100755 index 00000000..34fec043 --- /dev/null +++ b/16/x_/mxll.asm @@ -0,0 +1,82 @@ +;----------------------------------------------------------- +; +; MXLL.ASM - Load latches +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxLoadLatches + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD + +;----------------------------------------------------------- +; +; Loads the specified value into the VGA latches. +; +; Input: +; BL = value to load into latches +; Output: +; none +; Changes: +; bit mask register to FFh; +; function select register to "move"; +; write mode to 00h. +; Note: +; this is for internal use only. +; +mxLoadLatches PROC NEAR + ASSUME ds:NOTHING + + .push ds, si + mov dx, GDC + mov ax, 0FF08h + out dx, ax ; Set bit mask to FFh + mov ax, 0003h + out dx, ax ; Set function to "move" + mov ax, 0005h + out dx, ax ; Set write mode + mov ax, [mx_VideoSegment] + mov ds, ax + mov si, 0FFFFh + mov bh, 8 ; BH = write plane mask + mov cx, 3 ; CX = count = read plane +; Saves old values and force BL into latches +@@SetLoop: + mov dx, GDC + mov al, 04h + mov ah, cl + out dx, ax ; Select read plane + mov dx, TS + mov al, 02h + mov ah, bh + out dx, ax ; Select write plane + mov al, ds:[si] + push ax + mov ds:[si], bl + mov al, ds:[di] ; Force value into latch + shr bh, 1 ; Next write plane + loop @@SetLoop +; Restore previous values + mov cx, 3 + mov bh, 8 + mov dx, TS +@@ResetLoop: + mov al, 02h + mov ah, bh + out dx, ax ; Select write plane + pop ax + mov ds:[si], al + shr bh, 1 ; Next write plane + loop @@ResetLoop +; Exit + .pop ds, si + ret +mxLoadLatches ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxln.asm b/16/x_/mxln.asm new file mode 100755 index 00000000..fbc4ab94 --- /dev/null +++ b/16/x_/mxln.asm @@ -0,0 +1,414 @@ +;----------------------------------------------------------- +; +; MXLN.ASM - Line function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxLine + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD + +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD + +tblDrawFunc LABEL WORD + DW subWidthMove + DW subHeightMove + DW subWidthOp + DW subHeightOp + +;----------------------------------------------------------- +; +; Draws a line from (X1,Y1) to (X2,Y2) using the Bresenham +; algorithm. +; +; Input: +; X1, Y1 = start point +; X2, Y2 = end point +; Color = line color +; Op = raster operator +; Output: +; none +; +; Note: the end point (X2,Y2) *IS* drawed. I don't like this very much +; but clipping is much simpler. +; +mxLine PROC FAR + ARG Op:WORD, \ + Color:WORD, \ + Y2:WORD, \ + X2:WORD, \ + Y1:WORD, \ + X1:WORD = ARG_SIZE + LOCAL Width:WORD, \ + Height:WORD, \ + ErrorAdd:WORD, \ + ErrorSub:WORD, \ + DeltaX:WORD, \ + DeltaY:WORD, \ + P1:BYTE, \ + P2:BYTE, \ + WritePlane:BYTE = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, di + ASSUME ds:NOTHING + + mov ax, [X1] + mov bx, [Y1] + mov cx, [X2] + mov dx, [Y2] + call subClipLine + jc @@Exit ; Line is full clipped + +; Get width + mov si, cx + xchg ax, si ; SI = X1, AX = X2 + sub ax, si + jge @@1 +; Swap points, we want X1 < X2 + xchg si, cx ; Swap X1 and X2 + xchg bx, dx ; Swap Y1 and Y2 + neg ax +@@1: + mov [Width], ax + +; Get height + mov cx, [mx_BytesPerLine] ; We don't need X2 anymore + mov ax, dx + sub ax, bx + jge @@2 + neg cx ; Move from bottom to top + neg ax ; Get absolute value of AX +@@2: + mov [Height], ax + mov [DeltaY], cx + +; Get pixel address and write plane + mov ax, bx + mul [mx_BytesPerLine] + mov cx, si ; CX = X1 + shr si, 1 + shr si, 1 + add si, ax ; SI = pixel offset + and cl, 03h + mov ax, 1102h + shl ah, cl + mov [WritePlane], ah + mov dx, TS + out dx, ax ; Set write plane + mov ax, [mx_VideoSegment] + mov ds, ax ; DS:SI points to (X1,Y1) + +; Select the function to handle the drawing loop + xor bx, bx + mov al, BYTE PTR [Op] + cmp al, OP_MOVE + je @@3 + and al, 03h + shl al, 1 + shl al, 1 + shl al, 1 + mov ah, al + mov al, 03h + mov dx, GDC + out dx, ax ; Set logical function + inc bx + inc bx +@@3: + mov ax, [Width] + mov cx, [Height] +; Horizontal, vertical and diagonal lines are not optimized yet + cmp ax, cx + jae @@4 + inc bx +@@4: + shl bx, 1 + call tblDrawFunc[bx] + +; Reset logical function if needed + cmp BYTE PTR [Op], OP_MOVE + je @@Exit + mov ax, 0003h + mov dx, GDC + out dx, ax + +@@Exit: + xor ax, ax + .pop ds, si, di + .leave ARG_SIZE + +;----------------------------------------------------------- +; +; Checks the coordinates of a line against the active +; clip region. +; Uses a variation of the Cohen-Sutherland algorithm developed +; by Victor Duvanenko. +; +; Input: +; AX, BX = X1, Y1 +; CX, DX = X2, Y2 +; Output: +; CF = set if line is full clipped +; AX, BX = clipped X1, Y1 +; CX, DX = clipped X2, Y2 +; Note: +; destroys SI, DI +; +subClipLine PROC NEAR + mov di, ax ; Copy X1 to DI and free AX + mov si, dx ; Copy Y2 to SI and free DX +; Compute clip codes for point (X2,Y2)=(CX,SI) + xor al, al +@@P2X1: cmp cx, [mx_ClipX1] + jge @@P2X2 + or al, 1 +@@P2X2: cmp cx, [mx_ClipX2] + jle @@P2Y1 + or al, 2 +@@P2Y1: cmp si, [mx_ClipY1] + jge @@P2Y2 + or al, 4 +@@P2Y2: cmp si, [mx_ClipY2] + jle @@P2XY + or al, 8 +@@P2XY: mov [P2], al +; Compute clip codes for point (X1,Y1)=(DI,BX) + xor al, al +@@P1X1: cmp di, [mx_ClipX1] + jge @@P1X2 + or al, 1 +@@P1X2: cmp di, [mx_ClipX2] + jle @@P1Y1 + or al, 2 +@@P1Y1: cmp bx, [mx_ClipY1] + jge @@P1Y2 + or al, 4 +@@P1Y2: cmp bx, [mx_ClipY2] + jle @@P1XY + or al, 8 +@@P1XY: mov [P1], al +; Check codes for trivial cases + mov ah, [P2] + test al, ah ; Is line invisible? + jnz @@FullClip ; Yes, exit + or ah, al ; Both points clipped? + jz @@Done ; Yes, exit +; Calculate deltas + mov ax, cx + sub ax, di + mov [DeltaX], ax + mov ax, si + sub ax, bx + mov [DeltaY], ax + mov al, [P1] ; Init clipping code +; Clipping loop +@@ClipLoop: + test al, al ; Is first point clipped? + jnz @@ClipX1 ; No, continue + xchg cx, di ; Swap points... + xchg bx, si + xchg al, [P2] ; ...and codes +; Clip left: Y1 = Y1 + DeltaY*(mx_ClipX1-X1)/DeltaX +@@ClipX1: + test al, 1 + jz @@ClipX2 + mov ax, [mx_ClipX1] + sub ax, di + mov di, [mx_ClipX1] + jmp @@ClipX1X2 +; Clip right: Y1 = Y1 + DeltaY*(mx_ClipX2-X1)/DeltaX +@@ClipX2: + test al, 2 + jz @@ClipY1 + mov ax, [mx_ClipX2] + sub ax, di + mov di, [mx_ClipX2] +@@ClipX1X2: + imul [DeltaY] + idiv [DeltaX] + add bx, ax + mov al, 8 + cmp bx, [mx_ClipY2] + jg @@CheckLoop + mov al, 4 + cmp bx, [mx_ClipY1] + jl @@CheckLoop + xor al, al + jmp @@CheckLoop +; Clip top: X1 = X1 + DeltaX*(mx_ClipY1-Y1)/DeltaY +@@ClipY1: + test al, 4 + jz @@ClipY2 + mov ax, [mx_ClipY1] + sub ax, bx + mov bx, [mx_ClipY1] + jmp @@ClipY1Y2 +; Clip bottom: X1 = X1 + DeltaX*(mx_ClipY2-Y1)/DeltaY +@@ClipY2: + mov ax, [mx_ClipY2] + sub ax, bx + mov bx, [mx_ClipY2] +@@ClipY1Y2: + imul [DeltaX] + idiv [DeltaY] + add di, ax + mov al, 1 + cmp di, [mx_ClipX1] + jl @@CheckLoop + mov al, 2 + cmp di, [mx_ClipX2] + jg @@CheckLoop + xor al, al +@@CheckLoop: + mov ah, [P2] + test al, ah + jnz @@FullClip + or ah, al + jnz @@ClipLoop + +@@Done: + mov ax, di + mov dx, si + clc + ret +@@FullClip: + stc + ret +subClipLine ENDP + +; Called when Width >= Height and Op = OP_MOVE +subWidthMove PROC NEAR + mov di, ax + neg di ; Initialize error term + shl cx, 1 + mov [ErrorAdd], cx + mov cx, ax + shl ax, 1 + mov [ErrorSub], ax + mov al, 02h + mov ah, [WritePlane] + mov bl, BYTE PTR [Color] + mov dx, TS + inc cx +@@Loop: + mov ds:[si], bl + dec cx + jz @@Exit + rol ah, 1 + adc si, 0 + out dx, ax + add di, [ErrorAdd] + jl @@Loop + add si, [DeltaY] + sub di, [ErrorSub] + jmp @@Loop +@@Exit: + ret +subWidthMove ENDP + +; Called when Width < Height and Op = OP_MOVE +subHeightMove PROC NEAR + mov di, cx + neg di ; Initialize error term + shl ax, 1 + mov [ErrorAdd], ax + mov ax, cx + shl ax, 1 + mov [ErrorSub], ax + mov bl, BYTE PTR [Color] + mov ah, [WritePlane] + mov al, 02h + mov dx, TS + inc cx +@@Loop: + mov ds:[si], bl + dec cx + jz @@Exit + add si, [DeltaY] + add di, [ErrorAdd] + jl @@Loop + rol ah, 1 ; Next write plane + adc si, 0 ; Bump video offset if plane overflows + out dx, ax + sub di, [ErrorSub] ; Adjust error down + jmp @@Loop +@@Exit: + ret +subHeightMove ENDP + +; Called when Width >= Height and Op <> OP_MOVE +subWidthOp PROC NEAR + mov di, ax + neg di ; Initialize error term + shl cx, 1 + mov [ErrorAdd], cx + mov cx, ax + shl ax, 1 + mov [ErrorSub], ax + mov al, 02h + mov ah, [WritePlane] + mov bl, BYTE PTR [Color] + mov dx, TS + inc cx +@@Loop: + mov bh, ds:[si] ; Latch data + mov ds:[si], bl + dec cx + jz @@Exit + rol ah, 1 + adc si, 0 + out dx, ax + add di, [ErrorAdd] + jl @@Loop + add si, [DeltaY] + sub di, [ErrorSub] + jmp @@Loop +@@Exit: + ret +subWidthOp ENDP + +; Called when Width < Height and Op <> OP_MOVE +subHeightOp PROC NEAR + mov di, cx + neg di ; Initialize error term + shl ax, 1 + mov [ErrorAdd], ax + mov ax, cx + shl ax, 1 + mov [ErrorSub], ax + mov bl, BYTE PTR [Color] + mov ah, [WritePlane] + mov al, 02h + mov dx, TS + inc cx +@@Loop: + mov bh, ds:[si] + mov ds:[si], bl + dec cx + jz @@Exit + add si, [DeltaY] + add di, [ErrorAdd] + jl @@Loop + rol ah, 1 ; Next write plane + adc si, 0 ; Bump video offset if plane overflows + out dx, ax + sub di, [ErrorSub] ; Adjust error down + jmp @@Loop +@@Exit: + ret +subHeightOp ENDP + +mxLine ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxot.asm b/16/x_/mxot.asm new file mode 100755 index 00000000..62547665 --- /dev/null +++ b/16/x_/mxot.asm @@ -0,0 +1,330 @@ +;----------------------------------------------------------- +; +; MXOT.ASM - Text functions +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES ; We use the reserved name 'WIDTH' +INCLUDE MODEX.DEF + +PUBLIC mxOutChar +PUBLIC mxOutText +PUBLIC mxSetFont +PUBLIC mxSetTextColor +PUBLIC mxGetTextStep +PUBLIC mxSetTextStep + +MAX_WIDTH EQU 16 ; Must be <= 16 +MAX_HEIGHT EQU 32 + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_CodeSegment : WORD +EXTRN mxPutImage : FAR + +; Default 8x8 font +fnt_Default LABEL + INCLUDE DEFAULT.FNT + +; Table of system fonts +tbl_SystemFont LABEL WORD + DW fnt_Default, 8, 8 + +MX_MAXSYSFONT EQU ($-OFFSET tbl_SystemFont) SHR 2 + +mx_FontPtr DW OFFSET fnt_Default, SEG MX_TEXT +mx_FontWidth DW 8 ; Font width in pixels +mx_FontHeight DW 8 ; Font height in pixels +mx_FontCharSize DW 8 ; Size in bytes of a font character +mx_FontColor DW 00FFh ; Color: foreground + background*256 +mx_FontOp DW OP_MOVE ; Raster op +mx_DeltaX DW 8 ; Horizontal step +mx_DeltaY DW 0 ; Vertical step + +;----------------------------------------------------------- +; +; Sets the current font. +; +; Input: +; Font = pointer to font data +; Width = width of font character in pixels +; Height = height of font character in pixels +; Output: +; AX = 0 on success, else invalid parameters +; +; Note: when the high word of Font (i.e. the segment) is zero, the low +; word is used to select one of the system fonts. +; +mxSetFont PROC FAR + ARG Height:WORD, \ + Width:WORD, \ + Font:DWORD = ARG_SIZE + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, WORD PTR Font[2] ; Get font segment + test ax, ax ; Null segment? + jnz @@UserFont ; No, install user font + +; Install system font + mov ax, WORD PTR Font[0] ; Get font number + cmp ax, MX_MAXSYSFONT ; Check range + jb @@SystemFont + xor ax, ax ; Out of range, use default font +@@SystemFont: + shl ax, 1 + shl ax, 1 + mov bx, ax + mov ax, tbl_SystemFont[bx] ; Get font offset + mov WORD PTR mx_FontPtr[0], ax + mov WORD PTR mx_FontPtr[2], cs + mov al, BYTE PTR tbl_SystemFont[bx+2] + xor ah, ah + mov [mx_FontWidth], ax + mov [mx_DeltaX], ax + mov dl, BYTE PTR tbl_SystemFont[bx+3] + xor dh, dh + mov [mx_FontHeight], dx + mul dx + mov [mx_FontCharSize], ax + mov [mx_DeltaX], ax + xor ax, ax + mov [mx_DeltaY], ax + jmp @@Exit + +; Install user font +@@UserFont: + mov ax, -1 ; Assume an error + mov bx, [Width] + cmp bx, MAX_WIDTH + ja @@Exit ; Invalid character width + mov dx, [Height] + cmp dx, MAX_HEIGHT + ja @@Exit ; Invalid character height + mov [mx_FontWidth], bx + mov [mx_FontHeight], dx + mov ax, bx + add ax, 7 + .shr ax, 3 + mul dx + mov [mx_FontCharSize], ax + mov ax, WORD PTR Font[0] + mov WORD PTR mx_FontPtr[0], ax + mov ax, WORD PTR Font[2] + mov WORD PTR mx_FontPtr[2], ax + xor ax, ax + +@@Exit: + .pop ds + ASSUME ds:NOTHING + .leave ARG_SIZE +mxSetFont ENDP + +;----------------------------------------------------------- +; +; Sets the text color and raster op. +; +; Input: +; Color = text color (foreground + background*256) +; Op = raster op +; Output: +; none +; +mxSetTextColor PROC FAR + ARG Op:WORD, \ + Color:WORD = ARG_SIZE + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [Color] + mov [mx_FontColor], ax + mov ax, [Op] + mov [mx_FontOp], ax + + xor ax, ax + .pop ds + ASSUME ds:NOTHING + .leave ARG_SIZE +mxSetTextColor ENDP + +;----------------------------------------------------------- +; +; Writes a character using the current font and attributes. +; +; Input: +; X, Y = video coordinates +; C = character to print +; Output: +; none +; +mxOutChar PROC FAR + ARG C:BYTE:2, \ + Y:WORD, \ + X:WORD = ARG_SIZE + LOCAL Image:BYTE:MAX_WIDTH*MAX_HEIGHT, \ + Count:WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + ASSUME ds:NOTHING + +; Gets the pointer to font data for the selected character + lds si, DWORD PTR [mx_FontPtr] + mov al, [C] + xor ah, ah + mul [mx_FontCharSize] ; Offset into font + add si, ax ; DS:SI -> font data for character + +; Converts font data into a 256-color linear image + mov ax, ss + mov es, ax + lea di, [Image] + mov dx, [mx_FontColor] + mov ax, [mx_FontHeight] + mov [Count], ax +@@HeightLoop: + mov cx, [mx_FontWidth] + mov bh, ds:[si] + inc si ; Get a byte from font data + cmp cx, 8 + jbe @@WidthLoop ; Ok for width <= 8 + mov bl, ds:[si] ; Get another byte + inc si +@@WidthLoop: + mov al, dl ; Assume foreground color + shl bx, 1 ; Is font bit set? + jc @@1 ; Yes, foreground is just great + mov al, dh ; Get background color +@@1: + mov es:[di], al ; Put pixel into image + inc di + dec cx + jnz @@WidthLoop + dec [Count] + jnz @@HeightLoop + +; Now pass image to mx_PutImage + lea ax, [Image] + push es + push ax ; Pointer to image + push [X] + push [Y] ; Image coordinates + push [mx_FontWidth] + push [mx_FontHeight] ; Image size + push [mx_FontOp] ; Raster op + call mxPutImage ; Write character + + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxOutChar ENDP + +;----------------------------------------------------------- +; +; Writes a string at the coordinates specified. +; +; Input: +; X, Y = text coordinates +; S = pointer to ASCIIZ string +; Output: +; none +; +mxOutText PROC FAR + ARG S:DWORD, \ + Y:WORD, \ + X:WORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + lds si, [S] +@@Loop: + mov al, ds:[si] + test al, al ; End of string? + jz @@Exit ; Yes, exit + inc si + push [X] ; Display character + push [Y] + push ax + call mxOutChar + mov ax, [mx_DeltaX] + add [X], ax ; Bump X coordinate + mov ax, [mx_DeltaY] + add [Y], ax ; Bump Y coordinate + dec [Count] + jnz @@Loop + +@@Exit: + xor ax, ax + .pop ds, si + .leave ARG_SIZE + ret +mxOutText ENDP + +;----------------------------------------------------------- +; +; Sets the distance between characters. +; +; Input: +; DeltaX = horizontal distance in pixels +; DeltaY = vertical distance in pixels +; Output: +; none +; +; Note: this function may be used to set the text direction. +; +mxSetTextStep PROC FAR + ARG DeltaY:WORD, \ + DeltaX:WORD = ARG_SIZE + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [DeltaX] + mov [mx_DeltaX], ax + mov ax, [DeltaY] + mov [mx_DeltaY], ax + + .pop ds + .leave ARG_SIZE +mxSetTextStep ENDP + +;----------------------------------------------------------- +; +; Gets the current distance between characters. +; +; Input: +; DeltaX = pointer to horizontal distance in pixels (integer) +; DeltaY = pointer to vertical distance in pixels (integer) +; Output: +; none +; +mxGetTextStep PROC FAR + ARG DeltaY:DWORD, \ + DeltaX:DWORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + mov ax, [mx_DeltaX] + lds si, [DeltaX] + mov ds:[si], ax + mov ax, [mx_DeltaY] + lds si, [DeltaY] + mov ds:[si], ax + + .pop ds, si + .leave ARG_SIZE +mxGetTextStep ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxpb.asm b/16/x_/mxpb.asm new file mode 100755 index 00000000..8c6aa449 --- /dev/null +++ b/16/x_/mxpb.asm @@ -0,0 +1,22 @@ +;----------------------------------------------------------- +; +; MXPB.ASM - Scan buffer for convex polygon fills +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mx_ScanBuffer + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +ALIGN 4 + +mx_ScanBuffer LABEL + DW POLYSCANBUFSIZE DUP(?) + +MX_TEXT ENDS +END diff --git a/16/x_/mxpf.asm b/16/x_/mxpf.asm new file mode 100755 index 00000000..db0da898 --- /dev/null +++ b/16/x_/mxpf.asm @@ -0,0 +1,420 @@ +;----------------------------------------------------------- +; +; MXPG.ASM - Convex polygon fill +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxFillPoly + +;----------------------------------------------------------- +; +; "Local" definitions +; +TPOINT STRUC + X DW ? + Y DW ? +TPOINT ENDS + +; Do NOT change order! +TSCAN STRUC + Y1 DW ? + Y2 DW ? +TSCAN ENDS + +MAXSCANCOLUMNS EQU POLYSCANBUFSIZE / SIZE TSCAN + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_CodeSegment : WORD +EXTRN mx_BytesPerLine : WORD +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD +EXTRN mx_ScanBuffer : NEAR + +;----------------------------------------------------------- +; +; Scans an edge using the DDA (digital differential analyzer) algorithm. +; +; Input: +; DS:BX = pointer to start point (X1, Y1) +; DS:SI = pointer to end point (X2, Y2) +; ES:DI = pointer to edge buffer +; Output: +; ES:DI = updated pointer to edge buffer +; Notes: +; must preserve DS:SI. +; +subScan PROC NEAR + mov cx, ds:[si].X + sub cx, ds:[bx].X ; Get width + jg @@1 + ret +@@1: + push bp ; Save BP + + mov ax, ds:[si].Y + mov bx, ds:[bx].Y + sub ax, bx ; Get height + jg @@T2B ; Scan top to bottom + jl @@B2T ; Scan bottom to top + +; Special case: vertical line + mov ax, bx +@@V: + mov es:[di].Y1, ax + add di, SIZE TSCAN + dec cx + jnz @@V + jmp @@Exit + +; Scan top to bottom +@@T2B: + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx ; BP:BX = fixed 16:16 step + mov dx, 8000h +@@T2BLoop: + mov es:[di].Y1, ax + add di, SIZE TSCAN + add dx, bx + adc ax, bp + dec cx + jnz @@T2BLoop + jmp @@Exit + +; Scan bottom to top +@@B2T: + neg ax + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx + mov dx, 8000h +@@B2TLoop: + mov es:[di].Y1, ax + add di, SIZE TSCAN + sub dx, bx + sbb ax, bp + dec cx + jnz @@B2TLoop + +@@Exit: + pop bp ; Restore BP + ret +subScan ENDP + +;----------------------------------------------------------- +; +; Fills a convex polygon with the specified color. +; +; Input: +; Count = number of vertexes +; Map = indexes of points and colors (integer) +; Points = array of points (integer X, Y coordinates) +; Color = base color +; Output: +; none +; Notes: +; vertexes must be in counterclockwise order, arrays are 0-based. +; +mxFillPoly PROC FAR + ARG Color:WORD, \ + Points:DWORD, \ + Map:DWORD, \ + Count:WORD = ARG_SIZE + LOCAL WritePlane:BYTE:2, \ + ScanOffsetT:WORD, \ + ScanOffsetB:WORD, \ + ScanCount:WORD, \ + Holder:WORD, \ + Height:WORD, \ + MinIdxT:WORD, \ + MinIdxB:WORD, \ + MaxIdx:WORD, \ + Width:WORD, \ + BoxX1:WORD, \ + BoxY1:WORD, \ + BoxX2:WORD, \ + BoxY2::WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + ASSUME ds:NOTHING + +; Check that at least three vertexes are specified + mov cx, [Count] + cmp cx, 3 + jb @@Exit + +;------------------------------ +; Find bounding box for polygon + les di, [Map] + lds si, [Points] ; Pointer to vertex array + mov [BoxX1], 32767 + mov [BoxX2], -32768 + mov [BoxY1], 32767 + mov [BoxY2], -32768 + + xor dx, dx +@@MinMaxLoop: + mov bx, es:[di] ; Get index of vertex + .shl bx, 2 ; Get offset in point array + add bx, si + +; Check X range +@@CheckMinX: + mov ax, ds:[bx].X ; Get X coordinate + cmp ax, [BoxX1] + jge @@CheckMaxX + mov [BoxX1], ax + mov [MinIdxT], dx + mov [MinIdxB], dx +@@CheckMaxX: + cmp ax, [BoxX2] + jle @@CheckMinY + mov [BoxX2], ax + mov [MaxIdx], dx + +; Check Y range +@@CheckMinY: + mov ax, ds:[bx].Y + cmp ax, [BoxY1] + jge @@CheckMaxY + mov [BoxY1], ax +@@CheckMaxY: + cmp ax, [BoxY2] + jle @@CheckDone + mov [BoxY2], ax + +; Repeat thru all points +@@CheckDone: + inc di ; Next map entry + inc dx + inc di + inc dx + dec cx + jnz @@MinMaxLoop + +;--------------------------------- +; Check if polygon is full clipped + mov ax, [BoxX2] + cmp ax, [mx_ClipX1] ; Is poly full clipped? + jl @@Exit + mov bx, [BoxX1] + cmp bx, [mx_ClipX2] ; Is poly full clipped? + jg @@Exit + sub ax, bx ; Get width + jle @@Exit ; Exit if not positive + mov ax, [BoxY2] + cmp ax, [mx_ClipY1] ; Is poly full clipped? + jl @@Exit + mov bx, [BoxY1] + cmp bx, [mx_ClipY2] ; Is poly full clipped? + jg @@Exit + sub ax, bx ; Get height + jle @@Exit ; Exit if not positive + + dec [Count] + shl [Count], 1 ; We'll work with word offsets + mov es, [mx_CodeSegment] + +;-------------- +; Scan top edge + mov ax, OFFSET mx_ScanBuffer + mov [ScanOffsetT], ax + mov si, [MinIdxT] ; Offset of bottom point index +@@STLoop: + lds bx, [Map] ; DS:BX -> map table + mov di, ds:[bx+si] ; Index of top point #1 + dec si ; Next point + dec si + test si, si + jnl @@ST1 + mov si, [Count] +@@ST1: + mov [MinIdxT], si ; Save new index of top point + mov si, ds:[bx+si] ; Get index of top point #2 + .shl di, 2 ; Convert indexes to offsets + .shl si, 2 + lds bx, [Points] ; DS:BX -> point array + add si, bx ; DS:SI -> top point #2 + add bx, di ; DS:BX -> top point #1 + mov di, [ScanOffsetT] + call subScan ; Scan edge + mov [ScanOffsetT], di + mov si, [MinIdxT] + cmp si, [MaxIdx] ; End of edge? + jne @@STLoop ; No, continue + +;----------------- +; Scan bottom edge + mov ax, OFFSET mx_ScanBuffer + OFFSET Y2 + mov [ScanOffsetB], ax + mov si, [MinIdxB] ; Offset of bottom point index +@@SBLoop: + lds bx, [Map] ; DS:BX -> map table + mov di, ds:[bx+si] ; Index of bottom point #1 + inc si ; Next bottom point + inc si + cmp si, [Count] + jbe @@SB1 + xor si, si +@@SB1: + mov [MinIdxB], si ; Save new index of bottom point + mov si, ds:[bx+si] ; Get index of bottom point #2 + .shl di, 2 ; Convert indexes to offsets + .shl si, 2 + lds bx, [Points] ; DS:BX -> point array + add si, bx ; DS:SI -> top point #2 + add bx, di ; DS:BX -> top point #1 + mov di, [ScanOffsetB] + call subScan ; Scan edge + mov [ScanOffsetB], di + mov si, [MinIdxB] + cmp si, [MaxIdx] ; End of edge? + jne @@SBLoop ; No, continue + +;-------------------- +; Clip left and right + mov si, OFFSET mx_ScanBuffer + mov ax, [BoxX1] + mov cx, [BoxX2] + sub cx, ax ; CX = bounding box width + mov bx, [mx_ClipX1] + sub bx, ax + jle @@ClipL1 ; No need to clip left + sub cx, bx ; Update width + add ax, bx ; BoxX1 = mx_ClipX1 + mov [BoxX1], ax + .shl bx, 2 ; Warning!!! This is an hand-coded + add si, bx ; multiply by the size of TSCAN +@@ClipL1: + mov bx, ax + add bx, cx ; Last scan column + sub bx, [mx_ClipX2] + jle @@ClipL2 ; No need to clip right + sub cx, bx ; Clip right +@@ClipL2: + test cx, cx ; Is clipped width positive? + jle @@Exit ; No, exit + mov [ScanCount], cx ; Save number of columns to draw + mov [ScanOffsetT], si ; Remember offset of (clipped) buffer + mov ds, [mx_CodeSegment] ; DS:SI -> scan buffer + +;------------------------------ +; Check if Y clipping is needed + mov ax, [BoxY1] + cmp ax, [mx_ClipY1] + jl @@ClipTB ; Need to clip top + mov ax, [BoxY2] + cmp ax, [mx_ClipY2] + jg @@ClipTB ; Need to clip bottom + jmp @@ClipYExit ; Skip Y clipping + +;-------------------- +; Clip top and bottom +@@ClipTB: + mov di, cx ; DI = scan count + inc di ; Increment count for pre-loop test + sub si, SIZE TSCAN +@@ClipYLoop: + dec di ; Any column left? + jz @@ClipYExit ; No, exit + add si, SIZE TSCAN + mov ax, ds:[si].Y1 ; Y1 + mov cx, ds:[si].Y2 ; Y2 + mov dx, [mx_ClipY2] + cmp ax, dx ; Full clipped? + jg @@ClipYClip ; Yes, skip this column + cmp cx, dx ; Need to clip bottom? + jle @@ClipY1 ; No, continue +; Clip bottom + mov ds:[si].Y2, dx + mov bx, cx + sub bx, dx ; Clip distance + sub cx, ax ; Height + jle @@ClipYClip + mov cx, ds:[si].Y2 +@@ClipY1: + mov dx, [mx_ClipY1] + cmp cx, dx ; Full top clipped? + jl @@ClipYClip ; Yes, skip + sub cx, ax ; Get height + jle @@ClipYClip ; Skip if not positive + cmp ax, dx ; Need to clip top? + jge @@ClipYLoop ; No, continue +; Clip top + mov ds:[si].Y1, dx ; Y1 = mx_ClipY1 + sub dx, ax ; DX = number of pixels clipped + cmp cx, dx + ja @@ClipYLoop ; Not clipped, continue +@@ClipYClip: + mov ds:[si].Y1, -1 ; Mark column as clipped + jmp @@ClipYLoop +@@ClipYExit: + +;------------- +; Draw columns + mov es, [mx_VideoSegment] + mov si, [ScanOffsetT] + mov cl, BYTE PTR [BoxX1] ; Init write plane + and cl, 03h + mov al, 11h + shl al, cl + mov [WritePlane], al + .shr [BoxX1], 2 +@@DrawLoop: + mov ax, ds:[si].Y1 + test ax, ax ; Was column clipped? + js @@DrawNext ; Yes, skip + mov cx, ds:[si].Y2 + sub cx, ax ; CX = height + jle @@DrawNext + mul [mx_BytesPerLine] ; Get pixel address + add ax, [BoxX1] + mov di, ax + mov ah, [WritePlane] + mov dx, TS + mov al, 02h + out dx, ax + mov ax, [Color] + mov dx, [mx_BytesPerLine] + shr cx, 1 + jnc @@FillScan + mov es:[di], al + add di, dx + jcxz @@DrawNext +@@FillScan: + mov es:[di], al + add di, dx + mov es:[di], al + add di, dx + dec cx + jnz @@FillScan +@@DrawNext: + rol [WritePlane], 1 + adc [BoxX1], 0 ; Bump pointer to video memory if needed + add si, SIZE TSCAN + dec [ScanCount] + jnz @@DrawLoop + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxFillPoly ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxpg.asm b/16/x_/mxpg.asm new file mode 100755 index 00000000..caa7cf1b --- /dev/null +++ b/16/x_/mxpg.asm @@ -0,0 +1,589 @@ +;----------------------------------------------------------- +; +; MXPG.ASM - Convex polygon fill with Gouraud shading +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxGouraudPoly + +;----------------------------------------------------------- +; +; "Local" definitions +; +TPOINT STRUC + X DW ? + Y DW ? +TPOINT ENDS + +; Do NOT change order! +TSCAN STRUC + Y1 DW ? + E1 DB ? + C1 DB ? + Y2 DW ? + E2 DB ? + C2 DB ? +TSCAN ENDS + +MAXSCANCOLUMNS EQU POLYSCANBUFSIZE / SIZE TSCAN + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_CodeSegment : WORD +EXTRN mx_BytesPerLine : WORD +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD +EXTRN mx_ScanBuffer : NEAR + +;----------------------------------------------------------- +; +; Scans an edge using the DDA (digital differential analyzer) algorithm. +; Also interpolates color for shading. +; +; Input: +; DS:BX = pointer to start point (X1, Y1) +; DS:SI = pointer to end point (X2, Y2) +; ES:DI = pointer to edge buffer +; DX = start color +; AX = end color +; Output: +; ES:DI = updated pointer to edge buffer +; Notes: +; must preserve DS:SI. +; +subScan PROC NEAR + mov cx, ds:[si].X + sub cx, ds:[bx].X ; Get width + jg @@1 + ret +@@1: + push bp ; Save BP + push di ; Save scan info offset + push cx ; Save height + push ax ; Save colors + push dx + + mov ax, ds:[si].Y + mov bx, ds:[bx].Y + sub ax, bx ; Get height + jg @@T2B ; Scan top to bottom + jl @@B2T ; Scan bottom to top + +; Special case: vertical line + mov ax, bx +@@V: + mov es:[di].Y1, ax + add di, SIZE TSCAN + dec cx + jnz @@V + jmp @@GetColorInfo + +; Scan top to bottom +@@T2B: + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx ; BP:BX = fixed 16:16 step + mov dx, 8000h +@@T2BLoop: + mov es:[di].Y1, ax + add di, SIZE TSCAN + add dx, bx + adc ax, bp + dec cx + jnz @@T2BLoop + jmp @@GetColorInfo + +; Scan bottom to top +@@B2T: + neg ax + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx + mov dx, 8000h +@@B2TLoop: + mov es:[di].Y1, ax + add di, SIZE TSCAN + sub dx, bx + sbb ax, bp + dec cx + jnz @@B2TLoop + +; Now get the color info +@@GetColorInfo: + pop bx ; Restore colors + pop ax + pop cx ; Height + pop di ; ES:DI -> scan info + + sub ax, bx ; Get color range + jg @@CL2R + jl @@CR2L + +; Special case: same color + mov ah, bl + mov al, 80h +@@CV: + mov WORD PTR es:[di].E1, ax + add di, SIZE TSCAN + dec cx + jnz @@CV + jmp @@Exit + +; Scan left to right +@@CL2R: + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx ; BP:BX = fixed 16:16 step + mov dx, 8000h +@@CL2RLoop: + mov es:[di].C1, al + mov es:[di].E1, dh + add di, SIZE TSCAN + add dx, bx + adc ax, bp + dec cx + jnz @@CL2RLoop + jmp @@Exit + +; Scan right to left +@@CR2L: + neg ax + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx + mov dx, 8000h + +@@CR2LLoop: + mov es:[di].C1, al + mov es:[di].E1, dh + add di, SIZE TSCAN + sub dx, bx + sbb ax, bp + dec cx + jnz @@CR2LLoop + +@@Exit: + pop bp + ret +subScan ENDP + +;----------------------------------------------------------- +; +; Fills a scan column. +; +; Input: +; DS:SI = current TSCAN +; ES:DI = address of top pixel +; CX = number of pixels to write +; DX = base color +; Output: +; none +; +subFillScan PROC NEAR + mov ax, WORD PTR ds:[si].E2 + mov bx, WORD PTR ds:[si].E1 + cmp ah, bh + jg @@L2R ; Color increases + jl @@R2L ; Color decreases + +; Special case: color doesn't change + add ax, dx + mov dx, [mx_BytesPerLine] +@@V: + mov es:[di], ah + add di, dx + dec cx + jnz @@V + ret + +; Color increases +@@L2R: + .push bp, si + mov si, bx + add si, dx ; Relocate color + sub ax, bx + xor dx, dx + div cx + mov bp, ax ; BP = color step, integer part + xor ax, ax + div cx + mov bx, ax ; BX = color step, fractional part + mov dx, 8000h + mov ax, [mx_BytesPerLine] + xchg si, ax +@@L2RLoop: + mov es:[di], ah + add dx, bx + adc ax, bp + add di, si + dec cx + jnz @@L2RLoop + .pop bp, si + ret + +; Color decreases +@@R2L: + .push bp, si + mov si, bx + add si, dx ; Relocate color + sub ax, bx + neg ax + xor dx, dx + div cx + mov bp, ax ; BP = color step, integer part + xor ax, ax + div cx + mov bx, ax ; BX = color step, fractional part + mov dx, 8000h + mov ax, [mx_BytesPerLine] + xchg si, ax +@@R2LLoop: + mov es:[di], ah + sub dx, bx + sbb ax, bp + add di, si + dec cx + jnz @@R2LLoop + .pop bp, si + ret +subFillScan ENDP + +;----------------------------------------------------------- +; +; Fills a convex polygon with the specified color. +; Interpolates pixel colors using the Gouraud algorithm. +; +; Input: +; Count = number of vertexes +; Map = indexes of points and colors (integer) +; Points = array of points (integer X, Y coordinates) +; Colors = array of colors (integer) +; Color = base color +; Output: +; none +; Notes: +; vertexes must be in counterclockwise order, arrays are 0-based. +; +mxGouraudPoly PROC FAR + ARG Color:WORD, \ + Colors:DWORD, \ + Points:DWORD, \ + Map:DWORD, \ + Count:WORD = ARG_SIZE + LOCAL WritePlane:BYTE:2, \ + ScanOffsetT:WORD, \ + ScanOffsetB:WORD, \ + ScanCount:WORD, \ + Holder:WORD, \ + Height:WORD, \ + MinIdxT:WORD, \ + MinIdxB:WORD, \ + MaxIdx:WORD, \ + Width:WORD, \ + BoxX1:WORD, \ + BoxY1:WORD, \ + BoxX2:WORD, \ + BoxY2::WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + ASSUME ds:NOTHING + +; Check that at least three vertexes are specified + mov cx, [Count] + cmp cx, 3 + jb @@Exit + +;------------------------------ +; Find bounding box for polygon + les di, [Map] + lds si, [Points] ; Pointer to vertex array + mov [BoxX1], 32767 + mov [BoxX2], -32768 + mov [BoxY1], 32767 + mov [BoxY2], -32768 + + xor dx, dx +@@MinMaxLoop: + mov bx, es:[di] ; Get index of vertex + .shl bx, 2 ; Get offset in point array + add bx, si + +; Check X range +@@CheckMinX: + mov ax, ds:[bx].X ; Get X coordinate + cmp ax, [BoxX1] + jge @@CheckMaxX + mov [BoxX1], ax + mov [MinIdxT], dx + mov [MinIdxB], dx +@@CheckMaxX: + cmp ax, [BoxX2] + jle @@CheckMinY + mov [BoxX2], ax + mov [MaxIdx], dx + +; Check Y range +@@CheckMinY: + mov ax, ds:[bx].Y + cmp ax, [BoxY1] + jge @@CheckMaxY + mov [BoxY1], ax +@@CheckMaxY: + cmp ax, [BoxY2] + jle @@CheckDone + mov [BoxY2], ax + +; Repeat thru all points +@@CheckDone: + inc di ; Next map entry + inc di + inc dx + inc dx + dec cx + jnz @@MinMaxLoop + +;--------------------------------- +; Check if polygon is full clipped + mov ax, [BoxX2] + cmp ax, [mx_ClipX1] ; Is poly full clipped? + jl @@Exit + mov bx, [BoxX1] + cmp bx, [mx_ClipX2] ; Is poly full clipped? + jg @@Exit + sub ax, bx ; Get width + jle @@Exit ; Exit if not positive + mov ax, [BoxY2] + cmp ax, [mx_ClipY1] ; Is poly full clipped? + jl @@Exit + mov bx, [BoxY1] + cmp bx, [mx_ClipY2] ; Is poly full clipped? + jg @@Exit + sub ax, bx ; Get height + jle @@Exit ; Exit if not positive + + dec [Count] + shl [Count], 1 ; We'll work with word offsets + mov es, [mx_CodeSegment] + +;-------------- +; Scan top edge + mov ax, OFFSET mx_ScanBuffer + mov [ScanOffsetT], ax + mov si, [MinIdxT] ; Offset of bottom point index +@@STLoop: + lds bx, [Map] ; DS:BX -> map table + mov di, ds:[bx+si] ; Index of top point #1 + dec si ; Next point + dec si + test si, si + jnl @@ST1 + mov si, [Count] +@@ST1: + mov [MinIdxT], si ; Save new index of top point + mov si, ds:[bx+si] ; Get index of top point #2 + lds bx, [Colors] ; Get pointer to color array + shl di, 1 ; Convert indexes to offsets + shl si, 1 + mov ax, ds:[bx+si] ; Get colors + mov dx, ds:[bx+di] + lds bx, [Points] ; DS:BX -> point array + shl si, 1 + shl di, 1 + add si, bx ; DS:SI -> top point #2 + add bx, di ; DS:BX -> top point #1 + mov di, [ScanOffsetT] + call subScan ; Scan edge + mov [ScanOffsetT], di + mov si, [MinIdxT] + cmp si, [MaxIdx] ; End of edge? + jne @@STLoop ; No, continue + +;----------------- +; Scan bottom edge + mov ax, OFFSET mx_ScanBuffer + OFFSET Y2 + mov [ScanOffsetB], ax + mov si, [MinIdxB] ; Offset of bottom point index +@@SBLoop: + lds bx, [Map] ; DS:BX -> map table + mov di, ds:[bx+si] ; Index of bottom point #1 + inc si ; Next bottom point + inc si + cmp si, [Count] + jbe @@SB1 + xor si, si +@@SB1: + mov [MinIdxB], si ; Save new index of bottom point + mov si, ds:[bx+si] ; Get index of bottom point #2 + lds bx, [Colors] ; Get pointer to color array + shl di, 1 ; Convert indexes to offsets + shl si, 1 + mov ax, ds:[bx+si] ; Get colors + mov dx, ds:[bx+di] + lds bx, [Points] ; DS:BX -> point array + shl si, 1 + shl di, 1 + add si, bx ; DS:SI -> top point #2 + add bx, di ; DS:BX -> top point #1 + mov di, [ScanOffsetB] + call subScan ; Scan edge + mov [ScanOffsetB], di + mov si, [MinIdxB] + cmp si, [MaxIdx] ; End of edge? + jne @@SBLoop ; No, continue + +;-------------------- +; Clip left and right + mov si, OFFSET mx_ScanBuffer + mov ax, [BoxX1] + mov cx, [BoxX2] + sub cx, ax ; CX = bounding box width + mov bx, [mx_ClipX1] + sub bx, ax + jle @@ClipL1 ; No need to clip left + sub cx, bx ; Update width + add ax, bx ; BoxX1 = mx_ClipX1 + mov [BoxX1], ax + .shl bx, 3 ; Warning!!! This is an hand-coded + add si, bx ; multiply by the size of TSCAN +@@ClipL1: + mov bx, ax + add bx, cx ; Last scan column + sub bx, [mx_ClipX2] + jle @@ClipL2 ; No need to clip right + sub cx, bx ; Clip right +@@ClipL2: + test cx, cx ; Is clipped width positive? + jle @@Exit ; No, exit + mov [ScanCount], cx ; Save number of columns to draw + mov [ScanOffsetT], si ; Remember offset of (clipped) buffer + mov ds, [mx_CodeSegment] ; DS:SI -> scan buffer + +;------------------------------ +; Check if Y clipping is needed + mov ax, [BoxY1] + cmp ax, [mx_ClipY1] + jl @@ClipTB ; Need to clip top + mov ax, [BoxY2] + cmp ax, [mx_ClipY2] + jg @@ClipTB ; Need to clip bottom + jmp @@ClipYExit ; Skip Y clipping + +;-------------------- +; Clip top and bottom +@@ClipTB: + mov di, cx ; DI = scan count + inc di ; Increment count for pre-loop test + sub si, SIZE TSCAN +@@ClipYLoop: + dec di ; Any column left? + jz @@ClipYExit ; No, exit + add si, SIZE TSCAN + mov ax, ds:[si].Y1 ; Y1 + mov cx, ds:[si].Y2 ; Y2 + mov dx, [mx_ClipY2] + cmp ax, dx ; Full clipped? + jg @@ClipYClip ; Yes, skip this column + cmp cx, dx ; Need to clip bottom? + jle @@ClipY1 ; No, continue +; Clip bottom, need to scale colors too + mov ds:[si].Y2, dx + mov bx, cx + sub bx, dx ; Clip distance + sub cx, ax ; Height + jle @@ClipYClip + mov ax, WORD PTR ds:[si].E1 + sub ax, WORD PTR ds:[si].E2 + imul bx + idiv cx + add WORD PTR ds:[si].E2, ax + mov ax, ds:[si].Y1 ; Restore AX and CX + mov cx, ds:[si].Y2 +@@ClipY1: + mov dx, [mx_ClipY1] + cmp cx, dx ; Full top clipped? + jl @@ClipYClip ; Yes, skip + sub cx, ax ; Get height + jle @@ClipYClip ; Skip if not positive + cmp ax, dx ; Need to clip top? + jge @@ClipYLoop ; No, continue +; Clip top, need to scale colors too + mov ds:[si].Y1, dx ; Y1 = mx_ClipY1 + sub dx, ax ; DX = number of pixels clipped + cmp cx, dx + jbe @@ClipYClip ; Full clipped, skip + mov ax, WORD PTR ds:[si].E2 + sub ax, WORD PTR ds:[si].E1 ; AX = color distance + imul dx + idiv cx + add WORD PTR ds:[si].E1, ax ; Update starting color + jmp @@ClipYLoop +@@ClipYClip: + mov ds:[si].Y1, -1 ; Mark column as clipped + jmp @@ClipYLoop +@@ClipYExit: + +;------------- +; Draw columns + mov es, [mx_VideoSegment] + mov si, [ScanOffsetT] + mov cl, BYTE PTR [BoxX1] ; Init write plane + and cl, 03h + mov al, 11h + shl al, cl + mov [WritePlane], al + .shr [BoxX1], 2 + mov ax, [Color] ; Make 8:8 fixed color + mov ah, al + xor al, al + mov [Color], ax +@@DrawLoop: + mov ax, ds:[si].Y1 + test ax, ax ; Was column clipped? + js @@DrawNext ; Yes, skip + mov cx, ds:[si].Y2 + sub cx, ax ; CX = height + jle @@DrawNext + mul [mx_BytesPerLine] ; Get pixel address + add ax, [BoxX1] + mov di, ax + mov ah, [WritePlane] + mov al, 02h + mov dx, TS + out dx, ax + mov dx, [Color] + call subFillScan +@@DrawNext: + rol [WritePlane], 1 + adc [BoxX1], 0 ; Bump pointer to video memory if needed + add si, SIZE TSCAN + dec [ScanCount] + jnz @@DrawLoop + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxGouraudPoly ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxpi.asm b/16/x_/mxpi.asm new file mode 100755 index 00000000..9e8525f5 --- /dev/null +++ b/16/x_/mxpi.asm @@ -0,0 +1,267 @@ +;----------------------------------------------------------- +; +; MXPI.ASM - Put image +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxPutImage + +EXTRN subClipImage : NEAR + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_BytesPerLine : WORD + +mxTable LABEL WORD ; Raster ops + DW subMove + DW subAnd + DW subOr + DW subXor + DW subTrans + DW subAdd + +;----------------------------------------------------------- +; +; Move functions. +; Note: loops unrolled and optimized for CX even, no check for CX = 0. +; +subMove PROC NEAR + shr cx, 1 ; Make CX even + jc @@Odd ; Special case if odd byte +@@Loop: movsb + add si, 3 + movsb + add si, 3 + dec cx + jnz @@Loop +@@Exit: ret +@@Odd: movsb + add si, 3 + jcxz @@Exit + jmp @@Loop +subMove ENDP +; +subAnd PROC NEAR + shr cx, 1 + jc @@Odd +@@Loop: mov al, ds:[si] + mov ah, ds:[si+4] + and es:[di], ax + inc di + inc di + add si, 8 + dec cx + jnz @@Loop +@@Exit: ret +@@Odd: lodsb + and es:[di], al + inc di + add si, 3 + jcxz @@Exit + jmp @@Loop +subAnd ENDP +; +subOr PROC NEAR + shr cx, 1 + jc @@Odd +@@Loop: mov al, ds:[si] + mov ah, ds:[si+4] + or es:[di], ax + inc di + inc di + add si, 8 + dec cx + jnz @@Loop +@@Exit: ret +@@Odd: lodsb + or es:[di], al + inc di + add si, 3 + jcxz @@Exit + jmp @@Loop +subOr ENDP +; +subXor PROC NEAR + shr cx, 1 + jc @@Odd +@@Loop: mov al, ds:[si] + mov ah, ds:[si+4] + xor es:[di], ax + inc di + inc di + add si, 8 + dec cx + jnz @@Loop +@@Exit: ret +@@Odd: lodsb + xor es:[di], al + inc di + add si, 3 + jcxz @@Exit + jmp @@Loop +subXor ENDP +; +subTrans PROC NEAR +@@Loop: mov al, ds:[si] + cmp al, ah + je @@Skip + mov es:[di], al +@@Skip: inc di + add si, 4 + dec cx + jnz @@Loop +@@Exit: ret +subTrans ENDP +; +subAdd PROC NEAR +@@Loop: mov al, ds:[si] + add es:[di], al + inc di + add si, 4 + dec cx + jnz @@Loop + ret +subAdd ENDP + +;----------------------------------------------------------- +; +; Copies a "raw" image from memory to screen. +; +; Input: +; Image = pointer to image +; X, Y = coordinates of destination +; Width = width of image in pixels +; Height = height of image in pixels +; Op = raster op (OP_xxx) +; Output: +; none +; +mxPutImage PROC FAR + ARG Op:WORD, \ + Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD, \ + Image:DWORD = ARG_SIZE + LOCAL PlaneWidth:WORD:4, \ + PixelOffset:WORD, \ + MoveFunction:WORD, \ + Count:BYTE, \ + ReadPlane:BYTE, \ + OpInfo:BYTE, \ + WritePlane:BYTE = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + +; Clip image + mov bx, [X] + mov ax, [Y] + mov cx, [Width] + mov dx, [Height] + call subClipImage + jc @@Exit ; Full clipped + mov [Height], dx + add WORD PTR Image[0], si ; Skip clipped pixels + +; Get pixel address + mul [mx_BytesPerLine] + mov di, bx + shr di, 1 + shr di, 1 + add di, ax + mov [PixelOffset], di + mov es, [mx_VideoSegment] ; ES:DI points to pixel + and bl, 03h + mov [ReadPlane], bl + +; Compute extra bytes and width count for each plane + mov bx, cx + shr bx, 1 + shr bx, 1 ; Width for each plane + and cl, 03h + mov al, 00001000b + shr al, cl + mov si, 3 SHL 1 +@@PatchLoop: + mov PlaneWidth[si], bx + shr al, 1 + adc bx, 0 + dec si + dec si + jge @@PatchLoop + +; Setup planes for output to VGA registers + mov cl, [ReadPlane] + mov al, 00010001b + shl al, cl + mov [WritePlane], al + +; Install move function + mov bx, [Op] + mov [OpInfo], bh ; Remember additional info if needed + xor bh, bh + cmp bl, OP_ADD + jbe @@SetMoveFunction + xor bl, bl +@@SetMoveFunction: + shl bx, 1 + mov ax, mxTable[bx] + mov [MoveFunction], ax + +; Put image + cld + mov [Count], 4 ; Four planes + lea bx, PlaneWidth ; SS:[BX] = width in bytes for plane + mov ds, WORD PTR Image[2] +@@PlaneLoop: + cmp WORD PTR ss:[bx], 0 ; Exit if nothing more to do + je @@Exit ; (also, never try to move zero bytes!) + mov si, WORD PTR Image[0] + mov ah, [WritePlane] + and ah, 0Fh + mov al, 02h + mov dx, TS + out dx, ax ; Select write plane + mov ah, [ReadPlane] + and ah, 03h + mov al, 04h + mov dx, GDC + out dx, ax ; Select read plane + mov dx, [Height] + mov di, [PixelOffset] +@@Loop: + push si + push di + mov cx, WORD PTR ss:[bx] ; Number of bytes to move + mov ah, [OpInfo] ; Transparent color for subTrans + call [MoveFunction] + pop di + pop si + add si, [Width] ; Go to next image line + add di, [mx_BytesPerLine] ; Go to next screen row + dec dx + jnz @@Loop ; Repeat for all lines + inc bx + inc bx ; Select width for next plane + inc [ReadPlane] + rol [WritePlane], 1 + adc [PixelOffset], 0 + inc WORD PTR Image[0] + dec [Count] + jnz @@PlaneLoop ; Repeat for all planes + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxPutImage ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxpn.asm b/16/x_/mxpn.asm new file mode 100755 index 00000000..eaaf61b4 --- /dev/null +++ b/16/x_/mxpn.asm @@ -0,0 +1,60 @@ +;----------------------------------------------------------- +; +; MXPN.ASM - Panning function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxPan + +EXTRN mxWaitDisplay : FAR +EXTRN mxStartAddress : FAR + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD + +;----------------------------------------------------------- +; +; Moves the screen. +; +; Input: +; X, Y = new X, Y coordinates of view screen +; Output: +; none +; +mxPan PROC FAR + ARG Y:WORD, \ + X:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + + mov ax, [Y] + mul [mx_BytesPerLine] + mov dx, [X] + shr dx, 1 + shr dx, 1 + add ax, dx + push ax ; Push the start address + call mxWaitDisplay + call mxStartAddress + + mov dx, 03DAh ; Set the pixel pan register + in al, dx + mov dx, 03C0h + mov al, 33h + out dx, al + mov al, BYTE PTR [X] + and al, 3 + shl al, 1 + out dx, al + + xor ax, ax + .leave ARG_SIZE +mxPan ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxpp.asm b/16/x_/mxpp.asm new file mode 100755 index 00000000..fc1755a3 --- /dev/null +++ b/16/x_/mxpp.asm @@ -0,0 +1,121 @@ +;----------------------------------------------------------- +; +; MXPP.ASM - Get/put pixel functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxGetPixel +PUBLIC mxPutPixel + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD + +;----------------------------------------------------------- +; +; Gets a pixel. +; +; Input: +; X, Y = pixel coordinates +; Output: +; pixel color +; +mxGetPixel PROC FAR + ARG Y:WORD, \ + X:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si + + xor ax, ax + mov si, [X] + cmp si, [mx_ClipX1] + jl @@Exit + cmp si, [mx_ClipX2] + jg @@Exit + mov bx, [Y] + cmp bx, [mx_ClipY1] + jl @@Exit + cmp bx, [mx_ClipY2] + jg @@Exit + + mov al, 04h ; Set read plane + mov ah, BYTE PTR [X] + and ah, 3 + mov dx, GDC + out dx, ax + + mov ds, [mx_VideoSegment] + mov ax, bx + mul [mx_BytesPerLine] + .shr si, 2 + add si, ax + + mov al, ds:[si] ; Get pixel value + xor ah, ah + +@@Exit: + .pop ds, si + .leave ARG_SIZE +mxGetPixel ENDP + +;----------------------------------------------------------- +; +; Puts a pixel of the specified color. +; +; Input: +; X, Y = pixel coordinates +; Color = pixel color +; Output: +; none +; +mxPutPixel PROC FAR + ARG Color:BYTE:2, \ + Y:WORD, \ + X:WORD = ARG_SIZE + .enter 0 + .push ds, si + + mov si, [X] + cmp si, [mx_ClipX1] + jl @@Exit + cmp si, [mx_ClipX2] + jg @@Exit + mov ax, [Y] + cmp ax, [mx_ClipY1] + jl @@Exit + cmp ax, [mx_ClipY2] + jg @@Exit + + mov ds, [mx_VideoSegment] + mul [mx_BytesPerLine] + .shr si, 2 + add si, ax + + mov cl, BYTE PTR [X] ; Set write plane + and cl, 3 + mov ax, 0102h + shl ah, cl + mov dx, TS + out dx, ax + + mov al, [Color] ; Write pixel + mov ds:[si], al + +@@Exit: + xor ax, ax + .pop ds, si + .leave ARG_SIZE +mxPutPixel ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxra.asm b/16/x_/mxra.asm new file mode 100755 index 00000000..dd8e6839 --- /dev/null +++ b/16/x_/mxra.asm @@ -0,0 +1,37 @@ +;----------------------------------------------------------- +; +; MXRA.ASM - Row address +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxRowAddress + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Sets the row address register. +; +; Input: +; RowAddress = row size in words +; Output: +; none +; +mxRowAddress PROC FAR + ARG RowAddress:BYTE:2 = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + mov dx, CRTC + mov al, 13h + mov ah, [RowAddress] + out dx, ax + xor ax, ax + .leave ARG_SIZE +mxRowAddress ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxrp.asm b/16/x_/mxrp.asm new file mode 100755 index 00000000..de820c16 --- /dev/null +++ b/16/x_/mxrp.asm @@ -0,0 +1,101 @@ +;----------------------------------------------------------- +; +; MXRP.ASM - Rotate palette function +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxRotatePalette + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Rotates the palette of the specified number of colors. +; +; Input: +; Palette = pointer to palette +; Count = number of colors to rotate +; Step = step size +; Output: +; none +; +; Note: if Step is positive palette is rotated left to right, otherwise +; right to left. +; +mxRotatePalette PROC FAR + ARG Step:WORD, \ + Count:WORD, \ + Palette:DWORD = ARG_SIZE + LOCAL Holder:BYTE:768 = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + + mov bx, [Count] + add bx, bx + add bx, [Count] ; BX = Count*3 + + lds si, [Palette] ; DS:SI -> palette + push ss + pop es + lea di, Holder ; ES:DI -> local space + cld + + mov ax, [Step] + mov dx, ax + test ax, ax + jz @@Exit ; Nothing to do, exit + jl @@RightToLeft + +@@LeftToRight: + add ax, ax + add dx, ax ; DX = Step*3 + sub bx, dx ; BX = (Count-Step)*3 + add si, bx + push si + mov cx, dx + rep movsb + mov es, WORD PTR Palette[2] + mov di, si + dec di ; ES:DI -> last byte of palette + pop si + dec si + mov cx, bx + std + rep movsb + push ss + pop ds + lea si, Holder + les di, [Palette] + mov cx, dx + cld + rep movsb + jmp @@Exit + +@@RightToLeft: + add ax, ax + add dx, ax + neg dx ; DX = Step*3 + sub bx, dx ; BX = (Count-Step)*3 + mov cx, dx + rep movsb + les di, [Palette] + mov cx, bx + rep movsb + push ss + pop ds + lea si, Holder + mov cx, dx + rep movsb + +@@Exit: + .pop ds, si, es, di + .leave ARG_SIZE +mxRotatePalette ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxsa.asm b/16/x_/mxsa.asm new file mode 100755 index 00000000..3ebae67d --- /dev/null +++ b/16/x_/mxsa.asm @@ -0,0 +1,44 @@ +;----------------------------------------------------------- +; +; MXSA.ASM - Start address function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxStartAddress + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Modifies the starting address of video memory. +; +; Input: +; StartAddr = new start address of video memory +; Output: +; none +; +mxStartAddress PROC FAR + ARG StartAddr:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + + mov bx, [StartAddr] + mov dx, CRTC + mov al, 0Ch ; Linear Starting Address high + mov ah, bh + cli + out dx, ax + mov al, 0Dh ; Linear Starting Address low + mov ah, bl + out dx, ax + sti + + .leave ARG_SIZE +mxStartAddress ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxsc.asm b/16/x_/mxsc.asm new file mode 100755 index 00000000..bcae45e6 --- /dev/null +++ b/16/x_/mxsc.asm @@ -0,0 +1,50 @@ +;----------------------------------------------------------- +; +; MXSC.ASM - Set color function +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxSetColor + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Updates the selected DAC register. +; +; Input: +; Index = index of color to set +; R, G, B = color components +; Output: +; none +; +mxSetColor PROC FAR + ARG B:BYTE:2, \ + G:BYTE:2, \ + R:BYTE:2, \ + Index:WORD = ARG_SIZE + .enter 0 + .push ds, si + + mov ax, [Index] + mov dx, 3C8h ; PEL write address register + out dx, al + inc dx + + mov al, [R] + out dx, al + mov al, [G] + out dx, al + mov al, [B] + out dx, al + + .pop ds, si + .leave ARG_SIZE +mxSetColor ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxsi.asm b/16/x_/mxsi.asm new file mode 100755 index 00000000..b88d3b11 --- /dev/null +++ b/16/x_/mxsi.asm @@ -0,0 +1,317 @@ +;----------------------------------------------------------- +; +; MXPI.ASM - Stretch image +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxStretchImage + +EXTRN subClipBox : NEAR + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_BytesPerLine : WORD + +mxTable LABEL WORD ; Raster ops + DW subMove + DW subAnd + DW subOr + DW subXor + DW subTrans + DW subAdd + +;----------------------------------------------------------- +; +; Stretches and copies a "raw" image from memory to screen. +; +; Input: +; Image = pointer to image +; X, Y = coordinates of destination +; Width = width of image in pixels +; Height = height of image in pixels +; NewWidth = new width of image in pixels +; NewHeight = new height of image in pixels +; Op = raster op (OP_xxx) +; Output: +; none +; +mxStretchImage PROC FAR + ARG Op:WORD, \ + NewHeight:WORD, \ + NewWidth:WORD, \ + Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD, \ + Image:DWORD = ARG_SIZE + LOCAL PixelOffset:WORD, \ + MoveFunction:WORD, \ + ReadPlane:BYTE, \ + OpInfo:BYTE, \ + WidthStep:DWORD, \ + HeightStep:DWORD, \ + ImageLo:WORD, \ + WritePlane:BYTE = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + +; Get width stretch factor + IF USE386 EQ TRUE + movzx edx, [Width] + xor eax, eax + movzx ebx, [NewWidth] + shl ebx, 16 + idiv ebx + mov [WidthStep], eax + ELSE + xor dx, dx ; Width stretch factor + mov ax, [Width] + mov bx, [NewWidth] + div bx + mov WORD PTR WidthStep[2], ax + xor ax, ax + div bx + mov WORD PTR WidthStep[0], ax + ENDIF +; Get height stretch factor + IF USE386 EQ TRUE + movzx edx, [Height] + xor eax, eax + movzx ebx, [NewHeight] + shl ebx, 16 + idiv ebx + mov [HeightStep], eax + ELSE + xor dx, dx + mov ax, [Height] + mov bx, [NewHeight] + div bx + mov WORD PTR HeightStep[2], ax + xor ax, ax + div bx + mov WORD PTR HeightStep[0], ax + ENDIF + +; Clip image + mov bx, [X] + mov ax, [Y] + mov cx, [NewWidth] + mov dx, [NewHeight] + call subClipBox + jc @@Exit ; Full clipped + mov [NewWidth], cx + mov [NewHeight], dx + sub [X], bx + sub [Y], ax + +; Get pixel address + mul [mx_BytesPerLine] + mov di, bx + shr di, 1 + shr di, 1 + add di, ax + mov [PixelOffset], di + mov es, [mx_VideoSegment] ; ES:DI points to pixel + and bl, 03h + mov [ReadPlane], bl ; Set read plane + mov cl, bl + mov al, 00010001b + shl al, cl + mov [WritePlane], al ; Set write plane + +; Relocate image origin if previously clipped + mov ax, [Y] + test ax, ax + jz @@OriginYDone + IF USE386 EQ TRUE + shl eax, 16 + imul [HeightStep] + mov ax, [Width] + mul dx + ELSE + mov bx, ax + mul WORD PTR HeightStep[0] + mov cx, dx + mov ax, bx + mul WORD PTR HeightStep[2] + add ax, cx + mul [Width] + ENDIF + add WORD PTR [Image], ax +@@OriginYDone: + mov ax, [X] + test ax, ax + jz @@OriginXDone + IF USE386 EQ TRUE + shl eax, 16 + imul [WidthStep] + add WORD PTR [Image], dx + ELSE + mov bx, ax + mul WORD PTR WidthStep[0] + mov cx, dx + mov ax, bx + mul WORD PTR WidthStep[2] + add ax, cx + add WORD PTR [Image], ax + ENDIF +@@OriginXDone: + mov ax, WORD PTR HeightStep[2] + mul [Width] + mov WORD PTR HeightStep[2], ax + +; Install move function + mov bx, [Op] + mov [OpInfo], bh ; Remember additional info if needed + xor bh, bh + cmp bl, OP_ADD + jbe @@SetMoveFunction + xor bl, bl +@@SetMoveFunction: + shl bx, 1 + mov ax, mxTable[bx] + mov [MoveFunction], ax + +; Put image + mov ds, WORD PTR Image[2] + xor ax, ax + mov [ImageLo], ax +@@Loop: + mov si, WORD PTR Image[0] ; Get pointer to image + mov ah, [WritePlane] + and ah, 0Fh + mov al, 02h + mov dx, TS + out dx, ax ; Select write plane + mov ah, [ReadPlane] + and ah, 03h + mov al, 04h + mov dx, GDC + out dx, ax ; Select read plane + mov cx, [NewHeight] + mov di, [PixelOffset] ; ES:DI points to video memory + mov ah, [OpInfo] ; Additional raster op info + xor bx, bx + mov dx, [mx_BytesPerLine] + call [MoveFunction] ; Draw column + inc [ReadPlane] ; Next read plane + rol [WritePlane], 1 ; Next write plane + adc [PixelOffset], 0 ; Update video offset if needed + mov dx, WORD PTR WidthStep[0] + mov ax, WORD PTR WidthStep[2] + add [ImageLo], dx + adc WORD PTR Image[0], ax ; Next image column + dec [NewWidth] + jnz @@Loop ; Repeat for all columns + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE + +;----------------------------------------------------------- +; +; Move functions, on entry: +; AH = additional raster op info (e.g. transparent color) +; BX = 0, +; CX = pixel count, +; DX = mx_BytesPerLine. +; +subMove PROC NEAR +@@Loop: mov al, ds:[si] + mov es:[di], al + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subMove ENDP +; +subAnd PROC NEAR +@@Loop: mov al, ds:[si] + and es:[di], al + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subAnd ENDP +; +subOr PROC NEAR +@@Loop: mov al, ds:[si] + or es:[di], al + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subOr ENDP +; +subXor PROC NEAR +@@Loop: mov al, ds:[si] + xor es:[di], al + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subXor ENDP +; +subTrans PROC NEAR +@@Loop: mov al, ds:[si] + cmp al, ah + je @@Skip + mov es:[di], al +@@Skip: + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subTrans ENDP +; +subAdd PROC NEAR +@@Loop: mov al, ds:[si] + add es:[di], al + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subAdd ENDP + +mxStretchImage ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxsl.asm b/16/x_/mxsl.asm new file mode 100755 index 00000000..d7908855 --- /dev/null +++ b/16/x_/mxsl.asm @@ -0,0 +1,62 @@ +;----------------------------------------------------------- +; +; MXLN.ASM - Start line function +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxStartLine + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD + +;----------------------------------------------------------- +; +; Changes the video start address to the specified line. +; +; Input: +; Line = new start line +; Output: +; none +; +mxStartLine PROC FAR + ARG Line:WORD = ARG_SIZE + .enter 0 + ASSUME ds:NOTHING + + mov ax, [Line] ; Get video offset + mul [mx_BytesPerLine] + xchg ax, bx ; Copy it into BX + +; Wait display + mov dx, STATUS +@@1: in al, dx + test al, 08h + jnz @@1 + +; Set starting address + mov dx, CRTC + mov al, 0Ch ; Linear Starting Address high + mov ah, bh + cli + out dx, ax + mov al, 0Dh ; Linear Starting Address low + mov ah, bl + out dx, ax + sti + +; Wait retrace + mov dx, STATUS +@@2: in al,dx + test al, 08h + jz @@2 + + xor ax, ax + .leave ARG_SIZE +MX_TEXT ENDS +END diff --git a/16/x_/mxsm.asm b/16/x_/mxsm.asm new file mode 100755 index 00000000..183fba1e --- /dev/null +++ b/16/x_/mxsm.asm @@ -0,0 +1,508 @@ +;----------------------------------------------------------- +; +; MXSM.ASM - Set/change mode functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxChangeMode +PUBLIC mxGetAspect +PUBLIC mxGetScreenSize +PUBLIC mxSetMode + +PUBLIC mx_ScreenWidth +PUBLIC mx_ScreenHeight +PUBLIC mx_BytesPerLine + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mxSetSysClipRegion : FAR + +EXTRN mx_VideoSegment : WORD +EXTRN mx_CodeSegment : WORD + +mx_ScreenWidth DW ? ; Current screen width +mx_ScreenHeight DW ? +mx_AspectX DW ? ; Aspect ratio for current mode +mx_AspectY DW ? +mx_BytesPerLine DW 0 ; Bytes per line + +; +; Tables for setting video modes, sources: +; - MODEX.ASM, Matt Pritchard +; - Dr. Dobb's Journal, Michael Abrash +; - Fractint VIDEO.ASM module +; +TBL_SingleLine LABEL WORD ; CRTC + DW 04009h ; Cell height: 1 scan line + DW 00014h ; Double word mode off + DW 0E317h ; Byte mode on + DW 0 +TBL_DoubleLine LABEL WORD ; CRTC + DW 04109h ; Cell height: 2 scan lines + DW 00014h + DW 0E317h + DW 0 +TBL_Width320 LABEL WORD ; CRTC + DW 05F00h ; Horizontal total + DW 04F01h ; Horizontal displayed + DW 05002h ; Start horizontal blanking + DW 08203h ; End horizontal blanking + DW 05404h ; Start horizontal sync + DW 08005h ; End horizontal sync + DW 02813h ; Row address + DW 0 +TBL_Width360 LABEL WORD ; CRTC + DW 06B00h ; Horizontal total + DW 05901h ; Horizontal displayed + DW 05A02h ; Start horizontal blanking + DW 08E03h ; End horizontal blanking + DW 05E04h ; Start horizontal sync + DW 08A05h ; End horizontal sync + DW 02D13h ; Row address + DW 0 +TBL_Height175 LABEL WORD ; CRTC + DW 0BF06h ; Vertical total + DW 01F07h ; Overflow + DW 08310h ; Start vertical sync + DW 08511h ; End vertical sync + DW 05D12h ; Vertical displayed + DW 06315h ; Start vertical blanking + DW 0BA16h ; End vertical blanking + DW 0 +TBL_Height200 LABEL WORD ; CRTC + DW 0BF06h ; Vertical total + DW 01F07h ; Overflow + DW 09C10h ; Start vertical sync + DW 08E11h ; End vertical sync + DW 08F12h ; Vertical displayed + DW 09615h ; Start vertical blanking + DW 0B916h ; End vertical blanking + DW 0 +TBL_Height240 LABEL WORD ; CRTC + DW 00D06h ; Vertical total + DW 03E07h ; Overflow + DW 0EA10h ; Start vertical sync + DW 08C11h ; End vertical sync + DW 0DF12h ; Vertical displayed + DW 0E715h ; Start vertical blanking + DW 00616h ; End vertical blanking + DW 0 +TBL_Tweak400x600: + DW 07400h + DW 06301h + DW 06402h + DW 09703h + DW 06804h + DW 09505h + DW 08606h + DW 0F007h + DW 06009h + DW 0310Fh + DW 05B10h + DW 08D11h + DW 05712h + DW 03213h + DW 00014h + DW 06015h + DW 08016h + DW 0E317h + DW 0 + +TBL_320x200: + DB 63h ; 400 scan lines, 25 MHz clock + DW 6, 5 ; Aspect: 6/5 = 1.2:1 + DW 320, 200 ; Size + DW TBL_Width320, TBL_Height200, TBL_DoubleLine, 0 + DW 819 ; Max height +TBL_320x240: + DB 0E3h ; 400 scan lines, 25 MHz clock + DW 1, 1 ; Aspect: 1/1 = 1:1 + DW 320, 240 ; Size + DW TBL_Width320, TBL_Height240, TBL_DoubleLine, 0 + DW 819 ; Max height +TBL_320x400: + DB 63h ; 480 scan lines, 25 MHz clock + DW 6, 10 ; Aspect: 6/10 = 0.6:1 + DW 320, 400 ; Size + DW TBL_Width320, TBL_Height200, TBL_SingleLine, 0 + DW 819 ; Max height +TBL_320x480: + DB 0E3h ; 480 scan lines, 25 MHz clock + DW 1, 2 ; Aspect: 1/2 = 0.5:1 + DW 320, 480 ; Size + DW TBL_Width320, TBL_Height240, TBL_SingleLine, 0 + DW 819 ; Max height +TBL_360x200: + DB 067h ; 400 scan lines, 28 MHz clock + DW 27, 20 ; Aspect: 27/20 = 1.35:1 + DW 360, 200 ; Size + DW TBL_Width360, TBL_Height200, TBL_DoubleLine, 0 + DW 728 ; Max height +TBL_360x240: + DB 0E7h ; 480 scan lines, 28 MHz clock + DW 9, 8 ; Aspect: 9/8 = 1.125:1 + DW 360, 240 ; Size + DW TBL_Width360, TBL_Height240, TBL_DoubleLine, 0 + DW 728 ; Max height +TBL_360x400: + DB 067h ; 400 scan lines, 28 MHz clock + DW 27, 40 ; Aspect: 27/40 = 0.675:1 + DW 360, 400 ; Size + DW TBL_Width360, TBL_Height200, TBL_SingleLine, 0 + DW 728 ; Max height +TBL_360x480: + DB 0E7h ; 480 scan lines, 28 MHz clock + DW 9, 16 ; Aspect: 9/16 = 0.5625:1 + DW 360, 480 ; Size + DW TBL_Width360, TBL_Height240, TBL_SingleLine, 0 + DW 728 ; Max height +TBL_320x175: + DB 0A3h + DW 0, 0 ; Aspect: + DW 320, 175 + DW TBL_Width320, TBL_Height175, TBL_DoubleLine, 0 + DW 819 +TBL_320x350: + DB 0A3h + DW 0, 0 ; Aspect: + DW 320, 175 + DW TBL_Width320, TBL_Height175, TBL_SingleLine, 0 + DW 819 +TBL_360x175: + DB 0A7h + DW 0, 0 ; Aspect: + DW 360, 480 ; Size + DW TBL_Width360, TBL_Height175, TBL_DoubleLine, 0 + DW 728 ; Max height +TBL_360x350: + DB 0A7h + DW 0, 0 ; Aspect: + DW 360, 480 ; Size + DW TBL_Width360, TBL_Height175, TBL_SingleLine, 0 + DW 728 ; Max height +TBL_400x600: + DB 0E7h ; 28 MHz clock + DW 1, 2 ; Aspect: 1/2 = 0.5:1 + DW 400, 600 ; Size + DW TBL_Tweak400x600, 0 + DW 655 ; Max height + +TBL_Mode LABEL WORD + DW TBL_320x175 + DW TBL_320x200 + DW TBL_320x240 + DW TBL_320x350 + DW TBL_320x400 + DW TBL_320x480 + DW TBL_360x175 + DW TBL_360x200 + DW TBL_360x240 + DW TBL_360x350 + DW TBL_360x400 + DW TBL_360x480 + DW TBL_400x600 + +MAXVMODE EQU ($-OFFSET TBL_Mode) / 2 + +;----------------------------------------------------------- +; +; Enables 80x25 color text mode +; +subText PROC NEAR + ASSUME ds:MX_TEXT + mov ax, 0003h + int 10h ; Call BIOS set mode + + mov [mx_ScreenHeight], 0 + mov [mx_BytesPerLine], 0 + ret +subText ENDP + +;----------------------------------------------------------- +; +; Enables the selected graphics mode. +; +; Input: +; Mode = mode to select (MX_???x???) +; Output: +; none +; +mxSetMode PROC FAR + ARG Mode:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + +; Set DS to code segment alias + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov si, [Mode] + cmp si, MAXVMODE ; Is it a valid mode? + ja @@Exit ; No, exit + test si, si ; Text mode? + jnz @@Set ; No, handle it + + call subText ; Back to text mode + jmp @@Exit ; Exit now + +; Set video mode +@@Set: + dec si ; Skip text mode + shl si, 1 + mov si, TBL_Mode[si] + cld + +; Use BIOS to set 320x200x256 linear mode + push si ; Save SI + mov ax, 0013h + int 10h ; Use BIOS to set 320x200 linear mode + pop si ; Restore SI + + mov dx, TS + mov ax, 0604h + out dx, ax ; Disable chain-4 mode + mov ax, 0100h + out dx, ax ; Reset + mov dx, MISC + lodsb + out dx, al ; New timing/size + mov dx, TS + mov ax, 0300h + out dx, ax ; Restart sequencer + +; Unlock CRTC registers 0-7 + mov dx, CRTC + mov al, 11h + out dx, al ; Vertical sync end register + inc dx + in al, dx + and al, 7Fh ; Clear write protect bit + out dx, al + + lodsw ; Get X aspect + mov [mx_AspectX], ax + lodsw ; Get Y aspect + mov [mx_AspectY], ax + lodsw ; Get screen width + mov [mx_ScreenWidth], ax + shr ax, 1 + shr ax, 1 ; Divide by four to get bytes per line + mov [mx_BytesPerLine], ax + lodsw ; Get screen height + mov [mx_ScreenHeight], ax + +; Set CRTC registers + mov bx, si + mov dx, CRTC +@@TableLoop: + mov si, ds:[bx] ; DS:SI -> table of CRTC registers + inc bx + inc bx ; DS:BX -> offset of next table + test si, si ; Last table? + jz @@EndLoop ; Yes, exit loop +@@Loop: + lodsw ; Get CRTC register index and value + test ax, ax ; End of table? + jz @@TableLoop ; Yes, go to next table + out dx, ax ; Set register AL to value AH + jmp @@Loop ; Get next register/value +@@EndLoop: + +; Set virtual screen and system clip region + push [mx_ScreenWidth] + push WORD PTR ds:[bx] + call mxSetSysClipRegion + +; Clear video memory + mov dx, TS + mov ax, 0F02h + out dx, ax ; Enable all planes + mov es, [mx_VideoSegment] + xor di, di + mov cx, 8000h + xor ax, ax + rep stosw + +@@Done: +; Lock CRTC registers 0-7 (some cards need this) + mov dx, CRTC + mov al, 11h + out dx, al ; Vertical sync end register + inc dx + in al, dx + or al, 80h ; Set write protect bit + out dx, al + +@@Exit: + xor ax, ax + mov ax, [mx_ScreenWidth] + .pop ds, si, es, di + .leave ARG_SIZE +mxSetMode ENDP + +;----------------------------------------------------------- +; +; Changes from the current mode the selected graphics mode. +; +; Input: +; Mode = mode to select (MX_???x???) +; Output: +; none +; Notes: +; this function assumes that mxSetMode and mxSetVirtualScreen +; have been called first. View size is rearranged to match the +; specified mode, but video memory is not cleared. +; Differences from mxSetMode: +; - video BIOS is not called to initialize graphics; +; - row address register is not modified; +; - video memory is not cleared; +; - mx_BytesPerLine is not modified; +; - system clip region is not modified. +; +mxChangeMode PROC FAR + ARG Mode:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + +; Set DS to code segment alias + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov si, [Mode] + cmp si, MAXVMODE ; Is it a valid mode? + ja @@Exit ; No, exit + test si, si ; Text mode? + jz @@Exit ; Yes, exit + + dec si ; Skip text mode + shl si, 1 + mov si, TBL_Mode[si] + cld + + mov dx, TS + mov ax, 0604h + out dx, ax ; Disable chain-4 mode + mov ax, 0100h + out dx, ax ; Reset + mov dx, MISC + lodsb + out dx, al ; New timing/size + mov dx, TS + mov ax, 0300h + out dx, ax ; Restart sequencer + +; Unlock CRTC registers 0-7 + mov dx, CRTC + mov al, 11h + out dx, al ; Vertical sync end register + inc dx + in al, dx + and al, 7Fh ; Clear write protect bit + out dx, al + + lodsw ; Get X aspect + mov [mx_AspectX], ax + lodsw ; Get Y aspect + mov [mx_AspectY], ax + lodsw ; Get screen width + mov [mx_ScreenWidth], ax + lodsw ; Get screen height + mov [mx_ScreenHeight], ax + +; Set CRTC registers + mov bx, si + mov dx, CRTC +@@TableLoop: + mov si, ds:[bx] ; DS:SI -> table of CRTC registers + inc bx + inc bx ; DS:BX -> offset of next table + test si, si ; Last table? + jz @@EndLoop ; Yes, exit loop +@@Loop: + lodsw ; Get CRTC register index and value + test ax, ax ; End of table? + jz @@TableLoop ; Yes, go to next table + cmp al, 13h ; Row address register? + je @@Loop ; Yes, ignore it + out dx, ax ; Set register AL to value AH + jmp @@Loop ; Get next register/value +@@EndLoop: + +; Lock CRTC registers 0-7 (some cards need this) + mov dx, CRTC + mov al, 11h + out dx, al ; Vertical sync end register + inc dx + in al, dx + or al, 80h ; Set write protect bit + out dx, al + +@@Exit: + xor ax, ax + mov ax, [mx_ScreenWidth] + .pop ds, si, es, di + .leave ARG_SIZE +mxChangeMode ENDP + +;----------------------------------------------------------- +; +; Returns the aspect ratio for the current mode. +; +; Input: +; AspectX = pointer to aspect X +; AspectY = pointer to aspect Y +; +; A rectangle of width AspectX and height AspectY looks like a square. +; +mxGetAspect PROC FAR + ARG AspectY:DWORD, \ + AspectX:DWORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + lds si, [AspectX] + mov ax, [mx_AspectX] + mov ds:[si], ax + lds si, [AspectY] + mov ax, [mx_AspectY] + mov ds:[si], ax + + .pop ds, si + .leave ARG_SIZE +mxGetAspect ENDP + +;----------------------------------------------------------- +; +; Returns the current screen size. +; +; Input: +; Width = pointer to screen width +; Height = pointer to screen height +; +mxGetScreenSize PROC FAR + ARG SizeY:DWORD, \ + SizeX:DWORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + lds si, [SizeX] + mov ax, [mx_ScreenWidth] + mov ds:[si], ax + lds si, [SizeY] + mov ax, [mx_ScreenHeight] + mov ds:[si], ax + + .pop ds, si + .leave ARG_SIZE +mxGetScreenSize ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxsp.asm b/16/x_/mxsp.asm new file mode 100755 index 00000000..1d08e711 --- /dev/null +++ b/16/x_/mxsp.asm @@ -0,0 +1,57 @@ +;----------------------------------------------------------- +; +; MXSP.ASM - Set palette function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxSetPalette + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Updates the VGA palette. +; +; Input: +; Buffer = pointer to palette data (R,G,B) +; Start = index of first color to set +; Count = number of color to set +; Output: +; none +; +mxSetPalette PROC FAR + ARG Count:WORD, \ + Start:WORD, \ + Buffer:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si + + lds si, [Buffer] + mov cx, [Count] + mov ax, [Start] + mov dx, 3C8h ; PEL write address register + out dx, al + inc dx + cld + cli ; Disable interrupts +@@Loop: + lodsb + out dx, al ; Red + lodsb + out dx, al ; Green + lodsb + out dx, al ; Blue + loop @@Loop ; Loop until done + sti ; Enable interrupts + + .pop ds, si + .leave ARG_SIZE +mxSetPalette ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxss.asm b/16/x_/mxss.asm new file mode 100755 index 00000000..97df7366 --- /dev/null +++ b/16/x_/mxss.asm @@ -0,0 +1,72 @@ +;----------------------------------------------------------- +; +; MXSS.ASM - Split screen function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxSplitScreen + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Splits the screen. +; +; Input: +; Line = scan line at which screen has to be splitted +; Output: +; none +; +mxSplitScreen PROC FAR + ARG Line:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + +; Modify the line compare value: bits 0-7 are in the Line Compare +; register (CRTC #18), bit 8 is in the Overflow Low register (CRTC #7) +; and bit 9 is in the Maximum Row Address register (CRTC #9) + mov ax, [Line] + shl ax, 1 ; Adjust line for mode "X" + mov bh, ah + mov bl, ah + and bx, 0201h + mov cl, 4 + shl bx, cl + shl bh, 1 + mov dx, CRTC +; Write bits 0-7 to line compare register + mov ah, al + mov al, 18h + out dx, ax +; Write bit 8 to overflow register + mov al, 07h + out dx, al + inc dx + in al, dx + dec dx + mov ah, al + and ah, 11101111b + or ah, bl + mov al, 07h + out dx, ax +; Write bit 9 to maximum row address register + mov al, 09h + out dx, al + inc dx + in al, dx + dec dx + mov ah, al + and ah, 10111111b + or ah, bh + mov al, 09h + out dx, ax + + .leave ARG_SIZE +mxSplitScreen ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxtl.asm b/16/x_/mxtl.asm new file mode 100755 index 00000000..69900c88 --- /dev/null +++ b/16/x_/mxtl.asm @@ -0,0 +1,169 @@ +;----------------------------------------------------------- +; +; MXTL.ASM - Put tile +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxPutTile +PUBLIC mxTransPutTile + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_BytesPerLine : WORD + +;----------------------------------------------------------- +; +; Copies a "mode-x" tile from memory to screen. +; +; Input: +; Image = pointer to tile +; X, Y = coordinates of destination +; Width = width of image in pixels (Width and 3 = 0) +; Height = height of image in pixels +; Output: +; none +; Note: +; no clipping is performed on tiles! +; +mxPutTile PROC FAR + ARG Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD, \ + Image:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + + mov ax, [Y] ; Get pixel address + mul [mx_BytesPerLine] + mov di, [X] + .shr di, 2 + add di, ax + mov es, [mx_VideoSegment] + + lds si, [Image] ; Get tile address + .shr [Width], 2 ; Number of bytes per plane + mov cl, BYTE PTR [X] + and cl, 3 + mov ah, 11h ; AH = plane mask + shl ah, cl ; Align mask to first plane + + mov [Y], 4 ; Number of planes + mov bx, [mx_BytesPerLine] + sub bx, [Width] ; Extra bytes per line +@@Loop: + mov al, 02h + mov dx, TS + out dx, ax ; Set write plane + mov [X], di ; Save video offset + mov dx, [Height] +@@Loop2: + mov cx, [Width] ; Number of bytes to move + + shr cx, 1 ; Move line + rep movsw + rcl cx, 1 + rep movsb + + add di, bx ; Move video offset to next line + dec dx ; Done all lines? + jnz @@Loop2 ; No, continue + mov di, [X] ; Restore video offset + rol ah, 1 ; Next plane + adc di, 0 ; Bump video offset if needed + dec [Y] ; Any plane left? + jnz @@Loop ; Yes, keep looping + + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxPutTile ENDP + +;----------------------------------------------------------- +; +; Copies a "mode-x" tile from memory to screen. +; Skips over color 0. +; +; Input: +; Image = pointer to tile +; X, Y = coordinates of destination +; Width = width of image in pixels (Width and 3 = 0) +; Height = height of image in pixels +; Output: +; none +; Note: +; no clipping is performed on tiles! +; +mxTransPutTile PROC FAR + ARG Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD, \ + Image:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + + mov ax, [Y] ; Get pixel address + mul [mx_BytesPerLine] + mov di, [X] + .shr di, 2 + add di, ax + mov es, [mx_VideoSegment] + + lds si, [Image] ; Get tile address + .shr [Width], 2 ; Number of bytes per plane + mov cl, BYTE PTR [X] + and cl, 3 + mov ah, 11h ; AH = plane mask + shl ah, cl ; Align mask to first plane + + mov [Y], 4 ; Number of planes + mov bx, [mx_BytesPerLine] + sub bx, [Width] ; Extra bytes per line +@@Loop: + mov al, 02h + mov dx, TS + out dx, ax ; Set write plane + mov [X], di ; Save video offset + mov dx, [Height] +@@Loop2: + mov cx, [Width] ; Number of bytes to move + +; Move one line + jcxz @@MoveLineDone +@@MoveLineLoop: + mov al, ds:[si] + test al, al + jz @@MoveLineNext + mov es:[di], al +@@MoveLineNext: + inc si + inc di + dec cx + jnz @@MoveLineLoop +@@MoveLineDone: + + add di, bx ; Move video offset to next line + dec dx ; Done all lines? + jnz @@Loop2 ; No, continue + mov di, [X] ; Restore video offset + rol ah, 1 ; Next plane + adc di, 0 ; Bump video offset if needed + dec [Y] ; Any plane left? + jnz @@Loop ; Yes, keep looping + + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxTransPutTile ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxvs.asm b/16/x_/mxvs.asm new file mode 100755 index 00000000..992eabab --- /dev/null +++ b/16/x_/mxvs.asm @@ -0,0 +1,110 @@ +;----------------------------------------------------------- +; +; MXVS.ASM - Set/get virtual screen +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxSetVirtualScreen +PUBLIC mxGetVirtualScreen + +EXTRN mxRowAddress : FAR +EXTRN mxSetSysClipRegion : FAR + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_CodeSegment : WORD + +mx_VirtualWidth DW ? ; Virtual screen size +mx_VirtualHeight DW ? + +;----------------------------------------------------------- +; +; Sets the virtual screen. +; +; Input: +; Width = virtual screen width +; Height = virtual screen height +; Output: +; 0 on success, else invalid parameters +; +mxSetVirtualScreen PROC FAR + ARG Height:WORD, \ + Width:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds + +; Set DS to code segment + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, 1 ; Assume an error + cmp [Width], 320 ; Check width + jb @@Exit + push ax ; Save return code + mov dx, 0004h + xor ax, ax ; DX:AX = 256K + div [Width] ; Max height in AX + cmp [Height], ax + pop ax ; Restore return code + ja @@Exit ; Exit if bad heigth + + mov ax, [Width] + and ax, 0FFF8h ; Align to byte + mov [mx_VirtualWidth], ax + shr ax, 1 + shr ax, 1 + mov [mx_BytesPerLine], ax + shr ax, 1 + push ax + call mxRowAddress ; Set row address + mov ax, [Height] + mov [mx_VirtualHeight], ax + + push [Width] + push [Height] + call mxSetSysClipRegion + xor ax, ax + +@@Exit: + .pop ds + .leave ARG_SIZE +mxSetVirtualScreen ENDP + +;----------------------------------------------------------- +; +; Returns the current virtual screen size. +; +; Input: +; Width = pointer to virtual screen width +; Height = pointer to virtual screen height +; Output: +; none +; +mxGetVirtualScreen PROC FAR + ARG Height:DWORD, \ + Width:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si + + mov ax, [mx_VirtualWidth] + lds si, [Width] + mov ds:[si], ax + mov ax, [mx_VirtualHeight] + lds si, [Height] + mov ds:[si], ax + + xor ax, ax + .pop ds, si + .leave ARG_SIZE +mxGetVirtualScreen ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxwd.asm b/16/x_/mxwd.asm new file mode 100755 index 00000000..de55208f --- /dev/null +++ b/16/x_/mxwd.asm @@ -0,0 +1,28 @@ +;----------------------------------------------------------- +; +; MXWD.ASM - Wait display function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxWaitDisplay + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Waits for display start. +; +mxWaitDisplay PROC FAR + mov dx, STATUS +@@1: in al, dx + test al, 08h + jnz @@1 + ret +mxWaitDisplay ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxwm.asm b/16/x_/mxwm.asm new file mode 100755 index 00000000..06158859 --- /dev/null +++ b/16/x_/mxwm.asm @@ -0,0 +1,39 @@ +;----------------------------------------------------------- +; +; MXWM.ASM - Set write mode function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxWriteMode + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Sets the write mode. +; +; Input: +; Mode = write mode (0,1,2,3) +; Output: +; none +; +mxWriteMode PROC FAR + ARG Mode:BYTE:2 = ARG_SIZE + .enter 0 + + mov dx, GDC + mov ah, [Mode] + and ah, 00000011b + or ah, 01000000b + mov al, 05h + out dx, ax + + .leave ARG_SIZE +mxWriteMode ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxwp.asm b/16/x_/mxwp.asm new file mode 100755 index 00000000..19ca99d0 --- /dev/null +++ b/16/x_/mxwp.asm @@ -0,0 +1,62 @@ +;----------------------------------------------------------- +; +; MXWP.ASM - Set write/read plane functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxWritePlane +PUBLIC mxReadPlane + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Sets the write plane(s). +; +; Input: +; Plane = write plane(s) to set (bit 0 enables plane 0, +; bit 1 enables plane 1 and so on, different planes +; may be selected at the same time) +; Output: +; none +; +mxWritePlane PROC FAR + ARG Plane:BYTE:2 = ARG_SIZE + .enter 0 + + mov ah, [Plane] + and ah, 00001111b ; Mask off unused bits + mov al, 02h + mov dx, TS + out dx, ax + + .leave ARG_SIZE +mxWritePlane ENDP + +;----------------------------------------------------------- +; +; Sets the read plane. +; +; Input: +; Plane = read plane to set (0,1,2,3) +; Output: +; none +; +mxReadPlane PROC FAR + ARG Plane:BYTE:2 = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + mov al, 04h + mov ah, [Plane] + and ah, 0000011b ; Mask off unused bits + mov dx, GDC + out dx, ax + .leave ARG_SIZE +mxReadPlane ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/mxwr.asm b/16/x_/mxwr.asm new file mode 100755 index 00000000..bd29fe59 --- /dev/null +++ b/16/x_/mxwr.asm @@ -0,0 +1,28 @@ +;----------------------------------------------------------- +; +; MXWR.ASM - Wait vertical retrace function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxWaitRetrace + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Waits for vertical retrace start. +; +mxWaitRetrace PROC FAR + mov dx, STATUS +@@1: in al,dx + test al, 08h + jz @@1 + ret +mxWaitRetrace ENDP + +MX_TEXT ENDS +END diff --git a/16/x_/readme.txt b/16/x_/readme.txt new file mode 100755 index 00000000..306e8b9a --- /dev/null +++ b/16/x_/readme.txt @@ -0,0 +1,8 @@ +ModeX - A graphical library for DOS programs +Copyright (c) 1993-1994 Alessandro Scotti +http://www.ascotti.org/ + +Please look at the above site in the "Art of..." and +then in the "Old programs" section for more information. + + diff --git a/16/xw/makefile b/16/xw/makefile index 298ec301..96d1c081 100755 --- a/16/xw/makefile +++ b/16/xw/makefile @@ -15,7 +15,7 @@ OBJ=obj !endif LIBINCS = modex.def -LIBOBJS = mxbb.$(OBJ) mxcc.$(OBJ) mxcg.$(OBJ) mxcl.$(OBJ) mxcr.$(OBJ) mxel.$(OBJ) mxfb.$(OBJ) mxfp.$(OBJ) mxgc.$(OBJ) mxgi.$(OBJ) mxgm.$(OBJ) mxgp.$(OBJ) mxgv.$(OBJ) mxhl.$(OBJ) mxit.$(OBJ) mxll.$(OBJ) mxln.$(OBJ) mxot.$(OBJ) mxpb.$(OBJ) mxpf.$(OBJ) mxpg.$(OBJ) mxpi.$(OBJ) mxpn.$(OBJ) mxpp.$(OBJ) mxra.$(OBJ) mxrp.$(OBJ) mxsa.$(OBJ) mxsc.$(OBJ) mxsi.$(OBJ) mxsl.$(OBJ) mxsm.$(OBJ) mxsp.$(OBJ) mxss.$(OBJ) mxtl.$(OBJ) mxvs.$(OBJ) mxwd.$(OBJ) mxwm.$(OBJ) mxwp.$(OBJ) mxwr.$(OBJ) +LIBOBJS = mxbb.$(OBJ) mxcc.$(OBJ) mxcg.$(OBJ) mxcl.$(OBJ) mxcr.$(OBJ) mxfb.$(OBJ) mxfp.$(OBJ) mxgc.$(OBJ) mxgi.$(OBJ) mxgm.$(OBJ) mxgp.$(OBJ) mxgv.$(OBJ) mxhl.$(OBJ) mxit.$(OBJ) mxll.$(OBJ) mxln.$(OBJ) mxot.$(OBJ) mxpb.$(OBJ) mxpf.$(OBJ) mxpg.$(OBJ) mxpi.$(OBJ) mxpn.$(OBJ) mxpp.$(OBJ) mxra.$(OBJ) mxrp.$(OBJ) mxsa.$(OBJ) mxsc.$(OBJ) mxsi.$(OBJ) mxsl.$(OBJ) mxsm.$(OBJ) mxsp.$(OBJ) mxss.$(OBJ) mxtl.$(OBJ) mxvs.$(OBJ) mxwd.$(OBJ) mxwm.$(OBJ) mxwp.$(OBJ) mxwr.$(OBJ) # # ASM compiler @@ -47,8 +47,6 @@ mxcl.$(OBJ): mxcl.asm $(ASMC) $(ASMO) mxcl.asm mxcr.$(OBJ): mxcr.asm $(ASMC) $(ASMO) mxcr.asm -mxel.$(OBJ): mxel.asm - $(ASMC) $(ASMO) mxel.asm mxfb.$(OBJ): mxfb.asm $(ASMC) $(ASMO) mxfb.asm mxfp.$(OBJ): mxfp.asm diff --git a/16/xw_/makefile b/16/xw_/makefile index 298ec301..cfe15232 100755 --- a/16/xw_/makefile +++ b/16/xw_/makefile @@ -15,8 +15,8 @@ OBJ=obj !endif LIBINCS = modex.def -LIBOBJS = mxbb.$(OBJ) mxcc.$(OBJ) mxcg.$(OBJ) mxcl.$(OBJ) mxcr.$(OBJ) mxel.$(OBJ) mxfb.$(OBJ) mxfp.$(OBJ) mxgc.$(OBJ) mxgi.$(OBJ) mxgm.$(OBJ) mxgp.$(OBJ) mxgv.$(OBJ) mxhl.$(OBJ) mxit.$(OBJ) mxll.$(OBJ) mxln.$(OBJ) mxot.$(OBJ) mxpb.$(OBJ) mxpf.$(OBJ) mxpg.$(OBJ) mxpi.$(OBJ) mxpn.$(OBJ) mxpp.$(OBJ) mxra.$(OBJ) mxrp.$(OBJ) mxsa.$(OBJ) mxsc.$(OBJ) mxsi.$(OBJ) mxsl.$(OBJ) mxsm.$(OBJ) mxsp.$(OBJ) mxss.$(OBJ) mxtl.$(OBJ) mxvs.$(OBJ) mxwd.$(OBJ) mxwm.$(OBJ) mxwp.$(OBJ) mxwr.$(OBJ) - +LIBOBJS = mxbb.$(OBJ) mxcc.$(OBJ) mxcg.$(OBJ) mxcl.$(OBJ) mxcr.$(OBJ) mxfb.$(OBJ) mxgc.$(OBJ) mxgi.$(OBJ) mxgm.$(OBJ) mxgp.$(OBJ) mxgv.$(OBJ) mxhl.$(OBJ) mxit.$(OBJ) mxll.$(OBJ) mxln.$(OBJ) mxot.$(OBJ) mxpb.$(OBJ) mxpf.$(OBJ) mxpg.$(OBJ) mxpi.$(OBJ) mxpn.$(OBJ) mxpp.$(OBJ) mxra.$(OBJ) mxrp.$(OBJ) mxsa.$(OBJ) mxsc.$(OBJ) mxsi.$(OBJ) mxsl.$(OBJ) mxsm.$(OBJ) mxsp.$(OBJ) mxss.$(OBJ) mxtl.$(OBJ) mxvs.$(OBJ) mxwd.$(OBJ) mxwm.$(OBJ) mxwp.$(OBJ) mxwr.$(OBJ) +#mxfp.$(OBJ) # # ASM compiler # @@ -47,8 +47,6 @@ mxcl.$(OBJ): mxcl.asm $(ASMC) $(ASMO) mxcl.asm mxcr.$(OBJ): mxcr.asm $(ASMC) $(ASMO) mxcr.asm -mxel.$(OBJ): mxel.asm - $(ASMC) $(ASMO) mxel.asm mxfb.$(OBJ): mxfb.asm $(ASMC) $(ASMO) mxfb.asm mxfp.$(OBJ): mxfp.asm diff --git a/16/xw_/mxbb.asm b/16/xw_/mxbb.asm new file mode 100755 index 00000000..5598cd10 --- /dev/null +++ b/16/xw_/mxbb.asm @@ -0,0 +1,207 @@ + PUBLIC MXBITBLT + EXTRN SUBHORIZONTALLINEINFO:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXBITBLT: + push bp + mov bp,sp + sub sp,16H + push ds + push si + push es + push di + cmp word ptr 0cH[bp],0 + je L$2 + mov ax,word ptr 10H[bp] + and al,3 + mov dx,word ptr 8[bp] + and dl,3 + mov bx,offset L$10 + cmp al,dl + jne L$1 + mov bx,offset L$3 +L$1: + call bx +L$2: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +L$3: + mov bx,word ptr 8[bp] + mov ax,word ptr 6[bp] + mov cx,word ptr 0cH[bp] + call near ptr MX_TEXT:SUBHORIZONTALLINEINFO + mov byte ptr -14H[bp],al + mov byte ptr -16H[bp],ah + mov word ptr 0cH[bp],cx + mov ax,word ptr cs:MX_VIDEOSEGMENT + mov ds,ax + mov es,ax + mov ax,word ptr 0eH[bp] + mul word ptr cs:MX_BYTESPERLINE + mov si,word ptr 10H[bp] + shr si,1 + shr si,1 + add si,ax + mov dx,3ceH + mov ax,4105H + out dx,ax + cld + mov ah,byte ptr -14H[bp] + or ah,ah + je L$5 + mov dx,3c4H + mov al,2 + out dx,ax + mov ax,word ptr cs:MX_BYTESPERLINE + dec ax + mov cx,word ptr 0aH[bp] + push si + push di +L$4: + movsb + add si,ax + add di,ax + dec cx + jne L$4 + pop di + pop si + inc si + inc di +L$5: + mov bx,word ptr 0cH[bp] + test bx,bx + je L$7 + mov dx,3c4H + mov ax,0f02H + out dx,ax + mov ax,word ptr cs:MX_BYTESPERLINE + sub ax,bx + mov dx,word ptr 0aH[bp] + push si + push di +L$6: + mov cx,bx + rep movsb + add si,ax + add di,ax + dec dx + jne L$6 + pop di + pop si + add si,bx + add di,bx +L$7: + mov ah,byte ptr -16H[bp] + or ah,ah + je L$9 + mov dx,3c4H + mov al,2 + out dx,ax + mov ax,word ptr cs:MX_BYTESPERLINE + dec ax + mov cx,word ptr 0aH[bp] +L$8: + movsb + add si,ax + add di,ax + dec cx + jne L$8 +L$9: + mov dx,3ceH + mov ax,4005H + out dx,ax + ret +L$10: + mov cx,word ptr 0cH[bp] + mov bx,cx + shr bx,1 + shr bx,1 + and cl,3 + mov al,8 + shr al,cl + mov si,6 +L$11: + mov word ptr -8[bp+si],bx + shr al,1 + adc bx,0 + dec si + dec si + jge L$11 + mov ax,word ptr cs:MX_VIDEOSEGMENT + mov ds,ax + mov es,ax + mov ax,word ptr 0eH[bp] + mul word ptr cs:MX_BYTESPERLINE + mov si,word ptr 10H[bp] + shr si,1 + shr si,1 + add si,ax + mov word ptr -0aH[bp],si + mov ax,word ptr 6[bp] + mul word ptr cs:MX_BYTESPERLINE + mov di,word ptr 8[bp] + shr di,1 + shr di,1 + add di,ax + mov word ptr -0cH[bp],di + mov ax,word ptr 10H[bp] + and al,3 + mov byte ptr -10H[bp],al + mov cx,word ptr 8[bp] + and cl,3 + mov al,11H + shl al,cl + mov byte ptr -12H[bp],al + cld + mov byte ptr -0eH[bp],4 + lea bx,-8[bp] +L$12: + cmp word ptr ss:[bx],0 + je L$15 + mov ah,byte ptr -12H[bp] + and ah,0fH + mov al,2 + mov dx,3c4H + out dx,ax + mov ah,byte ptr -10H[bp] + mov al,4 + mov dx,3ceH + out dx,ax + mov dx,word ptr 0aH[bp] + mov ax,word ptr cs:MX_BYTESPERLINE + sub ax,word ptr ss:[bx] +L$13: + mov cx,word ptr ss:[bx] + shr cx,1 + rep movsw + rcl cx,1 + rep movsb + add si,ax + add di,ax + dec dx + jne L$13 + inc bx + inc bx + inc byte ptr -10H[bp] + and byte ptr -10H[bp],3 + jne L$14 + inc word ptr -0aH[bp] +L$14: + rol byte ptr -12H[bp],1 + adc word ptr -0cH[bp],0 + mov si,word ptr -0aH[bp] + mov di,word ptr -0cH[bp] + dec byte ptr -0eH[bp] + jne L$12 +L$15: + ret +MX_TEXT ENDS + END diff --git a/16/xw_/mxcc.asm b/16/xw_/mxcc.asm new file mode 100755 index 00000000..efe64f3f --- /dev/null +++ b/16/xw_/mxcc.asm @@ -0,0 +1,628 @@ + PUBLIC XSUBCLIPLINE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPX1:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + or al,byte ptr [bx+si] +L$2: + DW offset L$3 + or al,byte ptr [bx+si] + DW offset L$4 + or word ptr [bx+si],ax + DW offset L$5 +; ???? + inc word ptr [bx+si] + add byte ptr [bp+si],cl + add byte ptr 0a00H[bx+si],al + add byte ptr 900H[bp],dl + add byte ptr -100H[si],ch + inc word ptr [bx+si] + add byte ptr ds:[0c000H],al + add byte ptr ds:[0ce00H],al + add byte ptr [di],al + add ah,bl + add bh,bh + inc word ptr [bx+si] + add bh,bh + inc word ptr [bx+si] + add bh,bh + inc word ptr [bx+si] + add bh,bh + inc word ptr [bx+si] + add bh,bh + inc word ptr [bx+si] + DB 0 +L$3: + DW offset MX_TEXT+0ecH + DW offset MX_TEXT+0eeH + DW offset MX_TEXT+0f1H + DW offset MX_TEXT+0eaH + DW offset MX_TEXT+0f4H + DW offset MX_TEXT+0f7H + DW offset MX_TEXT+104H + DW offset MX_TEXT+0eaH + DW offset MX_TEXT+111H + DW offset MX_TEXT+114H + DW offset MX_TEXT+121H +L$4: + DW offset MX_TEXT+132H + DW offset MX_TEXT+0eaH + DW offset MX_TEXT+135H + DW offset MX_TEXT+0eaH + DW offset MX_TEXT+13bH + DW offset MX_TEXT+0eaH + DW offset MX_TEXT+148H + DW offset L$7 + DW offset L$10 + DW offset L$7 + DW offset L$11 +L$5: + DW offset L$14 + DW offset L$15 + DW offset L$7 + DW offset L$7 + DW offset L$16 + DW offset L$17 + DW offset L$7 + DW offset L$7 + DW offset L$18 + DW offset L$19 + DW offset L$22 + DW offset L$23 + DW offset L$24 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$25 + DW offset L$26 + DW offset L$27 + DW offset L$30 + DW offset L$7 + DW offset L$31 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$32 + DW offset L$7 + DW offset L$33 + DW offset L$36 + DW offset L$37 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$38 + DW offset L$39 + DW offset L$43 + DW offset L$44 + DW offset L$45 + DW offset L$7 + DW offset L$46 + DW offset L$47 + DW offset L$48 + DW offset L$51 + DW offset L$7 + DW offset L$52 + DW offset L$7 + DW offset L$53 + DW offset L$7 + DW offset L$54 + DW offset L$58 + DW offset L$59 + DW offset L$7 + DW offset L$7 + DW offset L$60 + DW offset L$61 +L$6: + clc + ret +L$7: + stc + ret + clc + ret + jmp near ptr L$67 + jmp near ptr L$68 + jmp near ptr L$70 + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY1 + jge L$6 + jmp near ptr L$70 + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY1 + jge L$6 + jmp near ptr L$70 + jmp near ptr L$69 + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY2 + jle L$6 + jmp near ptr L$69 + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY2 + jle L$6 + jmp near ptr L$69 +L$8: + stc + ret +L$9: + clc + ret + jmp near ptr L$63 + call near ptr L$63 + jmp near ptr L$68 + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$8 + jmp near ptr L$70 + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$8 + call near ptr L$70 + cmp cx,word ptr cs:MX_CLIPX2 + jle L$9 + jmp near ptr L$68 +L$10: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$8 + jmp near ptr L$69 +L$11: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$8 + call near ptr L$69 + cmp cx,word ptr cs:MX_CLIPX2 + jle L$9 + jmp near ptr L$68 +L$12: + clc + ret +L$13: + stc + ret +L$14: + jmp near ptr L$64 +L$15: + call near ptr L$64 + jmp near ptr L$67 +L$16: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$13 + jmp near ptr L$70 +L$17: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$13 + call near ptr L$70 + cmp cx,word ptr cs:MX_CLIPX1 + jge L$12 + jmp near ptr L$67 +L$18: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$13 + jmp near ptr L$69 +L$19: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$13 + call near ptr L$69 + cmp cx,word ptr cs:MX_CLIPX1 + jge L$12 + jmp near ptr L$67 +L$20: + clc + ret +L$21: + stc + ret +L$22: + jmp near ptr L$66 +L$23: + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX1 + jl L$21 + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY1 + jge L$20 + jmp near ptr L$70 +L$24: + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX2 + jg L$21 + jmp near ptr L$68 +L$25: + call near ptr L$66 + jmp near ptr L$69 +L$26: + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX1 + jl L$21 + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY2 + jle L$20 + jmp near ptr L$69 +L$27: + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX2 + jg L$21 + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY2 + jle L$20 + jmp near ptr L$69 +L$28: + clc + ret +L$29: + stc + ret +L$30: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY1 + jge L$28 + jmp near ptr L$66 +L$31: + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY1 + jl L$29 + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX1 + jge L$28 + jmp near ptr L$63 +L$32: + call near ptr L$69 + cmp cx,word ptr cs:MX_CLIPX1 + jl L$29 + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX1 + jge L$28 + jmp near ptr L$63 +L$33: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$29 + call near ptr L$68 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$29 + cmp si,word ptr cs:MX_CLIPY2 + jle L$28 + jmp near ptr L$69 +L$34: + clc + ret +L$35: + stc + ret +L$36: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY1 + jge L$34 + jmp near ptr L$66 +L$37: + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY2 + jl L$35 + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX2 + jle L$34 + jmp near ptr L$64 +L$38: + call near ptr L$69 + cmp cx,word ptr cs:MX_CLIPX2 + jg L$35 + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY1 + jge L$34 + jmp near ptr L$66 +L$39: + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY1 + jl L$35 + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$35 + cmp si,word ptr cs:MX_CLIPY2 + jle L$40 + call near ptr L$69 +L$40: + cmp bx,word ptr cs:MX_CLIPY1 + jge L$34 + jmp near ptr L$66 +L$41: + clc + ret +L$42: + stc + ret +L$43: + jmp near ptr L$65 +L$44: + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX1 + jl L$42 + jmp near ptr L$67 +L$45: + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX2 + jg L$42 + jmp near ptr L$68 +L$46: + call near ptr L$65 + jmp near ptr L$70 +L$47: + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX1 + jl L$42 + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY1 + jge L$42 + jmp near ptr L$70 +L$48: + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX2 + jg L$42 + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY1 + jge L$41 + jmp near ptr L$70 +L$49: + clc + ret +L$50: + stc + ret +L$51: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY2 + jle L$49 + jmp near ptr L$65 +L$52: + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY2 + jg L$50 + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX1 + jge L$49 + jmp near ptr L$63 +L$53: + call near ptr L$70 + cmp cx,word ptr cs:MX_CLIPX1 + jl L$50 + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY2 + jle L$49 + jmp near ptr L$65 +L$54: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$50 + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY2 + jg L$50 + cmp bx,word ptr cs:MX_CLIPY2 + jle L$55 + call near ptr L$65 +L$55: + cmp si,word ptr cs:MX_CLIPY1 + jge L$49 + jmp near ptr L$70 +L$56: + clc + ret +L$57: + stc + ret +L$58: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY2 + jle L$56 + jmp near ptr L$65 +L$59: + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY2 + jg L$57 + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX2 + jle L$56 + jmp L$64 +L$60: + call near ptr L$70 + cmp cx,word ptr cs:MX_CLIPX2 + jg L$57 + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY2 + jle L$56 + jmp L$65 +L$61: + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY2 + jg L$57 + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$57 + cmp si,word ptr cs:MX_CLIPY1 + jge L$62 + call near ptr L$70 +L$62: + cmp bx,word ptr cs:MX_CLIPY2 + jle L$56 + jmp L$65 +L$63: + mov ax,si + sub ax,bx + mov dx,word ptr cs:MX_CLIPX1 + sub dx,di + imul dx + mov bp,cx + sub bp,di + idiv bp + add bx,ax + mov di,word ptr cs:MX_CLIPX1 + clc + ret +L$64: + mov ax,si + sub ax,bx + mov dx,word ptr cs:MX_CLIPX2 + sub dx,di + imul dx + mov bp,cx + sub bp,di + idiv bp + add bx,ax + mov di,word ptr cs:MX_CLIPX2 + clc + ret +L$65: + mov ax,cx + sub ax,di + mov dx,word ptr cs:MX_CLIPY2 + sub dx,bx + imul dx + mov bp,si + sub bp,bx + idiv bp + add di,ax + mov bx,word ptr cs:MX_CLIPY2 + clc + ret +L$66: + mov ax,cx + sub ax,di + mov dx,word ptr cs:MX_CLIPY1 + sub dx,bx + imul dx + mov bp,si + sub bp,bx + idiv bp + add di,ax + mov bx,word ptr cs:MX_CLIPY1 + clc + ret +L$67: + mov ax,bx + sub ax,si + mov dx,word ptr cs:MX_CLIPX1 + sub dx,cx + imul dx + mov bp,di + sub bp,cx + idiv bp + add si,ax + mov cx,word ptr cs:MX_CLIPX1 + clc + ret +L$68: + mov ax,bx + sub ax,si + mov dx,word ptr cs:MX_CLIPX2 + sub dx,cx + imul dx + mov bp,di + sub bp,cx + idiv bp + add si,ax + mov cx,word ptr cs:MX_CLIPX2 + clc + ret +L$69: + mov ax,di + sub ax,cx + mov dx,word ptr cs:MX_CLIPY2 + sub dx,si + imul dx + mov bp,bx + sub bp,si + idiv bp + add cx,ax + mov si,word ptr cs:MX_CLIPY2 + clc + ret +L$70: + mov ax,di + sub ax,cx + mov dx,word ptr cs:MX_CLIPY1 + sub dx,si + imul dx + mov bp,bx + sub bp,si + idiv bp + add cx,ax + mov si,word ptr cs:MX_CLIPY1 + clc + ret +XSUBCLIPLINE: + push bp + xor si,si + cmp dx,word ptr cs:MX_CLIPY2 + jle L$71 + or si,8 + jmp L$72 +L$71: + cmp dx,word ptr cs:MX_CLIPY1 + jge L$72 + or si,4 +L$72: + cmp cx,word ptr cs:MX_CLIPX2 + jle L$73 + or si,2 + jmp L$74 +L$73: + cmp cx,word ptr cs:MX_CLIPX1 + jge L$74 + or si,1 +L$74: + cmp bx,word ptr cs:MX_CLIPY2 + jle L$75 + or si,80H + jmp L$76 +L$75: + cmp bx,word ptr cs:MX_CLIPY1 + jge L$76 + or si,40H +L$76: + cmp ax,word ptr cs:MX_CLIPX2 + jle L$77 + or si,20H + jmp L$78 +L$77: + cmp ax,word ptr cs:MX_CLIPX1 + jge L$78 + or si,10H +L$78: + mov di,si + and di,0fH + and si,0f0H + shr si,1 + shr si,1 + cmp di,word ptr cs:L$1[si] + jg L$79 + mov si,word ptr cs:L$2[si] + shl di,1 + add si,di + mov di,ax + mov si,word ptr cs:[si] + xchg si,dx + call dx + mov ax,di + mov dx,si + pop bp + ret +L$79: + pop bp + stc + ret +MX_TEXT ENDS + END diff --git a/16/xw_/mxcg.asm b/16/xw_/mxcg.asm new file mode 100755 index 00000000..c29a48ec --- /dev/null +++ b/16/xw_/mxcg.asm @@ -0,0 +1,42 @@ + PUBLIC MXCOLORTOGRAY +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXCOLORTOGRAY: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov cx,word ptr 6[bp] + jcxz L$2 + lds si,dword ptr 0cH[bp] + les di,dword ptr 8[bp] + cld + mov bx,4d97H +L$1: + lodsb + mul bh + mov dx,ax + lodsb + mul bl + add dx,ax + lodsb + mov ah,1cH + mul ah + add ax,dx + mov al,ah + stosw + stosb + loop L$1 +L$2: + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0aH +MX_TEXT ENDS + END diff --git a/16/xw_/mxcl.asm b/16/xw_/mxcl.asm new file mode 100755 index 00000000..549bc8ce --- /dev/null +++ b/16/xw_/mxcl.asm @@ -0,0 +1,110 @@ + PUBLIC MXCIRCLE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_CLIPX1:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXCIRCLE: + push bp + mov bp,sp + sub sp,2 + push ds + push si + push di + xor si,si + mov di,word ptr 8[bp] + mov ax,3 + sub ax,di + sub ax,di + mov word ptr -2[bp],ax + mov ds,word ptr cs:MX_VIDEOSEGMENT +L$1: + cmp si,di + jg L$3 + mov ax,si + mov bx,di + call near ptr L$4 + mov ax,si + neg ax + mov bx,di + call near ptr L$4 + mov ax,si + mov bx,di + neg bx + call near ptr L$4 + mov ax,si + neg ax + mov bx,di + neg bx + call near ptr L$4 + mov ax,di + mov bx,si + call near ptr L$4 + mov ax,di + neg ax + mov bx,si + call near ptr L$4 + mov ax,di + mov bx,si + neg bx + call near ptr L$4 + mov ax,di + neg ax + mov bx,si + neg bx + call near ptr L$4 + mov ax,word ptr -2[bp] + test ax,ax + jl L$2 + mov ax,di + shl ax,1 + shl ax,1 + sub ax,4 + sub word ptr -2[bp],ax + dec di +L$2: + mov ax,si + shl ax,1 + shl ax,1 + add ax,6 + add word ptr -2[bp],ax + inc si + jmp L$1 +L$3: + xor ax,ax + pop di + pop si + pop ds + mov sp,bp + pop bp + retf 8 +L$4: + add bx,word ptr 0cH[bp] + add ax,word ptr 0aH[bp] + cmp bx,word ptr cs:MX_CLIPX1 + jl L$5 + cmp bx,word ptr cs:MX_CLIPX2 + jg L$5 + cmp ax,word ptr cs:MX_CLIPY1 + jl L$5 + cmp ax,word ptr cs:MX_CLIPY2 + jg L$5 + mul word ptr cs:MX_BYTESPERLINE + mov cx,bx + shr bx,1 + shr bx,1 + add bx,ax + and cl,3 + mov ax,102H + shl ah,cl + mov dx,3c4H + out dx,ax + mov al,byte ptr 6[bp] + mov byte ptr [bx],al +L$5: + ret +MX_TEXT ENDS + END diff --git a/16/xw_/mxcr.asm b/16/xw_/mxcr.asm new file mode 100755 index 00000000..826e065a --- /dev/null +++ b/16/xw_/mxcr.asm @@ -0,0 +1,243 @@ + PUBLIC MX_CLIPX1 + PUBLIC MX_CLIPY1 + PUBLIC MX_CLIPX2 + PUBLIC MX_CLIPY2 + PUBLIC MXSETCLIP + PUBLIC MXGETCLIP + PUBLIC MXSETSYSCLIPREGION + PUBLIC MXSETCLIPREGION + PUBLIC MXGETCLIPREGION + PUBLIC SUBCLIPIMAGE + PUBLIC SUBCLIPBOX + EXTRN MX_CODESEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MX_CLIPX1: + add byte ptr [bx+si],al +MX_CLIPY1: + add byte ptr [bx+si],al +MX_CLIPX2: + add byte ptr [bx+si],al +MX_CLIPY2: + add byte ptr [bx+si],al +L$1: + add byte ptr [bx+si],al +L$2: + add byte ptr [bx+si],al +L$3: + add byte ptr [bx+si],al +L$4: + add byte ptr [bx+si],al +L$5: + add byte ptr [bx+si],al +L$6: + add byte ptr [bx+si],al +L$7: + add byte ptr [bx+si],al +L$8: + add byte ptr [bx+si],al +L$9: + DB 0 +MXSETCLIP: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr L$5 + mov bx,word ptr L$6 + mov cx,word ptr L$7 + mov dx,word ptr L$8 + cmp byte ptr 6[bp],1 + je L$10 + mov ax,word ptr L$1 + mov bx,word ptr L$2 + mov cx,word ptr L$3 + mov dx,word ptr L$4 +L$10: + mov word ptr MX_CLIPX1,ax + mov word ptr MX_CLIPY1,bx + mov word ptr MX_CLIPX2,cx + mov word ptr MX_CLIPY2,dx + mov al,byte ptr 6[bp] + xchg byte ptr L$9,al + xor ah,ah + pop ds + mov sp,bp + pop bp + retf 2 +MXGETCLIP: + mov al,byte ptr cs:L$9 + xor ah,ah + retf +MXSETSYSCLIPREGION: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + xor ax,ax + mov word ptr L$1,ax + mov word ptr L$2,ax + mov ax,word ptr 8[bp] + dec ax + mov word ptr L$3,ax + mov ax,word ptr 6[bp] + dec ax + mov word ptr L$4,ax + mov ax,0 + push ax + push cs + call near ptr MXSETCLIP + pop ds + mov sp,bp + pop bp + retf 4 +MXSETCLIPREGION: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr 0cH[bp] + mov word ptr L$5,ax + mov ax,word ptr 0aH[bp] + mov word ptr L$6,ax + mov ax,word ptr 8[bp] + add ax,word ptr 0cH[bp] + dec ax + mov word ptr L$7,ax + mov ax,word ptr 6[bp] + add ax,word ptr 0aH[bp] + dec ax + mov word ptr L$8,ax + mov al,byte ptr L$9 + cmp al,1 + jne L$11 + push ax + push cs + call near ptr MXSETCLIP +L$11: + xor ax,ax + pop ds + mov sp,bp + pop bp + retf 8 +MXGETCLIPREGION: + push bp + mov bp,sp + sub sp,0 + push es + push di + mov ax,word ptr cs:L$5 + les di,dword ptr 12H[bp] + mov word ptr es:[di],ax + mov ax,word ptr cs:L$6 + les di,dword ptr 0eH[bp] + mov word ptr es:[di],ax + mov ax,word ptr cs:L$7 + sub ax,word ptr cs:L$5 + inc ax + les di,dword ptr 0aH[bp] + mov word ptr es:[di],ax + mov ax,word ptr cs:L$8 + sub ax,word ptr cs:L$6 + inc ax + les di,dword ptr 6[bp] + mov word ptr es:[di],ax + mov al,byte ptr cs:L$9 + xor ah,ah + pop di + pop es + mov sp,bp + pop bp + retf 10H +SUBCLIPIMAGE: + xor si,si + mov di,word ptr cs:MX_CLIPY1 + cmp ax,di + jge L$12 + sub di,ax + sub dx,di + jle L$16 + mov ax,di + mov di,dx + mul cx + mov si,ax + mov dx,di + mov ax,word ptr cs:MX_CLIPY1 +L$12: + mov di,word ptr cs:MX_CLIPY2 + cmp ax,di + jg L$16 + inc di + sub di,dx + sub di,ax + jge L$13 + add dx,di +L$13: + mov di,word ptr cs:MX_CLIPX1 + cmp bx,di + jge L$14 + sub di,bx + sub cx,di + jle L$16 + add si,di + mov bx,word ptr cs:MX_CLIPX1 +L$14: + mov di,word ptr cs:MX_CLIPX2 + cmp bx,di + jg L$16 + inc di + sub di,bx + sub di,cx + jge L$15 + add cx,di +L$15: + clc + ret +L$16: + stc + ret +SUBCLIPBOX: + mov di,word ptr cs:MX_CLIPY1 + cmp ax,di + jge L$17 + sub di,ax + sub dx,di + jle L$21 + mov ax,word ptr cs:MX_CLIPY1 +L$17: + mov di,word ptr cs:MX_CLIPY2 + cmp ax,di + jg L$21 + inc di + sub di,dx + sub di,ax + jge L$18 + add dx,di +L$18: + mov di,word ptr cs:MX_CLIPX1 + cmp bx,di + jge L$19 + sub di,bx + sub cx,di + jle L$21 + mov bx,word ptr cs:MX_CLIPX1 +L$19: + mov di,word ptr cs:MX_CLIPX2 + cmp bx,di + jg L$21 + inc di + sub di,bx + sub di,cx + jge L$20 + add cx,di +L$20: + clc + ret +L$21: + stc + ret +MX_TEXT ENDS + END diff --git a/16/xw_/mxel.asm b/16/xw_/mxel.asm new file mode 100755 index 00000000..e69de29b diff --git a/16/xw_/mxfb.asm b/16/xw_/mxfb.asm new file mode 100755 index 00000000..e20f1dc9 --- /dev/null +++ b/16/xw_/mxfb.asm @@ -0,0 +1,133 @@ + PUBLIC MXFILLBOX + EXTRN SUBCLIPBOX:BYTE + EXTRN SUBHORIZONTALLINEINFO:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + mov ah,al + shr cx,1 + rep stosw + rcl cx,1 + rep stosb + ret +L$2: + mov byte ptr [bx],al + add bx,dx + loop L$2 + ret +L$3: + mov si,di +L$4: + mov ah,byte ptr [si] + mov byte ptr [si],al + inc si + loop L$4 + ret +L$5: + mov ah,byte ptr [bx] + mov byte ptr [bx],al + add bx,dx + loop L$5 + ret +MXFILLBOX: + push bp + mov bp,sp + sub sp,8 + push ds + push si + push es + push di + mov bx,word ptr 10H[bp] + mov ax,word ptr 0eH[bp] + mov cx,word ptr 0cH[bp] + mov dx,word ptr 0aH[bp] + call near ptr MX_TEXT:SUBCLIPBOX + jae L$6 + jmp near ptr L$12 +L$6: + mov word ptr 0aH[bp],dx + call near ptr MX_TEXT:SUBHORIZONTALLINEINFO + mov word ptr 0cH[bp],cx + mov byte ptr -2[bp],al + mov byte ptr -4[bp],ah + mov ax,word ptr cs:MX_VIDEOSEGMENT + mov es,ax + mov ds,ax + cld + mov word ptr -6[bp],offset L$2 + mov word ptr -8[bp],offset L$1 + mov ax,word ptr 6[bp] + cmp al,3 + ja L$7 + cmp al,0 + je L$7 + shl al,1 + shl al,1 + shl al,1 + mov ah,al + mov al,3 + mov dx,3ceH + out dx,ax + mov word ptr -6[bp],offset L$5 + mov word ptr -8[bp],offset L$3 +L$7: + mov ah,byte ptr -2[bp] + or ah,ah + je L$8 + mov dx,3c4H + mov al,2 + out dx,ax + mov dx,word ptr cs:MX_BYTESPERLINE + mov cx,word ptr 0aH[bp] + mov bx,di + mov al,byte ptr 8[bp] + call word ptr -6[bp] + inc di +L$8: + mov cx,word ptr 0cH[bp] + jcxz L$10 + mov dx,3c4H + mov ax,0f02H + out dx,ax + mov al,byte ptr 8[bp] + mov bx,di + mov dx,word ptr 0aH[bp] + push di +L$9: + mov di,bx + call word ptr -8[bp] + mov cx,word ptr 0cH[bp] + add bx,word ptr cs:MX_BYTESPERLINE + dec dx + jne L$9 + pop di + add di,word ptr 0cH[bp] +L$10: + mov ah,byte ptr -4[bp] + or ah,ah + je L$11 + mov dx,3c4H + mov al,2 + out dx,ax + mov dx,word ptr cs:MX_BYTESPERLINE + mov cx,word ptr 0aH[bp] + mov bx,di + mov al,byte ptr 8[bp] + call word ptr -6[bp] +L$11: + mov dx,3ceH + mov ax,3 + out dx,ax +L$12: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +MX_TEXT ENDS + END diff --git a/16/xw_/mxfp.asm b/16/xw_/mxfp.asm new file mode 100755 index 00000000..7ff26176 --- /dev/null +++ b/16/xw_/mxfp.asm @@ -0,0 +1,219 @@ + PUBLIC MXFADEPALETTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP + inc bx + outsw + jo L$5 + jb L$4 + push 2074H + sub byte ptr 29H[bp+di],ah + and byte ptr [bx+di],dh + cmp word ptr [bx+di],di + xor ch,byte ptr [di] + xor word ptr [bx+di],di + cmp word ptr [si],si + and byte ptr 52H[bx+di],al + push sp + dec cx + push bx + and byte ptr 2eH[bp+di],dh + jb L$1 + insb + and byte ptr cs:6cH[bx+di],al + insb + and byte ptr 69H[bp+si],dh + push 7374H + and byte ptr 65H[bp+si],dh + jae L$7 + jb L$9 + DB 65H, 64H, 2eH +MXFADEPALETTE: + push bp + mov bp,sp + sub sp,60aH + push si + push di + push ds + push es + mov word ptr -608H[bp],1 + mov ax,word ptr 10H[bp] + and ax,0ff00H +L$1: + je L$2 + mov cl,8 + shr ax,cl + mov word ptr -608H[bp],ax +L$2: + mov ax,word ptr 10H[bp] + and ax,0feH + mov cl,1 + shr ax,cl + or ax,ax + jne L$3 + mov ax,30H +L$3: + mov word ptr -60aH[bp],ax +L$4: + inc ax + mov byte ptr -606H[bp],al + mov byte ptr -604H[bp],1 + DB 0c6H, 86H, 0feH, 0f9H +L$5: + add byte ptr 0e46H[bp+di],cl + cmp ax,100H + jb L$6 + jmp near ptr L$12 +L$6: + add ax,word ptr 0cH[bp] + cmp ax,100H + jbe L$8 + mov ax,100H + sub ax,word ptr 0eH[bp] + DB 89H, 46H +L$7: + or al,0bH + ???? + jne L$8 + jmp near ptr L$12 +L$8: + mov cx,word ptr 0cH[bp] + mov ax,cx + shl ax,1 + add cx,ax + mov ax,ss +L$9: + mov es,ax + lea di,-300H[bp] + mov ax,word ptr 0eH[bp] + mov si,ax + shl ax,1 + add ax,si + lds si,dword ptr 12H[bp] + add si,ax + cld + shr cx,1 + rep movsw + rcl cx,1 + rep movsb + test word ptr 10H[bp],1 + je L$10 + mov ax,word ptr -60aH[bp] + mov byte ptr -602H[bp],al + mov byte ptr -604H[bp],0ffH + mov ax,ss + mov ds,ax + mov es,ax + lea di,-300H[bp] + mov ax,word ptr 0eH[bp] + mov cx,word ptr 0cH[bp] + call near ptr L$19 +L$10: + mov bh,byte ptr 0aH[bp] + and bh,3fH + mov bl,byte ptr 8[bp] + and bl,3fH + mov dh,byte ptr 6[bp] + and dh,3fH + mov dl,byte ptr -602H[bp] + mov ax,ss + mov ds,ax + mov es,ax +L$11: + mov ax,word ptr 0cH[bp] + mov cx,word ptr -60aH[bp] + lea si,-300H[bp] + lea di,-600H[bp] + call near ptr L$13 + push bx + push dx + lea si,-600H[bp] + mov ax,word ptr 0eH[bp] + mov bx,word ptr 0cH[bp] + mov cx,word ptr -608H[bp] + call near ptr L$15 + pop dx + pop bx + add dl,byte ptr -604H[bp] + dec byte ptr -606H[bp] + jne L$11 +L$12: + pop es + pop ds + pop di + pop si + mov sp,bp + pop bp + retf 10H +L$13: + cld + push bp + mov bp,ax +L$14: + lodsb + sub al,bh + imul dl + idiv cl + add al,bh + stosb + lodsb + sub al,bl + imul dl + idiv cl + add al,bl + stosb + lodsb + sub al,dh + imul dl + idiv cl + add al,dh + stosb + dec bp + jne L$14 + pop bp + ret +L$15: + mov ah,al + mov dx,3daH +L$16: + in al,dx + test al,8 + jne L$16 +L$17: + in al,dx + test al,8 + je L$17 + loop L$16 + mov cx,bx + mov dx,3c8H + mov al,ah + out dx,al + inc dx + cld + cli +L$18: + lodsb + out dx,al + lodsb + out dx,al + lodsb + out dx,al + loop L$18 + sti + ret +L$19: + mov dx,3c7H + out dx,al + inc dx + inc dx + cld +L$20: + in al,dx + stosb + in al,dx + stosb + in al,dx + stosb + loop L$20 + ret +MX_TEXT ENDS + END diff --git a/16/xw_/mxgc.asm b/16/xw_/mxgc.asm new file mode 100755 index 00000000..2f297632 --- /dev/null +++ b/16/xw_/mxgc.asm @@ -0,0 +1,30 @@ + PUBLIC MXGETCOLOR +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXGETCOLOR: + push bp + mov bp,sp + sub sp,0 + push ds + push si + mov ax,word ptr 12H[bp] + mov dx,3c7H + out dx,al + inc dx + inc dx + lds si,dword ptr 0eH[bp] + in al,dx + mov byte ptr [si],al + lds si,dword ptr 0aH[bp] + in al,dx + mov byte ptr [si],al + lds si,dword ptr 6[bp] + in al,dx + mov byte ptr [si],al + pop si + pop ds + mov sp,bp + pop bp + retf 0eH +MX_TEXT ENDS + END diff --git a/16/xw_/mxgi.asm b/16/xw_/mxgi.asm new file mode 100755 index 00000000..0570d498 --- /dev/null +++ b/16/xw_/mxgi.asm @@ -0,0 +1,98 @@ + PUBLIC MXGETIMAGE + EXTRN SUBCLIPIMAGE:BYTE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXGETIMAGE: + push bp + mov bp,sp + sub sp,10H + push ds + push si + push es + push di + mov bx,word ptr 0cH[bp] + mov ax,word ptr 0aH[bp] + mov cx,word ptr 8[bp] + mov dx,word ptr 6[bp] + call near ptr MX_TEXT:SUBCLIPIMAGE + jae L$1 + jmp near ptr L$7 +L$1: + mov word ptr 6[bp],dx + add word ptr 0eH[bp],si + mul word ptr cs:MX_BYTESPERLINE + mov si,bx + shr si,1 + shr si,1 + add si,ax + mov word ptr -0aH[bp],si + mov ds,word ptr cs:MX_VIDEOSEGMENT + and bl,3 + mov byte ptr -0eH[bp],bl + mov bx,cx + shr bx,1 + shr bx,1 + and cl,3 + mov al,8 + shr al,cl + mov di,6 +L$2: + mov word ptr -8[bp+di],bx + shr al,1 + adc bx,0 + dec di + dec di + jge L$2 + cld + mov byte ptr -10H[bp],4 + lea bx,-8[bp] + mov es,word ptr 10H[bp] + mov ah,byte ptr -0eH[bp] +L$3: + cmp word ptr ss:[bx],0 + je L$7 + mov di,word ptr 0eH[bp] + mov al,4 + mov dx,3ceH + out dx,ax + mov dx,word ptr 6[bp] + mov si,word ptr -0aH[bp] +L$4: + push si + push di + mov cx,word ptr ss:[bx] +L$5: + movsb + add di,3 + dec cx + jne L$5 + pop di + pop si + add di,word ptr 8[bp] + add si,word ptr cs:MX_BYTESPERLINE + dec dx + jne L$4 + inc bx + inc bx + inc ah + test ah,4 + je L$6 + inc word ptr -0aH[bp] + and ah,3 +L$6: + inc word ptr 0eH[bp] + dec byte ptr -10H[bp] + jne L$3 +L$7: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +MX_TEXT ENDS + END diff --git a/16/xw_/mxgm.asm b/16/xw_/mxgm.asm new file mode 100755 index 00000000..8ca07a17 --- /dev/null +++ b/16/xw_/mxgm.asm @@ -0,0 +1,68 @@ + PUBLIC MXGAMMACORRECT +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + add byte ptr [bp+si],cl + push cs + adc word ptr [bp+di],dx + adc ax,1817H + sbb bl,byte ptr [bp+di] + sbb al,1dH + pop ds + and byte ptr [bx+di],ah + and ah,byte ptr [bp+di] + and al,25H + and ax,2726H + sub byte ptr [bx+di],ch + sub word ptr [bp+si],bp + sub bp,word ptr [si] + sub al,2dH + das + xor byte ptr [bx+si],dh + xor word ptr [bx+di],si + xor dh,byte ptr [bp+di] + xor si,word ptr [si] + xor al,35H + xor ax,3636H + aaa + aaa + cmp byte ptr [bx+si],bh + cmp word ptr [bx+di],di + cmp bh,byte ptr [bp+si] + cmp di,word ptr [bp+di] + cmp al,3cH + cmp ax,3e3dH + aas + aas +MXGAMMACORRECT: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov cx,word ptr 6[bp] + jcxz L$3 + lds si,dword ptr 0cH[bp] + les di,dword ptr 8[bp] + mov bx,offset L$1 + cld + mov ax,cx + add cx,cx + add cx,ax +L$2: + lodsb + xlat word ptr cs:[bx] + stosb + loop L$2 +L$3: + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0aH +MX_TEXT ENDS + END diff --git a/16/xw_/mxgp.asm b/16/xw_/mxgp.asm new file mode 100755 index 00000000..14dfc17a --- /dev/null +++ b/16/xw_/mxgp.asm @@ -0,0 +1,32 @@ + PUBLIC MXGETPALETTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXGETPALETTE: + push bp + mov bp,sp + sub sp,0 + push es + push di + les di,dword ptr 0aH[bp] + mov cx,word ptr 6[bp] + mov ax,word ptr 8[bp] + mov dx,3c7H + out dx,al + inc dx + inc dx + cld +L$1: + in al,dx + stosb + in al,dx + stosb + in al,dx + stosb + loop L$1 + pop di + pop es + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw_/mxgv.asm b/16/xw_/mxgv.asm new file mode 100755 index 00000000..44b30ddb --- /dev/null +++ b/16/xw_/mxgv.asm @@ -0,0 +1,8 @@ + PUBLIC MXGETVERSION +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXGETVERSION: + mov ax,128H + retf +MX_TEXT ENDS + END diff --git a/16/xw_/mxhl.asm b/16/xw_/mxhl.asm new file mode 100755 index 00000000..f664632b --- /dev/null +++ b/16/xw_/mxhl.asm @@ -0,0 +1,45 @@ + PUBLIC SUBHORIZONTALLINEINFO + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + add byte ptr [bx+si],al + add ax,word ptr [bx+si] + add al,byte ptr [bx+si] + add word ptr [bx+si],ax +L$2: + add byte ptr ds:[80cH],cl +L$3: + add byte ptr [bx+di],al + add ax,word ptr [bx] +L$4: + DB 2, 6 +SUBHORIZONTALLINEINFO: + ;DD ds:[63278] + ASSUME ds:NOTHING + add byte ptr -2e05H[bp+di],cl + out dx,ax + shr di,1 + add di,ax + and bx,3 + mov al,byte ptr cs:L$2[bx] + shl bx,1 + sub cx,word ptr cs:L$1[bx] + jge L$5 + mov bx,cx + inc bx + inc bx + and al,byte ptr cs:L$4[bx] + xor ah,ah + xor cx,cx + jmp L$6 +L$5: + mov bx,cx + and bx,3 + mov ah,byte ptr cs:L$3[bx] + shr cx,1 + shr cx,1 +L$6: + ret +MX_TEXT ENDS + END diff --git a/16/xw_/mxit.asm b/16/xw_/mxit.asm new file mode 100755 index 00000000..25bce3c3 --- /dev/null +++ b/16/xw_/mxit.asm @@ -0,0 +1,98 @@ +;----------------------------------------------------------- +; +; MXIT.ASM - Initialization/termination functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +;WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxInit +PUBLIC mxTerm + +PUBLIC mx_VideoSegment +PUBLIC mx_CodeSegment + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +DB 'MODEX library - Copyright (c) 1992-1994 Alessandro Scotti' + +mx_VideoSegment DW 0A000h +mx_CodeSegment DW SEG MX_TEXT + +;----------------------------------------------------------- +; +; Initialization. +; +; Input: +; none +; Output: +; AX = 0 on success +; +mxInit PROC FAR + LOCAL Result:WORD, \ + VideoSeg:WORD, \ + CStoDSalias:WORD = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + + mov [Result], -1 ; Assume an error + mov [VideoSeg], 0A000h ; Real mode video segment + mov [CStoDSalias], cs ; Real mode data alias for CS + +; Check if running in protected mode under DPMI + mov ax, 1686h + int 2Fh + or ax, ax + jnz @@1 ; DPMI not found, continue in real mode + +; Get a data alias for CS + mov ax, 000Ah ; DMPI: create data alias + mov bx, cs + int 31h + jc @@Exit ; Exit if service failed + mov [CStoDSalias], ax ; Save data alias for CS +; Get a protected-mode selector for the video segment + mov ax, 0002h + mov bx, 0A000h ; Real mode segment of video + int 31h ; DPMI: get segment selector + jc @@Exit ; Exit if service failed + mov [VideoSeg], ax ; Save protected mode video selector + +; Initialize variables +@@1: + mov ds, [CStoDSalias] + ASSUME ds:MX_TEXT + mov [mx_CodeSegment], ds + mov ax, [VideoSeg] + mov [mx_VideoSegment], ax + +; Don't bother with VGA check for now... + + mov [Result], 0 + +@@Exit: + mov ax, [Result] + .pop ds, si, es, di +; .leave +mxInit ENDP + +;----------------------------------------------------------- +; +; Termination. +; +; Input: +; none +; Output: +; always 0. +; +mxTerm PROC FAR + ASSUME ds:NOTHING + xor ax, ax + ret +mxTerm ENDP + +MX_TEXT ENDS +END diff --git a/16/xw_/mxll.asm b/16/xw_/mxll.asm new file mode 100755 index 00000000..f08de8d4 --- /dev/null +++ b/16/xw_/mxll.asm @@ -0,0 +1,50 @@ + PUBLIC MXLOADLATCHES + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXLOADLATCHES: + push ds + push si + mov dx,3ceH + mov ax,0ff08H + out dx,ax + mov ax,3 + out dx,ax + mov ax,5 + out dx,ax + mov ax,word ptr cs:MX_VIDEOSEGMENT + mov ds,ax + mov si,0ffffH + mov bh,8 + mov cx,3 +L$1: + mov dx,3ceH + mov al,4 + mov ah,cl + out dx,ax + mov dx,3c4H + mov al,2 + mov ah,bh + out dx,ax + mov al,byte ptr [si] + push ax + mov byte ptr [si],bl + mov al,byte ptr [di] + shr bh,1 + loop L$1 + mov cx,3 + mov bh,8 + mov dx,3c4H +L$2: + mov al,2 + mov ah,bh + out dx,ax + pop ax + mov byte ptr [si],al + shr bh,1 + loop L$2 + pop si + pop ds + ret +MX_TEXT ENDS + END diff --git a/16/xw_/mxln.asm b/16/xw_/mxln.asm new file mode 100755 index 00000000..77d2b64b --- /dev/null +++ b/16/xw_/mxln.asm @@ -0,0 +1,332 @@ + PUBLIC MXLINE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_CLIPX1:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + DW offset L$29 + DW offset L$32 + DW offset L$35 + DW offset L$38 +MXLINE: + push bp + mov bp,sp + sub sp,12H + push ds + push si + push di + mov ax,word ptr 10H[bp] + mov bx,word ptr 0eH[bp] + mov cx,word ptr 0cH[bp] + mov dx,word ptr 0aH[bp] + call near ptr L$8 + jae L$2 + jmp near ptr L$7 +L$2: + mov si,cx + xchg ax,si + sub ax,si + jge L$3 + xchg cx,si + xchg dx,bx + neg ax +L$3: + mov word ptr -2[bp],ax + mov cx,word ptr cs:MX_BYTESPERLINE + mov ax,dx + sub ax,bx + jge L$4 + neg cx + neg ax +L$4: + mov word ptr -4[bp],ax + mov word ptr -0cH[bp],cx + mov ax,bx + mul word ptr cs:MX_BYTESPERLINE + mov cx,si + shr si,1 + shr si,1 + add si,ax + and cl,3 + mov ax,1102H + shl ah,cl + mov byte ptr -12H[bp],ah + mov dx,3c4H + out dx,ax + mov ax,word ptr cs:MX_VIDEOSEGMENT + mov ds,ax + xor bx,bx + mov al,byte ptr 6[bp] + cmp al,0 + je L$5 + and al,3 + shl al,1 + shl al,1 + shl al,1 + mov ah,al + mov al,3 + mov dx,3ceH + out dx,ax + inc bx + inc bx +L$5: + mov ax,word ptr -2[bp] + mov cx,word ptr -4[bp] + cmp ax,cx + jae L$6 + inc bx +L$6: + shl bx,1 + call word ptr cs:L$1[bx] + cmp byte ptr 6[bp],0 + je L$7 + mov ax,3 + mov dx,3ceH + out dx,ax +L$7: + xor ax,ax + pop di + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +L$8: + mov di,ax + mov si,dx + xor al,al + cmp cx,word ptr cs:MX_CLIPX1 + jge L$9 + or al,1 +L$9: + cmp cx,word ptr cs:MX_CLIPX2 + jle L$10 + or al,2 +L$10: + cmp si,word ptr cs:MX_CLIPY1 + jge L$11 + or al,4 +L$11: + cmp si,word ptr cs:MX_CLIPY2 + jle L$12 + or al,8 +L$12: + mov byte ptr -10H[bp],al + xor al,al + cmp di,word ptr cs:MX_CLIPX1 + jge L$13 + or al,1 +L$13: + cmp di,word ptr cs:MX_CLIPX2 + jle L$14 + or al,2 +L$14: + cmp bx,word ptr cs:MX_CLIPY1 + jge L$15 + or al,4 +L$15: + cmp bx,word ptr cs:MX_CLIPY2 + jle L$16 + or al,8 +L$16: + mov byte ptr -0eH[bp],al + mov ah,byte ptr -10H[bp] + test ah,al + je L$17 + jmp near ptr L$28 +L$17: + or ah,al + jne L$18 + jmp near ptr L$27 +L$18: + mov ax,cx + sub ax,di + mov word ptr -0aH[bp],ax + mov ax,si + sub ax,bx + mov word ptr -0cH[bp],ax + mov al,byte ptr -0eH[bp] +L$19: + test al,al + jne L$20 + xchg di,cx + xchg si,bx + xchg byte ptr -10H[bp],al +L$20: + test al,1 + je L$21 + mov ax,word ptr cs:MX_CLIPX1 + sub ax,di + mov di,word ptr cs:MX_CLIPX1 + jmp L$22 +L$21: + test al,2 + je L$23 + mov ax,word ptr cs:MX_CLIPX2 + sub ax,di + mov di,word ptr cs:MX_CLIPX2 +L$22: + imul word ptr -0cH[bp] + idiv word ptr -0aH[bp] + add bx,ax + mov al,8 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$26 + mov al,4 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$26 + xor al,al + jmp L$26 +L$23: + test al,4 + je L$24 + mov ax,word ptr cs:MX_CLIPY1 + sub ax,bx + mov bx,word ptr cs:MX_CLIPY1 + jmp L$25 +L$24: + mov ax,word ptr cs:MX_CLIPY2 + sub ax,bx + mov bx,word ptr cs:MX_CLIPY2 +L$25: + imul word ptr -0aH[bp] + idiv word ptr -0cH[bp] + add di,ax + mov al,1 + cmp di,word ptr cs:MX_CLIPX1 + jl L$26 + mov al,2 + cmp di,word ptr cs:MX_CLIPX2 + jg L$26 + xor al,al +L$26: + mov ah,byte ptr -10H[bp] + test ah,al + jne L$28 + or ah,al + je L$27 + jmp near ptr L$19 +L$27: + mov ax,di + mov dx,si + clc + ret +L$28: + stc + ret +L$29: + mov di,ax + neg di + shl cx,1 + mov word ptr -6[bp],cx + mov cx,ax + shl ax,1 + mov word ptr -8[bp],ax + mov al,2 + mov ah,byte ptr -12H[bp] + mov bl,byte ptr 8[bp] + mov dx,3c4H + inc cx +L$30: + mov byte ptr [si],bl + dec cx + je L$31 + rol ah,1 + adc si,0 + out dx,ax + add di,word ptr -6[bp] + jl L$30 + add si,word ptr -0cH[bp] + sub di,word ptr -8[bp] + jmp L$30 +L$31: + ret +L$32: + mov di,cx + neg di + shl ax,1 + mov word ptr -6[bp],ax + mov ax,cx + shl ax,1 + mov word ptr -8[bp],ax + mov bl,byte ptr 8[bp] + mov ah,byte ptr -12H[bp] + mov al,2 + mov dx,3c4H + inc cx +L$33: + mov byte ptr [si],bl + dec cx + je L$34 + add si,word ptr -0cH[bp] + add di,word ptr -6[bp] + jl L$33 + rol ah,1 + adc si,0 + out dx,ax + sub di,word ptr -8[bp] + jmp L$33 +L$34: + ret +L$35: + mov di,ax + neg di + shl cx,1 + mov word ptr -6[bp],cx + mov cx,ax + shl ax,1 + mov word ptr -8[bp],ax + mov al,2 + mov ah,byte ptr -12H[bp] + mov bl,byte ptr 8[bp] + mov dx,3c4H + inc cx +L$36: + mov bh,byte ptr [si] + mov byte ptr [si],bl + dec cx + je L$37 + rol ah,1 + adc si,0 + out dx,ax + add di,word ptr -6[bp] + jl L$36 + add si,word ptr -0cH[bp] + sub di,word ptr -8[bp] + jmp L$36 +L$37: + ret +L$38: + mov di,cx + neg di + shl ax,1 + mov word ptr -6[bp],ax + mov ax,cx + shl ax,1 + mov word ptr -8[bp],ax + mov bl,byte ptr 8[bp] + mov ah,byte ptr -12H[bp] + mov al,2 + mov dx,3c4H + inc cx +L$39: + mov bh,byte ptr [si] + mov byte ptr [si],bl + dec cx + je L$40 + add si,word ptr -0cH[bp] + add di,word ptr -6[bp] + jl L$39 + rol ah,1 + adc si,0 + out dx,ax + sub di,word ptr -8[bp] + jmp L$39 +L$40: + ret +MX_TEXT ENDS + END diff --git a/16/xw_/mxot.asm b/16/xw_/mxot.asm new file mode 100755 index 00000000..f7e6fde4 --- /dev/null +++ b/16/xw_/mxot.asm @@ -0,0 +1,1330 @@ + PUBLIC MXSETFONT + PUBLIC MXSETTEXTCOLOR + PUBLIC MXOUTCHAR + PUBLIC MXOUTTEXT + PUBLIC MXSETTEXTSTEP + PUBLIC MXGETTEXTSTEP + EXTRN MX_CODESEGMENT:BYTE + EXTRN MXPUTIMAGE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +; Default 8x8 font +fnt_Default LABEL BYTE + INCLUDE DEFAULT.FNT + +; Table of system fonts +tbl_SystemFont LABEL WORD + DW fnt_Default, 8, 8 + +MX_MAXSYSFONT EQU ($-OFFSET tbl_SystemFont) SHR 2 + +mx_FontPtr DW OFFSET fnt_Default, SEG MX_TEXT +mx_FontWidth DW 8 ; Font width in pixels +mx_FontHeight DW 8 ; Font height in pixels +mx_FontCharSize DW 8 ; Size in bytes of a font character +mx_FontColor DW 00FFh ; Color: foreground + background*256 +mx_FontOp DW 0 ; Raster op +mx_DeltaX DW 8 ; Horizontal step +mx_DeltaY DW 0 ; Vertical step + +L$1: + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + ; The label referred to here is an undefined location + ;;;;ffff + ;jle 0xff8bh + movsw + and word ptr -7e67H[di],7e7eH + call bx + call bx + out 0ffH,ax + jle L$9 +; ;???? +; ;???? +; ;???? + jl L$7 + adc byte ptr [bx+si],al + adc byte ptr [bx+si],bh +L$2: + jl L$2 + jl L$8 + adc byte ptr [bx+si],al + adc byte ptr [bx+si],bh + adc byte ptr -2[si],dl + push sp + adc dh,bh + adc byte ptr [bx+si],bh +L$3: + jl L$3 +L$4: + ;???? + jl L$5 + inc byte ptr [bx+si] + sbb byte ptr [si],bh + jle L$11 + cmp al,18H + add bh,bh + out 0c3H,ax + DB 81H, 81H, 0c3H, 0e7H +L$5: + inc word ptr [bx+si] + cmp al,66H + inc dx + inc dx + DB 66H, 3cH +L$6: + add bh,bh + ret + cwd + mov bp,99bdH +L$7: + ret + inc word ptr [bx] + add ax,word ptr [di] + ; The label referred to here is an undefined location + ;;;;;0ffff + ;;;;;js 0ffffffe1H + DB 84H +L$8: + test byte ptr 7cH[bx+si],bh + add byte ptr 7c82H[bp+si],10H + cmp byte ptr [bx+si],dl + sbb al,10H + sbb al,10H + adc byte ptr [bx+si],dl + xor byte ptr [bx+si],dh + and bh,byte ptr ds:[2222H] + ;;;;;pushad + cwd + pop dx + cmp al,0e7H + out 3cH,ax + pop dx + cwd + add byte ptr [bx+si],dl + xor byte ptr -10H[bx+si],dh +L$9: + jo L$10 + adc byte ptr [bx+si],al + add al,0e0H + ;;;;lock loopnz L$6 + adc byte ptr [bx+si],38H + push sp + adc byte ptr [bx+si],dl + push sp + cmp byte ptr [bx+si],dl + dec ax + dec ax + dec ax + dec ax + dec ax + add byte ptr [bx+si],cl + jle L$4 + xchg ax,dx + jb L$10 + adc dl,byte ptr [bp+si] + add byte ptr [si],bh + and bl,byte ptr [bx+si] + and al,24H + sbb byte ptr 3cH[si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + DB 0, 3eH + ;;;;DD ds:[03eh] +L$10: + add byte ptr [bx+si],bh + push sp + DB 10H +L$11: + adc byte ptr [bx+si],dl + push sp + cmp dh,bh + add byte ptr [bx+si],dl + cmp byte ptr 10H[si],dl + adc byte ptr [bx+si],dl + add byte ptr [bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr 38H[si],dl + adc byte ptr [bx+si],al + add byte ptr [bx+si],cl + add al,0feH + add al,8 + add byte ptr [bx+si],al + add byte ptr [bx+si],ah + inc ax + inc byte ptr 20H[bx+si] + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr -380H[bx+si],0 + add byte ptr [bx+si],al + and al,42H + inc word ptr 24H[bp+si] + add byte ptr [bx+si],al + add byte ptr [bx+si],al + adc byte ptr [bx+si],bh +L$12: + jl L$12 + add byte ptr [bx+si],al + add byte ptr [bx+si],al + ;???? + jl L$15 + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + add byte ptr [bx+si],dl + add byte ptr [bx+si],al + and al,24H + add byte ptr [bx+si],al + DB 0 +L$13: + add byte ptr [bx+si],al + and al,24H + ;;;;jle 140H + ;;;;jle 142H +L$14: + and al,0 + cmp byte ptr 50H[si],dl + cmp byte ptr [si],dl + push sp + cmp byte ptr [bx+si],dl + add byte ptr [bp+si],al + inc sp + or byte ptr [bx+si],dl + and byte ptr [bp+si],al + cmp byte ptr 38H[si],al + ;;;;pusha + xchg ax,sp +L$15: + DB 88H +L$16: + ;;;;je 138H + and byte ptr [bx+si],ah + inc ax + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],dl + and byte ptr 40H[bx+si],al + inc ax + and byte ptr [bx+si],dl + add byte ptr 20H[bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],ah +L$17: + inc ax + add byte ptr [bx+si],al + and al,18H + jle L$18 + and al,0 + add byte ptr [bx+si],al + adc byte ptr [bx+si],dl + jl L$18 + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + adc byte ptr [bx+si],dl + and byte ptr [bx+si],al + add byte ptr [bx+si],al + cld + DB 0 +L$18: + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],dl + add byte ptr [bx+si],al + add al,8 + adc byte ptr [bx+si],ah + inc ax +L$19: + add byte ptr [bx+si],7cH + ;???? + DB 8aH, 92H +L$20: + mov byte ptr tbl_SystemFont[bx+2],al + DD L$21 +L$21: + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],bh + add byte ptr L$13[bx+si],bh + add al,18H + ;;;;pusha + cmp ah,0 + js L$14 + add al,38H + add al,84H + js L$22 +L$22: + sbb al,24H + inc sp + test dh,bh + add al,0eH + add ah,bh + cmp al,4 + add al,84H + js L$23 +L$23: + js L$16 + cmp al,84H + test byte ptr [bx+si],bh + cld + add al,4 + or byte ptr [bx+si],dl + and byte ptr [bx+si],ah + add byte ptr -7cH[bx+si],bh + test byte ptr -7cH[bx+si],bh + test byte ptr [bx+si],bh + js L$17 + test byte ptr 4[si],bh + test byte ptr [bx+si],bh + add byte ptr [bx+si],al + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + adc byte ptr [bx+si],al + add byte ptr [bx+si],dl + adc byte ptr [bx+si],ah + or byte ptr [bx+si],dl + and byte ptr 20H[bx+si],al + adc byte ptr [bx+si],cl + add byte ptr [bx+si],al + add ah,bh + add byte ptr [bx+si],al + cld + add byte ptr [bx+si],al + inc ax + and byte ptr [bx+si],dl + or byte ptr [bx+si],dl + and byte ptr [bx+si],al + js L$19 + add al,8 + adc byte ptr [bx+si],al +L$24: + adc byte ptr [bx+si],al + jl L$20 + mov dx,0bea6H + cmp byte ptr [si],78H + test byte ptr -7b04H[si],al + test byte ptr -800H[si],al + test byte ptr -7b08H[si],al + test al,bh + add byte ptr -7cH[bx+si],bh + add byte ptr -7b80H[bx+si],78H + add al,dh + mov byte ptr -7b7cH[si],al + mov al,dh + add ah,bh + add byte ptr -7f10H[bx+si],80H + cld + add ah,bh + add byte ptr -7f10H[bx+si],80H + add byte ptr [bx+si],78H + test byte ptr -7b64H[bx+si],al + test byte ptr [bx+si],bh + test byte ptr -37cH[si],al + test byte ptr 84H[si],al + cmp byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + cmp byte ptr [bx+si],al + sbb al,8 + or byte ptr [bx+si],cl + mov byte ptr 70H[bx+si],cl + test byte ptr -1f70H[bx+si],cl + nop + mov byte ptr -8000H[si],al + add byte ptr -7f80H[bx+si],80H + cld + add dh,al + stosb + xchg ax,dx + add byte ptr -7d7eH[bp+si],0 + add dl,0a2H + xchg ax,dx + mov al,byte ptr 82H[bp] + js L$24 + test byte ptr -7b7cH[si],al + js L$25 +L$25: + clc + test byte ptr -7f08H[si],al + add byte ptr 7800H[bx+si],84H + test byte ptr -776cH[si],al + jbe L$26 +L$26: + clc + test byte ptr -6f08H[si],al + mov byte ptr 7800H[si],al + test byte ptr 478H[bx+si],al + test byte ptr [bx+si],bh + ;???? + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + add byte ptr -7b7cH[si],al + test byte ptr 7884H[si],al + add byte ptr -7b7cH[si],al + test byte ptr 3048H[si],al + add byte ptr -7d7eH[bp+si],al + adc byte ptr -3956H[bp+si],0 + add byte ptr 28H[si],10H + sub byte ptr -7eH[si],al + add byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + add dh,bh + add al,8 + adc byte ptr [bx+si],ah + inc ax + inc byte ptr [bx+si] + js L$32 + inc ax + inc ax + inc ax + inc ax + js L$27 +L$27: + add byte ptr 2040H[bx+si],al + adc byte ptr [bx+si],cl + add al,0 + js L$29 + or byte ptr [bx+si],cl + or byte ptr [bx+si],cl + js L$28 +L$28: + adc byte ptr [bx+si],ch +L$29: + inc sp + add byte ptr [bx+si],0 + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add bh,bh + and byte ptr [bx+si],ah + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + cmp byte ptr [si],al + cmp al,44H + jl L$30 +L$30: + add byte ptr 40H[bx+si],al + js L$33 + inc sp + js L$31 +L$31: + add byte ptr [bx+si],al +L$32: + cmp al,40H + inc ax + inc ax + cmp al,0 + add byte ptr [si],al + add al,3cH + inc sp + inc sp + cmp al,0 + add byte ptr [bx+si],al + cmp byte ptr 7cH[si],al + inc ax + cmp al,0 + add byte ptr [si],cl + adc byte ptr [si],bh + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + cmp al,44H + inc sp + cmp al,4 + cmp byte ptr [bx+si],al + inc ax + inc ax + js L$35 + inc sp + inc sp + add byte ptr [bx+si],al + adc byte ptr [bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + add byte ptr [bx+si],al + add al,0 + add al,4 + add al,44H + cmp byte ptr [bx+si],al +L$33: + inc ax + inc ax + push ax + ;;;;pusha + push ax + dec ax + add byte ptr [bx+si],al + xor byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + add byte ptr [bx+si],al + add byte ptr 54H[bx+si],ch + push sp + inc sp + inc sp + add byte ptr [bx+si],al + add byte ptr 44H[bx+si],bh + inc sp + inc sp + inc sp + add byte ptr [bx+si],al + add byte ptr [bx+si],bh + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + add byte ptr [bx+si],al +L$34: + js L$42 + inc sp + js L$41 + inc ax + DB 0 +L$35: + add byte ptr [si],bh + inc sp + inc sp + cmp al,4 + add al,0 + add byte ptr 60H[si],bl + inc ax + inc ax + inc ax + add byte ptr [bx+si],al + add byte ptr [bx+si],bh +L$36: + inc ax + jl L$38 + jl L$37 +L$37: + add byte ptr [bx+si],dl +L$38: + cmp byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + sbb byte ptr [bx+si],al + add byte ptr [bx+si],al + inc sp + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + add byte ptr [bx+si],al + inc sp + inc sp + inc sp + sub byte ptr [bx+si],dl + add byte ptr [bx+si],al + add byte ptr 44H[si],al +L$39: + push sp + push sp + ;;;;insb + add byte ptr [bx+si],al + add byte ptr 28H[si],al +L$40: + adc byte ptr [bx+si],ch + inc sp +L$41: + DB 0 +L$42: + add byte ptr [bx+si],al + inc sp + inc sp + inc sp + cmp al,4 + jl L$43 +L$43: + add byte ptr 4[si],bh + cmp byte ptr 7cH[bx+si],al + add byte ptr [bx+si],al + or byte ptr [bx+si],dl + adc byte ptr [bx+si],dh + adc byte ptr [bx+si],dl + or byte ptr [bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + and byte ptr [bx+si],dl + adc byte ptr [bx+si],bl + adc byte ptr [bx+si],dl + and byte ptr -68H[si],ah + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],dl + sub byte ptr -7eH[si],al + cmp dh,0 + jl L$34 + add byte ptr 7c80H[bx+si],4 + jl L$44 +L$44: + sub byte ptr [bx+si],al + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + cmp al,0 + jl L$54 + jl L$53 + jl L$45 +L$45: + jle L$36 + cmp byte ptr [si],al + cmp al,44H + jl L$46 +L$46: + and al,0 +L$47: + cmp byte ptr [si],al + cmp al,44H + jl L$48 +L$48: + js L$49 +L$49: + cmp byte ptr [si],al + cmp al,44H + jl L$50 +L$50: + sbb byte ptr [bx+si],bl + cmp byte ptr [si],al + cmp al,44H + jl L$51 +L$51: + add byte ptr [bx+si],al + js L$39 + cmp byte ptr 8[bx+si],38H + jl L$40 + cmp byte ptr 7cH[si],al + inc ax + cmp al,0 + dec ax + add byte ptr [bx+si],bh + inc sp + jl L$55 + cmp al,0 + js L$52 +L$52: + cmp byte ptr 7cH[si],al + inc ax +L$53: + cmp al,0 +L$54: + add byte ptr [bx+si],ch + add byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + adc byte ptr [bx+si],ch + add byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + add byte ptr [bx+si],dh + add byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + dec ax + add byte ptr -7cH[bx+si],bh + cld + test byte ptr 3000H[si],al + xor byte ptr -7cH[bx+si],bh + cld + test byte ptr 3800H[si],al + add ah,bh + xor al,80H + cld + add byte ptr [bx+si],al + add byte ptr 8[bp],bh + jle L$59 +L$55: + jle L$56 +L$56: + jle L$47 + nop + cld + nop + nop + sahf + add byte ptr -7eH[si],bh + cmp byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],al + sub byte ptr [bx+si],al + cmp byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],al + jo L$57 +L$57: + cmp byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],al + cmp byte ptr [si],al + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + jo L$58 +L$58: + inc sp + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + sub byte ptr [bx+si],al + inc sp + inc sp + inc sp + cmp al,4 + jl L$64 + add byte ptr -7cH[bx+si],bh + test byte ptr 78H[si],al + dec ax + add byte ptr -7b7cH[si],al + DB 84H +L$59: + ;;;;js 4d8H + add byte ptr [bx+si],dl + cmp byte ptr 40H[bx+si],al + inc ax + cmp byte ptr [bx+si],dl + cmp byte ptr 40H[si],al + loopnz L$66 + inc ax + cmp ah,44H + jl L$60 + jl L$61 + jl L$62 + add al,dh + mov byte ptr -7d09H[bp+si],cl + add byte ptr 0c00H[bp+si],12H + DB 10H +L$60: + sbb byte ptr [bx+si],dh +L$61: + DB 10H, 90H +L$62: + ;;;;pusha + cmp al,0 + cmp byte ptr [si],al + cmp al,44H + jl L$63 +L$63: + add byte ptr [bx+si],bl + add byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + DB 1cH +L$64: + add byte ptr [bx+si],bh + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + sbb al,0 + inc sp + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + jl L$65 +L$65: + js L$67 + inc sp +L$66: + inc sp + inc sp + add byte ptr [si],bh + inc sp + push sp + dec sp + inc sp + add byte ptr [bx+si],bl + and al,24H + push ds + add byte ptr ds:[0],bh + sbb al,22H + and bl,byte ptr [si] + add byte ptr ds:[0],bh + adc byte ptr [bx+si],al + adc byte ptr [bx+si],ah + inc ax + inc dx + cmp al,0 + add byte ptr [bx+si],al + add ah,bh + add byte ptr [bx+si],0 + add byte ptr [bx+si],al + cld + add al,4 + add byte ptr [bx+si],al + inc ax + inc sp + dec ax + push di + and word ptr 4[bx],ax + pop es + inc ax + inc sp + dec ax + push dx + dec dx + pop ds + DB 2 +L$67: + adc byte ptr [bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl +L$68: + adc byte ptr [bx+si],al + add byte ptr [si],ah +L$69: + dec ax + nop + dec ax + and al,0 + add byte ptr [bx+si],al + dec ax + and al,12H + and al,48H + add byte ptr [bx+si],al + and cl,byte ptr -77deH[bx+si] + and cl,byte ptr -77deH[bx+si] + push bp + stosb + push bp + stosb + push bp + stosb + push bp + stosb + ;???? + ja L$68 + out dx,al + ;???? + ja L$69 + out dx,al + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + clc + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb al,bh + sbb al,bh + sbb byte ptr [bx+si],bl + sbb byte ptr ds:[3636H],dh + div byte ptr ss:[3636H] + add byte ptr [bx+si],al + add byte ptr [bx+si],al + ;???? + add byte ptr ss:[bx+si],al + clc + sbb al,bh + sbb byte ptr [bx+si],bl + sbb byte ptr ds:[0f636H],dh + push es + div byte ptr ds:[3636H] + add byte ptr ss:[bx+si],al + inc byte ptr ds:[36f6H] + test byte ptr ss:[0feH],0 + add byte ptr ds:[3636H],dh + inc byte ptr ss:[bx+si] + add byte ptr [bx+si],al + sbb byte ptr [bx+si],bl + clc + sbb al,bh + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add al,bh + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx],bl + add byte ptr [bx+si],al + add byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb bh,bh + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add bh,bh + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],al + add byte ptr [bx+si],al + add bh,bh + add byte ptr [bx+si],al + add byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb bh,bh + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx],bl + sbb byte ptr [bx],bl + sbb byte ptr [bx+si],bl + sbb byte ptr ds:[3636H],dh + aaa + aaa + xor byte ptr [bx],bh + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx],bh + xor byte ptr [bx],dh + test word ptr ss:[bx+si],0ffH + add byte ptr [bx+si],al + add byte ptr [bx+si],al + inc word ptr [bx+si] + div word ptr ds:[3636H] + aaa + xor byte ptr [bx],dh + add byte ptr ss:[bx+si],al + inc word ptr [bx+si] + inc word ptr [bx+si] + add byte ptr [bx+si],al + test word ptr ss:[bx+si],36f7H + sbb byte ptr ss:[bx+si],bl + inc word ptr [bx+si] + inc word ptr [bx+si] + add byte ptr [bx+si],al + inc word ptr ss:[bx+si] + add byte ptr [bx+si],al + add byte ptr [bx+si],al + inc word ptr [bx+si] + call dword ptr [bx+si] + sbb byte ptr [bx+si],bl + add byte ptr [bx+si],al + add byte ptr [bx+si],al + push word ptr ds:[3636H] + aas + add byte ptr [bx+si],al + add byte ptr [bx+si],bl + sbb byte ptr [bx],bl + sbb byte ptr [bx],bl + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx],bl + sbb byte ptr [bx],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx],bh + push word ptr ss:[3636H] + sbb byte ptr [bx+si],bl + call dword ptr [bx+si] + call dword ptr [bx+si] + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + clc + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx],bl + DB 18H +L$70: + sbb byte ptr [bx+si],bl + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + inc word ptr [bx+si] + add byte ptr [bx+si],al + add bh,bh + ;???? + ;???? + push ax + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + ;???? + inc word ptr [bx+si] + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr -6cH[bp+si],ah + mov byte ptr 62H[si],dl + add al,dh + mov al,dh + mov byte ptr -7f10H[bx+si],cl + add al,bh + mov byte ptr -7f80H[bx+si],al + add byte ptr [bx+si],0 + cld + dec ax + dec ax + dec ax + dec ax + dec ax + add ah,bh + test byte ptr 20H[bx+si],al + inc ax + test ah,bh + add byte ptr [si],bh + inc ax + cmp byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],al + add byte ptr [bx+si],al + inc sp + inc sp + inc sp + js L$71 + inc ax + add byte ptr ds:[848H],dh + or byte ptr [bx+si],cl + or byte ptr [bx+si],al + cmp byte ptr [bx+si],dl + cmp byte ptr 44H[si],al + cmp byte ptr [bx+si],dl + cmp byte ptr -7cH[bx+si],bh + test ah,bh + test byte ptr 78H[si],al + js L$70 + test byte ptr 4848H[si],al + int 3 + add byte ptr 4[bx+si],bh + cmp byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],al + add byte ptr [bx+si],al + ;;;;insb + xchg ax,dx + xchg ax,dx + ;;;;insb + add byte ptr [bx+si],al + add byte ptr [bx+si],al + cmp al,byte ptr 5aH[si] + and bl,byte ptr [si] + sbb byte ptr [bx+si],ah + inc ax + js L$73 + and byte ptr [bx+si],bl +L$71: + add byte ptr -7cH[bx+si],bh + test byte ptr -7b7cH[si],al + test byte ptr [bx+si],al + add ah,bh + add ah,bh + add ah,bh + add byte ptr [bx+si],al + and byte ptr [bx+si],ah + clc + and byte ptr [bx+si],ah + add al,bh + add byte ptr [bx+si],ah + adc byte ptr [bx+si],cl + adc byte ptr [bx+si],ah + add byte ptr [si],bh + or byte ptr [bx+si],dl + and byte ptr [bx+si],dl + or byte ptr [bx+si],al + jl L$72 +L$72: + or al,12H + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + nop + ;;;;pusha + add byte ptr [bx+si],dl + add byte ptr [si],bh +L$73: + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + xor cl,byte ptr [si] + xor cl,byte ptr [si] + add byte ptr [bx+si],bh + inc sp + inc sp + cmp byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + sbb byte ptr [bx+si],bl + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],bl + add byte ptr [bx+si],al + add byte ptr ds:[808H],cl + or byte ptr 28H[bx+si],cl + sbb byte ptr [bx+si],cl + cmp byte ptr [si],ah + and al,24H + and al,0 + add byte ptr [bx+si],al + cmp al,4 + cmp al,20H + cmp al,0 + add byte ptr [bx+si],al + add byte ptr [bx+si],al + cmp al,3cH + cmp al,3cH + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al +L$74: + DW offset L$1 +L$75: + DB 8 +L$76: + add byte ptr [bx+si],cl + DB 0 +L$77: + DW offset L$1 +L$78: + DW seg L$1 +L$79: + or byte ptr [bx+si],al +L$80: + or byte ptr [bx+si],al +L$81: + or byte ptr [bx+si],al +L$82: + inc word ptr [bx+si] +L$83: + add byte ptr [bx+si],al +L$84: + or byte ptr [bx+si],al +L$85: + add byte ptr [bx+si],al +MXSETFONT: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr 0cH[bp] + test ax,ax + jne L$87 + mov ax,word ptr 0aH[bp] + cmp ax,1 + jb L$86 + xor ax,ax +L$86: + shl ax,1 + shl ax,1 + mov bx,ax + mov ax,word ptr L$74[bx] + mov word ptr L$77,ax + mov word ptr L$78,cs + mov al,byte ptr L$75[bx] + xor ah,ah + mov word ptr L$79,ax + mov word ptr L$84,ax + mov dl,byte ptr L$76[bx] + xor dh,dh + mov word ptr L$80,dx + mul dx + mov word ptr L$81,ax + mov word ptr L$84,ax + xor ax,ax + mov word ptr L$85,ax + jmp L$88 +L$87: + mov ax,0ffffH + mov bx,word ptr 8[bp] + cmp bx,10H + ja L$88 + mov dx,word ptr 6[bp] + cmp dx,20H + ja L$88 + mov word ptr L$79,bx + mov word ptr L$80,dx + mov ax,bx + add ax,7 + shr ax,1 + shr ax,1 + shr ax,1 + mul dx + mov word ptr L$81,ax + mov ax,word ptr 0aH[bp] + mov word ptr L$77,ax + mov ax,word ptr 0cH[bp] + mov word ptr L$78,ax + xor ax,ax +L$88: + pop ds + mov sp,bp + pop bp + retf 8 +MXSETTEXTCOLOR: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr 8[bp] + mov word ptr L$82,ax + mov ax,word ptr 6[bp] + mov word ptr L$83,ax + xor ax,ax + pop ds + mov sp,bp + pop bp + retf 4 +MXOUTCHAR: + push bp + mov bp,sp + sub sp,202H + push ds + push si + push es + push di + lds si,dword ptr cs:L$77 + mov al,byte ptr 6[bp] + xor ah,ah + mul word ptr cs:L$81 + add si,ax + mov ax,ss + mov es,ax + lea di,-200H[bp] + mov dx,word ptr cs:L$82 + mov ax,word ptr cs:L$80 + mov word ptr -202H[bp],ax +L$89: + mov cx,word ptr cs:L$79 + mov bh,byte ptr [si] + inc si + cmp cx,8 + jbe L$90 + mov bl,byte ptr [si] + inc si +L$90: + mov al,dl + shl bx,1 + jb L$91 + mov al,dh +L$91: + mov byte ptr es:[di],al + inc di + dec cx + jne L$90 + dec word ptr -202H[bp] + jne L$89 + lea ax,-200H[bp] + push es + push ax + push word ptr 0aH[bp] + push word ptr 8[bp] + push word ptr cs:L$79 + push word ptr cs:L$80 + push word ptr cs:L$83 + push cs + call near ptr MX_TEXT:MXPUTIMAGE + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 6 +MXOUTTEXT: + push bp + mov bp,sp + sub sp,0 + push ds + push si + lds si,dword ptr 6[bp] +L$92: + mov al,byte ptr [si] + test al,al + je L$93 + inc si + push word ptr 0cH[bp] + push word ptr 0aH[bp] + push ax + push cs + call near ptr MXOUTCHAR + mov ax,word ptr cs:L$84 + add word ptr 0cH[bp],ax + mov ax,word ptr cs:L$85 + add word ptr 0aH[bp],ax + dec word ptr -202H[bp] + jne L$92 +L$93: + xor ax,ax + pop si + pop ds + mov sp,bp + pop bp + retf 8 + retf +MXSETTEXTSTEP: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr 8[bp] + mov word ptr L$84,ax + mov ax,word ptr 6[bp] + mov word ptr L$85,ax + pop ds + mov sp,bp + pop bp + retf 4 +MXGETTEXTSTEP: + push bp + mov bp,sp + sub sp,0 + push ds + push si + mov ax,word ptr cs:L$84 + lds si,dword ptr 0aH[bp] + mov word ptr [si],ax + mov ax,word ptr cs:L$85 + lds si,dword ptr 6[bp] + mov word ptr [si],ax + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw_/mxot_.asm b/16/xw_/mxot_.asm new file mode 100755 index 00000000..e431b138 --- /dev/null +++ b/16/xw_/mxot_.asm @@ -0,0 +1,333 @@ +;----------------------------------------------------------- +; +; MXOT.ASM - Text functions +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +;WARN PRO +;NOWARN RES ; We use the reserved name 'WIDTH' +INCLUDE MODEX.DEF + +PUBLIC mxOutChar +PUBLIC mxOutText +PUBLIC mxSetFont +PUBLIC mxSetTextColor +PUBLIC mxGetTextStep +PUBLIC mxSetTextStep + +MAX_WIDTH EQU 16 ; Must be <= 16 +MAX_HEIGHT EQU 32 + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_CodeSegment : WORD +EXTRN mxPutImage : FAR + +; Default 8x8 font +fnt_Default LABEL BYTE + INCLUDE DEFAULT.FNT + +; Table of system fonts +tbl_SystemFont LABEL WORD + DW fnt_Default, 8, 8 + +MX_MAXSYSFONT EQU ($-OFFSET tbl_SystemFont) SHR 2 + +mx_FontPtr DW OFFSET fnt_Default, SEG MX_TEXT +mx_FontWidth DW 8 ; Font width in pixels +mx_FontHeight DW 8 ; Font height in pixels +mx_FontCharSize DW 8 ; Size in bytes of a font character +mx_FontColor DW 00FFh ; Color: foreground + background*256 +mx_FontOp DW OP_MOVE ; Raster op +mx_DeltaX DW 8 ; Horizontal step +mx_DeltaY DW 0 ; Vertical step + +;----------------------------------------------------------- +; +; Sets the current font. +; +; Input: +; Font = pointer to font data +; Width = width of font character in pixels +; Height = height of font character in pixels +; Output: +; AX = 0 on success, else invalid parameters +; +; Note: when the high word of Font (i.e. the segment) is zero, the low +; word is used to select one of the system fonts. +; +mxSetFont PROC FAR + push bp + mov bp,sp + sub sp,0 + push ds + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, WORD PTR Font[2] ; Get font segment + test ax, ax ; Null segment? + jnz @@UserFont ; No, install user font + +; Install system font + mov ax, WORD PTR Font[0] ; Get font number + cmp ax, MX_MAXSYSFONT ; Check range + jb @@SystemFont + xor ax, ax ; Out of range, use default font +@@SystemFont: + shl ax, 1 + shl ax, 1 + mov bx, ax + mov ax, tbl_SystemFont[bx] ; Get font offset + mov WORD PTR mx_FontPtr[0], ax + mov WORD PTR mx_FontPtr[2], cs + mov al, BYTE PTR tbl_SystemFont[bx+2] + xor ah, ah + mov [mx_FontWidth], ax + mov [mx_DeltaX], ax + mov dl, BYTE PTR tbl_SystemFont[bx+3] + xor dh, dh + mov [mx_FontHeight], dx + mul dx + mov [mx_FontCharSize], ax + mov [mx_DeltaX], ax + xor ax, ax + mov [mx_DeltaY], ax + jmp @@Exit + +; Install user font +@@UserFont: + mov ax, -1 ; Assume an error + mov bx, [bp+8] + cmp bx, MAX_WIDTH + ja @@Exit ; Invalid character width + mov dx, [bp+4] + cmp dx, MAX_HEIGHT + ja @@Exit ; Invalid character height + mov [mx_FontWidth], bx + mov [mx_FontHeight], dx + mov ax, bx + add ax, 7 + shr ax, 1 + shr ax, 1 + shr ax, 1 + mul dx + mov [mx_FontCharSize], ax + mov ax, WORD PTR Font[0] + mov WORD PTR mx_FontPtr[0], ax + mov ax, WORD PTR Font[2] + mov WORD PTR mx_FontPtr[2], ax + xor ax, ax + +@@Exit: + .pop ds + ASSUME ds:NOTHING + ;.leave ARG_SIZE +mxSetFont ENDP + +;----------------------------------------------------------- +; +; Sets the text color and raster op. +; +; Input: +; Color = text color (foreground + background*256) +; Op = raster op +; Output: +; none +; +mxSetTextColor PROC FAR + ARG Op:WORD, \ + Color:WORD = ARG_SIZE + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [Color] + mov [mx_FontColor], ax + mov ax, [Op] + mov [mx_FontOp], ax + + xor ax, ax + .pop ds + ASSUME ds:NOTHING + .leave ARG_SIZE +mxSetTextColor ENDP + +;----------------------------------------------------------- +; +; Writes a character using the current font and attributes. +; +; Input: +; X, Y = video coordinates +; C = character to print +; Output: +; none +; +mxOutChar PROC FAR + ARG C:BYTE:2, \ + Y:WORD, \ + X:WORD = ARG_SIZE + LOCAL Image:BYTE:MAX_WIDTH*MAX_HEIGHT, \ + Count:WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + ASSUME ds:NOTHING + +; Gets the pointer to font data for the selected character + lds si, DWORD PTR [mx_FontPtr] + mov al, [C] + xor ah, ah + mul [mx_FontCharSize] ; Offset into font + add si, ax ; DS:SI -> font data for character + +; Converts font data into a 256-color linear image + mov ax, ss + mov es, ax + lea di, [Image] + mov dx, [mx_FontColor] + mov ax, [mx_FontHeight] + mov [Count], ax +@@HeightLoop: + mov cx, [mx_FontWidth] + mov bh, ds:[si] + inc si ; Get a byte from font data + cmp cx, 8 + jbe @@WidthLoop ; Ok for width <= 8 + mov bl, ds:[si] ; Get another byte + inc si +@@WidthLoop: + mov al, dl ; Assume foreground color + shl bx, 1 ; Is font bit set? + jc @@1 ; Yes, foreground is just great + mov al, dh ; Get background color +@@1: + mov es:[di], al ; Put pixel into image + inc di + dec cx + jnz @@WidthLoop + dec [Count] + jnz @@HeightLoop + +; Now pass image to mx_PutImage + lea ax, [Image] + push es + push ax ; Pointer to image + push [X] + push [Y] ; Image coordinates + push [mx_FontWidth] + push [mx_FontHeight] ; Image size + push [mx_FontOp] ; Raster op + call mxPutImage ; Write character + + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxOutChar ENDP + +;----------------------------------------------------------- +; +; Writes a string at the coordinates specified. +; +; Input: +; X, Y = text coordinates +; S = pointer to ASCIIZ string +; Output: +; none +; +mxOutText PROC FAR + ARG S:DWORD, \ + Y:WORD, \ + X:WORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + lds si, [S] +@@Loop: + mov al, ds:[si] + test al, al ; End of string? + jz @@Exit ; Yes, exit + inc si + push [X] ; Display character + push [Y] + push ax + call mxOutChar + mov ax, [mx_DeltaX] + add [X], ax ; Bump X coordinate + mov ax, [mx_DeltaY] + add [Y], ax ; Bump Y coordinate + dec [Count] + jnz @@Loop + +@@Exit: + xor ax, ax + .pop ds, si + .leave ARG_SIZE + ret +mxOutText ENDP + +;----------------------------------------------------------- +; +; Sets the distance between characters. +; +; Input: +; DeltaX = horizontal distance in pixels +; DeltaY = vertical distance in pixels +; Output: +; none +; +; Note: this function may be used to set the text direction. +; +mxSetTextStep PROC FAR + ARG DeltaY:WORD, \ + DeltaX:WORD = ARG_SIZE + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [DeltaX] + mov [mx_DeltaX], ax + mov ax, [DeltaY] + mov [mx_DeltaY], ax + + .pop ds + .leave ARG_SIZE +mxSetTextStep ENDP + +;----------------------------------------------------------- +; +; Gets the current distance between characters. +; +; Input: +; DeltaX = pointer to horizontal distance in pixels (integer) +; DeltaY = pointer to vertical distance in pixels (integer) +; Output: +; none +; +mxGetTextStep PROC FAR + ARG DeltaY:DWORD, \ + DeltaX:DWORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + mov ax, [mx_DeltaX] + lds si, [DeltaX] + mov ds:[si], ax + mov ax, [mx_DeltaY] + lds si, [DeltaY] + mov ds:[si], ax + + .pop ds, si + .leave ARG_SIZE +mxGetTextStep ENDP + +MX_TEXT ENDS +END diff --git a/16/xw_/mxpb.asm b/16/xw_/mxpb.asm new file mode 100755 index 00000000..b8536fd6 --- /dev/null +++ b/16/xw_/mxpb.asm @@ -0,0 +1,4102 @@ + PUBLIC MX_SCANBUFFER +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MX_SCANBUFFER: + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al +MX_TEXT ENDS + END diff --git a/16/xw_/mxpf.asm b/16/xw_/mxpf.asm new file mode 100755 index 00000000..f33158b8 --- /dev/null +++ b/16/xw_/mxpf.asm @@ -0,0 +1,327 @@ + PUBLIC MXFILLPOLY + EXTRN MX_CLIPX1:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE + EXTRN MX_CODESEGMENT:BYTE + EXTRN MX_SCANBUFFER:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + mov cx,word ptr [si] + sub cx,word ptr [bx] + jg L$2 + ret +L$2: + push bp + mov ax,word ptr 2[si] + mov bx,word ptr 2[bx] + sub ax,bx + jg L$4 + jl L$6 + mov ax,bx +L$3: + mov word ptr es:[di],ax + add di,4 + dec cx + jne L$3 + jmp L$8 +L$4: + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$5: + mov word ptr es:[di],ax + add di,4 + add dx,bx + adc ax,bp + dec cx + jne L$5 + jmp L$8 +L$6: + neg ax + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$7: + mov word ptr es:[di],ax + add di,4 + sub dx,bx + sbb ax,bp + dec cx + jne L$7 +L$8: + pop bp + ret +MXFILLPOLY: + push bp + mov bp,sp + sub sp,1eH + push ds + push si + push es + push di + mov cx,word ptr 10H[bp] + cmp cx,3 + jae L$9 + jmp near ptr L$36 +L$9: + les di,dword ptr 0cH[bp] + lds si,dword ptr 8[bp] + mov word ptr -16H[bp],7fffH + mov word ptr -1aH[bp],8000H + mov word ptr -18H[bp],7fffH + mov word ptr -1eH[bp],8000H + xor dx,dx +L$10: + mov bx,word ptr es:[di] + shl bx,1 + shl bx,1 + add bx,si + mov ax,word ptr [bx] + cmp ax,word ptr -16H[bp] + jge L$11 + mov word ptr -16H[bp],ax + mov word ptr -0eH[bp],dx + mov word ptr -10H[bp],dx +L$11: + cmp ax,word ptr -1aH[bp] + jle L$12 + mov word ptr -1aH[bp],ax + mov word ptr -12H[bp],dx +L$12: + mov ax,word ptr 2[bx] + cmp ax,word ptr -18H[bp] + jge L$13 + mov word ptr -18H[bp],ax +L$13: + cmp ax,word ptr -1eH[bp] + jle L$14 + mov word ptr -1eH[bp],ax +L$14: + inc di + inc dx + inc di + inc dx + dec cx + jne L$10 + mov ax,word ptr -1aH[bp] + cmp ax,word ptr cs:MX_CLIPX1 + jge L$15 + jmp near ptr L$36 +L$15: + mov bx,word ptr -16H[bp] + cmp bx,word ptr cs:MX_CLIPX2 + jle L$16 + jmp near ptr L$36 +L$16: + sub ax,bx + jg L$17 + jmp near ptr L$36 +L$17: + mov ax,word ptr -1eH[bp] + cmp ax,word ptr cs:MX_CLIPY1 + jge L$18 + jmp near ptr L$36 +L$18: + mov bx,word ptr -18H[bp] + cmp bx,word ptr cs:MX_CLIPY2 + jle L$19 + jmp near ptr L$36 +L$19: + sub ax,bx + jg L$20 + jmp near ptr L$36 +L$20: + dec word ptr 10H[bp] + shl word ptr 10H[bp],1 + mov es,word ptr cs:MX_CODESEGMENT + mov ax,offset MX_TEXT:MX_SCANBUFFER + mov word ptr -4[bp],ax + mov si,word ptr -0eH[bp] +L$21: + lds bx,dword ptr 0cH[bp] + mov di,word ptr [bx+si] + dec si + dec si + test si,si + jge L$22 + mov si,word ptr 10H[bp] +L$22: + mov word ptr -0eH[bp],si + mov si,word ptr [bx+si] + shl di,1 + shl di,1 + shl si,1 + shl si,1 + lds bx,dword ptr 8[bp] + add si,bx + add bx,di + mov di,word ptr -4[bp] + call near ptr L$1 + mov word ptr -4[bp],di + mov si,word ptr -0eH[bp] + cmp si,word ptr -12H[bp] + jne L$21 + mov ax,offset MX_TEXT:MX_SCANBUFFER+2 + mov word ptr -6[bp],ax + mov si,word ptr -10H[bp] +L$23: + lds bx,dword ptr 0cH[bp] + mov di,word ptr [bx+si] + inc si + inc si + cmp si,word ptr 10H[bp] + jbe L$24 + xor si,si +L$24: + mov word ptr -10H[bp],si + mov si,word ptr [bx+si] + shl di,1 + shl di,1 + shl si,1 + shl si,1 + lds bx,dword ptr 8[bp] + add si,bx + add bx,di + mov di,word ptr -6[bp] + call near ptr L$1 + mov word ptr -6[bp],di + mov si,word ptr -10H[bp] + cmp si,word ptr -12H[bp] + jne L$23 + mov si,offset MX_TEXT:MX_SCANBUFFER + mov ax,word ptr -16H[bp] + mov cx,word ptr -1aH[bp] + sub cx,ax + mov bx,word ptr cs:MX_CLIPX1 + sub bx,ax + jle L$25 + sub cx,bx + add ax,bx + mov word ptr -16H[bp],ax + shl bx,1 + shl bx,1 + add si,bx +L$25: + mov bx,ax + add bx,cx + sub bx,word ptr cs:MX_CLIPX2 + jle L$26 + sub cx,bx +L$26: + test cx,cx + jg L$27 + jmp near ptr L$36 +L$27: + mov word ptr -8[bp],cx + mov word ptr -4[bp],si + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr -18H[bp] + cmp ax,word ptr cs:MX_CLIPY1 + jl L$28 + mov ax,word ptr -1eH[bp] + cmp ax,word ptr cs:MX_CLIPY2 + jg L$28 + jmp L$32 +L$28: + mov di,cx + inc di + sub si,4 +L$29: + dec di + je L$32 + add si,4 + mov ax,word ptr [si] + mov cx,word ptr 2[si] + mov dx,word ptr cs:MX_CLIPY2 + cmp ax,dx + jg L$31 + cmp cx,dx + jle L$30 + mov word ptr 2[si],dx + mov bx,cx + sub bx,dx + sub cx,ax + jle L$31 + mov cx,word ptr 2[si] +L$30: + mov dx,word ptr cs:MX_CLIPY1 + cmp cx,dx + jl L$31 + sub cx,ax + jle L$31 + cmp ax,dx + jge L$29 + mov word ptr [si],dx + sub dx,ax + cmp cx,dx + ja L$29 +L$31: + mov word ptr [si],0ffffH + jmp L$29 +L$32: + mov es,word ptr cs:MX_VIDEOSEGMENT + mov si,word ptr -4[bp] + mov cl,byte ptr -16H[bp] + and cl,3 + mov al,11H + shl al,cl + mov byte ptr -2[bp],al + shr word ptr -16H[bp],1 + shr word ptr -16H[bp],1 +L$33: + mov ax,word ptr [si] + test ax,ax + js L$35 + mov cx,word ptr 2[si] + sub cx,ax + jle L$35 + mul word ptr cs:MX_BYTESPERLINE + add ax,word ptr -16H[bp] + mov di,ax + mov ah,byte ptr -2[bp] + mov dx,3c4H + mov al,2 + out dx,ax + mov ax,word ptr 6[bp] + mov dx,word ptr cs:MX_BYTESPERLINE + shr cx,1 + jae L$34 + mov byte ptr es:[di],al + add di,dx + jcxz L$35 +L$34: + mov byte ptr es:[di],al + add di,dx + mov byte ptr es:[di],al + add di,dx + dec cx + jne L$34 +L$35: + rol byte ptr -2[bp],1 + adc word ptr -16H[bp],0 + add si,4 + dec word ptr -8[bp] + jne L$33 +L$36: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +MX_TEXT ENDS + END diff --git a/16/xw_/mxpg.asm b/16/xw_/mxpg.asm new file mode 100755 index 00000000..d252576f --- /dev/null +++ b/16/xw_/mxpg.asm @@ -0,0 +1,457 @@ + PUBLIC MXGOURAUDPOLY + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_CLIPX1:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE + EXTRN MX_CODESEGMENT:BYTE + EXTRN MX_SCANBUFFER:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + mov cx,word ptr [si] + sub cx,word ptr [bx] + jg L$2 + ret +L$2: + push bp + push di + push cx + push ax + push dx + mov ax,word ptr 2[si] + mov bx,word ptr 2[bx] + sub ax,bx + jg L$4 + jl L$6 + mov ax,bx +L$3: + mov word ptr es:[di],ax + add di,8 + dec cx + jne L$3 + jmp L$8 +L$4: + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$5: + mov word ptr es:[di],ax + add di,8 + add dx,bx + adc ax,bp + dec cx + jne L$5 + jmp L$8 +L$6: + neg ax + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$7: + mov word ptr es:[di],ax + add di,8 + sub dx,bx + sbb ax,bp + dec cx + jne L$7 +L$8: + pop bx + pop ax + pop cx + pop di + sub ax,bx + jg L$10 + jl L$12 + mov ah,bl + mov al,80H +L$9: + mov word ptr es:2[di],ax + add di,8 + dec cx + jne L$9 + jmp L$14 +L$10: + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$11: + mov byte ptr es:3[di],al + mov byte ptr es:2[di],dh + add di,8 + add dx,bx + adc ax,bp + dec cx + jne L$11 + jmp L$14 +L$12: + neg ax + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$13: + mov byte ptr es:3[di],al + mov byte ptr es:2[di],dh + add di,8 + sub dx,bx + sbb ax,bp + dec cx + jne L$13 +L$14: + pop bp + ret +L$15: + mov ax,word ptr 6[si] + mov bx,word ptr 2[si] + cmp ah,bh + jg L$17 + jl L$19 + add ax,dx + mov dx,word ptr cs:MX_BYTESPERLINE +L$16: + mov byte ptr es:[di],ah + add di,dx + dec cx + jne L$16 + ret +L$17: + push bp + push si + mov si,bx + add si,dx + sub ax,bx + xor dx,dx + div cx + mov bp,ax + xor ax,ax + div cx + mov bx,ax + mov dx,8000H + mov ax,word ptr cs:MX_BYTESPERLINE + xchg ax,si +L$18: + mov byte ptr es:[di],ah + add dx,bx + adc ax,bp + add di,si + dec cx + jne L$18 + pop si + pop bp + ret +L$19: + push bp + push si + mov si,bx + add si,dx + sub ax,bx + neg ax + xor dx,dx + div cx + mov bp,ax + xor ax,ax + div cx + mov bx,ax + mov dx,8000H + mov ax,word ptr cs:MX_BYTESPERLINE + xchg ax,si +L$20: + mov byte ptr es:[di],ah + sub dx,bx + sbb ax,bp + add di,si + dec cx + jne L$20 + pop si + pop bp + ret +MXGOURAUDPOLY: + push bp + mov bp,sp + sub sp,1eH + push ds + push si + push es + push di + mov cx,word ptr 14H[bp] + cmp cx,3 + jae L$21 + jmp near ptr L$47 +L$21: + les di,dword ptr 10H[bp] + lds si,dword ptr 0cH[bp] + mov word ptr -16H[bp],7fffH + mov word ptr -1aH[bp],8000H + mov word ptr -18H[bp],7fffH + mov word ptr -1eH[bp],8000H + xor dx,dx +L$22: + mov bx,word ptr es:[di] + shl bx,1 + shl bx,1 + add bx,si + mov ax,word ptr [bx] + cmp ax,word ptr -16H[bp] + jge L$23 + mov word ptr -16H[bp],ax + mov word ptr -0eH[bp],dx + mov word ptr -10H[bp],dx +L$23: + cmp ax,word ptr -1aH[bp] + jle L$24 + mov word ptr -1aH[bp],ax + mov word ptr -12H[bp],dx +L$24: + mov ax,word ptr 2[bx] + cmp ax,word ptr -18H[bp] + jge L$25 + mov word ptr -18H[bp],ax +L$25: + cmp ax,word ptr -1eH[bp] + jle L$26 + mov word ptr -1eH[bp],ax +L$26: + inc di + inc di + inc dx + inc dx + dec cx + jne L$22 + mov ax,word ptr -1aH[bp] + cmp ax,word ptr cs:MX_CLIPX1 + jge L$27 + jmp near ptr L$47 +L$27: + mov bx,word ptr -16H[bp] + cmp bx,word ptr cs:MX_CLIPX2 + jle L$28 + jmp near ptr L$47 +L$28: + sub ax,bx + jg L$29 + jmp near ptr L$47 +L$29: + mov ax,word ptr -1eH[bp] + cmp ax,word ptr cs:MX_CLIPY1 + jge L$30 + jmp near ptr L$47 +L$30: + mov bx,word ptr -18H[bp] + cmp bx,word ptr cs:MX_CLIPY2 + jle L$31 + jmp near ptr L$47 +L$31: + sub ax,bx + jg L$32 + jmp near ptr L$47 +L$32: + dec word ptr 14H[bp] + shl word ptr 14H[bp],1 + mov es,word ptr cs:MX_CODESEGMENT + mov ax,offset MX_TEXT:MX_SCANBUFFER + mov word ptr -4[bp],ax + mov si,word ptr -0eH[bp] +L$33: + lds bx,dword ptr 10H[bp] + mov di,word ptr [bx+si] + dec si + dec si + test si,si + jge L$34 + mov si,word ptr 14H[bp] +L$34: + mov word ptr -0eH[bp],si + mov si,word ptr [bx+si] + lds bx,dword ptr 8[bp] + shl di,1 + shl si,1 + mov ax,word ptr [bx+si] + mov dx,word ptr [bx+di] + lds bx,dword ptr 0cH[bp] + shl si,1 + shl di,1 + add si,bx + add bx,di + mov di,word ptr -4[bp] + call near ptr L$1 + mov word ptr -4[bp],di + mov si,word ptr -0eH[bp] + cmp si,word ptr -12H[bp] + jne L$33 + mov ax,offset MX_TEXT:MX_SCANBUFFER+4 + mov word ptr -6[bp],ax + mov si,word ptr -10H[bp] +L$35: + lds bx,dword ptr 10H[bp] + mov di,word ptr [bx+si] + inc si + inc si + cmp si,word ptr 14H[bp] + jbe L$36 + xor si,si +L$36: + mov word ptr -10H[bp],si + mov si,word ptr [bx+si] + lds bx,dword ptr 8[bp] + shl di,1 + shl si,1 + mov ax,word ptr [bx+si] + mov dx,word ptr [bx+di] + lds bx,dword ptr 0cH[bp] + shl si,1 + shl di,1 + add si,bx + add bx,di + mov di,word ptr -6[bp] + call near ptr L$1 + mov word ptr -6[bp],di + mov si,word ptr -10H[bp] + cmp si,word ptr -12H[bp] + jne L$35 + mov si,offset MX_TEXT:MX_SCANBUFFER + mov ax,word ptr -16H[bp] + mov cx,word ptr -1aH[bp] + sub cx,ax + mov bx,word ptr cs:MX_CLIPX1 + sub bx,ax + jle L$37 + sub cx,bx + add ax,bx + mov word ptr -16H[bp],ax + shl bx,1 + shl bx,1 + shl bx,1 + add si,bx +L$37: + mov bx,ax + add bx,cx + sub bx,word ptr cs:MX_CLIPX2 + jle L$38 + sub cx,bx +L$38: + test cx,cx + jg L$39 + jmp near ptr L$47 +L$39: + mov word ptr -8[bp],cx + mov word ptr -4[bp],si + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr -18H[bp] + cmp ax,word ptr cs:MX_CLIPY1 + jl L$40 + mov ax,word ptr -1eH[bp] + cmp ax,word ptr cs:MX_CLIPY2 + jg L$40 + jmp L$44 +L$40: + mov di,cx + inc di + sub si,8 +L$41: + dec di + je L$44 + add si,8 + mov ax,word ptr [si] + mov cx,word ptr 4[si] + mov dx,word ptr cs:MX_CLIPY2 + cmp ax,dx + jg L$43 + cmp cx,dx + jle L$42 + mov word ptr 4[si],dx + mov bx,cx + sub bx,dx + sub cx,ax + jle L$43 + mov ax,word ptr 2[si] + sub ax,word ptr 6[si] + imul bx + idiv cx + add word ptr 6[si],ax + mov ax,word ptr [si] + mov cx,word ptr 4[si] +L$42: + mov dx,word ptr cs:MX_CLIPY1 + cmp cx,dx + jl L$43 + sub cx,ax + jle L$43 + cmp ax,dx + jge L$41 + mov word ptr [si],dx + sub dx,ax + cmp cx,dx + jbe L$43 + mov ax,word ptr 6[si] + sub ax,word ptr 2[si] + imul dx + idiv cx + add word ptr 2[si],ax + jmp L$41 +L$43: + mov word ptr [si],0ffffH + jmp L$41 +L$44: + mov es,word ptr cs:MX_VIDEOSEGMENT + mov si,word ptr -4[bp] + mov cl,byte ptr -16H[bp] + and cl,3 + mov al,11H + shl al,cl + mov byte ptr -2[bp],al + shr word ptr -16H[bp],1 + shr word ptr -16H[bp],1 + mov ax,word ptr 6[bp] + mov ah,al + xor al,al + mov word ptr 6[bp],ax +L$45: + mov ax,word ptr [si] + test ax,ax + js L$46 + mov cx,word ptr 4[si] + sub cx,ax + jle L$46 + mul word ptr cs:MX_BYTESPERLINE + add ax,word ptr -16H[bp] + mov di,ax + mov ah,byte ptr -2[bp] + mov al,2 + mov dx,3c4H + out dx,ax + mov dx,word ptr 6[bp] + call near ptr L$15 +L$46: + rol byte ptr -2[bp],1 + adc word ptr -16H[bp],0 + add si,8 + dec word ptr -8[bp] + jne L$45 +L$47: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 10H +MX_TEXT ENDS + END diff --git a/16/xw_/mxpi.asm b/16/xw_/mxpi.asm new file mode 100755 index 00000000..2631d82f --- /dev/null +++ b/16/xw_/mxpi.asm @@ -0,0 +1,218 @@ + PUBLIC MXPUTIMAGE + EXTRN SUBCLIPIMAGE:BYTE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + DW offset L$2 + DW offset L$6 + DW offset L$10 + DW offset L$14 + DW offset L$18 + DW offset L$20 +L$2: + shr cx,1 + jb L$5 +L$3: + movsb + add si,3 + movsb + add si,3 + dec cx + jne L$3 +L$4: + ret +L$5: + movsb + add si,3 + jcxz L$4 + jmp L$3 +L$6: + shr cx,1 + jb L$9 +L$7: + mov al,byte ptr [si] + mov ah,byte ptr 4[si] + and word ptr es:[di],ax + inc di + inc di + add si,8 + dec cx + jne L$7 +L$8: + ret +L$9: + lodsb + and byte ptr es:[di],al + inc di + add si,3 + jcxz L$8 + jmp L$7 +L$10: + shr cx,1 + jb L$13 +L$11: + mov al,byte ptr [si] + mov ah,byte ptr 4[si] + or word ptr es:[di],ax + inc di + inc di + add si,8 + dec cx + jne L$11 +L$12: + ret +L$13: + lodsb + or byte ptr es:[di],al + inc di + add si,3 + jcxz L$12 + jmp L$11 +L$14: + shr cx,1 + jb L$17 +L$15: + mov al,byte ptr [si] + mov ah,byte ptr 4[si] + xor word ptr es:[di],ax + inc di + inc di + add si,8 + dec cx + jne L$15 +L$16: + ret +L$17: + lodsb + xor byte ptr es:[di],al + inc di + add si,3 + jcxz L$16 + jmp L$15 +L$18: + mov al,byte ptr [si] + cmp al,ah + je L$19 + mov byte ptr es:[di],al +L$19: + inc di + add si,4 + dec cx + jne L$18 + ret +L$20: + mov al,byte ptr [si] + add byte ptr es:[di],al + inc di + add si,4 + dec cx + jne L$20 + ret +MXPUTIMAGE: + push bp + mov bp,sp + sub sp,14H + push ds + push si + push es + push di + mov bx,word ptr 0eH[bp] + mov ax,word ptr 0cH[bp] + mov cx,word ptr 0aH[bp] + mov dx,word ptr 8[bp] + call near ptr MX_TEXT:SUBCLIPIMAGE + jae L$21 + jmp near ptr L$26 +L$21: + mov word ptr 8[bp],dx + add word ptr 10H[bp],si + mul word ptr cs:MX_BYTESPERLINE + mov di,bx + shr di,1 + shr di,1 + add di,ax + mov word ptr -0aH[bp],di + mov es,word ptr cs:MX_VIDEOSEGMENT + and bl,3 + mov byte ptr -10H[bp],bl + mov bx,cx + shr bx,1 + shr bx,1 + and cl,3 + mov al,8 + shr al,cl + mov si,6 +L$22: + mov word ptr -8[bp+si],bx + shr al,1 + adc bx,0 + dec si + dec si + jge L$22 + mov cl,byte ptr -10H[bp] + mov al,11H + shl al,cl + mov byte ptr -14H[bp],al + mov bx,word ptr 6[bp] + mov byte ptr -12H[bp],bh + xor bh,bh + cmp bl,5 + jbe L$23 + xor bl,bl +L$23: + shl bx,1 + mov ax,word ptr cs:L$1[bx] + mov word ptr -0cH[bp],ax + cld + mov byte ptr -0eH[bp],4 + lea bx,-8[bp] + mov ds,word ptr 12H[bp] +L$24: + cmp word ptr ss:[bx],0 + je L$26 + mov si,word ptr 10H[bp] + mov ah,byte ptr -14H[bp] + and ah,0fH + mov al,2 + mov dx,3c4H + out dx,ax + mov ah,byte ptr -10H[bp] + and ah,3 + mov al,4 + mov dx,3ceH + out dx,ax + mov dx,word ptr 8[bp] + mov di,word ptr -0aH[bp] +L$25: + push si + push di + mov cx,word ptr ss:[bx] + mov ah,byte ptr -12H[bp] + call word ptr -0cH[bp] + pop di + pop si + add si,word ptr 0aH[bp] + add di,word ptr cs:MX_BYTESPERLINE + dec dx + jne L$25 + inc bx + inc bx + inc byte ptr -10H[bp] + rol byte ptr -14H[bp],1 + adc word ptr -0aH[bp],0 + inc word ptr 10H[bp] + dec byte ptr -0eH[bp] + jne L$24 +L$26: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0eH +MX_TEXT ENDS + END diff --git a/16/xw_/mxpn.asm b/16/xw_/mxpn.asm new file mode 100755 index 00000000..e4f20b10 --- /dev/null +++ b/16/xw_/mxpn.asm @@ -0,0 +1,34 @@ + PUBLIC MXPAN + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MXWAITDISPLAY:BYTE + EXTRN MXSTARTADDRESS:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXPAN: + push bp + mov bp,sp + sub sp,0 + mov ax,word ptr 6[bp] + mul word ptr cs:MX_BYTESPERLINE + mov dx,word ptr 8[bp] + shr dx,1 + shr dx,1 + add ax,dx + push ax + call far ptr MXWAITDISPLAY + call far ptr MXSTARTADDRESS + mov dx,3daH + in al,dx + mov dx,3c0H + mov al,33H + out dx,al + mov al,byte ptr 8[bp] + and al,3 + shl al,1 + out dx,al + xor ax,ax + mov sp,bp + pop bp + retf 4 +MX_TEXT ENDS + END diff --git a/16/xw_/mxpp.asm b/16/xw_/mxpp.asm new file mode 100755 index 00000000..42f7a6f0 --- /dev/null +++ b/16/xw_/mxpp.asm @@ -0,0 +1,84 @@ + PUBLIC MXGETPIXEL + PUBLIC MXPUTPIXEL + EXTRN MX_CLIPX1:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXGETPIXEL: + push bp + mov bp,sp + sub sp,0 + push ds + push si + xor ax,ax + mov si,word ptr 8[bp] + cmp si,word ptr cs:MX_CLIPX1 + jl L$1 + cmp si,word ptr cs:MX_CLIPX2 + jg L$1 + mov bx,word ptr 6[bp] + cmp bx,word ptr cs:MX_CLIPY1 + jl L$1 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$1 + mov al,4 + mov ah,byte ptr 8[bp] + and ah,3 + mov dx,3ceH + out dx,ax + mov ds,word ptr cs:MX_VIDEOSEGMENT + mov ax,bx + mul word ptr cs:MX_BYTESPERLINE + shr si,1 + shr si,1 + add si,ax + mov al,byte ptr [si] + xor ah,ah +L$1: + pop si + pop ds + mov sp,bp + pop bp + retf 4 +MXPUTPIXEL: + push bp + mov bp,sp + sub sp,0 + push ds + push si + mov si,word ptr 0aH[bp] + cmp si,word ptr cs:MX_CLIPX1 + jl L$2 + cmp si,word ptr cs:MX_CLIPX2 + jg L$2 + mov ax,word ptr 8[bp] + cmp ax,word ptr cs:MX_CLIPY1 + jl L$2 + cmp ax,word ptr cs:MX_CLIPY2 + jg L$2 + mov ds,word ptr cs:MX_VIDEOSEGMENT + mul word ptr cs:MX_BYTESPERLINE + shr si,1 + shr si,1 + add si,ax + mov cl,byte ptr 0aH[bp] + and cl,3 + mov ax,102H + shl ah,cl + mov dx,3c4H + out dx,ax + mov al,byte ptr 6[bp] + mov byte ptr [si],al +L$2: + xor ax,ax + pop si + pop ds + mov sp,bp + pop bp + retf 6 +MX_TEXT ENDS + END diff --git a/16/xw_/mxra.asm b/16/xw_/mxra.asm new file mode 100755 index 00000000..a71b4a0e --- /dev/null +++ b/16/xw_/mxra.asm @@ -0,0 +1,17 @@ + PUBLIC MXROWADDRESS +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXROWADDRESS: + push bp + mov bp,sp + sub sp,0 + mov dx,3d4H + mov al,13H + mov ah,byte ptr 6[bp] + out dx,ax + xor ax,ax + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw_/mxrp.asm b/16/xw_/mxrp.asm new file mode 100755 index 00000000..03239eff --- /dev/null +++ b/16/xw_/mxrp.asm @@ -0,0 +1,72 @@ + PUBLIC MXROTATEPALETTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXROTATEPALETTE: + push bp + mov bp,sp + sub sp,300H + push ds + push si + push es + push di + mov bx,word ptr 8[bp] + add bx,bx + add bx,word ptr 8[bp] + lds si,dword ptr 0aH[bp] + push ss + pop es + lea di,-300H[bp] + cld + mov ax,word ptr 6[bp] + mov dx,ax + test ax,ax + je L$2 + jl L$1 + add ax,ax + add dx,ax + sub bx,dx + add si,bx + push si + mov cx,dx + rep movsb + mov es,word ptr 0cH[bp] + mov di,si + dec di + pop si + dec si + mov cx,bx + std + rep movsb + push ss + pop ds + lea si,-300H[bp] + les di,dword ptr 0aH[bp] + mov cx,dx + cld + rep movsb + jmp L$2 +L$1: + add ax,ax + add dx,ax + neg dx + sub bx,dx + mov cx,dx + rep movsb + les di,dword ptr 0aH[bp] + mov cx,bx + rep movsb + push ss + pop ds + lea si,-300H[bp] + mov cx,dx + rep movsb +L$2: + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw_/mxsa.asm b/16/xw_/mxsa.asm new file mode 100755 index 00000000..642d2dd7 --- /dev/null +++ b/16/xw_/mxsa.asm @@ -0,0 +1,22 @@ + PUBLIC MXSTARTADDRESS +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXSTARTADDRESS: + push bp + mov bp,sp + sub sp,0 + mov bx,word ptr 6[bp] + mov dx,3d4H + mov al,0cH + mov ah,bh + cli + out dx,ax + mov al,0dH + mov ah,bl + out dx,ax + sti + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw_/mxsc.asm b/16/xw_/mxsc.asm new file mode 100755 index 00000000..7d8bd47b --- /dev/null +++ b/16/xw_/mxsc.asm @@ -0,0 +1,26 @@ + PUBLIC MXSETCOLOR +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXSETCOLOR: + push bp + mov bp,sp + sub sp,0 + push ds + push si + mov ax,word ptr 0cH[bp] + mov dx,3c8H + out dx,al + inc dx + mov al,byte ptr 0aH[bp] + out dx,al + mov al,byte ptr 8[bp] + out dx,al + mov al,byte ptr 6[bp] + out dx,al + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw_/mxsi.asm b/16/xw_/mxsi.asm new file mode 100755 index 00000000..c9223532 --- /dev/null +++ b/16/xw_/mxsi.asm @@ -0,0 +1,220 @@ + PUBLIC MXSTRETCHIMAGE + EXTRN SUBCLIPBOX:BYTE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + DW offset L$8 + DW offset L$10 + DW offset L$12 + DW offset L$14 + DW offset L$16 + DW offset L$19 +MXSTRETCHIMAGE: + push bp + mov bp,sp + sub sp,14H + push ds + push si + push es + push di + xor dx,dx + mov ax,word ptr 0eH[bp] + mov bx,word ptr 0aH[bp] + div bx + mov word ptr -0aH[bp],ax + xor ax,ax + div bx + mov word ptr -0cH[bp],ax + xor dx,dx + mov ax,word ptr 0cH[bp] + mov bx,word ptr 8[bp] + div bx + mov word ptr -0eH[bp],ax + xor ax,ax + div bx + mov word ptr -10H[bp],ax + mov bx,word ptr 12H[bp] + mov ax,word ptr 10H[bp] + mov cx,word ptr 0aH[bp] + mov dx,word ptr 8[bp] + call near ptr MX_TEXT:SUBCLIPBOX + jae L$2 + jmp near ptr L$7 +L$2: + mov word ptr 0aH[bp],cx + mov word ptr 8[bp],dx + sub word ptr 12H[bp],bx + sub word ptr 10H[bp],ax + mul word ptr cs:MX_BYTESPERLINE + mov di,bx + shr di,1 + shr di,1 + add di,ax + mov word ptr -2[bp],di + mov es,word ptr cs:MX_VIDEOSEGMENT + and bl,3 + mov byte ptr -6[bp],bl + mov cl,bl + mov al,11H + shl al,cl + mov byte ptr -14H[bp],al + mov ax,word ptr 10H[bp] + test ax,ax + je L$3 + mov bx,ax + mul word ptr -10H[bp] + mov cx,dx + mov ax,bx + mul word ptr -0eH[bp] + add ax,cx + mul word ptr 0eH[bp] + add word ptr 14H[bp],ax +L$3: + mov ax,word ptr 12H[bp] + test ax,ax + je L$4 + mov bx,ax + mul word ptr -0cH[bp] + mov cx,dx + mov ax,bx + mul word ptr -0aH[bp] + add ax,cx + add word ptr 14H[bp],ax +L$4: + mov ax,word ptr -0eH[bp] + mul word ptr 0eH[bp] + mov word ptr -0eH[bp],ax + mov bx,word ptr 6[bp] + mov byte ptr -8[bp],bh + xor bh,bh + cmp bl,5 + jbe L$5 + xor bl,bl +L$5: + shl bx,1 + mov ax,word ptr cs:L$1[bx] + mov word ptr -4[bp],ax + mov ds,word ptr 16H[bp] + xor ax,ax + mov word ptr -12H[bp],ax +L$6: + mov si,word ptr 14H[bp] + mov ah,byte ptr -14H[bp] + and ah,0fH + mov al,2 + mov dx,3c4H + out dx,ax + mov ah,byte ptr -6[bp] + and ah,3 + mov al,4 + mov dx,3ceH + out dx,ax + mov cx,word ptr 8[bp] + mov di,word ptr -2[bp] + mov ah,byte ptr -8[bp] + xor bx,bx + mov dx,word ptr cs:MX_BYTESPERLINE + call word ptr -4[bp] + inc byte ptr -6[bp] + rol byte ptr -14H[bp],1 + adc word ptr -2[bp],0 + mov dx,word ptr -0cH[bp] + mov ax,word ptr -0aH[bp] + add word ptr -12H[bp],dx + adc word ptr 14H[bp],ax + dec word ptr 0aH[bp] + jne L$6 +L$7: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 12H +L$8: + mov al,byte ptr [si] + mov byte ptr es:[di],al + add di,dx + dec cx + je L$9 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$8 + add si,word ptr 0eH[bp] + jmp L$8 +L$9: + ret +L$10: + mov al,byte ptr [si] + and byte ptr es:[di],al + add di,dx + dec cx + je L$11 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$10 + add si,word ptr 0eH[bp] + jmp L$10 +L$11: + ret +L$12: + mov al,byte ptr [si] + or byte ptr es:[di],al + add di,dx + dec cx + je L$13 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$12 + add si,word ptr 0eH[bp] + jmp L$12 +L$13: + ret +L$14: + mov al,byte ptr [si] + xor byte ptr es:[di],al + add di,dx + dec cx + je L$15 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$14 + add si,word ptr 0eH[bp] + jmp L$14 +L$15: + ret +L$16: + mov al,byte ptr [si] + cmp al,ah + je L$17 + mov byte ptr es:[di],al +L$17: + add di,dx + dec cx + je L$18 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$16 + add si,word ptr 0eH[bp] + jmp L$16 +L$18: + ret +L$19: + mov al,byte ptr [si] + add byte ptr es:[di],al + add di,dx + dec cx + je L$20 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$19 + add si,word ptr 0eH[bp] + jmp L$19 +L$20: + ret +MX_TEXT ENDS + END diff --git a/16/xw_/mxsl.asm b/16/xw_/mxsl.asm new file mode 100755 index 00000000..109ce3ba --- /dev/null +++ b/16/xw_/mxsl.asm @@ -0,0 +1,36 @@ + PUBLIC MXSTARTLINE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXSTARTLINE: + push bp + mov bp,sp + sub sp,0 + mov ax,word ptr 6[bp] + mul word ptr cs:MX_BYTESPERLINE + xchg ax,bx + mov dx,3daH +L$1: + in al,dx + test al,8 + jne L$1 + mov dx,3d4H + mov al,0cH + mov ah,bh + cli + out dx,ax + mov al,0dH + mov ah,bl + out dx,ax + sti + mov dx,3daH +L$2: + in al,dx + test al,8 + je L$2 + xor ax,ax + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw_/mxsm.asm b/16/xw_/mxsm.asm new file mode 100755 index 00000000..96e746d3 --- /dev/null +++ b/16/xw_/mxsm.asm @@ -0,0 +1,449 @@ + PUBLIC MX_SCREENWIDTH + PUBLIC MX_SCREENHEIGHT + PUBLIC MX_BYTESPERLINE + PUBLIC MXSETMODE + PUBLIC MXCHANGEMODE + PUBLIC MXGETASPECT + PUBLIC MXGETSCREENSIZE + EXTRN MX_CODESEGMENT:BYTE + EXTRN MXSETSYSCLIPREGION:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MX_SCREENWIDTH: + add byte ptr [bx+si],al +MX_SCREENHEIGHT: + add byte ptr [bx+si],al +L$1: + add byte ptr [bx+si],al +L$2: + add byte ptr [bx+si],al +MX_BYTESPERLINE: + add byte ptr [bx+si],al +L$3: + or word ptr 14H[bx+si],ax + add byte ptr [bx],dl + jcxz L$4 +L$4: + DB 0 +L$5: + or word ptr 14H[bx+di],ax + add byte ptr [bx],dl + jcxz L$6 +L$6: + DB 0 +L$7: + add byte ptr 1[bx],bl + dec di + add dl,byte ptr 3[bx+si] + add byte ptr [si],54H + add ax,1380H + sub byte ptr [bx+si],al + DB 0 +L$8: + add byte ptr 1[bp+di],ch + pop cx + add bl,byte ptr 3[bp+si] + mov es,word ptr [si] + pop si + add ax,138aH + sub ax,0 + push es + mov di,1f07H + adc byte ptr -7aefH[bp+di],al + adc bl,byte ptr 15H[di] + arpl word ptr ds:[0baH],dx + DB 0 +L$9: + push es + DD ds:[7bfH] + pushf + adc word ptr -70eeH[bp],cx + adc ax,1696H + mov cx,0 +L$10: + push es + or ax,3e07H + adc dl,ch + adc word ptr -20eeH[si],cx + adc ax,16e7H + push es + add byte ptr [bx+si],al +L$11: + add byte ptr 1[si],dh + arpl word ptr [bp+si],ax + add dx,word ptr fs:6804H[bx] + add ax,695H + xchg byte ptr [bx],al + lock or word ptr 0fH[bx+si],sp + xor word ptr [bx+si],dx + pop bx + adc word ptr 5712H[di],cx + adc si,word ptr [bp+si] + adc al,0 + adc ax,1660H + adc byte ptr [bx],0e3H + add byte ptr [bx+si],al +L$12: + arpl word ptr ds:[500H],ax + add byte ptr 1[bx+si],al + enter 1a00H,0 + DW offset L$9 + DW offset L$5 + add byte ptr [bx+si],al + xor ax,word ptr [bp+di] +L$13: + jcxz L$14 + DB 0 +L$14: + add word ptr [bx+si],ax + inc ax + add ax,si + add byte ptr [bp+si],bl + add byte ptr [bp+si],bl + DW offset L$5 + add byte ptr [bx+si],al + xor ax,word ptr [bp+di] +L$15: + arpl word ptr ds:[0a00H],ax + add byte ptr 1[bx+si],al + nop + add word ptr [bp+si],bx + add byte ptr [bp+si],cl + DW offset L$3 + add byte ptr [bx+si],al + xor ax,word ptr [bp+di] +L$16: + jcxz L$17 + DB 0 +L$17: + add al,byte ptr [bx+si] + inc ax + add ax,sp + DD L$18 +L$18: + add byte ptr [bp+si],cl + add byte ptr [bx+si],al + add byte ptr [bp+di],dh + DB 3 +L$19: + sbb ax,word ptr [eax] + adc al,0 + push 0c801H + add byte ptr [bp+si],ch + add byte ptr [bp+si],cl + DW offset L$5 + add byte ptr [bx+si],al + fadd dword ptr [bp+si] +L$20: + out 9,ax + add byte ptr [bx+si],cl + add byte ptr 1[bx+si],ch + lock add byte ptr [bp+si],ch + add byte ptr [bp+si],bl + DW offset L$5 + add byte ptr [bx+si],al + fadd dword ptr [bp+si] +L$21: + sbb ax,word ptr [eax] + sub byte ptr [bx+si],al + push 9001H + add word ptr [bp+si],bp + add byte ptr [bp+si],cl + DW offset L$3 + add byte ptr [bx+si],al + fadd dword ptr [bp+si] +L$22: + out 9,ax + add byte ptr [bx+si],dl + add byte ptr 1[bx+si],ch + loopnz L$23 + DW offset L$8 +L$23 equ $-1 + DW offset L$10 + DW offset L$3 + add byte ptr [bx+si],al + fadd dword ptr [bp+si] +L$24: + mov word ptr ds:[0],ax + add byte ptr [bx+si],al + inc ax + add word ptr 1a00H[bx],bp + add byte ptr [bp+si],bh + add byte ptr [bp+si],dl + add byte ptr [bx+si],al + add byte ptr [bp+di],dh + DB 3 +L$25: + mov word ptr 0,ax + add byte ptr [bx+si],al + inc ax + add word ptr 1a00H[bx],bp + add byte ptr [bp+si],bh + add byte ptr [bp+si],cl + add byte ptr [bx+si],al + add byte ptr [bp+di],dh + DB 3 +L$26: + cmpsw + add byte ptr [bx+si],al + add byte ptr [bx+si],al + push 0e001H + add word ptr [bp+si],bp + add byte ptr [bp+si],bh + add byte ptr [bp+si],dl + add byte ptr [bx+si],al + add al,bl + DB 2 +L$27: + cmpsw + add byte ptr [bx+si],al + add byte ptr [bx+si],al + push 0e001H + add word ptr [bp+si],bp + add byte ptr [bp+si],bh + add byte ptr [bp+si],cl + add byte ptr [bx+si],al + add al,bl + DB 2 +L$28: + out 1,ax + add byte ptr [bp+si],al + add byte ptr 5801H[bx+si],dl + add ch,byte ptr [bp+si] + add byte ptr [bx+si],al + pop word ptr [bp+si] +L$29: + DW offset L$24 + DW offset L$12 + DW offset L$13 + DW offset L$25 + DW offset L$15 + DW offset L$16 + DW offset L$26 + DW offset L$19 + DW offset L$20 + DW offset L$27 + DW offset L$21 + DW offset L$22 + DW offset L$28 +L$30: + mov ax,3 + int 10H + mov word ptr MX_SCREENHEIGHT,0 + mov word ptr MX_BYTESPERLINE,0 + ret +MXSETMODE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov ds,word ptr cs:MX_CODESEGMENT + mov si,word ptr 6[bp] + cmp si,0dH + jbe L$31 + jmp near ptr L$36 +L$31: + test si,si + jne L$32 + call near ptr L$30 + jmp near ptr L$36 +L$32: + dec si + shl si,1 + mov si,word ptr L$29[si] + cld + push si + mov ax,13H + int 10H + pop si + mov dx,3c4H + mov ax,604H + out dx,ax + mov ax,100H + out dx,ax + mov dx,3c2H + lodsb + out dx,al + mov dx,3c4H + mov ax,300H + out dx,ax + mov dx,3d4H + mov al,11H + out dx,al + inc dx + in al,dx + and al,7fH + out dx,al + lodsw + mov word ptr L$1,ax + lodsw + mov word ptr L$2,ax + lodsw + mov word ptr MX_SCREENWIDTH,ax + shr ax,1 + shr ax,1 + mov word ptr MX_BYTESPERLINE,ax + lodsw + mov word ptr MX_SCREENHEIGHT,ax + mov bx,si + mov dx,3d4H +L$33: + mov si,word ptr [bx] + inc bx + inc bx + test si,si + je L$35 +L$34: + lodsw + test ax,ax + je L$33 + out dx,ax + jmp L$34 +L$35: + push word ptr MX_SCREENWIDTH + push word ptr [bx] + push cs + call near ptr MX_TEXT:MXSETSYSCLIPREGION + mov dx,3c4H + mov ax,0f02H + out dx,ax + mov es,word ptr MX_TEXT:MX_VIDEOSEGMENT + xor di,di + mov cx,8000H + xor ax,ax + rep stosw + mov dx,3d4H + mov al,11H + out dx,al + inc dx + in al,dx + or al,80H + out dx,al +L$36: + xor ax,ax + mov ax,word ptr MX_SCREENWIDTH + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 2 +MXCHANGEMODE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov ds,word ptr cs:MX_CODESEGMENT + mov si,word ptr 6[bp] + cmp si,0dH + ja L$40 + test si,si + je L$40 + dec si + shl si,1 + mov si,word ptr L$29[si] + cld + mov dx,3c4H + mov ax,604H + out dx,ax + mov ax,100H + out dx,ax + mov dx,3c2H + lodsb + out dx,al + mov dx,3c4H + mov ax,300H + out dx,ax + mov dx,3d4H + mov al,11H + out dx,al + inc dx + in al,dx + and al,7fH + out dx,al + lodsw + mov word ptr L$1,ax + lodsw + mov word ptr L$2,ax + lodsw + mov word ptr MX_SCREENWIDTH,ax + lodsw + mov word ptr MX_SCREENHEIGHT,ax + mov bx,si + mov dx,3d4H +L$37: + mov si,word ptr [bx] + inc bx + inc bx + test si,si + je L$39 +L$38: + lodsw + test ax,ax + je L$37 + cmp al,13H + je L$38 + out dx,ax + jmp L$38 +L$39: + mov dx,3d4H + mov al,11H + out dx,al + inc dx + in al,dx + or al,80H + out dx,al +L$40: + xor ax,ax + mov ax,word ptr MX_SCREENWIDTH + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 2 +MXGETASPECT: + push bp + mov bp,sp + sub sp,0 + push ds + push si + lds si,dword ptr 0aH[bp] + mov ax,word ptr cs:L$1 + mov word ptr [si],ax + lds si,dword ptr 6[bp] + mov ax,word ptr cs:L$2 + mov word ptr [si],ax + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MXGETSCREENSIZE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + lds si,dword ptr 0aH[bp] + mov ax,word ptr cs:MX_SCREENWIDTH + mov word ptr [si],ax + lds si,dword ptr 6[bp] + mov ax,word ptr cs:MX_SCREENHEIGHT + mov word ptr [si],ax + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw_/mxsp.asm b/16/xw_/mxsp.asm new file mode 100755 index 00000000..3385a6cf --- /dev/null +++ b/16/xw_/mxsp.asm @@ -0,0 +1,33 @@ + PUBLIC MXSETPALETTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXSETPALETTE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + lds si,dword ptr 0aH[bp] + mov cx,word ptr 6[bp] + mov ax,word ptr 8[bp] + mov dx,3c8H + out dx,al + inc dx + cld + cli +L$1: + lodsb + out dx,al + lodsb + out dx,al + lodsb + out dx,al + loop L$1 + sti + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw_/mxss.asm b/16/xw_/mxss.asm new file mode 100755 index 00000000..558584c3 --- /dev/null +++ b/16/xw_/mxss.asm @@ -0,0 +1,44 @@ + PUBLIC MXSPLITSCREEN +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXSPLITSCREEN: + push bp + mov bp,sp + sub sp,0 + mov ax,word ptr 6[bp] + shl ax,1 + mov bh,ah + mov bl,ah + and bx,201H + mov cl,4 + shl bx,cl + shl bh,1 + mov dx,3d4H + mov ah,al + mov al,18H + out dx,ax + mov al,7 + out dx,al + inc dx + in al,dx + dec dx + mov ah,al + and ah,0efH + or ah,bl + mov al,7 + out dx,ax + mov al,9 + out dx,al + inc dx + in al,dx + dec dx + mov ah,al + and ah,0bfH + or ah,bh + mov al,9 + out dx,ax + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw_/mxtl.asm b/16/xw_/mxtl.asm new file mode 100755 index 00000000..3f791b41 --- /dev/null +++ b/16/xw_/mxtl.asm @@ -0,0 +1,122 @@ + PUBLIC MXPUTTILE + PUBLIC MXTRANSPUTTILE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXPUTTILE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov ax,word ptr 0aH[bp] + mul word ptr cs:MX_BYTESPERLINE + mov di,word ptr 0cH[bp] + shr di,1 + shr di,1 + add di,ax + mov es,word ptr cs:MX_VIDEOSEGMENT + lds si,dword ptr 0eH[bp] + shr word ptr 8[bp],1 + shr word ptr 8[bp],1 + mov cl,byte ptr 0cH[bp] + and cl,3 + mov ah,11H + shl ah,cl + mov word ptr 0aH[bp],4 + mov bx,word ptr cs:MX_BYTESPERLINE + sub bx,word ptr 8[bp] +L$1: + mov al,2 + mov dx,3c4H + out dx,ax + mov word ptr 0cH[bp],di + mov dx,word ptr 6[bp] +L$2: + mov cx,word ptr 8[bp] + shr cx,1 + rep movsw + rcl cx,1 + rep movsb + add di,bx + dec dx + jne L$2 + mov di,word ptr 0cH[bp] + rol ah,1 + adc di,0 + dec word ptr 0aH[bp] + jne L$1 + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +MXTRANSPUTTILE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov ax,word ptr 0aH[bp] + mul word ptr cs:MX_BYTESPERLINE + mov di,word ptr 0cH[bp] + shr di,1 + shr di,1 + add di,ax + mov es,word ptr cs:MX_VIDEOSEGMENT + lds si,dword ptr 0eH[bp] + shr word ptr 8[bp],1 + shr word ptr 8[bp],1 + mov cl,byte ptr 0cH[bp] + and cl,3 + mov ah,11H + shl ah,cl + mov word ptr 0aH[bp],4 + mov bx,word ptr cs:MX_BYTESPERLINE + sub bx,word ptr 8[bp] +L$3: + mov al,2 + mov dx,3c4H + out dx,ax + mov word ptr 0cH[bp],di + mov dx,word ptr 6[bp] +L$4: + mov cx,word ptr 8[bp] + jcxz L$7 +L$5: + mov al,byte ptr [si] + test al,al + je L$6 + mov byte ptr es:[di],al +L$6: + inc si + inc di + dec cx + jne L$5 +L$7: + add di,bx + dec dx + jne L$4 + mov di,word ptr 0cH[bp] + rol ah,1 + adc di,0 + dec word ptr 0aH[bp] + jne L$3 + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +MX_TEXT ENDS + END diff --git a/16/xw_/mxvs.asm b/16/xw_/mxvs.asm new file mode 100755 index 00000000..c4728ff5 --- /dev/null +++ b/16/xw_/mxvs.asm @@ -0,0 +1,68 @@ + PUBLIC MXSETVIRTUALSCREEN + PUBLIC MXGETVIRTUALSCREEN + EXTRN MX_CODESEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MXROWADDRESS:BYTE + EXTRN MXSETSYSCLIPREGION:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + add byte ptr [bx+si],al +L$2: + add byte ptr [bx+si],al +MXSETVIRTUALSCREEN: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,1 + cmp word ptr 8[bp],140H + jb L$3 + push ax + mov dx,4 + xor ax,ax + div word ptr 8[bp] + cmp word ptr 6[bp],ax + pop ax + ja L$3 + mov ax,word ptr 8[bp] + and ax,0fff8H + mov word ptr L$1,ax + shr ax,1 + shr ax,1 + mov word ptr MX_TEXT:MX_BYTESPERLINE,ax + shr ax,1 + push ax + call far ptr MXROWADDRESS + mov ax,word ptr 6[bp] + mov word ptr L$2,ax + push word ptr 8[bp] + push word ptr 6[bp] + call far ptr MXSETSYSCLIPREGION + xor ax,ax +L$3: + pop ds + mov sp,bp + pop bp + retf 4 +MXGETVIRTUALSCREEN: + push bp + mov bp,sp + sub sp,0 + push ds + push si + mov ax,word ptr cs:L$1 + lds si,dword ptr 0aH[bp] + mov word ptr [si],ax + mov ax,word ptr cs:L$2 + lds si,dword ptr 6[bp] + mov word ptr [si],ax + xor ax,ax + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw_/mxwd.asm b/16/xw_/mxwd.asm new file mode 100755 index 00000000..c0d19aa2 --- /dev/null +++ b/16/xw_/mxwd.asm @@ -0,0 +1,12 @@ + PUBLIC MXWAITDISPLAY +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXWAITDISPLAY: + mov dx,3daH +L$1: + in al,dx + test al,8 + jne L$1 + retf +MX_TEXT ENDS + END diff --git a/16/xw_/mxwm.asm b/16/xw_/mxwm.asm new file mode 100755 index 00000000..7dc66acc --- /dev/null +++ b/16/xw_/mxwm.asm @@ -0,0 +1,18 @@ + PUBLIC MXWRITEMODE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXWRITEMODE: + push bp + mov bp,sp + sub sp,0 + mov dx,3ceH + mov ah,byte ptr 6[bp] + and ah,3 + or ah,40H + mov al,5 + out dx,ax + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw_/mxwp.asm b/16/xw_/mxwp.asm new file mode 100755 index 00000000..e03c4040 --- /dev/null +++ b/16/xw_/mxwp.asm @@ -0,0 +1,30 @@ + PUBLIC MXWRITEPLANE + PUBLIC MXREADPLANE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXWRITEPLANE: + push bp + mov bp,sp + sub sp,0 + mov ah,byte ptr 6[bp] + and ah,0fH + mov al,2 + mov dx,3c4H + out dx,ax + mov sp,bp + pop bp + retf 2 +MXREADPLANE: + push bp + mov bp,sp + sub sp,0 + mov al,4 + mov ah,byte ptr 6[bp] + and ah,3 + mov dx,3ceH + out dx,ax + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw_/mxwr.asm b/16/xw_/mxwr.asm new file mode 100755 index 00000000..0d228d8b --- /dev/null +++ b/16/xw_/mxwr.asm @@ -0,0 +1,12 @@ + PUBLIC MXWAITRETRACE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXWAITRETRACE: + mov dx,3daH +L$1: + in al,dx + test al,8 + je L$1 + retf +MX_TEXT ENDS + END diff --git a/16/xw_/xw.bat b/16/xw_/xw.bat new file mode 100755 index 00000000..1fd24399 --- /dev/null +++ b/16/xw_/xw.bat @@ -0,0 +1,39 @@ +@echo off +wdis -a MXBB.OBJ > mxbb.asm +wdis -a MXCC.OBJ > mxcc.asm +wdis -a MXCG.OBJ > mxcg.asm +wdis -a MXCL.OBJ > mxcl.asm +wdis -a MXCR.OBJ > mxcl.asm +wdis -a MXFB.OBJ > mxfb.asm +wdis -a MXFP.OBJ > mxfp.asm +wdis -a MXGC.OBJ > mxgc.asm +wdis -a MXGI.OBJ > mxgi.asm +wdis -a MXGM.OBJ > mxgm.asm +wdis -a MXGP.OBJ > mxgp.asm +wdis -a MXGV.OBJ > mxgv.asm +wdis -a MXHL.OBJ > mxhl.asm +wdis -a MXIT.OBJ > mxit.asm +wdis -a MXLL.OBJ > mxll.asm +wdis -a MXLN.OBJ > mxln.asm +wdis -a MXOT.OBJ > mxot.asm +wdis -a MXPB.OBJ > mxpb.asm +wdis -a MXPF.OBJ > mxpf.asm +wdis -a MXPG.OBJ > mxpg.asm +wdis -a MXPI.OBJ > mxpi.asm +wdis -a MXPN.OBJ > mxpn.asm +wdis -a MXPP.OBJ > mxpp.asm +wdis -a MXRA.OBJ > mxra.asm +wdis -a MXRP.OBJ > mxrp.asm +wdis -a MXSA.OBJ > mxsa.asm +wdis -a MXSC.OBJ > mxsc.asm +wdis -a MXSI.OBJ > mxsi.asm +wdis -a MXSL.OBJ > mxsl.asm +wdis -a MXSM.OBJ > mxsm.asm +wdis -a MXSP.OBJ > mxsp.asm +wdis -a MXSS.OBJ > mxss.asm +wdis -a MXTL.OBJ > mxtl.asm +wdis -a MXVS.OBJ > mxvs.asm +wdis -a MXWD.OBJ > mxwd.asm +wdis -a MXWM.OBJ > mxwm.asm +wdis -a MXWP.OBJ > mxwp.asm +wdis -a MXWR.OBJ > mxwr.asm diff --git a/16/xw__/default.fnt b/16/xw__/default.fnt new file mode 100755 index 00000000..12eb22cb --- /dev/null +++ b/16/xw__/default.fnt @@ -0,0 +1,260 @@ +; +; MODEX library default font +; Copyright (c) 1993-1994 by Alessandro Scotti +; + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; #0 + DB 07Eh, 081h, 0A5h, 081h, 0A5h, 099h, 081h, 07Eh ; #1 + DB 07Eh, 0FFh, 0DBh, 0FFh, 0DBh, 0E7h, 0FFh, 07Eh ; #2 + DB 06Ch, 0FEh, 0FEh, 0FEh, 07Ch, 038h, 010h, 000h ; #3 + DB 010h, 038h, 07Ch, 0FEh, 07Ch, 038h, 010h, 000h ; #4 + DB 010h, 038h, 010h, 054h, 0FEh, 054h, 010h, 0FEh ; #5 + DB 010h, 038h, 07Ch, 0FEh, 0FEh, 07Ch, 010h, 0FEh ; #6 + DB 000h, 018h, 03Ch, 07Eh, 07Eh, 03Ch, 018h, 000h ; #7 + DB 0FFh, 0E7h, 0C3h, 081h, 081h, 0C3h, 0E7h, 0FFh ; #8 + DB 000h, 03Ch, 066h, 042h, 042h, 066h, 03Ch, 000h ; #9 + DB 0FFh, 0C3h, 099h, 0BDh, 0BDh, 099h, 0C3h, 0FFh ; #10 + DB 007h, 003h, 005h, 078h, 084h, 084h, 084h, 078h ; #11 + DB 07Ch, 082h, 082h, 082h, 07Ch, 010h, 038h, 010h ; #12 + DB 01Ch, 010h, 01Ch, 010h, 010h, 010h, 030h, 030h ; #13 + DB 03Eh, 022h, 03Eh, 022h, 022h, 026h, 066h, 060h ; #14 + DB 099h, 05Ah, 03Ch, 0E7h, 0E7h, 03Ch, 05Ah, 099h ; #15 + DB 000h, 010h, 030h, 070h, 0F0h, 070h, 030h, 010h ; #16 + DB 000h, 080h, 0C0h, 0E0h, 0F0h, 0E0h, 0C0h, 080h ; #17 + DB 010h, 038h, 054h, 010h, 010h, 054h, 038h, 010h ; #18 + DB 048h, 048h, 048h, 048h, 048h, 000h, 048h, 000h ; #19 + DB 07Eh, 092h, 092h, 072h, 012h, 012h, 012h, 000h ; #20 + DB 03Ch, 022h, 018h, 024h, 024h, 018h, 044h, 03Ch ; #21 + DB 000h, 000h, 000h, 000h, 000h, 03Eh, 03Eh, 000h ; #22 + DB 038h, 054h, 010h, 010h, 010h, 054h, 038h, 0FEh ; #23 + DB 000h, 010h, 038h, 054h, 010h, 010h, 010h, 000h ; #24 + DB 000h, 010h, 010h, 010h, 054h, 038h, 010h, 000h ; #25 + DB 000h, 008h, 004h, 0FEh, 004h, 008h, 000h, 000h ; #26 + DB 000h, 020h, 040h, 0FEh, 040h, 020h, 000h, 000h ; #27 + DB 000h, 000h, 080h, 080h, 080h, 0FCh, 000h, 000h ; #28 + DB 000h, 024h, 042h, 0FFh, 042h, 024h, 000h, 000h ; #29 + DB 000h, 000h, 010h, 038h, 07Ch, 0FEh, 000h, 000h ; #30 + DB 000h, 000h, 0FEh, 07Ch, 038h, 010h, 000h, 000h ; #31 + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; + DB 010h, 010h, 010h, 010h, 010h, 000h, 010h, 000h ; ! + DB 000h, 024h, 024h, 000h, 000h, 000h, 000h, 000h ; " + DB 024h, 024h, 07Eh, 024h, 07Eh, 024h, 024h, 000h ; # + DB 038h, 054h, 050h, 038h, 014h, 054h, 038h, 010h ; $ + DB 000h, 002h, 044h, 008h, 010h, 020h, 042h, 000h ; % + DB 038h, 044h, 038h, 060h, 094h, 088h, 074h, 000h ; & + DB 020h, 020h, 040h, 000h, 000h, 000h, 000h, 000h ; ' + DB 010h, 020h, 040h, 040h, 040h, 020h, 010h, 000h ; ( + DB 040h, 020h, 010h, 010h, 010h, 020h, 040h, 000h ; ) + DB 000h, 024h, 018h, 07Eh, 018h, 024h, 000h, 000h ; * + DB 000h, 010h, 010h, 07Ch, 010h, 010h, 000h, 000h ; + + DB 000h, 000h, 000h, 000h, 000h, 010h, 010h, 020h ; , + DB 000h, 000h, 000h, 0FCh, 000h, 000h, 000h, 000h ; - + DB 000h, 000h, 000h, 000h, 000h, 000h, 010h, 000h ; . + DB 000h, 004h, 008h, 010h, 020h, 040h, 080h, 000h ; / + DB 07Ch, 0C6h, 08Ah, 092h, 0A2h, 0C6h, 07Ch, 000h ; 0 + DB 010h, 030h, 010h, 010h, 010h, 010h, 038h, 000h ; 1 + DB 078h, 084h, 004h, 018h, 060h, 080h, 0FCh, 000h ; 2 + DB 078h, 084h, 004h, 038h, 004h, 084h, 078h, 000h ; 3 + DB 01Ch, 024h, 044h, 084h, 0FEh, 004h, 00Eh, 000h ; 4 + DB 0FCh, 080h, 0F8h, 004h, 004h, 084h, 078h, 000h ; 5 + DB 078h, 084h, 080h, 0F8h, 084h, 084h, 078h, 000h ; 6 + DB 0FCh, 004h, 004h, 008h, 010h, 020h, 020h, 000h ; 7 + DB 078h, 084h, 084h, 078h, 084h, 084h, 078h, 000h ; 8 + DB 078h, 084h, 084h, 07Ch, 004h, 084h, 078h, 000h ; 9 + DB 000h, 000h, 010h, 000h, 000h, 000h, 010h, 000h ; : + DB 000h, 000h, 010h, 000h, 000h, 010h, 010h, 020h ; ; + DB 008h, 010h, 020h, 040h, 020h, 010h, 008h, 000h ; < + DB 000h, 000h, 0FCh, 000h, 000h, 0FCh, 000h, 000h ; = + DB 040h, 020h, 010h, 008h, 010h, 020h, 040h, 000h ; > + DB 078h, 084h, 004h, 008h, 010h, 000h, 010h, 000h ; ? + DB 07Ch, 082h, 0BAh, 0A6h, 0BEh, 080h, 07Ch, 000h ; @ + DB 078h, 084h, 084h, 0FCh, 084h, 084h, 084h, 000h ; A + DB 0F8h, 084h, 084h, 0F8h, 084h, 084h, 0F8h, 000h ; B + DB 078h, 084h, 080h, 080h, 080h, 084h, 078h, 000h ; C + DB 0F0h, 088h, 084h, 084h, 084h, 088h, 0F0h, 000h ; D + DB 0FCh, 080h, 080h, 0F0h, 080h, 080h, 0FCh, 000h ; E + DB 0FCh, 080h, 080h, 0F0h, 080h, 080h, 080h, 000h ; F + DB 078h, 084h, 080h, 09Ch, 084h, 084h, 078h, 000h ; G + DB 084h, 084h, 084h, 0FCh, 084h, 084h, 084h, 000h ; H + DB 038h, 010h, 010h, 010h, 010h, 010h, 038h, 000h ; I + DB 01Ch, 008h, 008h, 008h, 088h, 088h, 070h, 000h ; J + DB 084h, 088h, 090h, 0E0h, 090h, 088h, 084h, 000h ; K + DB 080h, 080h, 080h, 080h, 080h, 080h, 0FCh, 000h ; L + DB 0C6h, 0AAh, 092h, 082h, 082h, 082h, 082h, 000h ; M + DB 082h, 0C2h, 0A2h, 092h, 08Ah, 086h, 082h, 000h ; N + DB 078h, 084h, 084h, 084h, 084h, 084h, 078h, 000h ; O + DB 0F8h, 084h, 084h, 0F8h, 080h, 080h, 080h, 000h ; P + DB 078h, 084h, 084h, 084h, 094h, 088h, 076h, 000h ; Q + DB 0F8h, 084h, 084h, 0F8h, 090h, 088h, 084h, 000h ; R + DB 078h, 084h, 080h, 078h, 004h, 084h, 078h, 000h ; S + DB 0FEh, 010h, 010h, 010h, 010h, 010h, 010h, 000h ; T + DB 084h, 084h, 084h, 084h, 084h, 084h, 078h, 000h ; U + DB 084h, 084h, 084h, 084h, 084h, 048h, 030h, 000h ; V + DB 082h, 082h, 082h, 082h, 092h, 0AAh, 0C6h, 000h ; W + DB 082h, 044h, 028h, 010h, 028h, 044h, 082h, 000h ; X + DB 044h, 044h, 044h, 038h, 010h, 010h, 010h, 000h ; Y + DB 0FEh, 004h, 008h, 010h, 020h, 040h, 0FEh, 000h ; Z + DB 078h, 040h, 040h, 040h, 040h, 040h, 078h, 000h ; [ + DB 000h, 080h, 040h, 020h, 010h, 008h, 004h, 000h ; \ + DB 078h, 008h, 008h, 008h, 008h, 008h, 078h, 000h ; ] + DB 010h, 028h, 044h, 082h, 000h, 000h, 000h, 000h ; ^ + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh ; _ + DB 020h, 020h, 010h, 000h, 000h, 000h, 000h, 000h ; ` + DB 000h, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; a + DB 000h, 040h, 040h, 078h, 044h, 044h, 078h, 000h ; b + DB 000h, 000h, 03Ch, 040h, 040h, 040h, 03Ch, 000h ; c + DB 000h, 004h, 004h, 03Ch, 044h, 044h, 03Ch, 000h ; d + DB 000h, 000h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; e + DB 000h, 00Ch, 010h, 03Ch, 010h, 010h, 010h, 000h ; f + DB 000h, 000h, 03Ch, 044h, 044h, 03Ch, 004h, 038h ; g + DB 000h, 040h, 040h, 078h, 044h, 044h, 044h, 000h ; h + DB 000h, 010h, 000h, 010h, 010h, 010h, 010h, 000h ; i + DB 000h, 004h, 000h, 004h, 004h, 004h, 044h, 038h ; j + DB 000h, 040h, 040h, 050h, 060h, 050h, 048h, 000h ; k + DB 000h, 030h, 010h, 010h, 010h, 010h, 010h, 000h ; l + DB 000h, 000h, 068h, 054h, 054h, 044h, 044h, 000h ; m + DB 000h, 000h, 078h, 044h, 044h, 044h, 044h, 000h ; n + DB 000h, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; o + DB 000h, 000h, 078h, 044h, 044h, 078h, 040h, 040h ; p + DB 000h, 000h, 03Ch, 044h, 044h, 03Ch, 004h, 004h ; q + DB 000h, 000h, 05Ch, 060h, 040h, 040h, 040h, 000h ; r + DB 000h, 000h, 038h, 040h, 07Ch, 004h, 07Ch, 000h ; s + DB 000h, 010h, 038h, 010h, 010h, 010h, 018h, 000h ; t + DB 000h, 000h, 044h, 044h, 044h, 044h, 038h, 000h ; u + DB 000h, 000h, 044h, 044h, 044h, 028h, 010h, 000h ; v + DB 000h, 000h, 044h, 044h, 054h, 054h, 06Ch, 000h ; w + DB 000h, 000h, 044h, 028h, 010h, 028h, 044h, 000h ; x + DB 000h, 000h, 044h, 044h, 044h, 03Ch, 004h, 07Ch ; y + DB 000h, 000h, 07Ch, 004h, 038h, 040h, 07Ch, 000h ; z + DB 000h, 008h, 010h, 010h, 030h, 010h, 010h, 008h ; { + DB 000h, 010h, 010h, 010h, 000h, 010h, 010h, 010h ; | + DB 000h, 020h, 010h, 010h, 018h, 010h, 010h, 020h ; } + DB 064h, 098h, 000h, 000h, 000h, 000h, 000h, 000h ; ~ + DB 000h, 010h, 028h, 044h, 082h, 082h, 0FEh, 000h ;  + DB 07Ch, 080h, 080h, 080h, 080h, 07Ch, 004h, 07Ch ; #128 + DB 000h, 028h, 000h, 044h, 044h, 044h, 038h, 000h ; #129 + DB 03Ch, 000h, 07Ch, 044h, 07Ch, 040h, 07Ch, 000h ; #130 + DB 07Eh, 081h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #131 + DB 024h, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #132 + DB 078h, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #133 + DB 018h, 018h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #134 + DB 000h, 000h, 078h, 080h, 080h, 078h, 008h, 038h ; #135 + DB 07Ch, 082h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; #136 + DB 048h, 000h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; #137 + DB 078h, 000h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; #138 + DB 000h, 028h, 000h, 010h, 010h, 010h, 010h, 000h ; #139 + DB 010h, 028h, 000h, 010h, 010h, 010h, 010h, 000h ; #140 + DB 000h, 030h, 000h, 010h, 010h, 010h, 010h, 000h ; #141 + DB 048h, 000h, 078h, 084h, 0FCh, 084h, 084h, 000h ; #142 + DB 030h, 030h, 078h, 084h, 0FCh, 084h, 084h, 000h ; #143 + DB 038h, 000h, 0FCh, 080h, 0F0h, 080h, 0FCh, 000h ; #144 + DB 000h, 000h, 07Eh, 008h, 07Eh, 048h, 07Eh, 000h ; #145 + DB 07Eh, 090h, 090h, 0FCh, 090h, 090h, 09Eh, 000h ; #146 + DB 07Ch, 082h, 038h, 044h, 044h, 044h, 038h, 000h ; #147 + DB 028h, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; #148 + DB 070h, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; #149 + DB 038h, 044h, 000h, 044h, 044h, 044h, 038h, 000h ; #150 + DB 070h, 000h, 044h, 044h, 044h, 044h, 038h, 000h ; #151 + DB 028h, 000h, 044h, 044h, 044h, 03Ch, 004h, 07Ch ; #152 + DB 048h, 000h, 078h, 084h, 084h, 084h, 078h, 000h ; #153 + DB 048h, 000h, 084h, 084h, 084h, 084h, 078h, 000h ; #154 + DB 000h, 010h, 038h, 040h, 040h, 040h, 038h, 010h ; #155 + DB 038h, 044h, 040h, 0E0h, 040h, 040h, 082h, 0FCh ; #156 + DB 044h, 07Ch, 010h, 07Ch, 010h, 07Ch, 010h, 000h ; #157 + DB 0F0h, 088h, 08Ah, 0F7h, 082h, 082h, 082h, 000h ; #158 + DB 00Ch, 012h, 010h, 018h, 030h, 010h, 090h, 060h ; #159 + DB 03Ch, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #160 + DB 000h, 018h, 000h, 010h, 010h, 010h, 010h, 000h ; #161 + DB 01Ch, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; #162 + DB 01Ch, 000h, 044h, 044h, 044h, 044h, 038h, 000h ; #163 + DB 07Ch, 000h, 078h, 044h, 044h, 044h, 044h, 000h ; #164 + DB 07Ch, 000h, 044h, 064h, 054h, 04Ch, 044h, 000h ; #165 + DB 018h, 024h, 024h, 01Eh, 000h, 03Eh, 000h, 000h ; #166 + DB 01Ch, 022h, 022h, 01Ch, 000h, 03Eh, 000h, 000h ; #167 + DB 010h, 000h, 010h, 020h, 040h, 042h, 03Ch, 000h ; #168 + DB 000h, 000h, 000h, 0FCh, 080h, 080h, 000h, 000h ; #169 + DB 000h, 000h, 000h, 0FCh, 004h, 004h, 000h, 000h ; #170 + DB 040h, 044h, 048h, 057h, 021h, 047h, 004h, 007h ; #171 + DB 040h, 044h, 048h, 052h, 026h, 04Ah, 01Fh, 002h ; #172 + DB 010h, 000h, 010h, 010h, 010h, 010h, 010h, 000h ; #173 + DB 000h, 024h, 048h, 090h, 048h, 024h, 000h, 000h ; #174 + DB 000h, 048h, 024h, 012h, 024h, 048h, 000h, 000h ; #175 + DB 022h, 088h, 022h, 088h, 022h, 088h, 022h, 088h ; #176 + DB 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh ; #177 + DB 0DBh, 077h, 0DBh, 0EEh, 0DBh, 077h, 0DBh, 0EEh ; #178 + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h ; #179 + DB 018h, 018h, 018h, 018h, 0F8h, 018h, 018h, 018h ; #180 + DB 018h, 018h, 0F8h, 018h, 0F8h, 018h, 018h, 018h ; #181 + DB 036h, 036h, 036h, 036h, 0F6h, 036h, 036h, 036h ; #182 + DB 000h, 000h, 000h, 000h, 0FEh, 036h, 036h, 036h ; #183 + DB 000h, 000h, 0F8h, 018h, 0F8h, 018h, 018h, 018h ; #184 + DB 036h, 036h, 0F6h, 006h, 0F6h, 036h, 036h, 036h ; #185 + DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h ; #186 + DB 000h, 000h, 0FEh, 006h, 0F6h, 036h, 036h, 036h ; #187 + DB 036h, 036h, 0F6h, 006h, 0FEh, 000h, 000h, 000h ; #188 + DB 036h, 036h, 036h, 036h, 0FEh, 000h, 000h, 000h ; #189 + DB 018h, 018h, 0F8h, 018h, 0F8h, 000h, 000h, 000h ; #190 + DB 000h, 000h, 000h, 000h, 0F8h, 018h, 018h, 018h ; #191 + DB 018h, 018h, 018h, 018h, 01Fh, 000h, 000h, 000h ; #192 + DB 018h, 018h, 018h, 018h, 0FFh, 000h, 000h, 000h ; #193 + DB 000h, 000h, 000h, 000h, 0FFh, 018h, 018h, 018h ; #194 + DB 018h, 018h, 018h, 018h, 01Fh, 018h, 018h, 018h ; #195 + DB 000h, 000h, 000h, 000h, 0FFh, 000h, 000h, 000h ; #196 + DB 018h, 018h, 018h, 018h, 0FFh, 018h, 018h, 018h ; #197 + DB 018h, 018h, 01Fh, 018h, 01Fh, 018h, 018h, 018h ; #198 + DB 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h ; #199 + DB 036h, 036h, 037h, 030h, 03Fh, 000h, 000h, 000h ; #200 + DB 000h, 000h, 03Fh, 030h, 037h, 036h, 036h, 036h ; #201 + DB 036h, 036h, 0F7h, 000h, 0FFh, 000h, 000h, 000h ; #202 + DB 000h, 000h, 0FFh, 000h, 0F7h, 036h, 036h, 036h ; #203 + DB 036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h ; #204 + DB 000h, 000h, 0FFh, 000h, 0FFh, 000h, 000h, 000h ; #205 + DB 036h, 036h, 0F7h, 000h, 0F7h, 036h, 036h, 036h ; #206 + DB 018h, 018h, 0FFh, 000h, 0FFh, 000h, 000h, 000h ; #207 + DB 036h, 036h, 036h, 036h, 0FFh, 000h, 000h, 000h ; #208 + DB 000h, 000h, 0FFh, 000h, 0FFh, 018h, 018h, 018h ; #209 + DB 000h, 000h, 000h, 000h, 0FFh, 036h, 036h, 036h ; #210 + DB 036h, 036h, 036h, 036h, 03Fh, 000h, 000h, 000h ; #211 + DB 018h, 018h, 01Fh, 018h, 01Fh, 000h, 000h, 000h ; #212 + DB 000h, 000h, 01Fh, 018h, 01Fh, 018h, 018h, 018h ; #213 + DB 000h, 000h, 000h, 000h, 03Fh, 036h, 036h, 036h ; #214 + DB 036h, 036h, 036h, 036h, 0FFh, 036h, 036h, 036h ; #215 + DB 018h, 018h, 0FFh, 018h, 0FFh, 018h, 018h, 018h ; #216 + DB 018h, 018h, 018h, 018h, 0F8h, 000h, 000h, 000h ; #217 + DB 000h, 000h, 000h, 000h, 01Fh, 018h, 018h, 018h ; #218 + DB 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ; #219 + DB 000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh ; #220 + DB 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h ; #221 + DB 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh ; #222 + DB 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 000h, 000h ; #223 + DB 000h, 000h, 062h, 094h, 088h, 094h, 062h, 000h ; #224 + DB 000h, 0F0h, 088h, 0F0h, 088h, 088h, 0F0h, 080h ; #225 + DB 000h, 0F8h, 088h, 080h, 080h, 080h, 080h, 000h ; #226 + DB 000h, 0FCh, 048h, 048h, 048h, 048h, 048h, 000h ; #227 + DB 0FCh, 084h, 040h, 020h, 040h, 084h, 0FCh, 000h ; #228 + DB 03Ch, 040h, 038h, 044h, 044h, 044h, 038h, 000h ; #229 + DB 000h, 000h, 044h, 044h, 044h, 078h, 040h, 040h ; #230 + DB 000h, 036h, 048h, 008h, 008h, 008h, 008h, 000h ; #231 + DB 038h, 010h, 038h, 044h, 044h, 038h, 010h, 038h ; #232 + DB 078h, 084h, 084h, 0FCh, 084h, 084h, 078h, 000h ; #233 + DB 078h, 084h, 084h, 084h, 048h, 048h, 0CCh, 000h ; #234 + DB 078h, 004h, 038h, 044h, 044h, 044h, 038h, 000h ; #235 + DB 000h, 000h, 06Ch, 092h, 092h, 06Ch, 000h, 000h ; #236 + DB 000h, 000h, 03Ah, 044h, 05Ah, 022h, 05Ch, 000h ; #237 + DB 018h, 020h, 040h, 078h, 040h, 020h, 018h, 000h ; #238 + DB 078h, 084h, 084h, 084h, 084h, 084h, 084h, 000h ; #239 + DB 000h, 0FCh, 000h, 0FCh, 000h, 0FCh, 000h, 000h ; #240 + DB 020h, 020h, 0F8h, 020h, 020h, 000h, 0F8h, 000h ; #241 + DB 020h, 010h, 008h, 010h, 020h, 000h, 07Ch, 000h ; #242 + DB 008h, 010h, 020h, 010h, 008h, 000h, 07Ch, 000h ; #243 + DB 00Ch, 012h, 010h, 010h, 010h, 010h, 010h, 010h ; #244 + DB 010h, 010h, 010h, 010h, 010h, 010h, 090h, 060h ; #245 + DB 000h, 010h, 000h, 07Ch, 000h, 010h, 000h, 000h ; #246 + DB 000h, 032h, 04Ch, 000h, 032h, 04Ch, 000h, 000h ; #247 + DB 038h, 044h, 044h, 038h, 000h, 000h, 000h, 000h ; #248 + DB 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h ; #249 + DB 000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h ; #250 + DB 00Eh, 008h, 008h, 008h, 048h, 028h, 018h, 008h ; #251 + DB 038h, 024h, 024h, 024h, 024h, 000h, 000h, 000h ; #252 + DB 03Ch, 004h, 03Ch, 020h, 03Ch, 000h, 000h, 000h ; #253 + DB 000h, 000h, 03Ch, 03Ch, 03Ch, 03Ch, 000h, 000h ; #254 + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; #255 diff --git a/16/xw__/makefile b/16/xw__/makefile new file mode 100755 index 00000000..cfe15232 --- /dev/null +++ b/16/xw__/makefile @@ -0,0 +1,132 @@ +# +# MODEX library makefile (for Borland MAKE) +# Copyright (c) 1993,1994 by Alessandro Scotti +# +!ifdef __LINUX__ +REMOVECOMMAND=rm -f +COPYCOMMAND=cp -f +DIRSEP=/ +OBJ=o +!else +REMOVECOMMAND=del +COPYCOMMAND=copy /y +DIRSEP=\ +OBJ=obj +!endif +LIBINCS = modex.def + +LIBOBJS = mxbb.$(OBJ) mxcc.$(OBJ) mxcg.$(OBJ) mxcl.$(OBJ) mxcr.$(OBJ) mxfb.$(OBJ) mxgc.$(OBJ) mxgi.$(OBJ) mxgm.$(OBJ) mxgp.$(OBJ) mxgv.$(OBJ) mxhl.$(OBJ) mxit.$(OBJ) mxll.$(OBJ) mxln.$(OBJ) mxot.$(OBJ) mxpb.$(OBJ) mxpf.$(OBJ) mxpg.$(OBJ) mxpi.$(OBJ) mxpn.$(OBJ) mxpp.$(OBJ) mxra.$(OBJ) mxrp.$(OBJ) mxsa.$(OBJ) mxsc.$(OBJ) mxsi.$(OBJ) mxsl.$(OBJ) mxsm.$(OBJ) mxsp.$(OBJ) mxss.$(OBJ) mxtl.$(OBJ) mxvs.$(OBJ) mxwd.$(OBJ) mxwm.$(OBJ) mxwp.$(OBJ) mxwr.$(OBJ) +#mxfp.$(OBJ) +# +# ASM compiler +# +ASMC =wasm +ASMO =-mh -0 + +# +# PAS compiler +# +#PASC = tpc +#PASO = /m -$D- -$L- -$S- + +# +# LIB maker, uses response file +# +LIBC = wlib + +# .asm.obj: +# $(ASMC) $(ASMO) $< + +mxbb.$(OBJ): mxbb.asm + $(ASMC) $(ASMO) mxbb.asm +mxcc.$(OBJ): mxcc.asm + $(ASMC) $(ASMO) mxcc.asm +mxcg.$(OBJ): mxcg.asm + $(ASMC) $(ASMO) mxcg.asm +mxcl.$(OBJ): mxcl.asm + $(ASMC) $(ASMO) mxcl.asm +mxcr.$(OBJ): mxcr.asm + $(ASMC) $(ASMO) mxcr.asm +mxfb.$(OBJ): mxfb.asm + $(ASMC) $(ASMO) mxfb.asm +mxfp.$(OBJ): mxfp.asm + $(ASMC) $(ASMO) mxfp.asm +mxgc.$(OBJ): mxgc.asm + $(ASMC) $(ASMO) mxgc.asm +mxgi.$(OBJ): mxgi.asm + $(ASMC) $(ASMO) mxgi.asm +mxgm.$(OBJ): mxgm.asm + $(ASMC) $(ASMO) mxgm.asm +mxgp.$(OBJ): mxgp.asm + $(ASMC) $(ASMO) mxgp.asm +mxgv.$(OBJ): mxgv.asm + $(ASMC) $(ASMO) mxgv.asm +mxhl.$(OBJ): mxhl.asm + $(ASMC) $(ASMO) mxhl.asm +mxit.$(OBJ): mxit.asm + $(ASMC) $(ASMO) mxit.asm +mxll.$(OBJ): mxll.asm + $(ASMC) $(ASMO) mxll.asm +mxln.$(OBJ): mxln.asm + $(ASMC) $(ASMO) mxln.asm +mxot.$(OBJ): mxot.asm + $(ASMC) $(ASMO) mxot.asm +mxpb.$(OBJ): mxpb.asm + $(ASMC) $(ASMO) mxpb.asm +mxpf.$(OBJ): mxpf.asm + $(ASMC) $(ASMO) mxpf.asm +mxpg.$(OBJ): mxpg.asm + $(ASMC) $(ASMO) mxpg.asm +mxpi.$(OBJ): mxpi.asm + $(ASMC) $(ASMO) mxpi.asm +mxpn.$(OBJ): mxpn.asm + $(ASMC) $(ASMO) mxpn.asm +mxpp.$(OBJ): mxpp.asm + $(ASMC) $(ASMO) mxpp.asm +mxra.$(OBJ): mxra.asm + $(ASMC) $(ASMO) mxra.asm +mxrp.$(OBJ): mxrp.asm + $(ASMC) $(ASMO) mxrp.asm +mxsa.$(OBJ): mxsa.asm + $(ASMC) $(ASMO) mxsa.asm +mxsc.$(OBJ): mxsc.asm + $(ASMC) $(ASMO) mxsc.asm +mxsi.$(OBJ): mxsi.asm + $(ASMC) $(ASMO) mxsi.asm +mxsl.$(OBJ): mxsl.asm + $(ASMC) $(ASMO) mxsl.asm +mxsm.$(OBJ): mxsm.asm + $(ASMC) $(ASMO) mxsm.asm +mxsp.$(OBJ): mxsp.asm + $(ASMC) $(ASMO) mxsp.asm +mxss.$(OBJ): mxss.asm + $(ASMC) $(ASMO) mxss.asm +mxtl.$(OBJ): mxtl.asm + $(ASMC) $(ASMO) mxtl.asm +mxvs.$(OBJ): mxvs.asm + $(ASMC) $(ASMO) mxvs.asm +mxwd.$(OBJ): mxwd.asm + $(ASMC) $(ASMO) mxwd.asm +mxwm.$(OBJ): mxwm.asm + $(ASMC) $(ASMO) mxwm.asm +mxwp.$(OBJ): mxwp.asm + $(ASMC) $(ASMO) mxwp.asm +mxwr.$(OBJ): mxwr.asm + $(ASMC) $(ASMO) mxwr.asm + +all: $(LIBOBJS) modex.lib +# modex.tpu modex.tpp + +#modex.tpu: $(LIBOBJS) modex.pas +# $(PASC) $(PASO) modex +# copy modex.tpu .. +# copy modex.pas .. + +#modex.tpp: $(LIBOBJS) modex.pas +# $(PASC) /cp $(PASO) modex +# copy modex.tpp .. + +modex.lib: modex.lbr $(LIBOBJS) + $(LIBC) modex.lib @modex.lbr + +$(LIBOBJS): modex.def diff --git a/16/xw__/makefile.bcc b/16/xw__/makefile.bcc new file mode 100755 index 00000000..d3ad8b71 --- /dev/null +++ b/16/xw__/makefile.bcc @@ -0,0 +1,81 @@ +# +# MODEX library makefile (for Borland MAKE) +# Copyright (c) 1993,1994 by Alessandro Scotti +# +LIBINCS = MODEX.DEF + +LIBOBJS = MXBB.OBJ \ + MXCC.OBJ \ + MXCG.OBJ \ + MXCL.OBJ \ + MXCR.OBJ \ + MXFB.OBJ \ + MXFP.OBJ \ + MXGC.OBJ \ + MXGI.OBJ \ + MXGM.OBJ \ + MXGP.OBJ \ + MXGV.OBJ \ + MXHL.OBJ \ + MXIT.OBJ \ + MXLL.OBJ \ + MXLN.OBJ \ + MXOT.OBJ \ + MXPB.OBJ \ + MXPF.OBJ \ + MXPG.OBJ \ + MXPI.OBJ \ + MXPN.OBJ \ + MXPP.OBJ \ + MXRA.OBJ \ + MXRP.OBJ \ + MXSA.OBJ \ + MXSC.OBJ \ + MXSI.OBJ \ + MXSL.OBJ \ + MXSM.OBJ \ + MXSP.OBJ \ + MXSS.OBJ \ + MXTL.OBJ \ + MXVS.OBJ \ + MXWD.OBJ \ + MXWM.OBJ \ + MXWP.OBJ \ + MXWR.OBJ + +# +# ASM compiler +# +ASMC = tasm +ASMO = /m5 /p + +# +# PAS compiler +# +PASC = tpc +PASO = /m -$D- -$L- -$S- + +# +# LIB maker, uses response file +# +LIBC = tlib + +.asm.obj: + $(ASMC) $(ASMO) $< + +target: modex.lib +# modex.tpu modex.tpp + +#modex.tpu: $(LIBOBJS) modex.pas +# $(PASC) $(PASO) modex +# copy modex.tpu .. +# copy modex.pas .. + +#modex.tpp: $(LIBOBJS) modex.pas +# $(PASC) /cp $(PASO) modex +# copy modex.tpp .. + +modex.lib: modex.lbr $(LIBOBJS) + $(LIBC) modex.lib @modex.lbr + +$(LIBOBJS): modex.def diff --git a/16/xw__/modex.bak b/16/xw__/modex.bak new file mode 100755 index 0000000000000000000000000000000000000000..560a1c68304c56844f41325820f296a21192ac4e GIT binary patch literal 25600 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 literal 0 HcmV?d00001 diff --git a/16/xw__/modex.def b/16/xw__/modex.def new file mode 100755 index 00000000..7977a4a0 --- /dev/null +++ b/16/xw__/modex.def @@ -0,0 +1,163 @@ +;------------------------------------------------------------ +; +; MODEX.DEF - Include file +; Copyright (c) 1993-1994 by Alessandro Scotti +; +;JUMPS +;LOCALS + +TRUE EQU 1 ; Boolean constants +FALSE EQU 0 + +USE286 = FALSE ; TRUE enables 80286 instructions +USE386 = FALSE ; TRUE enables 80386 (and 80286) instructions + +IF USE286 EQ TRUE + P286 +ENDIF + +IF USE386 EQ TRUE + P386 + USE286 = TRUE +ENDIF + +MXVERSION EQU 0128h ; Library version (1.40) + +;------------------------------------------------------------ +; +; VGA definitions +; +MISC EQU 3C2h ; Miscellaneous output +TS EQU 3C4h ; Timing Sequencer index register +GDC EQU 3CEh ; Graphics Data Controller index register +CRTC EQU 3D4h ; CRTC index register +STATUS EQU 3DAh ; Input Status register one + +;------------------------------------------------------------ +; +; Raster operators +; +OP_SET EQU 0 +OP_MOVE EQU 0 ; Same as OP_SET +OP_AND EQU 1 +OP_OR EQU 2 +OP_XOR EQU 3 +OP_TRANS EQU 4 +OP_ADD EQU 5 ; Must be last op + +;------------------------------------------------------------ +; +; Polygon fill functions +; +POLYSCANBUFSIZE EQU 4*1024 + +;------------------------------------------------------------ +; Macro to push registers, variables or flags onto the stack +; Usage: .push "loc16"[,"loc16"...] +; where "loc16" is a 16-bit register, a word-sized variable or the +; keyword "FLAGS". +; Exmpl: .push ax, flags, var1 +; .pop ax, flags, var1 +; +.push MACRO r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 + IFNB + .ERROR <.PUSH has more than 10 arguments> + ENDIF + IRP $reg, + IFB <$reg> ;; Is argument blank? + EXITM ;; Yes, exit + ELSEIFIDNI <$reg>, ;; Is argument the keyword "FLAGS"? + pushf ;; Yes, push flags + ELSE + push $reg ;; Push argument + ENDIF + ENDM +ENDM + +;------------------------------------------------------------ +; Macro to pop registers, variables or flags from the stack +; Usage: .pop "loc16"[,"loc16"...] +; where "loc16" is a 16-bit register, a word-sized variable or the +; keyword "FLAGS". +; Exmpl: .push ax, flags, var1 +; .pop ax, flags, var1 +; +.pop MACRO r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 + IFNB + .ERROR <.POP has more than 10 arguments> + ENDIF + IRP $reg, + IFNB <$reg> ;; Is argument non-blank? + IFIDNI <$reg>, ;; Yes, is it the keyword "FLAGS"? + popf ;; Yes, pop flags + ELSE + pop $reg ;; Pop argument + ENDIF + ENDIF + ENDM +ENDM + +;------------------------------------------------------------ +; +.enter MACRO localsize + IF USE286 EQ TRUE + enter localsize, 0 + ELSE + push bp + mov bp, sp + sub sp, localsize + ENDIF +ENDM + +;------------------------------------------------------------ +; +;.leave MACRO argsize +; IF USE286 EQ TRUE +; leave +; ELSE +; mov sp, bp +; pop bp +; ENDIF +; IFNB +; ret argsize +; ELSE +; ret +; ENDIF +;ENDM + +;------------------------------------------------------------ +; +;.shr MACRO arg, count +; IF USE286 EQ TRUE +; shr arg, count +; ELSE +; $temp = count +; WHILE $temp GT 0 +; shr arg, 1 +; $temp = $temp-1 +; ENDM +; ENDIF +;ENDM + +;------------------------------------------------------------ +; +;.shl MACRO arg, count +; IF USE286 EQ TRUE +; shl arg, count +; ELSE +; $temp = count +; WHILE $temp GT 0 +; shl arg, 1 +; $temp = $temp-1 +; ENDM +; ENDIF +;ENDM + +;------------------------------------------------------------ +; +;.chk386 MACRO name, jump +; IF USE386 EQ FALSE +; .OUT "Warning: ", , " needs a 386 or better to run!" +; jmp @@jump +; ENDIF +;ENDM diff --git a/16/xw__/modex.h b/16/xw__/modex.h new file mode 100755 index 00000000..2c1f1ebe --- /dev/null +++ b/16/xw__/modex.h @@ -0,0 +1,153 @@ +/* + MODEX.H - C/C++ include file for the MODEX library + Copyright (c) 1994 Alessandro Scotti +*/ + +#ifndef _MODEX_H_ // Avoid nested inclusions +#define _MODEX_H_ + +// +// Video modes +// +#define MX_TEXT 0 // 80x25 text +#define MX_320x175 1 // 320x175x256 +#define MX_320x200 2 // 320x200x256, 4 pages, aspect 6:5 +#define MX_320x240 3 // 320x240x256, 3 pages, aspect 1:1 +#define MX_320x350 4 // 320x350x256 +#define MX_320x400 5 // 320x400x256, 2 pages +#define MX_320x480 6 // 320x480x256, 1 page +#define MX_360x175 7 // 360x175x256 +#define MX_360x200 8 // 360x200x256, 3 pages +#define MX_360x240 9 // 360x240x256, 2 pages +#define MX_360x350 10 // 360x350x256 +#define MX_360x400 11 // 360x400x256, 1 page +#define MX_360x480 12 // 360x480x256, 1 page +#define MX_400x600 13 // 400x600x256, 1 page + +// +// Fade effects +// +#define MX_FADEIN 0 +#define MX_FADEOUT 1 + +// +// Raster ops +// +#define OP_SET 0 // No operator +#define OP_AND 1 // And +#define OP_OR 2 // Or +#define OP_XOR 3 // Xor +#define OP_TRANS 4 // Transparent +#define OP_ADD 5 // Additive +#define OP_MOVE 0 // Alias for OP_SET + +// +// Temporary definitions +// +#define MXBYTE unsigned char +#define MXBOOL short int +#define MXSINT short int +#define MXUINT unsigned short int +#define MXAPI far pascal +#define MXPTR void far * + +// Functions + +#ifdef __cplusplus // Avoid C++ name mangling +extern "C" { +#endif + +// +// Initialization +// +MXSINT MXAPI mxInit( void ); // Returns 0 if successful +void MXAPI mxTerm( void ); +MXUINT MXAPI mxGetVersion( void ); +// +// Mode setting +// +void MXAPI mxChangeMode( MXUINT mode ); +void MXAPI mxSetMode( MXUINT mode ); +void MXAPI mxGetAspect( MXUINT far *aspectx, MXUINT far *aspecty ); +void MXAPI mxGetScreenSize( MXUINT far *width, MXUINT far *height ); +// +// Hardware support +// +void MXAPI mxWriteMode( MXBYTE wm ); +void MXAPI mxSplitScreen( MXUINT line ); +void MXAPI mxStartAddress( MXUINT sa ); +void MXAPI mxStartLine( MXUINT sl ); +void MXAPI mxWaitDisplay( void ); +void MXAPI mxWaitRetrace( void ); +void MXAPI mxWritePlane( MXBYTE wp ); +void MXAPI mxReadPlane( MXBYTE rp ); +void MXAPI mxRowAddress( MXBYTE ra ); +// +// Virtual screen +// +void MXAPI mxGetVirtualScreen( MXUINT far *width, MXUINT far *height ); +void MXAPI mxSetVirtualScreen( MXUINT width, MXUINT height ); +void MXAPI mxPan( MXUINT x, MXUINT y ); +// +// Clipping +// +MXBOOL MXAPI mxGetClip( void ); +MXBOOL MXAPI mxGetClipRegion( MXSINT far *x, MXSINT far *y, MXSINT far *w, MXSINT far *h ); +MXBOOL MXAPI mxSetClip( MXBOOL ); +void MXAPI mxSetClipRegion( MXUINT x, MXUINT y, MXUINT width, MXUINT height ); +// +// Graphics +// +void MXAPI mxBitBlt( MXSINT sx, MXSINT sy, MXUINT width, MXUINT height, MXSINT dx, MXSINT dy ); +void MXAPI mxFillBox( MXSINT x, MXSINT y, MXUINT width, MXUINT height, MXUINT color, MXUINT op ); +MXBYTE MXAPI mxGetPixel( MXSINT x, MXSINT y ); +void MXAPI mxPutPixel( MXSINT x, MXSINT y, MXBYTE color ); +void MXAPI mxLine( MXSINT x1, MXSINT y1, MXSINT x2, MXSINT y2, MXUINT color, MXUINT op ); +void MXAPI mxGetImage( MXPTR img, MXSINT x, MXSINT y, MXUINT width, MXUINT height ); +void MXAPI mxPutImage( MXPTR img, MXSINT x, MXSINT y, MXUINT w, MXUINT h, MXUINT op ); +void MXAPI mxPutTile( MXPTR tile, MXSINT x, MXSINT y, MXUINT width, MXUINT height ); +void MXAPI mxTransPutTile( MXPTR tile, MXSINT x, MXSINT y, MXUINT w, MXUINT h ); +void MXAPI mxCircle( MXSINT x, MXSINT y, MXUINT radius, MXBYTE color ); +void MXAPI mxStretchImage( MXPTR img, MXSINT x, MXSINT y, MXUINT w, MXUINT h, MXUINT neww, MXUINT newh, MXUINT op ); +// +// Palette +// +void MXAPI mxColorToGray( MXPTR source, MXPTR dest, MXUINT count ); +void MXAPI mxGammaCorrect( MXPTR source, MXPTR dest, MXUINT count ); +void MXAPI mxGetColor( MXUINT index, MXSINT far *r, MXSINT far *g, MXSINT far *b ); +void MXAPI mxSetColor( MXUINT index, MXSINT red, MXSINT green, MXSINT blue ); +void MXAPI mxGetPalette( MXPTR palette, MXUINT index, MXUINT count ); +void MXAPI mxSetPalette( MXPTR palette, MXUINT index, MXUINT count ); +void MXAPI mxFadePalette( MXPTR, MXUINT, MXUINT, MXUINT, MXUINT, MXUINT, MXUINT ); +void MXAPI mxRotatePalette( MXPTR palette, MXUINT count, MXSINT step ); +// +// Text +// +MXSINT MXAPI mxSetFont( MXPTR font, MXUINT charwidth, MXUINT charheight ); +void MXAPI mxSetTextColor( MXUINT color, MXUINT op ); +void MXAPI mxGetTextStep( MXSINT far *deltax, MXSINT far *deltay ); +void MXAPI mxSetTextStep( MXSINT deltax, MXSINT deltay ); +void MXAPI mxOutChar( MXSINT x, MXSINT y, char c ); +void MXAPI mxOutText( MXSINT x, MXSINT y, char far *sz ); +// +// Convex polygons +// +void MXAPI mxFillPoly( MXUINT, MXPTR, MXPTR, MXUINT, MXUINT ); +void MXAPI mxGouraudPoly( MXUINT, MXPTR, MXPTR, MXPTR, MXUINT, MXUINT ); +void MXAPI mxTexturePoly( MXUINT, MXPTR, MXPTR, MXPTR, MXPTR, MXUINT, MXUINT ); + +#ifdef __cplusplus +} +#endif + +// +// Remove temporary defines +// +#undef MXBYTE +#undef MXBOOL +#undef MXSINT +#undef MXUINT +#undef MXPTR +#undef MXAPI + +#endif // _MODEX_H_ diff --git a/16/xw__/modex.lbr b/16/xw__/modex.lbr new file mode 100755 index 00000000..93fc7801 --- /dev/null +++ b/16/xw__/modex.lbr @@ -0,0 +1,39 @@ ++-MXBB.OBJ & ++-MXCC.OBJ & ++-MXCG.OBJ & ++-MXCL.OBJ & ++-MXCR.OBJ & ++-MXFB.OBJ & ++-MXFP.OBJ & ++-MXGC.OBJ & ++-MXGI.OBJ & ++-MXGM.OBJ & ++-MXGP.OBJ & ++-MXGV.OBJ & ++-MXHL.OBJ & ++-MXIT.OBJ & ++-MXLL.OBJ & ++-MXLN.OBJ & ++-MXOT.OBJ & ++-MXPB.OBJ & ++-MXPF.OBJ & ++-MXPG.OBJ & ++-MXPI.OBJ & ++-MXPN.OBJ & ++-MXPP.OBJ & ++-MXPT.OBJ & ++-MXRA.OBJ & ++-MXRP.OBJ & ++-MXSA.OBJ & ++-MXSC.OBJ & ++-MXSI.OBJ & ++-MXSL.OBJ & ++-MXSM.OBJ & ++-MXSP.OBJ & ++-MXSS.OBJ & ++-MXTL.OBJ & ++-MXVS.OBJ & ++-MXWD.OBJ & ++-MXWM.OBJ & ++-MXWP.OBJ & ++-MXWR.OBJ diff --git a/16/xw__/modex.pas b/16/xw__/modex.pas new file mode 100755 index 00000000..7d9d26ed --- /dev/null +++ b/16/xw__/modex.pas @@ -0,0 +1,194 @@ +(* + Turbo Pascal interface to the MODEX library + Copyright (c) 1993,1994 by Alessandro Scotti +*) +unit ModeX; +interface + +const + (* Video modes *) + MX_TEXT = 0; + MX_320x175 = 1; + MX_320x200 = 2; + MX_320x240 = 3; + MX_320x350 = 4; + MX_320x400 = 5; + MX_320x480 = 6; + MX_360x175 = 7; + MX_360x200 = 8; + MX_360x240 = 9; + MX_360x350 = 10; + MX_360x400 = 11; + MX_360x480 = 12; + MX_400x600 = 13; + + (* Fade effects *) + MX_FADEIN = 0; + MX_FADEOUT = 1; + + (* Raster ops *) + OP_SET = 0; + OP_AND = 1; + OP_OR = 2; + OP_XOR = 3; + OP_TRANS = 4; + OP_ADD = 5; + OP_MOVE = 0; (* Alias for OP_SET *) + +procedure mxBitBlt( SX, SY: integer; Width, Height: word; DX, DY: integer ); +procedure mxCircle( CX, CY: integer; Radius: word; Color: byte ); +procedure mxChangeMode( Mode: word ); +procedure mxColorToGray( ColorPalette, GrayPalette: pointer; Count: word ); +procedure mxFadePalette( Palette: pointer; Cmd, Start, Count, R, G, B: word ); +procedure mxFillBox( X, Y: integer; Width, Height: word; Color: byte; Op: word ); +procedure mxGammaCorrect( ColorPalette, GammaPalette: pointer; Count: word ); +procedure mxGetAspect( var AspectX, AspectY: word ); +function mxGetClipRegion( var X1, Y1, Width, Height: word ): boolean; +function mxGetClip: boolean; +procedure mxGetImage( Image: pointer; X, Y: integer; Width, Height: word ); +procedure mxGetPalette( Palette: pointer; Start, Count: word ); +function mxGetPixel( X, Y: word ): byte; +procedure mxGetScreenSize( var Width, Height: word ); +procedure mxGetTextStep( var DeltaX, DeltaY: integer ); +function mxGetVersion: word; +procedure mxGetVirtualScreen( var Width, Height: word ); +procedure mxInit; +procedure mxLine( X1, Y1, X2, Y2: integer; Color, Op: word ); +procedure mxOutChar( X, Y: integer; C: char ); +procedure mxOutText( X, Y: integer; S: pointer ); +procedure mxPan( X, Y: word ); +procedure mxPutImage( Image: pointer; X, Y: integer; Width, Height, Op: word ); +procedure mxPutPixel( X, Y: word; C: byte ); +procedure mxPutTile( Tile: pointer; X, Y: integer; Width, Height: word ); +procedure mxReadPlane( Plane: byte ); +procedure mxRotatePalette( Palette: pointer; Count: word; Step: integer ); +procedure mxRowAddress( RowAddress: byte ); +function mxSetClip( Clip: boolean ): boolean; +procedure mxSetClipRegion( X1, Y1, Width, Height: word ); +procedure mxSetColor( Index, R, G, B: word ); +procedure mxSetFont( Font: pointer; Width, Height: word ); +procedure mxSetMode( Mode: word ); +procedure mxSetPalette( Palette: pointer; Start, Count: word ); +procedure mxSetTextColor( Color, Op: word ); +procedure mxSetTextStep( DeltaX, DeltaY: integer ); +procedure mxSetVirtualScreen( Width, Height: word ); +procedure mxStretchImage( Image: pointer; X, Y: integer; Width, Height, NewWidth, NewHeight, Op: word ); +procedure mxSplitScreen( Line: word ); +procedure mxStartAddress( StartAddress: word ); +procedure mxStartLine( Line: word ); +procedure mxTerm; +procedure mxTransPutTile( Tile: pointer; X, Y: integer; Width, Height: word ); +procedure mxWaitDisplay; +procedure mxWaitRetrace; +procedure mxWriteMode( Mode: byte ); +procedure mxWritePlane( Plane: byte ); + +procedure mxFillPoly( Count: word; var Map, Points; Color: word ); +procedure mxGouraudPoly( Count: word; var Map, Points, Colors; BaseColor: word ); +procedure mxTexturePoly( Count: word; var Map, Points, ImgPoints, Texture; Width: word ); + +procedure mxOutStr( X, Y: integer; S: string ); + +implementation + +procedure mxBitBlt; external; +procedure mxChangeMode( Mode: word ); external; +procedure mxCircle; external; +procedure mxColorToGray; external; +procedure mxFadePalette; external; +procedure mxFillBox; external; +procedure mxGammaCorrect; external; +procedure mxGetAspect( var AspectX, AspectY: word ); external; +function mxGetClipRegion; external; +function mxGetClip: boolean; external; +procedure mxGetImage; external; +procedure mxGetPalette( Palette: pointer; Start, Count: word ); external; +function mxGetPixel( X, Y: word ): byte; external; +procedure mxGetScreenSize( var Width, Height: word ); external; +procedure mxGetTextStep( var DeltaX, DeltaY: integer ); external; +function mxGetVersion: word; external; +procedure mxGetVirtualScreen( var Width, Height: word ); external; +procedure mxInit; external; +procedure mxLine( X1, Y1, X2, Y2: integer; Color, Op: word ); external; +procedure mxOutChar( X, Y: integer; C: char ); external; +procedure mxOutText( X, Y: integer; S: pointer ); external; +procedure mxPan( X, Y: word ); external; +procedure mxPutImage; external; +procedure mxPutPixel( X, Y: word; C: byte ); external; +procedure mxPutTile; external; +procedure mxReadPlane( Plane: byte ); external; +procedure mxRotatePalette; external; +procedure mxRowAddress( RowAddress: byte ); external; +function mxSetClip( Clip: boolean ): boolean; external; +procedure mxSetClipRegion( X1, Y1, Width, Height: word ); external; +procedure mxSetColor( Index, R, G, B: word ); external; +procedure mxSetFont( Font: pointer; Width, Height: word ); external; +procedure mxSetMode( Mode: word ); external; +procedure mxSetPalette( Palette: pointer; Start, Count: word ); external; +procedure mxSetTextColor( Color, Op: word ); external; +procedure mxSetTextStep( DeltaX, DeltaY: integer ); external; +procedure mxSetVirtualScreen( Width, Height: word ); external; +procedure mxSplitScreen( Line: word ); external; +procedure mxStartAddress( StartAddress: word ); external; +procedure mxStartLine; external; +procedure mxStretchImage; external; +procedure mxTerm; external; +procedure mxTransPutTile; external; +procedure mxWaitDisplay; external; +procedure mxWaitRetrace; external; +procedure mxWriteMode( Mode: byte ); external; +procedure mxWritePlane( Plane: byte ); external; + +procedure mxFillPoly; external; +procedure mxGouraudPoly; external; +procedure mxTexturePoly; external; +{$L MXPB} +{$L MXPF} +{$L MXPG} +{$L MXPT} + +{$L MXBB} +{$L MXCC} +{$L MXCG} +{$L MXCL} +{$L MXCR} +{$L MXFB} +{$L MXFP} +{$L MXGI} +{$L MXGM} +{$L MXGP} +{$L MXGV} +{$L MXHL} +{$L MXIT} +{$L MXLN} +{$L MXOT} +{$L MXPI} +{$L MXPN} +{$L MXPP} +{$L MXRA} +{$L MXRP} +{$L MXSA} +{$L MXSC} +{$L MXSI} +{$L MXSL} +{$L MXSM} +{$L MXSP} +{$L MXSS} +{$L MXTL} +{$L MXVS} +{$L MXWD} +{$L MXWM} +{$L MXWP} +{$L MXWR} + +(* + Prints a Turbo Pascal string. + Note: BP 7.0 supports ASCIIZ strings (PChar type). +*) +procedure mxOutStr; +begin + S := S + #0; + mxOutText( X, Y, @S[1] ); +end; + +end. diff --git a/16/xw__/modex/DEMO01.EXE b/16/xw__/modex/DEMO01.EXE new file mode 100755 index 0000000000000000000000000000000000000000..28caff88c58a0b8ce5a4d23c6544c00cda8482fc GIT binary patch literal 10208 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 320 ) then begin + S.X := 320; + S.DX := -S.DX; + end; + if( S.X < -16 ) then begin + S.X := -16; + S.DX := -S.DX; + end; + if( S.Y > 240 ) then begin + S.Y := 240; + S.DY := -S.DY; + end; + if( S.Y < -16 ) then begin + S.Y := -16; + S.DY := -S.DY; + end; + (* Draw the sprite, note the Page offset added to the *) + (* Y coordinate of the image *) + mxPutImage( @S.Image, S.X, Page+S.Y, S.W, S.H, OP_TRANS ); +end; + +begin + (* Initialize library *) + mxInit; + + (* Enter graphics mode *) + mxSetMode( MX_320x240 ); + + (* Print initialization message *) + mxSetTextColor( 15, OP_TRANS ); + mxOutStr( 4, 4, 'Initializing...' ); + + (* Initialize sprites *) + for I:=1 to MAX_SPRITE do sxInit( S[I] ); + + (* Draw background *) + for I:=1 to 192 do begin + mxCircle( 160, 480+120, I, I+63 ); + mxCircle( 161, 480+120, I, I+63 ); + end; + + (* Compute and set palette *) + for I:=1 to 192 do with Palette[I+63] do begin + R := 0; + G := 0; + B := 0; + if( I < 64 ) then + R := I shr 1+31 + else if( I < 128 ) then + G := (I-64) shr 1+31 + else + B := (I-128) shr 1+31; + end; + mxSetPalette( @Palette[64], 64, 192 ); + + (* Main loop *) + Page := 240; + while( not KeyPressed ) do begin + (* Set clip region to current page *) + mxSetClipRegion( 0, Page, 320, 240 ); + mxSetClip( TRUE ); + (* Restore background *) + mxBitBlt( 0, 480, 320, 240, 0, Page ); + (* Draw sprites *) + for I:=1 to MAX_SPRITE do sxMove( S[I] ); + (* Print message *) + mxOutStr( 4, Page+4, 'Some sprites moving...' ); + (* Flip page *) + mxStartLine( Page ); + Page := 240-Page; + (* Animate palette *) + mxSetPalette( @Palette[64], 64, 192 ); + mxRotatePalette( @Palette[64], 192, 3 ); + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/xw__/modex/DEMO02.EXE b/16/xw__/modex/DEMO02.EXE new file mode 100755 index 0000000000000000000000000000000000000000..14e7dc72b16e421ae94767feaa07cb3988f49db1 GIT binary patch literal 24688 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 L6~S)>H$VReFZ-F@ literal 0 HcmV?d00001 diff --git a/16/xw__/modex/DEMO02.PAS b/16/xw__/modex/DEMO02.PAS new file mode 100755 index 00000000..6b4fb6f9 --- /dev/null +++ b/16/xw__/modex/DEMO02.PAS @@ -0,0 +1,125 @@ +(* + DEMO02 - Texture mapping and palette rotation + (c) 1994 by Alessandro Scotti +*) +uses Crt, Modex, Plasma, Threed; + +const + LSIZE = 85; + Trans : TPoint = ( X:0; Y:0; Z:0 ); +type + T2DPoint = record + X, Y: integer; + end; + TTexture = record + Desc : array[ 0..3 ] of T2DPoint; + Width : word; + Data : array[ 1..64*64 ] of byte; + end; + TQuad = record + VtxCnt : word; + Vtx : array[ 0..3 ] of word; + Texture: word; + end; +var + Vtx : array[ 0..7 ] of TPoint; + XVtx : array[ 0..7 ] of TPoint; + VVtx : array[ 0..7 ] of T2DPoint; + Face : array[ 0..5 ] of TQuad; + Txts : array[ 0..5 ] of TTexture; + Nrm : array[ 0..5 ] of TPoint; + XNrm : array[ 0..5 ] of TPoint; + Page : word; + Palette: array[ byte ] of record R, G, B: byte; end; + +(* Make a 64x64 plasma to be used as texture *) +procedure MakeTexture( Idx: word ); +var + I: word; +begin + mxFillBox( 0, 0, 64, 64, 0, OP_SET ); + MakePlasma( 0, 0, 64, 64, 96, Random(192)+1, Random(192)+1, Random(192)+1 ); + mxGetImage( @Txts[Idx].Data, 0, 0, 64, 64 ); + (* Texture vertexes are 8:8 fixed, add $80 (0.5) for best results *) + with Txts[Idx] do begin + Desc[0].X := $80; Desc[0].Y := $80; + Desc[1].X := $80; Desc[1].Y := $3F80; + Desc[2].X := $3F80; Desc[2].Y := $3F80; + Desc[3].X := $3F80; Desc[3].Y := $80; + Width := 64; + end; +end; + +procedure Init; +var + I: integer; +begin + (* Build vertexes for a cube *) + with Vtx[0] do begin X:=-LSIZE; Y:=-LSIZE; Z:=-LSIZE; end; + with Vtx[1] do begin X:=+LSIZE; Y:=-LSIZE; Z:=-LSIZE; end; + with Vtx[2] do begin X:=-LSIZE; Y:=+LSIZE; Z:=-LSIZE; end; + with Vtx[3] do begin X:=+LSIZE; Y:=+LSIZE; Z:=-LSIZE; end; + with Vtx[4] do begin X:=-LSIZE; Y:=-LSIZE; Z:=+LSIZE; end; + with Vtx[5] do begin X:=+LSIZE; Y:=-LSIZE; Z:=+LSIZE; end; + with Vtx[6] do begin X:=-LSIZE; Y:=+LSIZE; Z:=+LSIZE; end; + with Vtx[7] do begin X:=+LSIZE; Y:=+LSIZE; Z:=+LSIZE; end; + for I:=0 to 7 do begin (* Make points 16:16 fixed *) + Vtx[I].X := Vtx[I].X*$10000; + Vtx[I].Y := Vtx[I].Y*$10000; + Vtx[I].Z := Vtx[I].Z*$10000; + end; + (* Build faces *) + with Face[0] do begin Vtx[0]:=0; Vtx[1]:=2; Vtx[2]:=3; Vtx[3]:=1; end; + with Face[1] do begin Vtx[0]:=4; Vtx[1]:=5; Vtx[2]:=7; Vtx[3]:=6; end; + with Face[2] do begin Vtx[0]:=0; Vtx[1]:=1; Vtx[2]:=5; Vtx[3]:=4; end; + with Face[3] do begin Vtx[0]:=1; Vtx[1]:=3; Vtx[2]:=7; Vtx[3]:=5; end; + with Face[4] do begin Vtx[0]:=2; Vtx[1]:=0; Vtx[2]:=4; Vtx[3]:=6; end; + with Face[5] do begin Vtx[0]:=7; Vtx[1]:=3; Vtx[2]:=2; Vtx[3]:=6; end; + for I:=0 to 5 do Face[I].Texture := I; + (* Build textures and palette *) + Randomize; + FillChar( Palette, SizeOf(Palette), 0 ); + MakePlasmaPalette( Palette, PAL_RGB ); + mxSetPalette( @Palette, 0, 193 ); + for I:=0 to 5 do MakeTexture( I ); +end; + +var + AX, AY, AZ: byte; + I: word; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + AX := 0; + AY := 0; + AZ := 0; + (* Init 3D transforms, perspective is intentionally exaggerated *) + tdSetTranslation( Trans ); + tdSetPerspective( 400*$10000, $10000, $10000 ); + (* Main loop, all magic here! *) + while( not KeyPressed ) do begin + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx, XVtx, 8 ); (* 3D transform points *) + tdTransformToImage( XVtx, VVtx, 8, 160, 120+Page ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 1 ); + Inc( AZ, 2 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + mxRotatePalette( @Palette[1], 192, 3 ); (* Rotate palette *) + (* Draw cube: backface culling is straighforward in this case, so *) + (* it can be handled by the polygon filling procedure *) + for I:=0 to 5 do + mxTexturePoly( 4, Face[I].Vtx, VVtx, Txts[I].Desc, Txts[I].Data, Txts[I].Width ); + mxStartLine( Page ); (* Flip pages *) + mxSetPalette( @Palette[1], 1, 192 ); (* Set new palette *) + Page := 240-Page; + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/xw__/modex/DEMO03.EXE b/16/xw__/modex/DEMO03.EXE new file mode 100755 index 0000000000000000000000000000000000000000..c646c4b0283db932174d915432747c2176034195 GIT binary patch literal 14256 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 RADIUS*RADIUS ) then goto Retry; + Z := Toggle( Round( Sqrt( Abs( RADIUS*RADIUS-X*X-Y*Y ) ) ) ); + case Random(3) of + 0: Swap( X, Z ); + 1: Swap( Y, Z ); + end; + X := X * $10000; Y := Y * $10000; Z := Z * $10000; + end; + end; + (* Initialize morphing *) + Move( CubeVtx^, Vtx^, SizeOf(Vtx^) ); + Status := 0; + Count := WAITCOUNT; +end; + +procedure Morph; +var + I: integer; +begin + (* Fully unoptimized, slowest loop I could think of! *) + for I:=0 to MAXVTX-1 do begin + Vtx^[I].X := ((CubeVtx^[I].X * Morph1)+(SphereVtx^[I].X * Morph2)) div MS; + Vtx^[I].Y := ((CubeVtx^[I].Y * Morph1)+(SphereVtx^[I].Y * Morph2)) div MS; + Vtx^[I].Z := ((CubeVtx^[I].Z * Morph1)+(SphereVtx^[I].Z * Morph2)) div MS; + end; +end; + +var + AX, AY, AZ: byte; + I: word; + C: char; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + AX := 0; + AY := 0; + AZ := 0; + (* Init 3D transforms, perspective is intentionally exaggerated *) + tdSetTranslation( Trans ); + tdSetPerspective( 400*$10000, $10000, $10000 ); + C := #0; + repeat + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx^, XVtx^, MAXVTX ); (* 3D transform points *) + tdTransformToImage( XVtx^, VVtx, MAXVTX, 160, 120+Page ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 1 ); + Inc( AZ, 2 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + (* Draw points *) + for I:=0 to MAXVTX-1 do + mxPutPixel( VVtx[I].X, VVtx[I].Y, 128 + XVtx^[I].Z shr 18 ); + mxStartLine( Page ); (* Flip pages *) + Page := 240-Page; + (* Morph *) + if( Odd(Status) ) then begin + Morph; + Inc( Morph1, Delta1 ); + Inc( Morph2, Delta2 ); + if( Morph1 < 0 )or( Morph2 < 0 ) then Inc( Status ); + if( Status = 4 ) then Status := 0; + end + else begin + Dec( Count ); + if( Count < 0 ) then begin + Inc( Status ); + Count := WAITCOUNT; + Morph1 := InitMorph1[Status]; + Morph2 := InitMorph2[Status]; + Delta1 := InitDelta1[Status]; + Delta2 := InitDelta2[Status]; + end; + end; + until( KeyPressed ); + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/xw__/modex/DEMO04.DAT b/16/xw__/modex/DEMO04.DAT new file mode 100755 index 0000000000000000000000000000000000000000..72aaad08ac55e4d161e7868374296a4e42554684 GIT binary patch literal 37662 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%0D)*4A2IO9KMZYD#oU43C^WOCfTg8_%RD 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�-ncKj8QX2BIutynAlnfJ{;J0ue86t5F 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 XG;Ye`)EVP3#M6mPm!(a=?*#mR$DZhs literal 0 HcmV?d00001 diff --git a/16/xw__/modex/DEMO04.EXE b/16/xw__/modex/DEMO04.EXE new file mode 100755 index 0000000000000000000000000000000000000000..1fec5e8aa383353d986ca1e4420838b09e61eef4 GIT binary patch literal 24384 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 Im202>1y)VB#{d8T literal 0 HcmV?d00001 diff --git a/16/xw__/modex/DEMO04.PAS b/16/xw__/modex/DEMO04.PAS new file mode 100755 index 00000000..1a946315 --- /dev/null +++ b/16/xw__/modex/DEMO04.PAS @@ -0,0 +1,198 @@ +(* + DEMO04 - Multiple textures and triple buffering (3 pages) + (c) 1994 by Alessandro Scotti +*) +uses Crt, Modex, Threed; + +const + MAXVTX = 256; + MAXCUB = 2; + MAXTXT = 2; + Trans : TPoint = ( X:0; Y:0; Z:0 ); + TxtSunDial: array[ 0..7 ] of word = ( + $7F80,$0080, $0080,$0080, $0080,$7E80, $7F80,$7E80 ); + TxtSapphire : array[ 0..7 ] of word = ( + $0080,$0080, $0080,$1F80, $1F80,$1F80, $1F80,$0080 ); + TxtMarble: array[ 0..7 ] of word = ( + $0080,$8080, $0080,$FD80, $7F80,$FD80, $7F80,$8080 ); +type + T2DPoint = record + X, Y: integer; + end; + TTexture = record + Desc : array[ 0..3 ] of record X, Y: word end; + Width : word; + Data : pointer; + end; + TQuad = record + Vtx : array[ 0..3 ] of word; + Texture: word; + end; + TCube = record + Face : array[ 0..5 ] of TQuad; + Base : integer; + end; +var + Vtx, XVtx: array[ 0..MAXVTX ] of TPoint; + VVtx : array[ 0..MAXVTX ] of T2DPoint; + Cube : array[ 0..MAXCUB ] of TCube; + ZList : array[ 0..MAXCUB ] of integer; + VtxCnt : word; + Txts : array[ 0..MAXTXT ] of TTexture; + Page : word; + Palette : array[ byte ] of record R, G, B: byte; end; + TxtDat1, TxtDat2: pointer; + +(* Add a new entry to the vertex array *) +procedure AddVtx( PX, PY, PZ: longint ); +begin + with Vtx[VtxCnt] do begin X:=PX*$10000; Y:=PY*$10000; Z:=PZ*$10000; end; + Inc( VtxCnt ); +end; + +procedure MakeCube( var C: TCube; X1,Y1,Z1, X2,Y2,Z2, TX,TY,TZ, Texture: integer ); +const + FaceIdx: array[ 0..23 ] of integer = ( + 0,1,2,3, 0,4,5,1, 1,5,6,2, 2,6,7,3, 3,7,4,0, 6,5,4,7 ); +var + I, VC: integer; +begin + VC := VtxCnt; + C.Base := VC; + AddVtx( X1+TX, Y1+TY, Z1+TZ ); + AddVtx( X2+TX, Y1+TY, Z1+TZ ); + AddVtx( X2+TX, Y2+TY, Z1+TZ ); + AddVtx( X1+TX, Y2+TY, Z1+TZ ); + AddVtx( X1+TX, Y1+TY, Z2+TZ ); + AddVtx( X2+TX, Y1+TY, Z2+TZ ); + AddVtx( X2+TX, Y2+TY, Z2+TZ ); + AddVtx( X1+TX, Y2+TY, Z2+TZ ); + for I:=0 to 23 do C.Face[I shr 2].Vtx[I and 3] := VC+FaceIdx[I]; + for I:=0 to 5 do C.Face[I].Texture := Texture; +end; + +procedure MakeTexture( Idx: integer; var VtxData ); +var + P: ^word; + I: integer; +begin + P := @VtxData; + with Txts[Idx] do begin + for I:=0 to 3 do begin + Desc[I].X := P^; Inc( P ); + Desc[I].Y := P^; Inc( P ); + end; + Width := 129; + Data := TxtDat1; + end; +end; + +procedure Init; +var + I: integer; + V: integer; + F: file; + P: array[ 1..768 ] of byte; +begin + (* Initialize objects *) + VtxCnt := 0; + MakeCube( Cube[0], -64,-64,8, 64,64,-8, 0,0,0, 1 ); (* Sundial *) + Cube[0].Face[0].Texture := 0; + V := VtxCnt; + MakeCube( Cube[1], -16,-16,16, 16,16,-16, 0,0,0, 2 ); (* Sapphire *) + tdSetTranslation( Trans ); + tdSetRotation( 32, 32, 00 ); + tdRotate( Vtx[V], XVtx[V], 8 ); (* Got to rotate this cube *) + for I:=V to V+7 do begin + Vtx[I].X := XVtx[I].X; + Vtx[I].Y := XVtx[I].Y; + Vtx[I].Z := XVtx[I].Z + 100*$10000; + end; + MakeCube( Cube[2], -64,-4,48, 64,4,-48, 0,68,56, 1 ); (* Marble *) + (* Load texture and palette *) + Assign( F, 'DEMO04.DAT' ); + Reset( F, 1 ); + BlockRead( F, P, SizeOf(P) ); + mxSetPalette( @P, 0, 256 ); + GetMem( TxtDat1, 63*1024 ); + BlockRead( F, TxtDat1^, 129*286 ); + Close( F ); + TxtDat2 := Ptr( Seg(TxtDat1^), Ofs(TxtDat1^)+129*254 ); + (* Init textures *) + MakeTexture( 0, TxtSundial ); + MakeTexture( 1, TxtMarble ); + MakeTexture( 2, TxtSapphire ); + Txts[2].Data := TxtDat2; +end; + +(* Sort procedure, not worth optimizing with only a few objects *) +procedure SortObjects; +var + I, J, K: integer; + ZMax: array[ 0..MAXCUB ] of longint; + ZI: integer; + L: longint; +begin + for I:=0 to MAXCUB do begin + L := XVtx[Cube[I].Base].Z; + for J:=1 to 7 do + if( L > XVtx[Cube[I].Base+J].Z ) then L := XVtx[Cube[I].Base+J].Z; + ZMax[I] := L; + ZList[I] := I; + end; + for I:=0 to MAXCUB-1 do begin + ZI := I; + for J:=I+1 to MAXCUB do + if( ZMax[ZList[J]] > ZMax[ZList[ZI]] ) then ZI := J; + if( ZI <> I ) then begin + K := ZList[I]; + ZList[I] := ZList[ZI]; + ZList[ZI] := K; + end; + end; +end; + +var + AX, AY, AZ: byte; + I, J, K: word; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + (* Init 3D transforms, perspective is intentionally exaggerated *) + AX := 0; AY := 0; AZ := 0; + tdSetTranslation( Trans ); + tdSetPerspective( 600*$10000, $10000, $10000 ); + (* Main loop, all magic here! *) + while( not KeyPressed ) do begin + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx, XVtx, VtxCnt ); (* 3D transform points *) + tdTransformToImage( XVtx, VVtx, VtxCnt, 160, 120+Page ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 2 ); + Inc( AZ, 1 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + (* Draw objects *) + SortObjects; + for I:=0 to MAXCUB do with Cube[ZList[I]] do begin + for J:=0 to 5 do begin + K := Face[J].Texture; + mxTexturePoly( 4, Face[J].Vtx, VVtx, Txts[K].Desc, Txts[K].Data^, Txts[K].Width ); + end; + end; + (* Flip page: at 320x240 the Start Address Register Low is always zero *) + case Page of + 0 : begin PortW[$3D4] := $000C; Page := 240; end; + 240: begin PortW[$3D4] := $4B0C; Page := 480; end; + 480: begin PortW[$3D4] := $960C; Page := 0; end; + end; + mxWaitRetrace; (* If the frame rate seems low, try to remove this line *) + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/xw__/modex/DEMO05.EXE b/16/xw__/modex/DEMO05.EXE new file mode 100755 index 0000000000000000000000000000000000000000..21a7c207f7134ed187a08530637509b96b37b19e GIT binary patch literal 22528 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 CoI~RP literal 0 HcmV?d00001 diff --git a/16/xw__/modex/DEMO05.PAS b/16/xw__/modex/DEMO05.PAS new file mode 100755 index 00000000..819c5cf3 --- /dev/null +++ b/16/xw__/modex/DEMO05.PAS @@ -0,0 +1,131 @@ +(* + DEMO05 - A Gouraud-shaded rotating torus + (c) 1994 Alessandro Scotti +*) +uses Crt, Modex, Threed; + +(* Define ALTPAL for alternate palette *) +{$define ALTPAL} + +const + MAXVTX1 = 15; RADIUS1 = 70; (* MAXVTX1+1 must be multiple of 4 *) + MAXVTX2 = 15; RADIUS2 = 30; + MAXVTX = (MAXVTX1+1)*(MAXVTX2+1)-1; + MAXFACE = MAXVTX; + Trans : TPoint = ( X:0; Y:0; Z:0 ); (* Object translation *) + Light : TPoint = ( X:0; Y:0; Z:-63*$10000 ); (* Light direction *) +type + TQuad = record + QVtx : array[ 0..3 ] of integer; + end; +var + Vtx, XVtx : array[ 0..MAXVTX ] of TPoint; (* Points *) + VVtx : array[ 0..MAXVTX ] of record X, Y: integer end; + Face : array[ 0..MAXFACE ] of TQuad; (* Polys *) + Culled : array[ 0..MAXFACE ] of integer; + GNrm,XGNrm: array[ 0..MAXVTX ] of TVector; (* Gouraud normals *) + VtxLight : array[ 0..MAXVTX ] of integer; (* Points brightness *) + Page : word; + +function GetVtx( I1, I2: integer ): integer; +begin + GetVtx := (I1 mod (MAXVTX1+1))*(MAXVTX2+1) + I2 mod (MAXVTX2+1); +end; + +procedure Init; +var + R, N, X, Y, Z: real; + I, J, K, V: integer; +begin + (* Build vertexes *) + for I:=0 to MAXVTX1 do begin + K := (I + (MAXVTX1+1) shr 2) mod (MAXVTX1+1); + R := RADIUS1 + RADIUS2*Cos( 2*K*Pi / (MAXVTX1+1) ); + for J:=0 to MAXVTX2 do begin + V := I*(MAXVTX2+1)+J; (* Index of current vertex *) + (* Compute coordinates of current vertex *) + X := R*Cos(2*J*Pi / (MAXVTX2+1)); (* Get coordinates *) + Y := R*Sin(2*J*Pi / (MAXVTX2+1)); + Z := RADIUS2*Sin(2*K*Pi / (MAXVTX1+1)); + Vtx[V].X := Round( X )*$10000; (* Save coordinates *) + Vtx[V].Y := Round( Y )*$10000; + Vtx[V].Z := Round( Z )*$10000; + (* Compute direction of Gouraud normal thru current vertex *) + X := X - RADIUS1*Cos(2*J*Pi / (MAXVTX2+1)); + Y := Y - RADIUS1*Sin(2*J*Pi / (MAXVTX2+1)); + N := Sqrt( X*X + Y*Y + Z*Z ); (* Get vector length *) + GNrm[V].X := Trunc( X*$10000/N ); (* Save normal vector *) + GNrm[V].Y := Trunc( Y*$10000/N ); + GNrm[V].Z := Trunc( Z*$10000/N ); + end; + end; + (* Generate faces so that depth-sorting is not needed: there are still *) + (* some *very* little errors, but this is the best I could devise *) + J := 0; + K := 0; + for I:=0 to MAXFACE do with Face[I] do begin + QVtx[0] := GetVtx( J, K ); + QVtx[1] := GetVtx( J, K+1 ); + QVtx[2] := GetVtx( J+1, K+1 ); + QVtx[3] := GetVtx( J+1, K ); + Inc( K ); + if( K > MAXVTX2 ) then begin + K := 0; + Inc( J ); + end; + end; +{$ifndef ALTPAL} + for I:=0 to 63 do mxSetColor( I+64, 0, 0, I ); (* Blue palette *) +{$else} + for I:=0 to 31 do mxSetColor(I+64, 0, I shl 1, 0); (* Green neon palette *) + for I:=32 to 63 do mxSetColor ( I+64, (I-32) shl 1, 63, (I-32) shl 1 ); +{$endif} +end; + +var + AX, AY, AZ: byte; + I: word; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + AX := 0; + AY := 0; + AZ := 0; + (* Init 3D transforms, perspective is intentionally exaggerated *) + tdSetTranslation( Trans ); + tdSetLight( Light ); + tdSetPerspective( 400*$10000, $10000, $10000 ); + (* Main loop, all magic here! *) + while( not KeyPressed ) do begin + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx, XVtx, MAXVTX+1 ); (* 3D transform points *) + tdTransformToImage( XVtx, VVtx, MAXVTX+1, 160, 120+Page ); + tdRotate( GNrm, XGNrm, MAXVTX+1 ); (* Rotate Gouraud normals *) + tdTransformLight( XGNrm, VtxLight, MAXVTX+1 ); + (* Backplane culling is not really needed here! *) + FillChar( Culled, SizeOf(Culled), 0 ); + tdBackPlaneCull( Face, XVtx, Culled, MAXFACE+1, SizeOf(TQuad) ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 2 ); + Inc( AZ, 3 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + (* Draw polygons *) + for I:=0 to MAXFACE do with Face[I] do + if( Culled[I] >= 0 ) then mxGouraudPoly( 4, QVtx, VVtx, VtxLight, 64 ); + (* Flip page: at 320x240 the Start Address Register Low is always zero *) + case Page of + 0 : begin PortW[$3D4] := $000C; Page := 240; end; + 240: begin PortW[$3D4] := $4B0C; Page := 480; end; + 480: begin PortW[$3D4] := $960C; Page := 0; end; + end; + mxWaitRetrace; (* Uncomment this instruction if screen flickers *) + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/xw__/modex/DEMO06.DAT b/16/xw__/modex/DEMO06.DAT new file mode 100755 index 0000000000000000000000000000000000000000..1ac2c2bb8f8c79a7cf1f3c968f75e8e5ac8cd705 GIT binary patch literal 77568 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 P3zel81wBCVexm$;I2yv& literal 0 HcmV?d00001 diff --git a/16/xw__/modex/DEMO06.EXE b/16/xw__/modex/DEMO06.EXE new file mode 100755 index 0000000000000000000000000000000000000000..f1308e8a536aa9d3d4574566fd018d698d5ef784 GIT binary patch literal 10864 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 G@BaZ%)XT^K literal 0 HcmV?d00001 diff --git a/16/xw__/modex/DEMO06.PAS b/16/xw__/modex/DEMO06.PAS new file mode 100755 index 00000000..f26af067 --- /dev/null +++ b/16/xw__/modex/DEMO06.PAS @@ -0,0 +1,135 @@ +(* + DEMO06 - Magnifying glass + (c) 1994 Alessandro Scotti +*) +uses Crt, Modex; + +const + R = 40; (* Lens radius *) + K : real = 1.8; (* Magnifying factor, less makes a stronger lens *) +type + TLine = array[ 0..319 ] of byte; + PLine = ^TLine; + TScreen = array[ 0..239 ] of PLine; +var + VScreen: TScreen; (* Virtual screen *) + BallX : array[ 0..R, 0..R ] of integer; + BallY : array[ 0..R, 0..R ] of integer; + Sprite : array[ -R..R, -R..R ] of byte; + Page : word; + +(* Returns "lens-view" coordinates of X,Y *) +procedure GetCoords( var X, Y: integer ); +var + LR, Z, SinA, SinB, TgB, Q: real; +begin + LR := Sqrt( X*X + Y*Y ); + if( LR = 0 ) then Exit; + if( LR < R ) then begin + Z := Sqrt( R*R - LR*LR ); + SinA := LR / R; + SinB := SinA / K; + TgB := SinB / Sqrt( 1-SinB*SinB ); + Q := LR - TgB*Z; + X := Round( X * ( Q/LR ) ); + Y := Round( Y * ( Q/LR ) ); + end; +end; + +procedure Init; +var + F : file; + Palette: array[ 0..767 ] of record R, G, B: byte; end; + X, Y, + X2, Y2 : integer; +begin + (* Load background image *) + Assign( F, 'demo06.dat' ); + Reset( F, 1 ); + BlockRead( F, Palette, 768 ); + mxSetPalette( @Palette, 0, 256 ); + for Y:=0 to 239 do begin + New( VScreen[Y] ); + BlockRead( F, VScreen[Y]^, 320 ); + mxPutImage( VScreen[Y], 0, 480+Y, 320, 1, OP_MOVE ); + end; + Close( F ); + (* Build lens *) + for X:=0 to R do begin + for Y:=0 to R do begin + X2 := X; + Y2 := Y; + GetCoords( X2, Y2 ); + BallX[X, Y] := X2; + BallY[X, Y] := Y2; + end; + end; +end; + +procedure PutLens( OX, OY: integer ); +var + X, Y: integer; +begin + for X:=0 to R do begin + for Y:=0 to R do begin + Sprite[Y][X] := VScreen[ OY+BallY[X,Y] ]^[ OX+BallX[X,Y] ]; + Sprite[Y][-X] := VScreen[ OY+BallY[X,Y] ]^[ OX-BallX[X,Y] ]; + Sprite[-Y][X] := VScreen[ OY-BallY[X,Y] ]^[ OX+BallX[X,Y] ]; + Sprite[-Y][-X] := VScreen[ OY-BallY[X,Y] ]^[ OX-BallX[X,Y] ]; + end; + end; + (* Draw the sprite *) + mxPutImage( @Sprite, OX-R, OY-R+Page, 2*R+1, 2*R+1, OP_MOVE ); +end; + +function Delta: integer; +begin + Delta := Random(3)+2; +end; + +procedure Check( Cond: boolean; var Coord, DeltaC: integer; NewCoord, Sign: integer ); +begin + if( Cond ) then begin + Coord := NewCoord; + DeltaC := Sign*Delta; + end; +end; + +var + X, Y, DX, DY: integer; + C: char; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; + X := R; + Y := R; + Randomize; + DX := Delta; + DY := Delta; + + (* Main loop *) + repeat + (* Update video *) + mxBitBlt( 0, 480, 320, 240, 0, Page ); + PutLens( X, Y ); + mxCircle( X, Page+Y, R, 0 ); + (* Update lens coordinates *) + Inc( X, DX ); + Check( X+R >= 319, X, DX, 319-R, -1 ); + Check( X <= R, X, DX, R, +1 ); + Inc( Y, DY ); + Check( Y+R >= 239, Y, DY, 239-R, -1 ); + Check( Y <= R, Y, DY, R, +1 ); + (* Flip pages: double buffering, avoid wait for display *) + case Page of + 0 : begin PortW[$3D4] := $000C; Page := 240; end; + 240: begin PortW[$3D4] := $4B0C; Page := 0; end; + end; + mxWaitRetrace; (* Wait for hidden page to show *) + until( KeyPressed ); + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/xw__/modex/DEMO07.EXE b/16/xw__/modex/DEMO07.EXE new file mode 100755 index 0000000000000000000000000000000000000000..8a401169bba312a0d668452c9df6086505c394a8 GIT binary patch literal 7440 zcmb6;4OmlGvU7iOa|sZlD7F3s+|p>Jq)IF*M9NADuCHopRZthS)l$3d+FiVX?fV4M zqSfRg^}W7!w|w2N#_Zem75g@}?7o2AXCNqOK9oQ!h`Wm5&&624;t~p&yty~Q*6wb< zx9Hq+&YYP!bLPyMIp<{cW)%?w%RmM5=y|^p2*?Cj4gj+eScC+GMF^P)*$8V9)+6L2 z`~;y0;UL2A5I#dVjnIa00pSh;Ljb4{<{->NSd6e7ArIlF2>*((7oiH_KM))Urx4l^ zt{~h(_$xvH;kP6}4ZT!%!2B?#%nbs!*zm__6e zDk_KQljRTrglS9;p+neUxxUC%-Ad*V<}wv$8c=d|G!FBPnCi=@k&{H`(g>`WNu%=+VXXeEA{pmqtiA=w zu*hX!Cw|sLGqVx3Yi9EBTg_6}fpu|I|4ed`%ZUG-nS{~Vf|6b$l99-WL_Ru*rPv|q z7U~wYG&)sbeT~&?>aFbcoFXT!B*)`M+5pc>2H zCc=`|i<0t0NzJ$%qNKej33pOh(*6EPNiW_Drmllv>UyX?g}z<=b9C(f?t7x)MaQaM zh}O?X*NsER#(g&V*MfUOy)joe!k4k=!b#0Z%@#vITcz%%(*5Nx^QZYM!Yja^_IF|B z1+4H_{Fj7HVGLH+0N>1C7ILsan#)3l)W(h{!x*eC0NxPT=h_p+H#hW<$uvA>2(0B# zV_n7oVF(y}@911x3*yh5Wq~S)q6`Xcy4nkSQn2^}%9FI|Ob6^q#G(_*=V<+!3v%Am z;3KIn^Hs`867AROo2WsnfjJ;|PfqM_$`-_^abka_Y*&F-_W`fG4t(5AFqbg|7h}7K z$V-U)3nH(8-3u0V2UwI}fF-UIQ1)9)Kcrkk9ZAq07OS3bB+KkEM4Jtcnj0)@q7E1W2MQ;& zwr;A*Rn;}oY#6hV&4$tUNHn;fDtTBB+;mqDW$kfL_2;NT?EggUKT28)1Bz?hL+Doy za!||1p~tOJ@K>w`Hn?#t2M6m*#6Bk(gKo$2S8(WDemuBw6nnIk`ht9wX=p1|7G*7* zKrwNDUkr|jTW%0tUoQH76fQFbBt~seMzKIpa*_%8`nY${J4lUI^if*t{&y*FpEl|3 zgH&k@e=#dd`-A~J@+_f6M+UqjO z_n+T?`7OiHQG$!s+PoNAr48kaIZASmX>DJG5MO|Q*Ij?v2-W3aG1_5#%XXkjIOHCE zip#h3C@pe#KoV{-MEWANw$4za6FEoxWp}Aj2hIw$-V^D-S)tbDWQt2t&=iI0?JEl6 zPQM`TQhwBb#e3DVW{hv~_E-#~4s`PYYXOS}|KWkzKjLEBnkp{9AXPTDXNW4kn^ZRH z6WsjQ$b{5me1pV<^vLBP?=vB#$T1vZ4l{kvNLKxK#u^BZb>n--3bTbryYtOxH{4=? z#0?$tr;V)lmiHFbXsq6eDX_X04>$GQ)a`l~<M!p#HmnbehByKUr z`A`a55K3W>NFpS4Lju+)zMIHsol6wSNSUMlbIK8GEo9KE#q=Xhw}26`QP!JdgN|rx z-{82|^UYsG<}`Sy4YAh?5!HjJ`C-&cvtSzRL|LO@SzYAK2)uLbL|LO@SzRPj%}3NBLZlL9NmMFC^&l!F ztBbUYhRP&u`41lGPSCjnKo3anYn;p$#2CBCY?(7Vx}Sx9kc%s>>DvLLR+x^ zEm-5d!Ph<;F|pAZi@XK6<(xD#=mcW0zL7d621+MTgQ6o$8CY>Uv3%fTd%OH&`{xMf zY zYbJ$8nQ^n&&dEbLD&&0M(YfRW6k9N<>p!RDceRU>wA06O{z2c}@7LiJZZliE+(Mr! zX0*1?u@X8#irYiIQR+Q6+1qx%S6owxLNYoY!rv%kGl`-!V?7Nzm%o@@W?=G4l5opD zIvTX!QG~7N6^zw33?&$5?8Ay+F&ivqs`Yr!lFn$8J6~(NqribJwAMC^6~+?Y#;g>A zj4sXX6}4Pic<+=a(}rI0{LmFgXM3q84u5K+;H!b!xW^T=kX zVxESRuY$%pN0T;(8^_XlE%?5mC;e^y_PQnDzhf^1wKBebDdC*;XzSc~x5%L}YxY9` z2V?Yf5$T|ewIJlm^6+ev?3_B~QxI0koC~M?4}1bbrp!FHz!ax3EB6C|u386-@VKmY z>Zb|9qcS%t9WOIZ(oU1*9S23biTz{-p2o=Ig!L=y=Yg}eU=GYECTj_M0iM2h!U1JI zoMwIu1fH{BK+Fzs8`aLwh^j7g#%2sfveV3~K*Z;rH)p&GU?SXN8)}KxIF6}>);Ql? zM}aVha%2fJC_zc}TLS!_Q~4ZPcqAzNGvlt)qtRVkqZ zXGs)R^iUf1mrMzqBU86SQAAqmi%>!djU*-?;SZ#>aRKuJ1Y92Bzewxp1dE#`7L?#w)mTthi2&DpA#sLIt-PiHTLc(hHJ)cGNG zqLk)6ZXOWjUr-K#tgCjwB6R=ha|I&NQ_nY*~++mHCK(6xp#}O@%;7~mG>^gMCBFMu{z5pkcjJoUe3hv3; z2&;M1KkAM8%td`37j;3M zmgR&M&@9>=E%lrC2ajj(x>Z?^CpNE*eWMlpf`gx7;UIX+E@#5ug5@9zDr zun?r7EI5?)^oV8^q>NCF_;44u9URI5A6QSV!0#$Yj9712F%a)g_jB8yU6-q7`148U zBxY-~#2BR9-X6SYAZtYoUl;+&cID%XVK5*K&O+I9OVVHzL9 zFE`G+YsPzT`xxuZV>P`K^7yT2kd3(;m{yfMe`|po>M_c7S29aM_oeWdTsRDTlPngF z(;Y%(JJo1cfISK*h6cM5>@&bV8|;Y~;+KNPMuI&74;l;bX|+=MIA#^{f0vPUv2bWY zd#v`!*148BmDyxPGu=BVM*AoX)fnyTV+rRYVtEOiiDF3;&ZopI;KZb4R2!Y!NhLl_ ztRa;`3+cpU^bIZzadjkK5I@*rz8Uk}uRqvizCL8WH^eD3&F6>0ZH~x1@(j4q@kki2 zXkzjzZpOdS{2rJmmhGla27|e^>s#mYx6Nzfh`cSEHWzHokC&f!wgHl2uxx=%TYPfN zm%1~$OOj>A?J0Qqiga_!Z7PU#aZgmaG@;t8BzMU}{;uVq+O4Wrfxnk(D3WW^85W8d zjcpqEynIWgJ4wA1Dts!7axp&lq(YNg3zaSu7mJxj3-*Oz*8@&dX=I-BNG4DU3qtc& z3UkQ^ZThJC)O56zXwo6uVu)l?@qPHjGbBEL*-}7AffHLuK@GN4%#q+o!*q>Q_)KOQjHgWNOuM+3fBIs=i$z7R z6(vBz^IQUGqZMF$t%!U1wOzXtvR?by>qRfWw3ADizx}a!?L5W#BiCdoD7`Vin9u+Ki=tM>p$uAQT3m8PDcD}ayh1msmnj<!A>QiR&0Vi9HINMG+gwQ2fnSoKS)A3~-D_%0^-|c7PAlSXf*r;mpuri2_+s z)=S`4*ex5_cCiYB5pr#3`kjK?@X zr}nAVxkV~eL4nFNXXE`t%vo4d0Qd&JMXx)f*^gNPIWmz$p47lm&KK_|#<0)_iO5g_ zl*}lORWVK%GqoAWjy*VvIpY~z%~^#FJ*vW(V{NL!hO1)bqN>o}Ul{Y7MwJI&7V&-2 zxDFqW`}i(=9=^)AY|f)PC@*Gvk$K+VGIIrm?-%;NF67TjGVtS3c{b?2jBJ0M&GvUy zw1dAJGiS!@k=fb)ixnNZ@bs)?Z`|zH|xr7*-GkM z?3LA~{(N6tK8BF~`td&hJOA##^N#-xvUKP!dB5DvhJ|IXHp#=olL6|HlV&EolNH{M2Yr=gj|Q4oFbT{F~~A>>HA zab0zn(!00>Gva1)RF>~6z9XrvE*K0;5ygoPx&#`hHKp7W$PdO1%v;f= 639, X, DX, 319, -1 ); + Check( X < 0, X, DX, 0, +1 ); + Inc( Y, DY ); + Check( Y+200 >= 399, Y, DY, 199, -1 ); + Check( Y < 0, Y, DY, 0, +1 ); + mxPan( X, Y ); + mxWaitRetrace; + end; + + (* Shutdown *) + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/xw__/modex/MATH.INC b/16/xw__/modex/MATH.INC new file mode 100755 index 00000000..742af410 --- /dev/null +++ b/16/xw__/modex/MATH.INC @@ -0,0 +1,34 @@ +; +; MATH.INC - Include file for THREED.ASM +; + +; 3-dimensional point, coordinates in fixed format (16:16) +; +TPOINT STRUC + X DD ? + Y DD ? + Z DD ? +TPOINT ENDS + +; 2-dimensional point, coordinates in integer format +; +TIMAGEPOINT STRUC + IX DW ? + IY DW ? +TIMAGEPOINT ENDS + +; Fixed-point divide: EAX = EAX / arg +; +.xdiv MACRO arg + xor edx, edx + shld edx, eax, 16 + shl eax, 16 + idiv arg +ENDM + +; Fixed-point multiply: EAX = EAX * arg +; +.xmul MACRO arg + imul arg + shrd eax, edx, 16 +ENDM diff --git a/16/xw__/modex/PLASMA.PAS b/16/xw__/modex/PLASMA.PAS new file mode 100755 index 00000000..237e292a --- /dev/null +++ b/16/xw__/modex/PLASMA.PAS @@ -0,0 +1,103 @@ +unit Plasma; +interface + +const + PAL_RGB = 0; + PAL_CLOUDS = 1; + PAL_LANDSCAPE = 2; + +procedure MakePlasma( X, Y: integer; W, H: word; C1, C2, C3, C4: byte ); +procedure MakePlasmaPalette( var Palette; What: word ); + +implementation uses Modex; + +procedure NewColor( XA, YA, X, Y, XB, YB: integer ); +var + Color: longint; +begin + Color := Abs( XA-XB )+Abs( YA-YB ); + Color := Random( Color shl 1 )-Color; + Color := (Color+mxGetPixel( XA, YA )+mxGetPixel( XB, YB )+1) shr 1; + if( Color < 1 ) then Color := 1; + if( Color > 192 ) then Color := 192; + if( mxGetPixel( X, Y ) = 0 ) then + mxPutPixel( X, Y, Lo(Color) ); +end; + +procedure Divide( X1, Y1, X2, Y2: integer ); +var + X, Y, Color: integer; +begin + if not( (X2-X1<2)and(Y2-Y1<2) ) then begin + X := (X1+X2) shr 1; + Y := (Y1+Y2) shr 1; + NewColor( X1, Y1, X, Y1, X2, Y1 ); + NewColor( X2, Y1, X2, Y, X2, Y2 ); + NewColor( X1, Y2, X, Y2, X2, Y2 ); + NewColor( X1, Y1, X1, Y, X1, Y2 ); + Color := (mxGetPixel( X1, Y1 )+mxGetPixel( X2, Y1 )+ + mxGetPixel( X2, Y2 )+mxGetPixel( X1, Y2 )) shr 2; + mxPutPixel( X, Y, Color ); + Divide( X1, Y1, X, Y ); + Divide( X, Y1, X2, Y ); + Divide( X, Y, X2, Y2 ); + Divide( X1, Y, X, Y2 ); + end; +end; + +procedure MakePlasma; +begin + Dec( W ); + Dec( H ); + mxPutPixel( X, Y, C1 ); + mxPutPixel( X, Y+H, C2 ); + mxPutPixel( X+W, Y+H, C3 ); + mxPutPixel( X+W, Y, C4 ); + Divide( X, Y, X+W, Y+H ); +end; + +procedure MakePlasmaPalette; +type + TPal = array[ byte ] of record R, G, B: byte end; +var + I: word; +begin + FillChar( TPal(Palette)[1], 192*3, 0 ); + case What of + PAL_CLOUDS: + for I:=1 to 192 do begin + TPal(Palette)[I].R := Abs( I-96 )*63 div 96; + TPal(Palette)[I].G := Abs( I-96 )*63 div 96; + TPal(Palette)[I].B := 63; + end; + PAL_LANDSCAPE: + begin + for I:=0 to 31 do begin + TPal(Palette)[I+1].R := I; + TPal(Palette)[I+1].G := I; + TPal(Palette)[I+1].B := I + I shr 1+15; + end; + for I:=32 to 63 do begin + TPal(Palette)[I+1].R := 0; + TPal(Palette)[I+1].G := I; + TPal(Palette)[I+1].B := 0; + end; + for I:=64 to 191 do begin + TPal(Palette)[I+1].R := (I-64) div 3 + 15; + TPal(Palette)[I+1].G := (I-64) div 3 + 15; + TPal(Palette)[I+1].B := (I-64) div 3 + 15; + end; + end; + else + for I:=1 to 64 do begin + TPal(Palette)[I].G := I-1; + TPal(Palette)[I].B := 64-I; + TPal(Palette)[I+64].R := I-1; + TPal(Palette)[I+64].G := 64-I; + TPal(Palette)[I+128].B := I-1; + TPal(Palette)[I+128].R := 64-I; + end; + end; +end; + +end. \ No newline at end of file diff --git a/16/xw__/modex/QIX2.EXE b/16/xw__/modex/QIX2.EXE new file mode 100755 index 0000000000000000000000000000000000000000..a10d7db5a0a62654c70c632d8ce6b078a520613c GIT binary patch literal 10336 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 DJ^3nG literal 0 HcmV?d00001 diff --git a/16/xw__/modex/QIX2.PAS b/16/xw__/modex/QIX2.PAS new file mode 100755 index 00000000..d1b59791 --- /dev/null +++ b/16/xw__/modex/QIX2.PAS @@ -0,0 +1,210 @@ +{$E-,N+} +uses Crt, Modex; + +const + DEFVERT = 12; (* Vertex count *) + DEFREPL = 3; (* Repetition count *) + DEFQIXS = 2; (* Qixs *) + FADESPEED = 48; +type + TPoint = record + X, Y : integer; + end; + TRGB = record + R, G, B: byte; + end; + TQix = record + Color: integer; + Vert : array[ 0..DEFVERT-1, 0..DEFREPL-1 ] of TPoint; + Delta: array[ 0..DEFVERT-1 ] of TPoint; + end; +var + Page : integer; + MaxX, + MaxY : word; + Qix : array[ 0..DEFQIXS-1 ] of TQix; + Pal : array[ byte ] of TRGB; + +type + TReal = double; + TRPoint = record + X, Y: TReal; + end; + TMatrix = array[ 0..3, 0..3 ] of TReal; +var + M: TMatrix; + G: array[ 0..DEFVERT-1 ] of TRPoint; + C: array[ 0..DEFVERT-1 ] of TRPoint; + +procedure BumpPal( Idx, DR, DG, DB, Steps: integer ); +var + I: integer; +begin + for I:=1 to Steps do begin + Pal[Idx+1].R := Pal[Idx].R + DR; + Pal[Idx+1].G := Pal[Idx].G + DG; + Pal[Idx+1].B := Pal[Idx].B + DB; + Inc( Idx ); + end; +end; + +procedure InitPalette; +begin + with Pal[0] do begin R:=0; G:=0; B:=0; end; + with Pal[1] do begin R:=0; G:=0; B:=62; end; + BumpPal( 1, 0, 2, -2, 31 ); + BumpPal( 32, 2, -2, 0, 31 ); + BumpPal( 63, -2, 2, 2, 31 ); + BumpPal( 94, 2, 0, -2, 31 ); + BumpPal( 125, -2, -2, 2, 31 ); +end; + +procedure Init( var Qix: TQix; Color: integer ); +var + I: integer; +begin + FillChar( Qix.Vert, SizeOf(Qix.Vert), 0 ); + for I:=0 to DEFVERT-1 do begin + Qix.Vert[I, DEFREPL-1].X := Random( MaxX ); + Qix.Vert[I, DEFREPL-1].Y := Random( MaxY ); + Qix.Delta[I].X := Random(5)+1; + Qix.Delta[I].Y := Random(5)+1; + end; + Qix.Color := Color; + + (* Initialize matrix (Catmull-Rom) *) + M[0,0] := -1/2; M[0,1] := 3/2; M[0,2] := -3/2; M[0,3] := 1/2; + M[1,0] := 1; M[1,1] := -5/2; M[1,2] := 2; M[1,3] := -1/2; + M[2,0] := -1/2; M[2,1] := 0; M[2,2] := 1/2; M[2,3] := 0; + M[3,0] := 0; M[3,1] := 1; M[3,2] := 0; M[3,3] := 0; +end; + +procedure mxBezier( var Qix: TQix; I0, Idx, N: integer ); +var + I, J: integer; + T, T2, T3: TReal; + X0, Y0, X, Y: TReal; + Delta: TReal; +begin + (* Compute coefficients *) + for I:=0 to 3 do begin + C[I].X := 0; + for J:=0 to 3 do C[I].X := C[I].X + M[I,J]*Qix.Vert[(I0+J) mod DEFVERT,Idx].X; + C[I].Y := 0; + for J:=0 to 3 do C[I].Y := C[I].Y + M[I,J]*Qix.Vert[(I0+J) mod DEFVERT,Idx].Y; + end; + X0 := C[3].X; + Y0 := C[3].Y; + Delta := 1 / N; + T := 0; + for I:=1 to N do begin + T := T + Delta; + T2 := T*T; + T3 := T*T2; + X := C[0].X*T3 + C[1].X*T2 + C[2].X*T + C[3].X; + Y := C[0].Y*T3 + C[1].Y*T2 + C[2].Y*T + C[3].Y; + mxLine( Round(X0), Page+Round(Y0), Round(X), Page+Round(Y), Qix.Color, OP_SET ); + X0 := X; + Y0 := Y; + end; +end; + +procedure Plot( var Qix: TQix; Idx: integer ); +var + I, J: integer; +begin + for I:=0 to DEFVERT-1 do begin + mxBezier( Qix, I, Idx, 12 ); + end; +end; + +procedure Update( var Qix: TQix; Idx: integer ); +var + I: integer; +begin + for I:=0 to DEFVERT-1 do with Qix do begin + Inc( Vert[I,Idx].X, Delta[I].X ); + if( Vert[I,Idx].X < 0 ) then begin + Vert[I,Idx].X := 0; + Delta[I].X := Random( 5 )+1; + end; + if( Vert[I,Idx].X > MaxX ) then begin + Vert[I,Idx].X := MaxX; + Delta[I].X := -Random( 5 )-1; + end; + Inc( Vert[I,Idx].Y, Delta[I].Y ); + if( Vert[I,Idx].Y < 0 ) then begin + Vert[I,Idx].Y := 0; + Delta[I].Y := Random( 5 )+1; + end; + if( Vert[I,Idx].Y > MaxY ) then begin + Vert[I,Idx].Y := MaxY; + Delta[I].Y := -Random( 5 )-1; + end; + end; +end; + +procedure Copy( var Qix: TQix; Dest, Src: integer ); +var + I: integer; +begin + for I:=0 to DEFVERT-1 do with Qix do begin + Vert[I,Dest].X := Vert[I,Src].X; + Vert[I,Dest].Y := Vert[I,Src].Y; + end; +end; + +procedure AnimateQix; +var + Q, Idx, I, J, P, Count: integer; +begin + Count := 0; + P := DEFREPL-1; + I := 0; + J := 1; + repeat + mxSetClipRegion( 0, Page, MaxX+1, MaxY+1 ); + mxSetClip( TRUE ); + mxFillBox( 0, Page, MaxX+1, MaxY+1, 0, OP_SET ); + for Q:=0 to DEFQIXS-1 do begin + Copy( Qix[Q], I, P ); + Update( Qix[Q], I ); + for Idx:=0 to DEFREPL-1 do begin + Plot( Qix[Q], Idx ); + end; + end; + I := (I+1) mod DEFREPL; + J := (J+1) mod DEFREPL; + P := (P+1) mod DEFREPL; + Inc( Count ); + mxStartLine( Page ); + if( Count >= FADESPEED ) then begin + for Q:=0 to DEFQIXS-1 do begin + Inc( Qix[Q].Color ); + if( Qix[Q].Color > 156 ) then + Qix[Q].Color := 1; + end; + Count := 0; + end; + Page := 240-Page; + until( KeyPressed ); +end; + +var + I: integer; +begin + Randomize; + mxInit; + mxSetMode( MX_320x240 ); + mxGetScreenSize( MaxX, MaxY ); + for I:=0 to DEFQIXS-1 do + Init( Qix[I], (I*(155 div DEFQIXS)) mod 155 + 1 ); + InitPalette; + mxSetPalette( @Pal, 0, 157 ); + Page := 240; + Dec( MaxX ); + Dec( MaxY ); + AnimateQix; + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/xw__/modex/README.TXT b/16/xw__/modex/README.TXT new file mode 100755 index 00000000..306e8b9a --- /dev/null +++ b/16/xw__/modex/README.TXT @@ -0,0 +1,8 @@ +ModeX - A graphical library for DOS programs +Copyright (c) 1993-1994 Alessandro Scotti +http://www.ascotti.org/ + +Please look at the above site in the "Art of..." and +then in the "Old programs" section for more information. + + diff --git a/16/xw__/modex/SINCOS.INC b/16/xw__/modex/SINCOS.INC new file mode 100755 index 00000000..6986eeeb --- /dev/null +++ b/16/xw__/modex/SINCOS.INC @@ -0,0 +1,518 @@ +; +; SINCOS.INC - Sin/cos tables for THREED.ASM +; + +tblSin LABEL DWORD + DD 0 + DD 411733 + DD 823219 + DD 1234209 + DD 1644455 + DD 2053710 + DD 2461729 + DD 2868265 + DD 3273072 + DD 3675909 + DD 4076531 + DD 4474698 + DD 4870169 + DD 5262706 + DD 5652074 + DD 6038037 + DD 6420363 + DD 6798821 + DD 7173184 + DD 7543226 + DD 7908725 + DD 8269459 + DD 8625213 + DD 8975771 + DD 9320922 + DD 9660458 + DD 9994176 + DD 10321873 + DD 10643353 + DD 10958422 + DD 11266890 + DD 11568571 + DD 11863283 + DD 12150850 + DD 12431097 + DD 12703856 + DD 12968963 + DD 13226258 + DD 13475586 + DD 13716797 + DD 13949745 + DD 14174291 + DD 14390298 + DD 14597637 + DD 14796184 + DD 14985817 + DD 15166424 + DD 15337895 + DD 15500126 + DD 15653022 + DD 15796488 + DD 15930439 + DD 16054795 + DD 16169479 + DD 16274424 + DD 16369565 + DD 16454846 + DD 16530216 + DD 16595628 + DD 16651044 + DD 16696429 + DD 16731757 + DD 16757007 + DD 16772163 + DD 16777216 + DD 16772163 + DD 16757007 + DD 16731757 + DD 16696429 + DD 16651044 + DD 16595628 + DD 16530216 + DD 16454846 + DD 16369565 + DD 16274424 + DD 16169479 + DD 16054795 + DD 15930439 + DD 15796488 + DD 15653022 + DD 15500126 + DD 15337895 + DD 15166424 + DD 14985817 + DD 14796184 + DD 14597637 + DD 14390298 + DD 14174291 + DD 13949745 + DD 13716797 + DD 13475586 + DD 13226258 + DD 12968963 + DD 12703856 + DD 12431097 + DD 12150850 + DD 11863283 + DD 11568571 + DD 11266890 + DD 10958422 + DD 10643353 + DD 10321873 + DD 9994176 + DD 9660458 + DD 9320922 + DD 8975771 + DD 8625213 + DD 8269459 + DD 7908725 + DD 7543226 + DD 7173184 + DD 6798821 + DD 6420363 + DD 6038037 + DD 5652074 + DD 5262706 + DD 4870169 + DD 4474698 + DD 4076531 + DD 3675909 + DD 3273072 + DD 2868265 + DD 2461729 + DD 2053710 + DD 1644455 + DD 1234209 + DD 823219 + DD 411733 + DD 0 + DD -411733 + DD -823219 + DD -1234209 + DD -1644455 + DD -2053710 + DD -2461729 + DD -2868265 + DD -3273072 + DD -3675909 + DD -4076531 + DD -4474698 + DD -4870169 + DD -5262706 + DD -5652074 + DD -6038037 + DD -6420363 + DD -6798821 + DD -7173184 + DD -7543226 + DD -7908725 + DD -8269459 + DD -8625213 + DD -8975771 + DD -9320922 + DD -9660458 + DD -9994176 + DD -10321873 + DD -10643353 + DD -10958422 + DD -11266890 + DD -11568571 + DD -11863283 + DD -12150850 + DD -12431097 + DD -12703856 + DD -12968963 + DD -13226258 + DD -13475586 + DD -13716797 + DD -13949745 + DD -14174291 + DD -14390298 + DD -14597637 + DD -14796184 + DD -14985817 + DD -15166424 + DD -15337895 + DD -15500126 + DD -15653022 + DD -15796488 + DD -15930439 + DD -16054795 + DD -16169479 + DD -16274424 + DD -16369565 + DD -16454846 + DD -16530216 + DD -16595628 + DD -16651044 + DD -16696429 + DD -16731757 + DD -16757007 + DD -16772163 + DD -16777216 + DD -16772163 + DD -16757007 + DD -16731757 + DD -16696429 + DD -16651044 + DD -16595628 + DD -16530216 + DD -16454846 + DD -16369565 + DD -16274424 + DD -16169479 + DD -16054795 + DD -15930439 + DD -15796488 + DD -15653022 + DD -15500126 + DD -15337895 + DD -15166424 + DD -14985817 + DD -14796184 + DD -14597637 + DD -14390298 + DD -14174291 + DD -13949745 + DD -13716797 + DD -13475586 + DD -13226258 + DD -12968963 + DD -12703856 + DD -12431097 + DD -12150850 + DD -11863283 + DD -11568571 + DD -11266890 + DD -10958422 + DD -10643353 + DD -10321873 + DD -9994176 + DD -9660458 + DD -9320922 + DD -8975771 + DD -8625213 + DD -8269459 + DD -7908725 + DD -7543226 + DD -7173184 + DD -6798821 + DD -6420363 + DD -6038037 + DD -5652074 + DD -5262706 + DD -4870169 + DD -4474698 + DD -4076531 + DD -3675909 + DD -3273072 + DD -2868265 + DD -2461729 + DD -2053710 + DD -1644455 + DD -1234209 + DD -823219 + DD -411733 +tblCos LABEL DWORD + DD 16777216 + DD 16772163 + DD 16757007 + DD 16731757 + DD 16696429 + DD 16651044 + DD 16595628 + DD 16530216 + DD 16454846 + DD 16369565 + DD 16274424 + DD 16169479 + DD 16054795 + DD 15930439 + DD 15796488 + DD 15653022 + DD 15500126 + DD 15337895 + DD 15166424 + DD 14985817 + DD 14796184 + DD 14597637 + DD 14390298 + DD 14174291 + DD 13949745 + DD 13716797 + DD 13475586 + DD 13226258 + DD 12968963 + DD 12703856 + DD 12431097 + DD 12150850 + DD 11863283 + DD 11568571 + DD 11266890 + DD 10958422 + DD 10643353 + DD 10321873 + DD 9994176 + DD 9660458 + DD 9320922 + DD 8975771 + DD 8625213 + DD 8269459 + DD 7908725 + DD 7543226 + DD 7173184 + DD 6798821 + DD 6420363 + DD 6038037 + DD 5652074 + DD 5262706 + DD 4870169 + DD 4474698 + DD 4076531 + DD 3675909 + DD 3273072 + DD 2868265 + DD 2461729 + DD 2053710 + DD 1644455 + DD 1234209 + DD 823219 + DD 411733 + DD 0 + DD -411733 + DD -823219 + DD -1234209 + DD -1644455 + DD -2053710 + DD -2461729 + DD -2868265 + DD -3273072 + DD -3675909 + DD -4076531 + DD -4474698 + DD -4870169 + DD -5262706 + DD -5652074 + DD -6038037 + DD -6420363 + DD -6798821 + DD -7173184 + DD -7543226 + DD -7908725 + DD -8269459 + DD -8625213 + DD -8975771 + DD -9320922 + DD -9660458 + DD -9994176 + DD -10321873 + DD -10643353 + DD -10958422 + DD -11266890 + DD -11568571 + DD -11863283 + DD -12150850 + DD -12431097 + DD -12703856 + DD -12968963 + DD -13226258 + DD -13475586 + DD -13716797 + DD -13949745 + DD -14174291 + DD -14390298 + DD -14597637 + DD -14796184 + DD -14985817 + DD -15166424 + DD -15337895 + DD -15500126 + DD -15653022 + DD -15796488 + DD -15930439 + DD -16054795 + DD -16169479 + DD -16274424 + DD -16369565 + DD -16454846 + DD -16530216 + DD -16595628 + DD -16651044 + DD -16696429 + DD -16731757 + DD -16757007 + DD -16772163 + DD -16777216 + DD -16772163 + DD -16757007 + DD -16731757 + DD -16696429 + DD -16651044 + DD -16595628 + DD -16530216 + DD -16454846 + DD -16369565 + DD -16274424 + DD -16169479 + DD -16054795 + DD -15930439 + DD -15796488 + DD -15653022 + DD -15500126 + DD -15337895 + DD -15166424 + DD -14985817 + DD -14796184 + DD -14597637 + DD -14390298 + DD -14174291 + DD -13949745 + DD -13716797 + DD -13475586 + DD -13226258 + DD -12968963 + DD -12703856 + DD -12431097 + DD -12150850 + DD -11863283 + DD -11568571 + DD -11266890 + DD -10958422 + DD -10643353 + DD -10321873 + DD -9994176 + DD -9660458 + DD -9320922 + DD -8975771 + DD -8625213 + DD -8269459 + DD -7908725 + DD -7543226 + DD -7173184 + DD -6798821 + DD -6420363 + DD -6038037 + DD -5652074 + DD -5262706 + DD -4870169 + DD -4474698 + DD -4076531 + DD -3675909 + DD -3273072 + DD -2868265 + DD -2461729 + DD -2053710 + DD -1644455 + DD -1234209 + DD -823219 + DD -411733 + DD 0 + DD 411733 + DD 823219 + DD 1234209 + DD 1644455 + DD 2053710 + DD 2461729 + DD 2868265 + DD 3273072 + DD 3675909 + DD 4076531 + DD 4474698 + DD 4870169 + DD 5262706 + DD 5652074 + DD 6038037 + DD 6420363 + DD 6798821 + DD 7173184 + DD 7543226 + DD 7908725 + DD 8269459 + DD 8625213 + DD 8975771 + DD 9320922 + DD 9660458 + DD 9994176 + DD 10321873 + DD 10643353 + DD 10958422 + DD 11266890 + DD 11568571 + DD 11863283 + DD 12150850 + DD 12431097 + DD 12703856 + DD 12968963 + DD 13226258 + DD 13475586 + DD 13716797 + DD 13949745 + DD 14174291 + DD 14390298 + DD 14597637 + DD 14796184 + DD 14985817 + DD 15166424 + DD 15337895 + DD 15500126 + DD 15653022 + DD 15796488 + DD 15930439 + DD 16054795 + DD 16169479 + DD 16274424 + DD 16369565 + DD 16454846 + DD 16530216 + DD 16595628 + DD 16651044 + DD 16696429 + DD 16731757 + DD 16757007 + DD 16772163 diff --git a/16/xw__/modex/THREED.ASM b/16/xw__/modex/THREED.ASM new file mode 100755 index 00000000..5ecd3ba3 --- /dev/null +++ b/16/xw__/modex/THREED.ASM @@ -0,0 +1,872 @@ +COMMENT / + Fixed-point math functions and 3D transforms + Copyright (c) 1993,94 by Alessandro Scotti +/ +WARN PRO +P386 +JUMPS +LOCALS + +INCLUDE MATH.INC + +PUBLIC tdFixedMul +PUBLIC tdGetNormal +PUBLIC tdRotate +PUBLIC tdGetSurfaceLight +PUBLIC tdSetLight +PUBLIC tdSetRotation +PUBLIC tdSetTranslation +PUBLIC tdTransform +PUBLIC tdTransformToImage +PUBLIC tdTransformLight +PUBLIC tdBackPlaneCull +PUBLIC tdSetPerspective + +;----------------------------------------------------------- +; +; Data segment +; +MATH_DATA SEGMENT USE16 PARA PUBLIC 'DATA' + ASSUME ds:MATH_DATA + +INCLUDE SINCOS.INC ; Fixed 8:24 sin/cos table + +XRotation TPOINT <> ; 3x3 rotation matrix +YRotation TPOINT <> +ZRotation TPOINT <> + +Translation TPOINT <> ; Translation vector + +Light TPOINT <> ; Light vector +AmbientLight DW 00 ; Ambient light + +XScale DD 10000h ; Scaling factor for X coordinate +YScale DD 10000h ; Scaling factor for Y coordinate +PerspectiveDistance DD 20000000h + +MATH_DATA ENDS + +;----------------------------------------------------------- +; +; Code segment +; +MATH_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MATH_TEXT, es:NOTHING, fs:NOTHING + +tdSetPerspective PROC PASCAL FAR + ARG Perspective:DWORD, \ + ScaleX:DWORD, \ + ScaleY:DWORD + USES ds + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + mov eax, [Perspective] + mov [PerspectiveDistance], eax + mov eax, [ScaleX] + mov [XScale], eax + mov eax, [ScaleY] + mov [YScale], eax + + ret +tdSetPerspective ENDP + + +;----------------------------------------------------------- +; +; Sets the rotation matrix. +; +; Input: +; RX = X-axis rotation angle +; RY = X-axis rotation angle +; RZ = X-axis rotation angle +; Output: +; none +; +tdSetRotation PROC PASCAL FAR + ARG RX:WORD, \ + RY:WORD, \ + RZ:WORD + USES ds, si, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + mov bx, [RZ] + mov si, [RY] + mov di, [RX] + shl bx, 2 + shl si, 2 + shl di, 2 + + push ebp ; We use EBP as a scratch register + +; Set X rotation + mov eax, tblCos[bx] + imul tblCos[si] + mov [XRotation.X], edx + + mov eax, tblSin[bx] + imul tblCos[si] + mov [XRotation.Y], edx + + mov eax, tblSin[si] + sar eax, 8 ; Convert fixed 8:24 to fixed 16:16 + mov [XRotation.Z], eax + +; Set Y rotation + mov eax, tblCos[bx] + imul tblSin[si] ; EDX:EAX = fixed 16:48 + shrd eax, edx, 24 ; EAX = fixed 8:24 + imul tblSin[di] ; EDX:EAX = fixed 16:48 + mov ebp, eax + mov ecx, edx + mov eax, tblSin[bx] + imul tblCos[di] + add eax, ebp + adc edx, ecx ; EDX:EAX = fixed 16:48 + neg edx + mov [YRotation.X], edx + + mov eax, tblSin[bx] + imul tblSin[si] + shrd eax, edx, 24 + imul tblSin[di] + mov ebp, eax + mov ecx, edx + mov eax, tblCos[bx] + imul tblCos[di] + sub eax, ebp + sbb edx, ecx + mov [YRotation.Y], edx + + mov eax, tblCos[si] + imul tblSin[di] + mov [YRotation.Z], edx + +; Set Z rotation + mov eax, tblCos[bx] + imul tblSin[si] + shrd eax, edx, 24 + imul tblCos[di] + mov ebp, eax + mov ecx, edx + mov eax, tblSin[bx] + imul tblSin[di] + sub eax, ebp + sbb edx, ecx + mov [ZRotation.X], edx + + mov eax, tblSin[bx] + imul tblSin[si] + shrd eax, edx, 24 + imul tblCos[di] + mov ebp, eax + mov ecx, edx + mov eax, tblCos[bx] + imul tblSin[di] + add eax, ebp + add edx, ecx + neg edx + mov [ZRotation.Y], edx + + mov eax, tblCos[si] + imul tblCos[di] + mov [ZRotation.Z], edx + + pop ebp ; Restore EBP + + ret +tdSetRotation ENDP + +;----------------------------------------------------------- +; +; Sets the translation vector. +; +; Input: +; TV = pointer to translation vector +; Output: +; none +; +tdSetTranslation PROC PASCAL FAR + ARG TV:DWORD + USES ds, es, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + les di, [TV] + mov eax, es:[di].X + mov [Translation.X], eax + mov eax, es:[di].Y + mov [Translation.Y], eax + mov eax, es:[di].Z + mov [Translation.Z], eax + + ret +tdSetTranslation ENDP + +;----------------------------------------------------------- +; +; Transforms an array of TPOINT. +; +; Input: +; Source = pointer to source array of TPOINT +; Dest = pointer to destination array of TPOINT +; Count = number of entries to transform +; Output: +; none +; +tdTransform PROC PASCAL FAR + ARG Source:DWORD, \ + Dest:DWORD, \ + Count:WORD + LOCAL Adjust:DWORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + lfs si, [Source] + les di, [Dest] + + ALIGN DWORD +@@Loop: +; Transform Z coordinate + mov eax, fs:[si].X + imul [ZRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [ZRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [ZRotation.Z] + add eax, ecx + adc edx, ebx + mov ebx, eax + shrd eax, edx, 16 + add eax, [Translation.Z] ; EAX = new Z coord (fixed 16:16) + mov es:[di].Z, eax +; Get perspective factor + mov ebx, [PerspectiveDistance] + sub eax, ebx + neg eax ; EAX = PD - Z + xor edx, edx + shld edx, eax, 16 + shl eax, 16 + idiv ebx ; EAX = fixed 16:16 result + mov [Adjust], eax + +; Transform X coordinate + mov eax, fs:[si].X + imul [XRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [XRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [XRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + add eax, [Translation.X] + imul [Adjust] + shrd eax, edx, 16 + mov es:[di].X, eax + +; Transform Y coordinate + mov eax, fs:[si].X + imul [YRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [YRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [YRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + add eax, [Translation.Y] + imul [Adjust] + shrd eax, edx, 16 + mov es:[di].Y, eax + + add si, SIZE TPOINT + add di, SIZE TPOINT + dec [Count] + jnz @@Loop + + ret +tdTransform ENDP + +;----------------------------------------------------------- +; +; Transforms an array of TPOINT into an array of TIMAGEPOINT. +; +; Input: +; Source = pointer to source array of TPOINT +; Dest = pointer to destination array of TIMAGEPOINT +; Count = number of entries to transform +; DeltaX = translation distance for the X coordinate +; DeltaY = translation distance for the Y coordinate +; Output: +; the maximum Z value +; +tdTransformToImage PROC PASCAL FAR + ARG Source:DWORD, \ + Dest:DWORD, \ + Count:WORD, \ + DeltaX:WORD, \ + DeltaY:WORD + LOCAL Adjust:DWORD, \ + Max:DWORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + lfs si, [Source] + les di, [Dest] + mov [Max], 80000000h + +@@Loop: +; Check max Z + mov eax, fs:[si].Z + cmp eax, [Max] + jle @@1 + mov [Max], eax +@@1: + +; Transform X coordinate + mov ax, WORD PTR fs:[si].X[2] + add ax, [DeltaX] + mov es:[di].IX, ax + +; Transform Y coordinate + mov ax, WORD PTR fs:[si].Y[2] + add ax, [DeltaY] + mov es:[di].IY, ax + + add si, SIZE TPOINT + add di, SIZE TIMAGEPOINT + dec [Count] + jnz @@Loop + + mov eax, [Max] + shld edx, eax, 16 + ret +tdTransformToImage ENDP + +;----------------------------------------------------------- +; +; Sets the light source. +; +; Input: +; Light = pointer to light vector +; Output: +; none +; +tdSetLight PROC PASCAL FAR + ARG L:DWORD + USES ds, es, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + les di, [L] + mov eax, es:[di].X + mov [Light.X], eax + mov eax, es:[di].Y + mov [Light.Y], eax + mov eax, es:[di].Z + mov [Light.Z], eax + + ret +tdSetLight ENDP + +;----------------------------------------------------------- +; +; Computes light intensity for an array of surfaces. +; +; Input: +; Normals = pointer to an array of surface normals +; Lights = pointer to an array of integer to be filled with +; light intensity +; Count = number of elements to transform +; Output: +; none +; +tdTransformLight PROC PASCAL FAR + ARG Normals:DWORD, \ + Lights:DWORD, \ + Count:WORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov fs, ax + ASSUME fs:MATH_DATA + + lds si, [Normals] + les di, [Lights] + ASSUME ds:NOTHING + +; Intensity is given by the dot product between the Light vector and +; the surface normal +@@Loop: + mov eax, ds:[si].Z + imul [Light.Z] + mov ebx, eax + mov ecx, edx + mov eax, ds:[si].Y + imul [Light.Y] + add ebx, eax + adc ecx, edx + mov eax, ds:[si].X + imul [Light.X] + add eax, ebx + adc edx, ecx ; EDX:EAX = fixed 32:32 intensity + add dx, [AmbientLight] + test dx, dx + jg @@1 + xor dx, dx ; Return 0 for no light +@@1: + mov es:[di], dx + inc di + inc di + add si, SIZE TPOINT + dec [Count] + jnz @@Loop + + ASSUME fs:NOTHING + ret +tdTransformLight ENDP + +;----------------------------------------------------------- +; +; Returns the light value given the normal to a surface. +; +; Input: +; Normal = pointer to TPOINT surface normal vector +; Output: +; AX = light intensity (>=0) +; Notes: +; the normal is rotated according to the current setting. +; +tdGetSurfaceLight PROC PASCAL FAR + ARG Normal:DWORD + USES ds, esi, es, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + les di, [Normal] + +; Transform Z coordinate + mov eax, es:[di].X + imul [ZRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, es:[di].Y + imul [ZRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, es:[di].Z + imul [ZRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + imul [Light.Z] + shrd eax, edx, 16 + mov esi, eax + +; Transform X coordinate + mov eax, es:[di].X + imul [XRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, es:[di].Y + imul [XRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, es:[di].Z + imul [XRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + imul [Light.X] + shrd eax, edx, 16 + add esi, eax + +; Transform Y coordinate + mov eax, es:[di].X + imul [YRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, es:[di].Y + imul [YRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, es:[di].Z + imul [YRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + imul [Light.X] + shrd eax, edx, 16 + add eax, esi + shr eax, 16 + +; Add ambient light + add ax, [AmbientLight] + test ax, ax + jge @@Exit + xor ax, ax + +@@Exit: + ret +tdGetSurfaceLight ENDP + +;----------------------------------------------------------- +; +; Rotates an array of TPOINT. +; +; Input: +; Source = pointer to source array of TPOINT +; Dest = pointer to destination array of TPOINT +; Count = number of entries to transform +; Output: +; none +; +tdRotate PROC PASCAL FAR + ARG Source:DWORD, \ + Dest:DWORD, \ + Count:WORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + lfs si, [Source] + les di, [Dest] + +@@Loop: +; Transform Z coordinate + mov eax, fs:[si].X + imul [ZRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [ZRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [ZRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + mov es:[di].Z, eax + +; Transform X coordinate + mov eax, fs:[si].X + imul [XRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [XRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [XRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + mov es:[di].X, eax + +; Transform Y coordinate + mov eax, fs:[si].X + imul [YRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [YRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [YRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + mov es:[di].Y, eax + + add si, SIZE TPOINT + add di, SIZE TPOINT + dec [Count] + jnz @@Loop + + ret +tdRotate ENDP + +tdFixedMul PROC PASCAL FAR + ARG F1:DWORD, \ + F2:DWORD + + mov eax, [F1] + imul [F2] + shr eax, 16 + + ret +tdFixedMul ENDP + +;----------------------------------------------------------- +; +; Returns in EAX the square root of EDX:EAX. +; +subSqrt PROC NEAR + push esi + push edi + + add eax, eax + adc edx, 0 + mov eax, edx ; Just discard the low bits + + mov esi, eax + xor edi, edi + shld edi, esi, 16 + shl esi, 16 +@@Loop: + mov ebx, eax + mul eax + add eax, esi + adc edx, edi + shrd eax, edx, 1 + shr edx, 1 + div ebx + cmp eax, ebx + jne @@Loop + +; Adjust EAX + shl eax, 8 + + pop edi + pop esi + ret +subSqrt ENDP + +;----------------------------------------------------------- +; +; Finds the unitary normal to a given surface. +; +; Input: +; Dest = pointer to TPOINT (vector) result +; P1, P2, P3 = pointer to TPOINT points on surface +; Output: +; none +; Notes: +; the normal is given by the cross-product between (P3-P1) and +; (P2-P1), so its orientation depends on the parameters order. +; +tdGetNormal PROC PASCAL FAR + ARG Dest:DWORD, \ + P1:DWORD, \ + P2:DWORD, \ + P3:DWORD + LOCAL V1:TPOINT, \ + V2:TPOINT, \ + N:TPOINT + USES ds, si, es, di + +; Get vector V1 + lds si, [P1] + les di, [P3] + mov eax, es:[di].X + sub eax, ds:[si].X + mov [V1.X], eax + mov eax, es:[di].Y + sub eax, ds:[si].Y + mov [V1.Y], eax + mov eax, es:[di].Z + sub eax, ds:[si].Z + mov [V1.Z], eax + +; Get vector V2 + les di, [P2] + mov eax, es:[di].X + sub eax, ds:[si].X + mov [V2.X], eax + mov eax, es:[di].Y + sub eax, ds:[si].Y + mov [V2.Y], eax + mov eax, es:[di].Z + sub eax, ds:[si].Z + mov [V2.Z], eax + +; Get normal vector (V1 x V2) + mov eax, [V1.Z] + imul [V2.Y] + mov ebx, eax + mov ecx, edx + mov eax, [V1.Y] + imul [V2.Z] + sub eax, ebx + sbb edx, ecx + shrd eax, edx, 16 + mov [N.X], eax + + mov eax, [V1.X] + imul [V2.Z] + mov ebx, eax + mov ecx, edx + mov eax, [V1.Z] + imul [V2.X] + sub eax, ebx + sbb edx, ecx + shrd eax, edx, 16 + mov [N.Y], eax + + mov eax, [V1.Y] + imul [V2.X] + mov ebx, eax + mov ecx, edx + mov eax, [V1.X] + imul [V2.Y] + sub eax, ebx + sbb edx, ecx + shrd eax, edx, 16 + mov [N.Z], eax + +; Get normal length + mov eax, [N.X] + imul eax + mov ebx, eax + mov ecx, edx + mov eax, [N.Y] + imul eax + add ebx, eax + adc ecx, edx + mov eax, [N.Z] + imul eax + add eax, ebx + adc edx, ecx ; EDX:EAX = N.X*N.X + N.Y*N.Y + N.Z*N.Z + call subSqrt ; EAX = normal length + mov ebx, eax + +; Adjust vector and save it + les di, [Dest] + mov eax, [N.X] + cdq + shld edx, eax, 16 + shl eax, 16 + idiv ebx + mov es:[di].X, eax + mov eax, [N.Y] + cdq + shld edx, eax, 16 + shl eax, 16 + idiv ebx + mov es:[di].Y, eax + mov eax, [N.Z] + cdq + shld edx, eax, 16 + shl eax, 16 + idiv ebx + mov es:[di].Z, eax + + ret +tdGetNormal ENDP + +TPOLY STRUC + Vtx DW 4 DUP(?) +TPOLY ENDS + +;----------------------------------------------------------- +; +; Performs surface removal on an array of polygons. +; +; Input: +; Poly = pointer to an array of TPOLY +; Vertex = pointer to an array of TPOINT +; Dest = pointer to an array of integer +; Count = number of polygons to check +; Step = size of TPOLY structure +; Output: +; if the n-th polygon is invisible the n-th entry of the +; Dest array is set to -1, other entries are not modified +; (so it's possible to use the Light array for Dest, because +; the light intensity is always >= 0) +; +tdBackPlaneCull PROC PASCAL FAR + ARG Step:WORD, \ + Poly:DWORD, \ + Vertex:DWORD, \ + Dest:DWORD, \ + Count:WORD + USES ds, si, es, di, fs + ASSUME ds:NOTHING + + mov ds, WORD PTR Vertex[2] + les di, [Poly] + mov fs, WORD PTR Dest[2] + +@@Loop: + mov ax, es:[di].Vtx[2] ; Index of 2nd vertex + shl ax, 2 + mov bx, ax + shl ax, 1 + add bx, ax ; BX = index*SIZE TPOINT + add bx, WORD PTR [Vertex] ; BX = offset of 2nd vertex + mov ax, es:[di].Vtx[4] ; Index of 3rd vertex + shl ax, 2 + mov si, ax + shl ax, 1 + add si, ax + add si, WORD PTR [Vertex] ; SI = offset of 3rd vertex + mov ecx, ds:[si].X + sub ecx, ds:[bx].X ; ECX = V3.X-V2.X + mov edx, ds:[si].Y + sub edx, ds:[bx].Y ; EDX = V3.Y-V2.Y + mov ax, es:[di].Vtx[0] ; Index of 1st vertex + shl ax, 2 + mov si, ax + shl ax, 1 + add si, ax + add si, WORD PTR [Vertex] ; SI = offset of 1st vertex + mov eax, ds:[si].X + sub eax, ds:[bx].X ; EAX = V1.X-V2.X + mov esi, ds:[si].Y + sub esi, ds:[bx].Y ; ESI = V1.Y-V2.Y + imul edx + mov ebx, eax + xchg ecx, edx ; ECX:EBX = (V1.X-V2.X)*(V3.Y-V2.Y) + mov eax, esi + imul edx ; EDX:EAX = (V1.Y-V2.Y)*(V3.X-V2.X) + sub eax, ebx + sbb edx, ecx + jl @@Next ; Polygon is visible + mov bx, WORD PTR [Dest] ; FS:BX -> current Dest entry + mov WORD PTR fs:[bx], -1 ; Remove polygon +@@Next: + add WORD PTR [Dest], 2 ; Next entry for dest + add di, [Step] ; Next polygon + dec [Count] + jnz @@Loop + + ret +tdBackPlaneCull ENDP + +MATH_TEXT ENDS +END diff --git a/16/xw__/modex/THREED.H b/16/xw__/modex/THREED.H new file mode 100755 index 00000000..b993ef86 --- /dev/null +++ b/16/xw__/modex/THREED.H @@ -0,0 +1,32 @@ +typedef struct { + long x, y, z; +} TVECTOR; + +#define PVECTOR TVECTOR far * + +#define TPOINT TVECTOR +#define PPOINT PVECTOR + +#define VPTR void far * + +#ifdef __cplusplus +extern "C" { +#endif + +long far pascal tdFixedMul( long, long ); +int far pascal tdGetSurfaceLight( PPOINT ); +long far pascal tdTransformToImage( VPTR, VPTR, short, short, short ); + +void far pascal tdBackPlaneCull( VPTR, VPTR, VPTR, short, short ); +void far pascal tdGetNormal( VPTR, PPOINT, PPOINT, PPOINT ); +void far pascal tdRotate( VPTR, VPTR, short ); +void far pascal tdSetLight( PVECTOR ); +void far pascal tdSetRotation( short, short, short ); +void far pascal tdSetTranslation( PVECTOR ); +void far pascal tdSetPerspective( long, long, long ); +void far pascal tdTransform( VPTR, VPTR, short ); +void far pascal tdTransformLight( VPTR, VPTR, short ); + +#ifdef __cplusplus +} +#endif diff --git a/16/xw__/modex/THREED.PAS b/16/xw__/modex/THREED.PAS new file mode 100755 index 00000000..8b712c9d --- /dev/null +++ b/16/xw__/modex/THREED.PAS @@ -0,0 +1,40 @@ +unit ThreeD; +interface + +type + TVector = record + X, Y, Z : longint; + end; + TPoint = TVector; + +function tdFixedMul( F1, F2: longint ): longint; +function tdGetSurfaceLight( var Normal: TPoint ): integer; +function tdTransformToImage( var Source, Dest; Count, DeltaX, DeltaY: integer ): longint; + +procedure tdBackPlaneCull( var Poly, Vertex, Dest; Count, Step: word ); +procedure tdGetNormal( var Dest, P1, P2, P3: TVector ); +procedure tdRotate( var Source, Dest; Count: word ); +procedure tdSetLight( var Light: TVector ); +procedure tdSetRotation( RX, RY, RZ: word ); +procedure tdSetTranslation( var TV: TVector ); +procedure tdSetPerspective( PD, XF, YF: longint ); +procedure tdTransform( var Source, Dest; Count: word ); +procedure tdTransformLight( var Source, Dest; Count: word ); + +implementation + +function tdGetSurfaceLight; external; +procedure tdSetRotation( RX, RY, RZ: word ); external; +procedure tdGetNormal; external; +procedure tdSetTranslation( var TV: TVector ); external; +procedure tdTransform( var Source, Dest; Count: word ); external; +procedure tdRotate; external; +function tdTransformToImage; external; +procedure tdSetLight( var Light: TVector ); external; +procedure tdSetPerspective; external; +procedure tdTransformLight; external; +function tdFixedMul( F1, F2: longint ): longint; external; +procedure tdBackPlaneCull; external; +{$L THREED} + +end. diff --git a/16/xw__/modex/demo01.c b/16/xw__/modex/demo01.c new file mode 100755 index 00000000..0908fdf4 --- /dev/null +++ b/16/xw__/modex/demo01.c @@ -0,0 +1,125 @@ +/* + DEMO01 - Sprites, page flipping and palette rotation + Copyright (c) 1994 Alessandro Scotti +*/ +uses Crt, Modex; + +#DEFINE MAX_SPRITE 100 +type + (* Sprite structure *) + TSprite = record + X, Y : integer; (* Sprite coordinates *) + DX,DY: integer; (* Deltas for sprite movement *) + W, H : integer; (* Sprite width and height *) + Image: array[ 1..16, 1..16 ] of byte; (* Sprite image data *) + end; + (* RGB color structure *) + TRgb = record + R, G, B: byte; + end; +var + S : array[ 1..MAX_SPRITE ] of TSprite; (* An array of sprites *) + Palette: array[ byte ] of TRgb; (* Palette *) + Page : word; (* Page offset *) + I : word; + +(* Initializes a sprite structure *) +procedure sxInit( var S: TSprite ); +var + I: word; +begin + S.X := Random( 320 ); (* Initialize position with random values *) + S.Y := Random( 240 ); + S.DX := Random( 7 )-3; (* Initialize speed with random values *) + S.DY := Random( 7 )-3; + S.W := 16; (* Size is fixed in this program *) + S.H := 16; + (* The image is a square with a hole inside *) + FillChar( S.Image, SizeOf(S.Image), Random(15)+1 ); + for I:=5 to 12 do FillChar( S.Image[ I, 5 ], 8, 0 ); +end; + +(* Moves a sprite *) +procedure sxMove( var S: TSprite ); +begin + Inc( S.X, S.DX ); (* Get new position *) + Inc( S.Y, S.DY ); + (* Check sprite position, change delta if needed *) + if( S.X > 320 ) then begin + S.X := 320; + S.DX := -S.DX; + end; + if( S.X < -16 ) then begin + S.X := -16; + S.DX := -S.DX; + end; + if( S.Y > 240 ) then begin + S.Y := 240; + S.DY := -S.DY; + end; + if( S.Y < -16 ) then begin + S.Y := -16; + S.DY := -S.DY; + end; + (* Draw the sprite, note the Page offset added to the *) + (* Y coordinate of the image *) + mxPutImage( @S.Image, S.X, Page+S.Y, S.W, S.H, OP_TRANS ); +end; + +begin + (* Initialize library *) + mxInit; + + (* Enter graphics mode *) + mxSetMode( MX_320x240 ); + + (* Print initialization message *) + mxSetTextColor( 15, OP_TRANS ); + mxOutStr( 4, 4, 'Initializing...' ); + + (* Initialize sprites *) + for I:=1 to MAX_SPRITE do sxInit( S[I] ); + + (* Draw background *) + for I:=1 to 192 do begin + mxCircle( 160, 480+120, I, I+63 ); + mxCircle( 161, 480+120, I, I+63 ); + end; + + (* Compute and set palette *) + for I:=1 to 192 do with Palette[I+63] do begin + R := 0; + G := 0; + B := 0; + if( I < 64 ) then + R := I shr 1+31 + else if( I < 128 ) then + G := (I-64) shr 1+31 + else + B := (I-128) shr 1+31; + end; + mxSetPalette( @Palette[64], 64, 192 ); + + (* Main loop *) + Page := 240; + while( not KeyPressed ) do begin + (* Set clip region to current page *) + mxSetClipRegion( 0, Page, 320, 240 ); + mxSetClip( TRUE ); + (* Restore background *) + mxBitBlt( 0, 480, 320, 240, 0, Page ); + (* Draw sprites *) + for I:=1 to MAX_SPRITE do sxMove( S[I] ); + (* Print message *) + mxOutStr( 4, Page+4, 'Some sprites moving...' ); + (* Flip page *) + mxStartLine( Page ); + Page := 240-Page; + (* Animate palette *) + mxSetPalette( @Palette[64], 64, 192 ); + mxRotatePalette( @Palette[64], 192, 3 ); + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/mxbb.asm b/16/xw__/mxbb.asm similarity index 100% rename from 16/mxbb.asm rename to 16/xw__/mxbb.asm diff --git a/16/xw__/mxcc.asm b/16/xw__/mxcc.asm new file mode 100755 index 00000000..f59177f8 --- /dev/null +++ b/16/xw__/mxcc.asm @@ -0,0 +1,629 @@ +.387 + PUBLIC XSUBCLIPLINE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPX1:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + or al,byte ptr [bx+si] +L$2: + DW offset L$3 + or al,byte ptr [bx+si] + DW offset L$4 + or word ptr [bx+si],ax + DW offset L$5 + ???? + inc word ptr [bx+si] + add byte ptr [bp+si],cl + add byte ptr 0a00H[bx+si],al + add byte ptr 900H[bp],dl + add byte ptr -100H[si],ch + inc word ptr [bx+si] + add byte ptr ds:[0c000H],al + add byte ptr ds:[0ce00H],al + add byte ptr [di],al + add ah,bl + add bh,bh + inc word ptr [bx+si] + add bh,bh + inc word ptr [bx+si] + add bh,bh + inc word ptr [bx+si] + add bh,bh + inc word ptr [bx+si] + add bh,bh + inc word ptr [bx+si] + DB 0 +L$3: + DW offset MX_TEXT+0ecH + DW offset MX_TEXT+0eeH + DW offset MX_TEXT+0f1H + DW offset MX_TEXT+0eaH + DW offset MX_TEXT+0f4H + DW offset MX_TEXT+0f7H + DW offset MX_TEXT+104H + DW offset MX_TEXT+0eaH + DW offset MX_TEXT+111H + DW offset MX_TEXT+114H + DW offset MX_TEXT+121H +L$4: + DW offset MX_TEXT+132H + DW offset MX_TEXT+0eaH + DW offset MX_TEXT+135H + DW offset MX_TEXT+0eaH + DW offset MX_TEXT+13bH + DW offset MX_TEXT+0eaH + DW offset MX_TEXT+148H + DW offset L$7 + DW offset L$10 + DW offset L$7 + DW offset L$11 +L$5: + DW offset L$14 + DW offset L$15 + DW offset L$7 + DW offset L$7 + DW offset L$16 + DW offset L$17 + DW offset L$7 + DW offset L$7 + DW offset L$18 + DW offset L$19 + DW offset L$22 + DW offset L$23 + DW offset L$24 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$25 + DW offset L$26 + DW offset L$27 + DW offset L$30 + DW offset L$7 + DW offset L$31 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$32 + DW offset L$7 + DW offset L$33 + DW offset L$36 + DW offset L$37 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$7 + DW offset L$38 + DW offset L$39 + DW offset L$43 + DW offset L$44 + DW offset L$45 + DW offset L$7 + DW offset L$46 + DW offset L$47 + DW offset L$48 + DW offset L$51 + DW offset L$7 + DW offset L$52 + DW offset L$7 + DW offset L$53 + DW offset L$7 + DW offset L$54 + DW offset L$58 + DW offset L$59 + DW offset L$7 + DW offset L$7 + DW offset L$60 + DW offset L$61 +L$6: + clc + ret +L$7: + stc + ret + clc + ret + jmp near ptr L$67 + jmp near ptr L$68 + jmp near ptr L$70 + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY1 + jge L$6 + jmp near ptr L$70 + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY1 + jge L$6 + jmp near ptr L$70 + jmp near ptr L$69 + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY2 + jle L$6 + jmp near ptr L$69 + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY2 + jle L$6 + jmp near ptr L$69 +L$8: + stc + ret +L$9: + clc + ret + jmp near ptr L$63 + call near ptr L$63 + jmp near ptr L$68 + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$8 + jmp near ptr L$70 + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$8 + call near ptr L$70 + cmp cx,word ptr cs:MX_CLIPX2 + jle L$9 + jmp near ptr L$68 +L$10: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$8 + jmp near ptr L$69 +L$11: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$8 + call near ptr L$69 + cmp cx,word ptr cs:MX_CLIPX2 + jle L$9 + jmp near ptr L$68 +L$12: + clc + ret +L$13: + stc + ret +L$14: + jmp near ptr L$64 +L$15: + call near ptr L$64 + jmp near ptr L$67 +L$16: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$13 + jmp near ptr L$70 +L$17: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$13 + call near ptr L$70 + cmp cx,word ptr cs:MX_CLIPX1 + jge L$12 + jmp near ptr L$67 +L$18: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$13 + jmp near ptr L$69 +L$19: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$13 + call near ptr L$69 + cmp cx,word ptr cs:MX_CLIPX1 + jge L$12 + jmp near ptr L$67 +L$20: + clc + ret +L$21: + stc + ret +L$22: + jmp near ptr L$66 +L$23: + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX1 + jl L$21 + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY1 + jge L$20 + jmp near ptr L$70 +L$24: + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX2 + jg L$21 + jmp near ptr L$68 +L$25: + call near ptr L$66 + jmp near ptr L$69 +L$26: + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX1 + jl L$21 + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY2 + jle L$20 + jmp near ptr L$69 +L$27: + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX2 + jg L$21 + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY2 + jle L$20 + jmp near ptr L$69 +L$28: + clc + ret +L$29: + stc + ret +L$30: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY1 + jge L$28 + jmp near ptr L$66 +L$31: + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY1 + jl L$29 + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX1 + jge L$28 + jmp near ptr L$63 +L$32: + call near ptr L$69 + cmp cx,word ptr cs:MX_CLIPX1 + jl L$29 + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX1 + jge L$28 + jmp near ptr L$63 +L$33: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$29 + call near ptr L$68 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$29 + cmp si,word ptr cs:MX_CLIPY2 + jle L$28 + jmp near ptr L$69 +L$34: + clc + ret +L$35: + stc + ret +L$36: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY1 + jge L$34 + jmp near ptr L$66 +L$37: + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY2 + jl L$35 + call near ptr L$66 + cmp di,word ptr cs:MX_CLIPX2 + jle L$34 + jmp near ptr L$64 +L$38: + call near ptr L$69 + cmp cx,word ptr cs:MX_CLIPX2 + jg L$35 + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY1 + jge L$34 + jmp near ptr L$66 +L$39: + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY1 + jl L$35 + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$35 + cmp si,word ptr cs:MX_CLIPY2 + jle L$40 + call near ptr L$69 +L$40: + cmp bx,word ptr cs:MX_CLIPY1 + jge L$34 + jmp near ptr L$66 +L$41: + clc + ret +L$42: + stc + ret +L$43: + jmp near ptr L$65 +L$44: + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX1 + jl L$42 + jmp near ptr L$67 +L$45: + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX2 + jg L$42 + jmp near ptr L$68 +L$46: + call near ptr L$65 + jmp near ptr L$70 +L$47: + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX1 + jl L$42 + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY1 + jge L$42 + jmp near ptr L$70 +L$48: + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX2 + jg L$42 + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY1 + jge L$41 + jmp near ptr L$70 +L$49: + clc + ret +L$50: + stc + ret +L$51: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY2 + jle L$49 + jmp near ptr L$65 +L$52: + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY2 + jg L$50 + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX1 + jge L$49 + jmp near ptr L$63 +L$53: + call near ptr L$70 + cmp cx,word ptr cs:MX_CLIPX1 + jl L$50 + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY2 + jle L$49 + jmp near ptr L$65 +L$54: + call near ptr L$63 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$50 + call near ptr L$68 + cmp si,word ptr cs:MX_CLIPY2 + jg L$50 + cmp bx,word ptr cs:MX_CLIPY2 + jle L$55 + call near ptr L$65 +L$55: + cmp si,word ptr cs:MX_CLIPY1 + jge L$49 + jmp near ptr L$70 +L$56: + clc + ret +L$57: + stc + ret +L$58: + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY2 + jle L$56 + jmp near ptr L$65 +L$59: + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY2 + jg L$57 + call near ptr L$65 + cmp di,word ptr cs:MX_CLIPX2 + jle L$56 + jmp L$64 +L$60: + call near ptr L$70 + cmp cx,word ptr cs:MX_CLIPX2 + jg L$57 + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY2 + jle L$56 + jmp L$65 +L$61: + call near ptr L$67 + cmp si,word ptr cs:MX_CLIPY2 + jg L$57 + call near ptr L$64 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$57 + cmp si,word ptr cs:MX_CLIPY1 + jge L$62 + call near ptr L$70 +L$62: + cmp bx,word ptr cs:MX_CLIPY2 + jle L$56 + jmp L$65 +L$63: + mov ax,si + sub ax,bx + mov dx,word ptr cs:MX_CLIPX1 + sub dx,di + imul dx + mov bp,cx + sub bp,di + idiv bp + add bx,ax + mov di,word ptr cs:MX_CLIPX1 + clc + ret +L$64: + mov ax,si + sub ax,bx + mov dx,word ptr cs:MX_CLIPX2 + sub dx,di + imul dx + mov bp,cx + sub bp,di + idiv bp + add bx,ax + mov di,word ptr cs:MX_CLIPX2 + clc + ret +L$65: + mov ax,cx + sub ax,di + mov dx,word ptr cs:MX_CLIPY2 + sub dx,bx + imul dx + mov bp,si + sub bp,bx + idiv bp + add di,ax + mov bx,word ptr cs:MX_CLIPY2 + clc + ret +L$66: + mov ax,cx + sub ax,di + mov dx,word ptr cs:MX_CLIPY1 + sub dx,bx + imul dx + mov bp,si + sub bp,bx + idiv bp + add di,ax + mov bx,word ptr cs:MX_CLIPY1 + clc + ret +L$67: + mov ax,bx + sub ax,si + mov dx,word ptr cs:MX_CLIPX1 + sub dx,cx + imul dx + mov bp,di + sub bp,cx + idiv bp + add si,ax + mov cx,word ptr cs:MX_CLIPX1 + clc + ret +L$68: + mov ax,bx + sub ax,si + mov dx,word ptr cs:MX_CLIPX2 + sub dx,cx + imul dx + mov bp,di + sub bp,cx + idiv bp + add si,ax + mov cx,word ptr cs:MX_CLIPX2 + clc + ret +L$69: + mov ax,di + sub ax,cx + mov dx,word ptr cs:MX_CLIPY2 + sub dx,si + imul dx + mov bp,bx + sub bp,si + idiv bp + add cx,ax + mov si,word ptr cs:MX_CLIPY2 + clc + ret +L$70: + mov ax,di + sub ax,cx + mov dx,word ptr cs:MX_CLIPY1 + sub dx,si + imul dx + mov bp,bx + sub bp,si + idiv bp + add cx,ax + mov si,word ptr cs:MX_CLIPY1 + clc + ret +XSUBCLIPLINE: + push bp + xor si,si + cmp dx,word ptr cs:MX_CLIPY2 + jle L$71 + or si,8 + jmp L$72 +L$71: + cmp dx,word ptr cs:MX_CLIPY1 + jge L$72 + or si,4 +L$72: + cmp cx,word ptr cs:MX_CLIPX2 + jle L$73 + or si,2 + jmp L$74 +L$73: + cmp cx,word ptr cs:MX_CLIPX1 + jge L$74 + or si,1 +L$74: + cmp bx,word ptr cs:MX_CLIPY2 + jle L$75 + or si,80H + jmp L$76 +L$75: + cmp bx,word ptr cs:MX_CLIPY1 + jge L$76 + or si,40H +L$76: + cmp ax,word ptr cs:MX_CLIPX2 + jle L$77 + or si,20H + jmp L$78 +L$77: + cmp ax,word ptr cs:MX_CLIPX1 + jge L$78 + or si,10H +L$78: + mov di,si + and di,0fH + and si,0f0H + shr si,1 + shr si,1 + cmp di,word ptr cs:L$1[si] + jg L$79 + mov si,word ptr cs:L$2[si] + shl di,1 + add si,di + mov di,ax + mov si,word ptr cs:[si] + xchg si,dx + call dx + mov ax,di + mov dx,si + pop bp + ret +L$79: + pop bp + stc + ret +MX_TEXT ENDS + END diff --git a/16/xw__/mxcg.asm b/16/xw__/mxcg.asm new file mode 100755 index 00000000..72cd3abf --- /dev/null +++ b/16/xw__/mxcg.asm @@ -0,0 +1,43 @@ +.387 + PUBLIC MXCOLORTOGRAY +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXCOLORTOGRAY: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov cx,word ptr 6[bp] + jcxz L$2 + lds si,dword ptr 0cH[bp] + les di,dword ptr 8[bp] + cld + mov bx,4d97H +L$1: + lodsb + mul bh + mov dx,ax + lodsb + mul bl + add dx,ax + lodsb + mov ah,1cH + mul ah + add ax,dx + mov al,ah + stosw + stosb + loop L$1 +L$2: + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0aH +MX_TEXT ENDS + END diff --git a/16/xw__/mxcl.asm b/16/xw__/mxcl.asm new file mode 100755 index 00000000..1f5af641 --- /dev/null +++ b/16/xw__/mxcl.asm @@ -0,0 +1,111 @@ +.387 + PUBLIC MXCIRCLE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_CLIPX1:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXCIRCLE: + push bp + mov bp,sp + sub sp,2 + push ds + push si + push di + xor si,si + mov di,word ptr 8[bp] + mov ax,3 + sub ax,di + sub ax,di + mov word ptr -2[bp],ax + mov ds,word ptr cs:MX_VIDEOSEGMENT +L$1: + cmp si,di + jg L$3 + mov ax,si + mov bx,di + call near ptr L$4 + mov ax,si + neg ax + mov bx,di + call near ptr L$4 + mov ax,si + mov bx,di + neg bx + call near ptr L$4 + mov ax,si + neg ax + mov bx,di + neg bx + call near ptr L$4 + mov ax,di + mov bx,si + call near ptr L$4 + mov ax,di + neg ax + mov bx,si + call near ptr L$4 + mov ax,di + mov bx,si + neg bx + call near ptr L$4 + mov ax,di + neg ax + mov bx,si + neg bx + call near ptr L$4 + mov ax,word ptr -2[bp] + test ax,ax + jl L$2 + mov ax,di + shl ax,1 + shl ax,1 + sub ax,4 + sub word ptr -2[bp],ax + dec di +L$2: + mov ax,si + shl ax,1 + shl ax,1 + add ax,6 + add word ptr -2[bp],ax + inc si + jmp L$1 +L$3: + xor ax,ax + pop di + pop si + pop ds + mov sp,bp + pop bp + retf 8 +L$4: + add bx,word ptr 0cH[bp] + add ax,word ptr 0aH[bp] + cmp bx,word ptr cs:MX_CLIPX1 + jl L$5 + cmp bx,word ptr cs:MX_CLIPX2 + jg L$5 + cmp ax,word ptr cs:MX_CLIPY1 + jl L$5 + cmp ax,word ptr cs:MX_CLIPY2 + jg L$5 + mul word ptr cs:MX_BYTESPERLINE + mov cx,bx + shr bx,1 + shr bx,1 + add bx,ax + and cl,3 + mov ax,102H + shl ah,cl + mov dx,3c4H + out dx,ax + mov al,byte ptr 6[bp] + mov byte ptr [bx],al +L$5: + ret +MX_TEXT ENDS + END diff --git a/16/xw__/mxcr.asm b/16/xw__/mxcr.asm new file mode 100755 index 00000000..254269f4 --- /dev/null +++ b/16/xw__/mxcr.asm @@ -0,0 +1,244 @@ +.387 + PUBLIC MX_CLIPX1 + PUBLIC MX_CLIPY1 + PUBLIC MX_CLIPX2 + PUBLIC MX_CLIPY2 + PUBLIC MXSETCLIP + PUBLIC MXGETCLIP + PUBLIC MXSETSYSCLIPREGION + PUBLIC MXSETCLIPREGION + PUBLIC MXGETCLIPREGION + PUBLIC SUBCLIPIMAGE + PUBLIC SUBCLIPBOX + EXTRN MX_CODESEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MX_CLIPX1: + add byte ptr [bx+si],al +MX_CLIPY1: + add byte ptr [bx+si],al +MX_CLIPX2: + add byte ptr [bx+si],al +MX_CLIPY2: + add byte ptr [bx+si],al +L$1: + add byte ptr [bx+si],al +L$2: + add byte ptr [bx+si],al +L$3: + add byte ptr [bx+si],al +L$4: + add byte ptr [bx+si],al +L$5: + add byte ptr [bx+si],al +L$6: + add byte ptr [bx+si],al +L$7: + add byte ptr [bx+si],al +L$8: + add byte ptr [bx+si],al +L$9: + DB 0 +MXSETCLIP: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr L$5 + mov bx,word ptr L$6 + mov cx,word ptr L$7 + mov dx,word ptr L$8 + cmp byte ptr 6[bp],1 + je L$10 + mov ax,word ptr L$1 + mov bx,word ptr L$2 + mov cx,word ptr L$3 + mov dx,word ptr L$4 +L$10: + mov word ptr MX_CLIPX1,ax + mov word ptr MX_CLIPY1,bx + mov word ptr MX_CLIPX2,cx + mov word ptr MX_CLIPY2,dx + mov al,byte ptr 6[bp] + xchg byte ptr L$9,al + xor ah,ah + pop ds + mov sp,bp + pop bp + retf 2 +MXGETCLIP: + mov al,byte ptr cs:L$9 + xor ah,ah + retf +MXSETSYSCLIPREGION: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + xor ax,ax + mov word ptr L$1,ax + mov word ptr L$2,ax + mov ax,word ptr 8[bp] + dec ax + mov word ptr L$3,ax + mov ax,word ptr 6[bp] + dec ax + mov word ptr L$4,ax + mov ax,0 + push ax + push cs + call near ptr MXSETCLIP + pop ds + mov sp,bp + pop bp + retf 4 +MXSETCLIPREGION: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr 0cH[bp] + mov word ptr L$5,ax + mov ax,word ptr 0aH[bp] + mov word ptr L$6,ax + mov ax,word ptr 8[bp] + add ax,word ptr 0cH[bp] + dec ax + mov word ptr L$7,ax + mov ax,word ptr 6[bp] + add ax,word ptr 0aH[bp] + dec ax + mov word ptr L$8,ax + mov al,byte ptr L$9 + cmp al,1 + jne L$11 + push ax + push cs + call near ptr MXSETCLIP +L$11: + xor ax,ax + pop ds + mov sp,bp + pop bp + retf 8 +MXGETCLIPREGION: + push bp + mov bp,sp + sub sp,0 + push es + push di + mov ax,word ptr cs:L$5 + les di,dword ptr 12H[bp] + mov word ptr es:[di],ax + mov ax,word ptr cs:L$6 + les di,dword ptr 0eH[bp] + mov word ptr es:[di],ax + mov ax,word ptr cs:L$7 + sub ax,word ptr cs:L$5 + inc ax + les di,dword ptr 0aH[bp] + mov word ptr es:[di],ax + mov ax,word ptr cs:L$8 + sub ax,word ptr cs:L$6 + inc ax + les di,dword ptr 6[bp] + mov word ptr es:[di],ax + mov al,byte ptr cs:L$9 + xor ah,ah + pop di + pop es + mov sp,bp + pop bp + retf 10H +SUBCLIPIMAGE: + xor si,si + mov di,word ptr cs:MX_CLIPY1 + cmp ax,di + jge L$12 + sub di,ax + sub dx,di + jle L$16 + mov ax,di + mov di,dx + mul cx + mov si,ax + mov dx,di + mov ax,word ptr cs:MX_CLIPY1 +L$12: + mov di,word ptr cs:MX_CLIPY2 + cmp ax,di + jg L$16 + inc di + sub di,dx + sub di,ax + jge L$13 + add dx,di +L$13: + mov di,word ptr cs:MX_CLIPX1 + cmp bx,di + jge L$14 + sub di,bx + sub cx,di + jle L$16 + add si,di + mov bx,word ptr cs:MX_CLIPX1 +L$14: + mov di,word ptr cs:MX_CLIPX2 + cmp bx,di + jg L$16 + inc di + sub di,bx + sub di,cx + jge L$15 + add cx,di +L$15: + clc + ret +L$16: + stc + ret +SUBCLIPBOX: + mov di,word ptr cs:MX_CLIPY1 + cmp ax,di + jge L$17 + sub di,ax + sub dx,di + jle L$21 + mov ax,word ptr cs:MX_CLIPY1 +L$17: + mov di,word ptr cs:MX_CLIPY2 + cmp ax,di + jg L$21 + inc di + sub di,dx + sub di,ax + jge L$18 + add dx,di +L$18: + mov di,word ptr cs:MX_CLIPX1 + cmp bx,di + jge L$19 + sub di,bx + sub cx,di + jle L$21 + mov bx,word ptr cs:MX_CLIPX1 +L$19: + mov di,word ptr cs:MX_CLIPX2 + cmp bx,di + jg L$21 + inc di + sub di,bx + sub di,cx + jge L$20 + add cx,di +L$20: + clc + ret +L$21: + stc + ret +MX_TEXT ENDS + END diff --git a/16/xw__/mxel.asm b/16/xw__/mxel.asm new file mode 100755 index 00000000..e69de29b diff --git a/16/xw__/mxfb.asm b/16/xw__/mxfb.asm new file mode 100755 index 00000000..d0993a13 --- /dev/null +++ b/16/xw__/mxfb.asm @@ -0,0 +1,134 @@ +.387 + PUBLIC MXFILLBOX + EXTRN SUBCLIPBOX:BYTE + EXTRN SUBHORIZONTALLINEINFO:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + mov ah,al + shr cx,1 + rep stosw + rcl cx,1 + rep stosb + ret +L$2: + mov byte ptr [bx],al + add bx,dx + loop L$2 + ret +L$3: + mov si,di +L$4: + mov ah,byte ptr [si] + mov byte ptr [si],al + inc si + loop L$4 + ret +L$5: + mov ah,byte ptr [bx] + mov byte ptr [bx],al + add bx,dx + loop L$5 + ret +MXFILLBOX: + push bp + mov bp,sp + sub sp,8 + push ds + push si + push es + push di + mov bx,word ptr 10H[bp] + mov ax,word ptr 0eH[bp] + mov cx,word ptr 0cH[bp] + mov dx,word ptr 0aH[bp] + call near ptr MX_TEXT:SUBCLIPBOX + jae L$6 + jmp near ptr L$12 +L$6: + mov word ptr 0aH[bp],dx + call near ptr MX_TEXT:SUBHORIZONTALLINEINFO + mov word ptr 0cH[bp],cx + mov byte ptr -2[bp],al + mov byte ptr -4[bp],ah + mov ax,word ptr cs:MX_VIDEOSEGMENT + mov es,ax + mov ds,ax + cld + mov word ptr -6[bp],offset L$2 + mov word ptr -8[bp],offset L$1 + mov ax,word ptr 6[bp] + cmp al,3 + ja L$7 + cmp al,0 + je L$7 + shl al,1 + shl al,1 + shl al,1 + mov ah,al + mov al,3 + mov dx,3ceH + out dx,ax + mov word ptr -6[bp],offset L$5 + mov word ptr -8[bp],offset L$3 +L$7: + mov ah,byte ptr -2[bp] + or ah,ah + je L$8 + mov dx,3c4H + mov al,2 + out dx,ax + mov dx,word ptr cs:MX_BYTESPERLINE + mov cx,word ptr 0aH[bp] + mov bx,di + mov al,byte ptr 8[bp] + call word ptr -6[bp] + inc di +L$8: + mov cx,word ptr 0cH[bp] + jcxz L$10 + mov dx,3c4H + mov ax,0f02H + out dx,ax + mov al,byte ptr 8[bp] + mov bx,di + mov dx,word ptr 0aH[bp] + push di +L$9: + mov di,bx + call word ptr -8[bp] + mov cx,word ptr 0cH[bp] + add bx,word ptr cs:MX_BYTESPERLINE + dec dx + jne L$9 + pop di + add di,word ptr 0cH[bp] +L$10: + mov ah,byte ptr -4[bp] + or ah,ah + je L$11 + mov dx,3c4H + mov al,2 + out dx,ax + mov dx,word ptr cs:MX_BYTESPERLINE + mov cx,word ptr 0aH[bp] + mov bx,di + mov al,byte ptr 8[bp] + call word ptr -6[bp] +L$11: + mov dx,3ceH + mov ax,3 + out dx,ax +L$12: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +MX_TEXT ENDS + END diff --git a/16/xw__/mxfp.asm b/16/xw__/mxfp.asm new file mode 100755 index 00000000..45900b0b --- /dev/null +++ b/16/xw__/mxfp.asm @@ -0,0 +1,220 @@ +.387 + PUBLIC MXFADEPALETTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP + inc bx + outsw + jo L$5 + jb L$4 + push 2074H + sub byte ptr 29H[bp+di],ah + and byte ptr [bx+di],dh + cmp word ptr [bx+di],di + xor ch,byte ptr [di] + xor word ptr [bx+di],di + cmp word ptr [si],si + and byte ptr 52H[bx+di],al + push sp + dec cx + push bx + and byte ptr 2eH[bp+di],dh + jb L$1 + insb + and byte ptr cs:6cH[bx+di],al + insb + and byte ptr 69H[bp+si],dh + push 7374H + and byte ptr 65H[bp+si],dh + jae L$7 + jb L$9 + DB 65H, 64H, 2eH +MXFADEPALETTE: + push bp + mov bp,sp + sub sp,60aH + push si + push di + push ds + push es + mov word ptr -608H[bp],1 + mov ax,word ptr 10H[bp] + and ax,0ff00H +L$1: + je L$2 + mov cl,8 + shr ax,cl + mov word ptr -608H[bp],ax +L$2: + mov ax,word ptr 10H[bp] + and ax,0feH + mov cl,1 + shr ax,cl + or ax,ax + jne L$3 + mov ax,30H +L$3: + mov word ptr -60aH[bp],ax +L$4: + inc ax + mov byte ptr -606H[bp],al + mov byte ptr -604H[bp],1 + DB 0c6H, 86H, 0feH, 0f9H +L$5: + add byte ptr 0e46H[bp+di],cl + cmp ax,100H + jb L$6 + jmp near ptr L$12 +L$6: + add ax,word ptr 0cH[bp] + cmp ax,100H + jbe L$8 + mov ax,100H + sub ax,word ptr 0eH[bp] + DB 89H, 46H +L$7: + or al,0bH + ???? + jne L$8 + jmp near ptr L$12 +L$8: + mov cx,word ptr 0cH[bp] + mov ax,cx + shl ax,1 + add cx,ax + mov ax,ss +L$9: + mov es,ax + lea di,-300H[bp] + mov ax,word ptr 0eH[bp] + mov si,ax + shl ax,1 + add ax,si + lds si,dword ptr 12H[bp] + add si,ax + cld + shr cx,1 + rep movsw + rcl cx,1 + rep movsb + test word ptr 10H[bp],1 + je L$10 + mov ax,word ptr -60aH[bp] + mov byte ptr -602H[bp],al + mov byte ptr -604H[bp],0ffH + mov ax,ss + mov ds,ax + mov es,ax + lea di,-300H[bp] + mov ax,word ptr 0eH[bp] + mov cx,word ptr 0cH[bp] + call near ptr L$19 +L$10: + mov bh,byte ptr 0aH[bp] + and bh,3fH + mov bl,byte ptr 8[bp] + and bl,3fH + mov dh,byte ptr 6[bp] + and dh,3fH + mov dl,byte ptr -602H[bp] + mov ax,ss + mov ds,ax + mov es,ax +L$11: + mov ax,word ptr 0cH[bp] + mov cx,word ptr -60aH[bp] + lea si,-300H[bp] + lea di,-600H[bp] + call near ptr L$13 + push bx + push dx + lea si,-600H[bp] + mov ax,word ptr 0eH[bp] + mov bx,word ptr 0cH[bp] + mov cx,word ptr -608H[bp] + call near ptr L$15 + pop dx + pop bx + add dl,byte ptr -604H[bp] + dec byte ptr -606H[bp] + jne L$11 +L$12: + pop es + pop ds + pop di + pop si + mov sp,bp + pop bp + retf 10H +L$13: + cld + push bp + mov bp,ax +L$14: + lodsb + sub al,bh + imul dl + idiv cl + add al,bh + stosb + lodsb + sub al,bl + imul dl + idiv cl + add al,bl + stosb + lodsb + sub al,dh + imul dl + idiv cl + add al,dh + stosb + dec bp + jne L$14 + pop bp + ret +L$15: + mov ah,al + mov dx,3daH +L$16: + in al,dx + test al,8 + jne L$16 +L$17: + in al,dx + test al,8 + je L$17 + loop L$16 + mov cx,bx + mov dx,3c8H + mov al,ah + out dx,al + inc dx + cld + cli +L$18: + lodsb + out dx,al + lodsb + out dx,al + lodsb + out dx,al + loop L$18 + sti + ret +L$19: + mov dx,3c7H + out dx,al + inc dx + inc dx + cld +L$20: + in al,dx + stosb + in al,dx + stosb + in al,dx + stosb + loop L$20 + ret +MX_TEXT ENDS + END diff --git a/16/xw__/mxgc.asm b/16/xw__/mxgc.asm new file mode 100755 index 00000000..5b128d22 --- /dev/null +++ b/16/xw__/mxgc.asm @@ -0,0 +1,31 @@ +.387 + PUBLIC MXGETCOLOR +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXGETCOLOR: + push bp + mov bp,sp + sub sp,0 + push ds + push si + mov ax,word ptr 12H[bp] + mov dx,3c7H + out dx,al + inc dx + inc dx + lds si,dword ptr 0eH[bp] + in al,dx + mov byte ptr [si],al + lds si,dword ptr 0aH[bp] + in al,dx + mov byte ptr [si],al + lds si,dword ptr 6[bp] + in al,dx + mov byte ptr [si],al + pop si + pop ds + mov sp,bp + pop bp + retf 0eH +MX_TEXT ENDS + END diff --git a/16/xw__/mxgi.asm b/16/xw__/mxgi.asm new file mode 100755 index 00000000..36fe7087 --- /dev/null +++ b/16/xw__/mxgi.asm @@ -0,0 +1,99 @@ +.387 + PUBLIC MXGETIMAGE + EXTRN SUBCLIPIMAGE:BYTE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXGETIMAGE: + push bp + mov bp,sp + sub sp,10H + push ds + push si + push es + push di + mov bx,word ptr 0cH[bp] + mov ax,word ptr 0aH[bp] + mov cx,word ptr 8[bp] + mov dx,word ptr 6[bp] + call near ptr MX_TEXT:SUBCLIPIMAGE + jae L$1 + jmp near ptr L$7 +L$1: + mov word ptr 6[bp],dx + add word ptr 0eH[bp],si + mul word ptr cs:MX_BYTESPERLINE + mov si,bx + shr si,1 + shr si,1 + add si,ax + mov word ptr -0aH[bp],si + mov ds,word ptr cs:MX_VIDEOSEGMENT + and bl,3 + mov byte ptr -0eH[bp],bl + mov bx,cx + shr bx,1 + shr bx,1 + and cl,3 + mov al,8 + shr al,cl + mov di,6 +L$2: + mov word ptr -8[bp+di],bx + shr al,1 + adc bx,0 + dec di + dec di + jge L$2 + cld + mov byte ptr -10H[bp],4 + lea bx,-8[bp] + mov es,word ptr 10H[bp] + mov ah,byte ptr -0eH[bp] +L$3: + cmp word ptr ss:[bx],0 + je L$7 + mov di,word ptr 0eH[bp] + mov al,4 + mov dx,3ceH + out dx,ax + mov dx,word ptr 6[bp] + mov si,word ptr -0aH[bp] +L$4: + push si + push di + mov cx,word ptr ss:[bx] +L$5: + movsb + add di,3 + dec cx + jne L$5 + pop di + pop si + add di,word ptr 8[bp] + add si,word ptr cs:MX_BYTESPERLINE + dec dx + jne L$4 + inc bx + inc bx + inc ah + test ah,4 + je L$6 + inc word ptr -0aH[bp] + and ah,3 +L$6: + inc word ptr 0eH[bp] + dec byte ptr -10H[bp] + jne L$3 +L$7: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +MX_TEXT ENDS + END diff --git a/16/xw__/mxgm.asm b/16/xw__/mxgm.asm new file mode 100755 index 00000000..0c97985d --- /dev/null +++ b/16/xw__/mxgm.asm @@ -0,0 +1,69 @@ +.387 + PUBLIC MXGAMMACORRECT +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + add byte ptr [bp+si],cl + push cs + adc word ptr [bp+di],dx + adc ax,1817H + sbb bl,byte ptr [bp+di] + sbb al,1dH + pop ds + and byte ptr [bx+di],ah + and ah,byte ptr [bp+di] + and al,25H + and ax,2726H + sub byte ptr [bx+di],ch + sub word ptr [bp+si],bp + sub bp,word ptr [si] + sub al,2dH + das + xor byte ptr [bx+si],dh + xor word ptr [bx+di],si + xor dh,byte ptr [bp+di] + xor si,word ptr [si] + xor al,35H + xor ax,3636H + aaa + aaa + cmp byte ptr [bx+si],bh + cmp word ptr [bx+di],di + cmp bh,byte ptr [bp+si] + cmp di,word ptr [bp+di] + cmp al,3cH + cmp ax,3e3dH + aas + aas +MXGAMMACORRECT: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov cx,word ptr 6[bp] + jcxz L$3 + lds si,dword ptr 0cH[bp] + les di,dword ptr 8[bp] + mov bx,offset L$1 + cld + mov ax,cx + add cx,cx + add cx,ax +L$2: + lodsb + xlat word ptr cs:[bx] + stosb + loop L$2 +L$3: + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0aH +MX_TEXT ENDS + END diff --git a/16/xw__/mxgp.asm b/16/xw__/mxgp.asm new file mode 100755 index 00000000..19a10ccc --- /dev/null +++ b/16/xw__/mxgp.asm @@ -0,0 +1,33 @@ +.387 + PUBLIC MXGETPALETTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXGETPALETTE: + push bp + mov bp,sp + sub sp,0 + push es + push di + les di,dword ptr 0aH[bp] + mov cx,word ptr 6[bp] + mov ax,word ptr 8[bp] + mov dx,3c7H + out dx,al + inc dx + inc dx + cld +L$1: + in al,dx + stosb + in al,dx + stosb + in al,dx + stosb + loop L$1 + pop di + pop es + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw__/mxgv.asm b/16/xw__/mxgv.asm new file mode 100755 index 00000000..bbe19c95 --- /dev/null +++ b/16/xw__/mxgv.asm @@ -0,0 +1,9 @@ +.387 + PUBLIC MXGETVERSION +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXGETVERSION: + mov ax,128H + retf +MX_TEXT ENDS + END diff --git a/16/xw__/mxhl.asm b/16/xw__/mxhl.asm new file mode 100755 index 00000000..159e5c99 --- /dev/null +++ b/16/xw__/mxhl.asm @@ -0,0 +1,45 @@ +.387 + PUBLIC SUBHORIZONTALLINEINFO + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + add byte ptr [bx+si],al + add ax,word ptr [bx+si] + add al,byte ptr [bx+si] + add word ptr [bx+si],ax +L$2: + add byte ptr ds:[80cH],cl +L$3: + add byte ptr [bx+di],al + add ax,word ptr [bx] +L$4: + DB 2, 6 +SUBHORIZONTALLINEINFO: + DD ds:[0f72eH] + add byte ptr -2e05H[bp+di],cl + out dx,ax + shr di,1 + add di,ax + and bx,3 + mov al,byte ptr cs:L$2[bx] + shl bx,1 + sub cx,word ptr cs:L$1[bx] + jge L$5 + mov bx,cx + inc bx + inc bx + and al,byte ptr cs:L$4[bx] + xor ah,ah + xor cx,cx + jmp L$6 +L$5: + mov bx,cx + and bx,3 + mov ah,byte ptr cs:L$3[bx] + shr cx,1 + shr cx,1 +L$6: + ret +MX_TEXT ENDS + END diff --git a/16/xw__/mxit.asm b/16/xw__/mxit.asm new file mode 100755 index 00000000..4f68fddd --- /dev/null +++ b/16/xw__/mxit.asm @@ -0,0 +1,92 @@ +.387 + PUBLIC MX_VIDEOSEGMENT + PUBLIC MX_CODESEGMENT + PUBLIC MXINIT + PUBLIC MXTERM +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP + dec bp + dec di + inc sp + inc bp + pop ax + and byte ptr 69H[si],ch + bound si,word ptr 61H[bp+si] + jb L$3 + and byte ptr [di],ch + and byte ptr 6fH[bp+di],al + jo L$5 + jb L$2 + push 2074H + sub byte ptr 29H[bp+di],ah + and byte ptr [bx+di],dh + cmp word ptr [bx+di],di + xor ch,byte ptr [di] + xor word ptr [bx+di],di + cmp word ptr [si],si + and byte ptr 6cH[bx+di],al + ; The label referred to here is an undefined location + jae 0a0H + popa + outsb + ; The label referred to here is an undefined location + jb 0a1H + and byte ptr 63H[bp+di],dl + outsw + ; The label referred to here is an undefined location + je 0acH + DB 69H +MX_VIDEOSEGMENT: + DB 0, 0a0H +MX_CODESEGMENT: + DW MX_TEXT +MXINIT: + push bp + mov bp,sp + sub sp,6 + push ds + push si + push es + push di + mov word ptr -2[bp],0ffffH + mov word ptr -4[bp],0a000H + mov word ptr -6[bp],cs + mov ax,1686H + int 2fH + or ax,ax + jne L$1 + mov ax,0aH + mov bx,cs + int 31H + jb L$4 + mov word ptr -6[bp],ax + mov ax,2 + mov bx,0a000H + int 31H + jb L$4 + mov word ptr -4[bp],ax +L$1: + mov ds,word ptr -6[bp] + mov word ptr MX_CODESEGMENT,ds + DB 8bH, 46H +L$2: + cld + mov word ptr MX_VIDEOSEGMENT,ax + DB 0c7H, 46H, 0feH +L$3: + add byte ptr [bx+si],al +L$4: + mov ax,word ptr -2[bp] + pop di + pop es +L$5: + pop si + pop ds + mov sp,bp + pop bp + retf +MXTERM: + xor ax,ax + retf +MX_TEXT ENDS + END diff --git a/16/xw__/mxll.asm b/16/xw__/mxll.asm new file mode 100755 index 00000000..94e5b2cd --- /dev/null +++ b/16/xw__/mxll.asm @@ -0,0 +1,51 @@ +.387 + PUBLIC MXLOADLATCHES + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXLOADLATCHES: + push ds + push si + mov dx,3ceH + mov ax,0ff08H + out dx,ax + mov ax,3 + out dx,ax + mov ax,5 + out dx,ax + mov ax,word ptr cs:MX_VIDEOSEGMENT + mov ds,ax + mov si,0ffffH + mov bh,8 + mov cx,3 +L$1: + mov dx,3ceH + mov al,4 + mov ah,cl + out dx,ax + mov dx,3c4H + mov al,2 + mov ah,bh + out dx,ax + mov al,byte ptr [si] + push ax + mov byte ptr [si],bl + mov al,byte ptr [di] + shr bh,1 + loop L$1 + mov cx,3 + mov bh,8 + mov dx,3c4H +L$2: + mov al,2 + mov ah,bh + out dx,ax + pop ax + mov byte ptr [si],al + shr bh,1 + loop L$2 + pop si + pop ds + ret +MX_TEXT ENDS + END diff --git a/16/xw__/mxln.asm b/16/xw__/mxln.asm new file mode 100755 index 00000000..b488734b --- /dev/null +++ b/16/xw__/mxln.asm @@ -0,0 +1,333 @@ +.387 + PUBLIC MXLINE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_CLIPX1:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + DW offset L$29 + DW offset L$32 + DW offset L$35 + DW offset L$38 +MXLINE: + push bp + mov bp,sp + sub sp,12H + push ds + push si + push di + mov ax,word ptr 10H[bp] + mov bx,word ptr 0eH[bp] + mov cx,word ptr 0cH[bp] + mov dx,word ptr 0aH[bp] + call near ptr L$8 + jae L$2 + jmp near ptr L$7 +L$2: + mov si,cx + xchg ax,si + sub ax,si + jge L$3 + xchg cx,si + xchg dx,bx + neg ax +L$3: + mov word ptr -2[bp],ax + mov cx,word ptr cs:MX_BYTESPERLINE + mov ax,dx + sub ax,bx + jge L$4 + neg cx + neg ax +L$4: + mov word ptr -4[bp],ax + mov word ptr -0cH[bp],cx + mov ax,bx + mul word ptr cs:MX_BYTESPERLINE + mov cx,si + shr si,1 + shr si,1 + add si,ax + and cl,3 + mov ax,1102H + shl ah,cl + mov byte ptr -12H[bp],ah + mov dx,3c4H + out dx,ax + mov ax,word ptr cs:MX_VIDEOSEGMENT + mov ds,ax + xor bx,bx + mov al,byte ptr 6[bp] + cmp al,0 + je L$5 + and al,3 + shl al,1 + shl al,1 + shl al,1 + mov ah,al + mov al,3 + mov dx,3ceH + out dx,ax + inc bx + inc bx +L$5: + mov ax,word ptr -2[bp] + mov cx,word ptr -4[bp] + cmp ax,cx + jae L$6 + inc bx +L$6: + shl bx,1 + call word ptr cs:L$1[bx] + cmp byte ptr 6[bp],0 + je L$7 + mov ax,3 + mov dx,3ceH + out dx,ax +L$7: + xor ax,ax + pop di + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +L$8: + mov di,ax + mov si,dx + xor al,al + cmp cx,word ptr cs:MX_CLIPX1 + jge L$9 + or al,1 +L$9: + cmp cx,word ptr cs:MX_CLIPX2 + jle L$10 + or al,2 +L$10: + cmp si,word ptr cs:MX_CLIPY1 + jge L$11 + or al,4 +L$11: + cmp si,word ptr cs:MX_CLIPY2 + jle L$12 + or al,8 +L$12: + mov byte ptr -10H[bp],al + xor al,al + cmp di,word ptr cs:MX_CLIPX1 + jge L$13 + or al,1 +L$13: + cmp di,word ptr cs:MX_CLIPX2 + jle L$14 + or al,2 +L$14: + cmp bx,word ptr cs:MX_CLIPY1 + jge L$15 + or al,4 +L$15: + cmp bx,word ptr cs:MX_CLIPY2 + jle L$16 + or al,8 +L$16: + mov byte ptr -0eH[bp],al + mov ah,byte ptr -10H[bp] + test ah,al + je L$17 + jmp near ptr L$28 +L$17: + or ah,al + jne L$18 + jmp near ptr L$27 +L$18: + mov ax,cx + sub ax,di + mov word ptr -0aH[bp],ax + mov ax,si + sub ax,bx + mov word ptr -0cH[bp],ax + mov al,byte ptr -0eH[bp] +L$19: + test al,al + jne L$20 + xchg di,cx + xchg si,bx + xchg byte ptr -10H[bp],al +L$20: + test al,1 + je L$21 + mov ax,word ptr cs:MX_CLIPX1 + sub ax,di + mov di,word ptr cs:MX_CLIPX1 + jmp L$22 +L$21: + test al,2 + je L$23 + mov ax,word ptr cs:MX_CLIPX2 + sub ax,di + mov di,word ptr cs:MX_CLIPX2 +L$22: + imul word ptr -0cH[bp] + idiv word ptr -0aH[bp] + add bx,ax + mov al,8 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$26 + mov al,4 + cmp bx,word ptr cs:MX_CLIPY1 + jl L$26 + xor al,al + jmp L$26 +L$23: + test al,4 + je L$24 + mov ax,word ptr cs:MX_CLIPY1 + sub ax,bx + mov bx,word ptr cs:MX_CLIPY1 + jmp L$25 +L$24: + mov ax,word ptr cs:MX_CLIPY2 + sub ax,bx + mov bx,word ptr cs:MX_CLIPY2 +L$25: + imul word ptr -0aH[bp] + idiv word ptr -0cH[bp] + add di,ax + mov al,1 + cmp di,word ptr cs:MX_CLIPX1 + jl L$26 + mov al,2 + cmp di,word ptr cs:MX_CLIPX2 + jg L$26 + xor al,al +L$26: + mov ah,byte ptr -10H[bp] + test ah,al + jne L$28 + or ah,al + je L$27 + jmp near ptr L$19 +L$27: + mov ax,di + mov dx,si + clc + ret +L$28: + stc + ret +L$29: + mov di,ax + neg di + shl cx,1 + mov word ptr -6[bp],cx + mov cx,ax + shl ax,1 + mov word ptr -8[bp],ax + mov al,2 + mov ah,byte ptr -12H[bp] + mov bl,byte ptr 8[bp] + mov dx,3c4H + inc cx +L$30: + mov byte ptr [si],bl + dec cx + je L$31 + rol ah,1 + adc si,0 + out dx,ax + add di,word ptr -6[bp] + jl L$30 + add si,word ptr -0cH[bp] + sub di,word ptr -8[bp] + jmp L$30 +L$31: + ret +L$32: + mov di,cx + neg di + shl ax,1 + mov word ptr -6[bp],ax + mov ax,cx + shl ax,1 + mov word ptr -8[bp],ax + mov bl,byte ptr 8[bp] + mov ah,byte ptr -12H[bp] + mov al,2 + mov dx,3c4H + inc cx +L$33: + mov byte ptr [si],bl + dec cx + je L$34 + add si,word ptr -0cH[bp] + add di,word ptr -6[bp] + jl L$33 + rol ah,1 + adc si,0 + out dx,ax + sub di,word ptr -8[bp] + jmp L$33 +L$34: + ret +L$35: + mov di,ax + neg di + shl cx,1 + mov word ptr -6[bp],cx + mov cx,ax + shl ax,1 + mov word ptr -8[bp],ax + mov al,2 + mov ah,byte ptr -12H[bp] + mov bl,byte ptr 8[bp] + mov dx,3c4H + inc cx +L$36: + mov bh,byte ptr [si] + mov byte ptr [si],bl + dec cx + je L$37 + rol ah,1 + adc si,0 + out dx,ax + add di,word ptr -6[bp] + jl L$36 + add si,word ptr -0cH[bp] + sub di,word ptr -8[bp] + jmp L$36 +L$37: + ret +L$38: + mov di,cx + neg di + shl ax,1 + mov word ptr -6[bp],ax + mov ax,cx + shl ax,1 + mov word ptr -8[bp],ax + mov bl,byte ptr 8[bp] + mov ah,byte ptr -12H[bp] + mov al,2 + mov dx,3c4H + inc cx +L$39: + mov bh,byte ptr [si] + mov byte ptr [si],bl + dec cx + je L$40 + add si,word ptr -0cH[bp] + add di,word ptr -6[bp] + jl L$39 + rol ah,1 + adc si,0 + out dx,ax + sub di,word ptr -8[bp] + jmp L$39 +L$40: + ret +MX_TEXT ENDS + END diff --git a/16/xw__/mxot.asm b/16/xw__/mxot.asm new file mode 100755 index 00000000..7bd60113 --- /dev/null +++ b/16/xw__/mxot.asm @@ -0,0 +1,1310 @@ +.387 + PUBLIC MXSETFONT + PUBLIC MXSETTEXTCOLOR + PUBLIC MXOUTCHAR + PUBLIC MXOUTTEXT + PUBLIC MXSETTEXTSTEP + PUBLIC MXGETTEXTSTEP + EXTRN MX_CODESEGMENT:BYTE + EXTRN MXPUTIMAGE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + ; The label referred to here is an undefined location + jle 0ffffff8bH + movsw + and word ptr -7e67H[di],7e7eH + call bx + call bx + out 0ffH,ax + jle L$9 + ???? + ???? + ???? + jl L$7 + adc byte ptr [bx+si],al + adc byte ptr [bx+si],bh +L$2: + jl L$2 + jl L$8 + adc byte ptr [bx+si],al + adc byte ptr [bx+si],bh + adc byte ptr -2[si],dl + push sp + adc dh,bh + adc byte ptr [bx+si],bh +L$3: + jl L$3 +L$4: + ???? + jl L$5 + inc byte ptr [bx+si] + sbb byte ptr [si],bh + jle L$11 + cmp al,18H + add bh,bh + out 0c3H,ax + DB 81H, 81H, 0c3H, 0e7H +L$5: + inc word ptr [bx+si] + cmp al,66H + inc dx + inc dx + DB 66H, 3cH +L$6: + add bh,bh + ret + cwd + mov bp,99bdH +L$7: + ret + inc word ptr [bx] + add ax,word ptr [di] + ; The label referred to here is an undefined location + js 0ffffffe1H + DB 84H +L$8: + test byte ptr 7cH[bx+si],bh + add byte ptr 7c82H[bp+si],10H + cmp byte ptr [bx+si],dl + sbb al,10H + sbb al,10H + adc byte ptr [bx+si],dl + xor byte ptr [bx+si],dh + and bh,byte ptr ds:[2222H] + pushad + cwd + pop dx + cmp al,0e7H + out 3cH,ax + pop dx + cwd + add byte ptr [bx+si],dl + xor byte ptr -10H[bx+si],dh +L$9: + jo L$10 + adc byte ptr [bx+si],al + add al,0e0H + lock loopnz L$6 + adc byte ptr [bx+si],38H + push sp + adc byte ptr [bx+si],dl + push sp + cmp byte ptr [bx+si],dl + dec ax + dec ax + dec ax + dec ax + dec ax + add byte ptr [bx+si],cl + jle L$4 + xchg ax,dx + jb L$10 + adc dl,byte ptr [bp+si] + add byte ptr [si],bh + and bl,byte ptr [bx+si] + and al,24H + sbb byte ptr 3cH[si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + DB 0, 3eH + DD ds:[3eH] +L$10: + add byte ptr [bx+si],bh + push sp + DB 10H +L$11: + adc byte ptr [bx+si],dl + push sp + cmp dh,bh + add byte ptr [bx+si],dl + cmp byte ptr 10H[si],dl + adc byte ptr [bx+si],dl + add byte ptr [bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr 38H[si],dl + adc byte ptr [bx+si],al + add byte ptr [bx+si],cl + add al,0feH + add al,8 + add byte ptr [bx+si],al + add byte ptr [bx+si],ah + inc ax + inc byte ptr 20H[bx+si] + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr -380H[bx+si],0 + add byte ptr [bx+si],al + and al,42H + inc word ptr 24H[bp+si] + add byte ptr [bx+si],al + add byte ptr [bx+si],al + adc byte ptr [bx+si],bh +L$12: + jl L$12 + add byte ptr [bx+si],al + add byte ptr [bx+si],al + ???? + jl L$15 + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + add byte ptr [bx+si],dl + add byte ptr [bx+si],al + and al,24H + add byte ptr [bx+si],al + DB 0 +L$13: + add byte ptr [bx+si],al + and al,24H + jle 140H + jle 142H +L$14: + and al,0 + cmp byte ptr 50H[si],dl + cmp byte ptr [si],dl + push sp + cmp byte ptr [bx+si],dl + add byte ptr [bp+si],al + inc sp + or byte ptr [bx+si],dl + and byte ptr [bp+si],al + cmp byte ptr 38H[si],al + pusha + xchg ax,sp +L$15: + DB 88H +L$16: + je 138H + and byte ptr [bx+si],ah + inc ax + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],dl + and byte ptr 40H[bx+si],al + inc ax + and byte ptr [bx+si],dl + add byte ptr 20H[bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],ah +L$17: + inc ax + add byte ptr [bx+si],al + and al,18H + jle L$18 + and al,0 + add byte ptr [bx+si],al + adc byte ptr [bx+si],dl + jl L$18 + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + adc byte ptr [bx+si],dl + and byte ptr [bx+si],al + add byte ptr [bx+si],al + cld + DB 0 +L$18: + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],dl + add byte ptr [bx+si],al + add al,8 + adc byte ptr [bx+si],ah + inc ax +L$19: + add byte ptr [bx+si],7cH + ???? + DB 8aH, 92H +L$20: + mov byte ptr 0c6H,al + DD L$21 +L$21: + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],bh + add byte ptr L$13[bx+si],bh + add al,18H + pusha + cmp ah,0 + js L$14 + add al,38H + add al,84H + js L$22 +L$22: + sbb al,24H + inc sp + test dh,bh + add al,0eH + add ah,bh + cmp al,4 + add al,84H + js L$23 +L$23: + js L$16 + cmp al,84H + test byte ptr [bx+si],bh + cld + add al,4 + or byte ptr [bx+si],dl + and byte ptr [bx+si],ah + add byte ptr -7cH[bx+si],bh + test byte ptr -7cH[bx+si],bh + test byte ptr [bx+si],bh + js L$17 + test byte ptr 4[si],bh + test byte ptr [bx+si],bh + add byte ptr [bx+si],al + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + adc byte ptr [bx+si],al + add byte ptr [bx+si],dl + adc byte ptr [bx+si],ah + or byte ptr [bx+si],dl + and byte ptr 20H[bx+si],al + adc byte ptr [bx+si],cl + add byte ptr [bx+si],al + add ah,bh + add byte ptr [bx+si],al + cld + add byte ptr [bx+si],al + inc ax + and byte ptr [bx+si],dl + or byte ptr [bx+si],dl + and byte ptr [bx+si],al + js L$19 + add al,8 + adc byte ptr [bx+si],al +L$24: + adc byte ptr [bx+si],al + jl L$20 + mov dx,0bea6H + cmp byte ptr [si],78H + test byte ptr -7b04H[si],al + test byte ptr -800H[si],al + test byte ptr -7b08H[si],al + test al,bh + add byte ptr -7cH[bx+si],bh + add byte ptr -7b80H[bx+si],78H + add al,dh + mov byte ptr -7b7cH[si],al + mov al,dh + add ah,bh + add byte ptr -7f10H[bx+si],80H + cld + add ah,bh + add byte ptr -7f10H[bx+si],80H + add byte ptr [bx+si],78H + test byte ptr -7b64H[bx+si],al + test byte ptr [bx+si],bh + test byte ptr -37cH[si],al + test byte ptr 84H[si],al + cmp byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + cmp byte ptr [bx+si],al + sbb al,8 + or byte ptr [bx+si],cl + mov byte ptr 70H[bx+si],cl + test byte ptr -1f70H[bx+si],cl + nop + mov byte ptr -8000H[si],al + add byte ptr -7f80H[bx+si],80H + cld + add dh,al + stosb + xchg ax,dx + add byte ptr -7d7eH[bp+si],0 + add dl,0a2H + xchg ax,dx + mov al,byte ptr 82H[bp] + js L$24 + test byte ptr -7b7cH[si],al + js L$25 +L$25: + clc + test byte ptr -7f08H[si],al + add byte ptr 7800H[bx+si],84H + test byte ptr -776cH[si],al + jbe L$26 +L$26: + clc + test byte ptr -6f08H[si],al + mov byte ptr 7800H[si],al + test byte ptr 478H[bx+si],al + test byte ptr [bx+si],bh + ???? + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + add byte ptr -7b7cH[si],al + test byte ptr 7884H[si],al + add byte ptr -7b7cH[si],al + test byte ptr 3048H[si],al + add byte ptr -7d7eH[bp+si],al + adc byte ptr -3956H[bp+si],0 + add byte ptr 28H[si],10H + sub byte ptr -7eH[si],al + add byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + add dh,bh + add al,8 + adc byte ptr [bx+si],ah + inc ax + inc byte ptr [bx+si] + js L$32 + inc ax + inc ax + inc ax + inc ax + js L$27 +L$27: + add byte ptr 2040H[bx+si],al + adc byte ptr [bx+si],cl + add al,0 + js L$29 + or byte ptr [bx+si],cl + or byte ptr [bx+si],cl + js L$28 +L$28: + adc byte ptr [bx+si],ch +L$29: + inc sp + add byte ptr [bx+si],0 + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add bh,bh + and byte ptr [bx+si],ah + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + cmp byte ptr [si],al + cmp al,44H + jl L$30 +L$30: + add byte ptr 40H[bx+si],al + js L$33 + inc sp + js L$31 +L$31: + add byte ptr [bx+si],al +L$32: + cmp al,40H + inc ax + inc ax + cmp al,0 + add byte ptr [si],al + add al,3cH + inc sp + inc sp + cmp al,0 + add byte ptr [bx+si],al + cmp byte ptr 7cH[si],al + inc ax + cmp al,0 + add byte ptr [si],cl + adc byte ptr [si],bh + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + cmp al,44H + inc sp + cmp al,4 + cmp byte ptr [bx+si],al + inc ax + inc ax + js L$35 + inc sp + inc sp + add byte ptr [bx+si],al + adc byte ptr [bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + add byte ptr [bx+si],al + add al,0 + add al,4 + add al,44H + cmp byte ptr [bx+si],al +L$33: + inc ax + inc ax + push ax + pusha + push ax + dec ax + add byte ptr [bx+si],al + xor byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + add byte ptr [bx+si],al + add byte ptr 54H[bx+si],ch + push sp + inc sp + inc sp + add byte ptr [bx+si],al + add byte ptr 44H[bx+si],bh + inc sp + inc sp + inc sp + add byte ptr [bx+si],al + add byte ptr [bx+si],bh + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + add byte ptr [bx+si],al +L$34: + js L$42 + inc sp + js L$41 + inc ax + DB 0 +L$35: + add byte ptr [si],bh + inc sp + inc sp + cmp al,4 + add al,0 + add byte ptr 60H[si],bl + inc ax + inc ax + inc ax + add byte ptr [bx+si],al + add byte ptr [bx+si],bh +L$36: + inc ax + jl L$38 + jl L$37 +L$37: + add byte ptr [bx+si],dl +L$38: + cmp byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + sbb byte ptr [bx+si],al + add byte ptr [bx+si],al + inc sp + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + add byte ptr [bx+si],al + inc sp + inc sp + inc sp + sub byte ptr [bx+si],dl + add byte ptr [bx+si],al + add byte ptr 44H[si],al +L$39: + push sp + push sp + insb + add byte ptr [bx+si],al + add byte ptr 28H[si],al +L$40: + adc byte ptr [bx+si],ch + inc sp +L$41: + DB 0 +L$42: + add byte ptr [bx+si],al + inc sp + inc sp + inc sp + cmp al,4 + jl L$43 +L$43: + add byte ptr 4[si],bh + cmp byte ptr 7cH[bx+si],al + add byte ptr [bx+si],al + or byte ptr [bx+si],dl + adc byte ptr [bx+si],dh + adc byte ptr [bx+si],dl + or byte ptr [bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + and byte ptr [bx+si],dl + adc byte ptr [bx+si],bl + adc byte ptr [bx+si],dl + and byte ptr -68H[si],ah + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],dl + sub byte ptr -7eH[si],al + cmp dh,0 + jl L$34 + add byte ptr 7c80H[bx+si],4 + jl L$44 +L$44: + sub byte ptr [bx+si],al + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + cmp al,0 + jl L$54 + jl L$53 + jl L$45 +L$45: + jle L$36 + cmp byte ptr [si],al + cmp al,44H + jl L$46 +L$46: + and al,0 +L$47: + cmp byte ptr [si],al + cmp al,44H + jl L$48 +L$48: + js L$49 +L$49: + cmp byte ptr [si],al + cmp al,44H + jl L$50 +L$50: + sbb byte ptr [bx+si],bl + cmp byte ptr [si],al + cmp al,44H + jl L$51 +L$51: + add byte ptr [bx+si],al + js L$39 + cmp byte ptr 8[bx+si],38H + jl L$40 + cmp byte ptr 7cH[si],al + inc ax + cmp al,0 + dec ax + add byte ptr [bx+si],bh + inc sp + jl L$55 + cmp al,0 + js L$52 +L$52: + cmp byte ptr 7cH[si],al + inc ax +L$53: + cmp al,0 +L$54: + add byte ptr [bx+si],ch + add byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + adc byte ptr [bx+si],ch + add byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + add byte ptr [bx+si],dh + add byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + dec ax + add byte ptr -7cH[bx+si],bh + cld + test byte ptr 3000H[si],al + xor byte ptr -7cH[bx+si],bh + cld + test byte ptr 3800H[si],al + add ah,bh + xor al,80H + cld + add byte ptr [bx+si],al + add byte ptr 8[bp],bh + jle L$59 +L$55: + jle L$56 +L$56: + jle L$47 + nop + cld + nop + nop + sahf + add byte ptr -7eH[si],bh + cmp byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],al + sub byte ptr [bx+si],al + cmp byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],al + jo L$57 +L$57: + cmp byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],al + cmp byte ptr [si],al + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + jo L$58 +L$58: + inc sp + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + sub byte ptr [bx+si],al + inc sp + inc sp + inc sp + cmp al,4 + jl L$64 + add byte ptr -7cH[bx+si],bh + test byte ptr 78H[si],al + dec ax + add byte ptr -7b7cH[si],al + DB 84H +L$59: + js 4d8H + add byte ptr [bx+si],dl + cmp byte ptr 40H[bx+si],al + inc ax + cmp byte ptr [bx+si],dl + cmp byte ptr 40H[si],al + loopnz L$66 + inc ax + cmp ah,44H + jl L$60 + jl L$61 + jl L$62 + add al,dh + mov byte ptr -7d09H[bp+si],cl + add byte ptr 0c00H[bp+si],12H + DB 10H +L$60: + sbb byte ptr [bx+si],dh +L$61: + DB 10H, 90H +L$62: + pusha + cmp al,0 + cmp byte ptr [si],al + cmp al,44H + jl L$63 +L$63: + add byte ptr [bx+si],bl + add byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],al + DB 1cH +L$64: + add byte ptr [bx+si],bh + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + sbb al,0 + inc sp + inc sp + inc sp + inc sp + cmp byte ptr [bx+si],al + jl L$65 +L$65: + js L$67 + inc sp +L$66: + inc sp + inc sp + add byte ptr [si],bh + inc sp + push sp + dec sp + inc sp + add byte ptr [bx+si],bl + and al,24H + push ds + add byte ptr ds:[0],bh + sbb al,22H + and bl,byte ptr [si] + add byte ptr ds:[0],bh + adc byte ptr [bx+si],al + adc byte ptr [bx+si],ah + inc ax + inc dx + cmp al,0 + add byte ptr [bx+si],al + add ah,bh + add byte ptr [bx+si],0 + add byte ptr [bx+si],al + cld + add al,4 + add byte ptr [bx+si],al + inc ax + inc sp + dec ax + push di + and word ptr 4[bx],ax + pop es + inc ax + inc sp + dec ax + push dx + dec dx + pop ds + DB 2 +L$67: + adc byte ptr [bx+si],al + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl +L$68: + adc byte ptr [bx+si],al + add byte ptr [si],ah +L$69: + dec ax + nop + dec ax + and al,0 + add byte ptr [bx+si],al + dec ax + and al,12H + and al,48H + add byte ptr [bx+si],al + and cl,byte ptr -77deH[bx+si] + and cl,byte ptr -77deH[bx+si] + push bp + stosb + push bp + stosb + push bp + stosb + push bp + stosb + ???? + ja L$68 + out dx,al + ???? + ja L$69 + out dx,al + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + clc + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb al,bh + sbb al,bh + sbb byte ptr [bx+si],bl + sbb byte ptr ds:[3636H],dh + div byte ptr ss:[3636H] + add byte ptr [bx+si],al + add byte ptr [bx+si],al + ???? + add byte ptr ss:[bx+si],al + clc + sbb al,bh + sbb byte ptr [bx+si],bl + sbb byte ptr ds:[0f636H],dh + push es + div byte ptr ds:[3636H] + add byte ptr ss:[bx+si],al + inc byte ptr ds:[36f6H] + test byte ptr ss:[0feH],0 + add byte ptr ds:[3636H],dh + inc byte ptr ss:[bx+si] + add byte ptr [bx+si],al + sbb byte ptr [bx+si],bl + clc + sbb al,bh + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add al,bh + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx],bl + add byte ptr [bx+si],al + add byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb bh,bh + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add bh,bh + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],al + add byte ptr [bx+si],al + add bh,bh + add byte ptr [bx+si],al + add byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb bh,bh + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx],bl + sbb byte ptr [bx],bl + sbb byte ptr [bx+si],bl + sbb byte ptr ds:[3636H],dh + aaa + aaa + xor byte ptr [bx],bh + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx],bh + xor byte ptr [bx],dh + test word ptr ss:[bx+si],0ffH + add byte ptr [bx+si],al + add byte ptr [bx+si],al + inc word ptr [bx+si] + div word ptr ds:[3636H] + aaa + xor byte ptr [bx],dh + add byte ptr ss:[bx+si],al + inc word ptr [bx+si] + inc word ptr [bx+si] + add byte ptr [bx+si],al + test word ptr ss:[bx+si],36f7H + sbb byte ptr ss:[bx+si],bl + inc word ptr [bx+si] + inc word ptr [bx+si] + add byte ptr [bx+si],al + inc word ptr ss:[bx+si] + add byte ptr [bx+si],al + add byte ptr [bx+si],al + inc word ptr [bx+si] + call dword ptr [bx+si] + sbb byte ptr [bx+si],bl + add byte ptr [bx+si],al + add byte ptr [bx+si],al + push word ptr ds:[3636H] + aas + add byte ptr [bx+si],al + add byte ptr [bx+si],bl + sbb byte ptr [bx],bl + sbb byte ptr [bx],bl + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx],bl + sbb byte ptr [bx],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx],bh + push word ptr ss:[3636H] + sbb byte ptr [bx+si],bl + call dword ptr [bx+si] + call dword ptr [bx+si] + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + sbb byte ptr [bx+si],bl + clc + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx],bl + DB 18H +L$70: + sbb byte ptr [bx+si],bl + ???? + ???? + ???? + ???? + ???? + ???? + ???? + inc word ptr [bx+si] + add byte ptr [bx+si],al + add bh,bh + ???? + ???? + push ax + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + ???? + inc word ptr [bx+si] + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr -6cH[bp+si],ah + mov byte ptr 62H[si],dl + add al,dh + mov al,dh + mov byte ptr -7f10H[bx+si],cl + add al,bh + mov byte ptr -7f80H[bx+si],al + add byte ptr [bx+si],0 + cld + dec ax + dec ax + dec ax + dec ax + dec ax + add ah,bh + test byte ptr 20H[bx+si],al + inc ax + test ah,bh + add byte ptr [si],bh + inc ax + cmp byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],al + add byte ptr [bx+si],al + inc sp + inc sp + inc sp + js L$71 + inc ax + add byte ptr ds:[848H],dh + or byte ptr [bx+si],cl + or byte ptr [bx+si],al + cmp byte ptr [bx+si],dl + cmp byte ptr 44H[si],al + cmp byte ptr [bx+si],dl + cmp byte ptr -7cH[bx+si],bh + test ah,bh + test byte ptr 78H[si],al + js L$70 + test byte ptr 4848H[si],al + int 3 + add byte ptr 4[bx+si],bh + cmp byte ptr 44H[si],al + inc sp + cmp byte ptr [bx+si],al + add byte ptr [bx+si],al + insb + xchg ax,dx + xchg ax,dx + insb + add byte ptr [bx+si],al + add byte ptr [bx+si],al + cmp al,byte ptr 5aH[si] + and bl,byte ptr [si] + sbb byte ptr [bx+si],ah + inc ax + js L$73 + and byte ptr [bx+si],bl +L$71: + add byte ptr -7cH[bx+si],bh + test byte ptr -7b7cH[si],al + test byte ptr [bx+si],al + add ah,bh + add ah,bh + add ah,bh + add byte ptr [bx+si],al + and byte ptr [bx+si],ah + clc + and byte ptr [bx+si],ah + add al,bh + add byte ptr [bx+si],ah + adc byte ptr [bx+si],cl + adc byte ptr [bx+si],ah + add byte ptr [si],bh + or byte ptr [bx+si],dl + and byte ptr [bx+si],dl + or byte ptr [bx+si],al + jl L$72 +L$72: + or al,12H + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + adc byte ptr [bx+si],dl + nop + pusha + add byte ptr [bx+si],dl + add byte ptr [si],bh +L$73: + adc byte ptr [bx+si],al + add byte ptr [bx+si],al + xor cl,byte ptr [si] + xor cl,byte ptr [si] + add byte ptr [bx+si],bh + inc sp + inc sp + cmp byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + sbb byte ptr [bx+si],bl + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],bl + add byte ptr [bx+si],al + add byte ptr ds:[808H],cl + or byte ptr 28H[bx+si],cl + sbb byte ptr [bx+si],cl + cmp byte ptr [si],ah + and al,24H + and al,0 + add byte ptr [bx+si],al + cmp al,4 + cmp al,20H + cmp al,0 + add byte ptr [bx+si],al + add byte ptr [bx+si],al + cmp al,3cH + cmp al,3cH + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al +L$74: + DW offset L$1 +L$75: + DB 8 +L$76: + add byte ptr [bx+si],cl + DB 0 +L$77: + DW offset L$1 +L$78: + DW seg L$1 +L$79: + or byte ptr [bx+si],al +L$80: + or byte ptr [bx+si],al +L$81: + or byte ptr [bx+si],al +L$82: + inc word ptr [bx+si] +L$83: + add byte ptr [bx+si],al +L$84: + or byte ptr [bx+si],al +L$85: + add byte ptr [bx+si],al +MXSETFONT: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr 0cH[bp] + test ax,ax + jne L$87 + mov ax,word ptr 0aH[bp] + cmp ax,1 + jb L$86 + xor ax,ax +L$86: + shl ax,1 + shl ax,1 + mov bx,ax + mov ax,word ptr L$74[bx] + mov word ptr L$77,ax + mov word ptr L$78,cs + mov al,byte ptr L$75[bx] + xor ah,ah + mov word ptr L$79,ax + mov word ptr L$84,ax + mov dl,byte ptr L$76[bx] + xor dh,dh + mov word ptr L$80,dx + mul dx + mov word ptr L$81,ax + mov word ptr L$84,ax + xor ax,ax + mov word ptr L$85,ax + jmp L$88 +L$87: + mov ax,0ffffH + mov bx,word ptr 8[bp] + cmp bx,10H + ja L$88 + mov dx,word ptr 6[bp] + cmp dx,20H + ja L$88 + mov word ptr L$79,bx + mov word ptr L$80,dx + mov ax,bx + add ax,7 + shr ax,1 + shr ax,1 + shr ax,1 + mul dx + mov word ptr L$81,ax + mov ax,word ptr 0aH[bp] + mov word ptr L$77,ax + mov ax,word ptr 0cH[bp] + mov word ptr L$78,ax + xor ax,ax +L$88: + pop ds + mov sp,bp + pop bp + retf 8 +MXSETTEXTCOLOR: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr 8[bp] + mov word ptr L$82,ax + mov ax,word ptr 6[bp] + mov word ptr L$83,ax + xor ax,ax + pop ds + mov sp,bp + pop bp + retf 4 +MXOUTCHAR: + push bp + mov bp,sp + sub sp,202H + push ds + push si + push es + push di + lds si,dword ptr cs:L$77 + mov al,byte ptr 6[bp] + xor ah,ah + mul word ptr cs:L$81 + add si,ax + mov ax,ss + mov es,ax + lea di,-200H[bp] + mov dx,word ptr cs:L$82 + mov ax,word ptr cs:L$80 + mov word ptr -202H[bp],ax +L$89: + mov cx,word ptr cs:L$79 + mov bh,byte ptr [si] + inc si + cmp cx,8 + jbe L$90 + mov bl,byte ptr [si] + inc si +L$90: + mov al,dl + shl bx,1 + jb L$91 + mov al,dh +L$91: + mov byte ptr es:[di],al + inc di + dec cx + jne L$90 + dec word ptr -202H[bp] + jne L$89 + lea ax,-200H[bp] + push es + push ax + push word ptr 0aH[bp] + push word ptr 8[bp] + push word ptr cs:L$79 + push word ptr cs:L$80 + push word ptr cs:L$83 + push cs + call near ptr MX_TEXT:MXPUTIMAGE + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 6 +MXOUTTEXT: + push bp + mov bp,sp + sub sp,0 + push ds + push si + lds si,dword ptr 6[bp] +L$92: + mov al,byte ptr [si] + test al,al + je L$93 + inc si + push word ptr 0cH[bp] + push word ptr 0aH[bp] + push ax + push cs + call near ptr MXOUTCHAR + mov ax,word ptr cs:L$84 + add word ptr 0cH[bp],ax + mov ax,word ptr cs:L$85 + add word ptr 0aH[bp],ax + dec word ptr -202H[bp] + jne L$92 +L$93: + xor ax,ax + pop si + pop ds + mov sp,bp + pop bp + retf 8 + retf +MXSETTEXTSTEP: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr 8[bp] + mov word ptr L$84,ax + mov ax,word ptr 6[bp] + mov word ptr L$85,ax + pop ds + mov sp,bp + pop bp + retf 4 +MXGETTEXTSTEP: + push bp + mov bp,sp + sub sp,0 + push ds + push si + mov ax,word ptr cs:L$84 + lds si,dword ptr 0aH[bp] + mov word ptr [si],ax + mov ax,word ptr cs:L$85 + lds si,dword ptr 6[bp] + mov word ptr [si],ax + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw__/mxot_.asm b/16/xw__/mxot_.asm new file mode 100755 index 00000000..e431b138 --- /dev/null +++ b/16/xw__/mxot_.asm @@ -0,0 +1,333 @@ +;----------------------------------------------------------- +; +; MXOT.ASM - Text functions +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +;WARN PRO +;NOWARN RES ; We use the reserved name 'WIDTH' +INCLUDE MODEX.DEF + +PUBLIC mxOutChar +PUBLIC mxOutText +PUBLIC mxSetFont +PUBLIC mxSetTextColor +PUBLIC mxGetTextStep +PUBLIC mxSetTextStep + +MAX_WIDTH EQU 16 ; Must be <= 16 +MAX_HEIGHT EQU 32 + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_CodeSegment : WORD +EXTRN mxPutImage : FAR + +; Default 8x8 font +fnt_Default LABEL BYTE + INCLUDE DEFAULT.FNT + +; Table of system fonts +tbl_SystemFont LABEL WORD + DW fnt_Default, 8, 8 + +MX_MAXSYSFONT EQU ($-OFFSET tbl_SystemFont) SHR 2 + +mx_FontPtr DW OFFSET fnt_Default, SEG MX_TEXT +mx_FontWidth DW 8 ; Font width in pixels +mx_FontHeight DW 8 ; Font height in pixels +mx_FontCharSize DW 8 ; Size in bytes of a font character +mx_FontColor DW 00FFh ; Color: foreground + background*256 +mx_FontOp DW OP_MOVE ; Raster op +mx_DeltaX DW 8 ; Horizontal step +mx_DeltaY DW 0 ; Vertical step + +;----------------------------------------------------------- +; +; Sets the current font. +; +; Input: +; Font = pointer to font data +; Width = width of font character in pixels +; Height = height of font character in pixels +; Output: +; AX = 0 on success, else invalid parameters +; +; Note: when the high word of Font (i.e. the segment) is zero, the low +; word is used to select one of the system fonts. +; +mxSetFont PROC FAR + push bp + mov bp,sp + sub sp,0 + push ds + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, WORD PTR Font[2] ; Get font segment + test ax, ax ; Null segment? + jnz @@UserFont ; No, install user font + +; Install system font + mov ax, WORD PTR Font[0] ; Get font number + cmp ax, MX_MAXSYSFONT ; Check range + jb @@SystemFont + xor ax, ax ; Out of range, use default font +@@SystemFont: + shl ax, 1 + shl ax, 1 + mov bx, ax + mov ax, tbl_SystemFont[bx] ; Get font offset + mov WORD PTR mx_FontPtr[0], ax + mov WORD PTR mx_FontPtr[2], cs + mov al, BYTE PTR tbl_SystemFont[bx+2] + xor ah, ah + mov [mx_FontWidth], ax + mov [mx_DeltaX], ax + mov dl, BYTE PTR tbl_SystemFont[bx+3] + xor dh, dh + mov [mx_FontHeight], dx + mul dx + mov [mx_FontCharSize], ax + mov [mx_DeltaX], ax + xor ax, ax + mov [mx_DeltaY], ax + jmp @@Exit + +; Install user font +@@UserFont: + mov ax, -1 ; Assume an error + mov bx, [bp+8] + cmp bx, MAX_WIDTH + ja @@Exit ; Invalid character width + mov dx, [bp+4] + cmp dx, MAX_HEIGHT + ja @@Exit ; Invalid character height + mov [mx_FontWidth], bx + mov [mx_FontHeight], dx + mov ax, bx + add ax, 7 + shr ax, 1 + shr ax, 1 + shr ax, 1 + mul dx + mov [mx_FontCharSize], ax + mov ax, WORD PTR Font[0] + mov WORD PTR mx_FontPtr[0], ax + mov ax, WORD PTR Font[2] + mov WORD PTR mx_FontPtr[2], ax + xor ax, ax + +@@Exit: + .pop ds + ASSUME ds:NOTHING + ;.leave ARG_SIZE +mxSetFont ENDP + +;----------------------------------------------------------- +; +; Sets the text color and raster op. +; +; Input: +; Color = text color (foreground + background*256) +; Op = raster op +; Output: +; none +; +mxSetTextColor PROC FAR + ARG Op:WORD, \ + Color:WORD = ARG_SIZE + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [Color] + mov [mx_FontColor], ax + mov ax, [Op] + mov [mx_FontOp], ax + + xor ax, ax + .pop ds + ASSUME ds:NOTHING + .leave ARG_SIZE +mxSetTextColor ENDP + +;----------------------------------------------------------- +; +; Writes a character using the current font and attributes. +; +; Input: +; X, Y = video coordinates +; C = character to print +; Output: +; none +; +mxOutChar PROC FAR + ARG C:BYTE:2, \ + Y:WORD, \ + X:WORD = ARG_SIZE + LOCAL Image:BYTE:MAX_WIDTH*MAX_HEIGHT, \ + Count:WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + ASSUME ds:NOTHING + +; Gets the pointer to font data for the selected character + lds si, DWORD PTR [mx_FontPtr] + mov al, [C] + xor ah, ah + mul [mx_FontCharSize] ; Offset into font + add si, ax ; DS:SI -> font data for character + +; Converts font data into a 256-color linear image + mov ax, ss + mov es, ax + lea di, [Image] + mov dx, [mx_FontColor] + mov ax, [mx_FontHeight] + mov [Count], ax +@@HeightLoop: + mov cx, [mx_FontWidth] + mov bh, ds:[si] + inc si ; Get a byte from font data + cmp cx, 8 + jbe @@WidthLoop ; Ok for width <= 8 + mov bl, ds:[si] ; Get another byte + inc si +@@WidthLoop: + mov al, dl ; Assume foreground color + shl bx, 1 ; Is font bit set? + jc @@1 ; Yes, foreground is just great + mov al, dh ; Get background color +@@1: + mov es:[di], al ; Put pixel into image + inc di + dec cx + jnz @@WidthLoop + dec [Count] + jnz @@HeightLoop + +; Now pass image to mx_PutImage + lea ax, [Image] + push es + push ax ; Pointer to image + push [X] + push [Y] ; Image coordinates + push [mx_FontWidth] + push [mx_FontHeight] ; Image size + push [mx_FontOp] ; Raster op + call mxPutImage ; Write character + + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxOutChar ENDP + +;----------------------------------------------------------- +; +; Writes a string at the coordinates specified. +; +; Input: +; X, Y = text coordinates +; S = pointer to ASCIIZ string +; Output: +; none +; +mxOutText PROC FAR + ARG S:DWORD, \ + Y:WORD, \ + X:WORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + lds si, [S] +@@Loop: + mov al, ds:[si] + test al, al ; End of string? + jz @@Exit ; Yes, exit + inc si + push [X] ; Display character + push [Y] + push ax + call mxOutChar + mov ax, [mx_DeltaX] + add [X], ax ; Bump X coordinate + mov ax, [mx_DeltaY] + add [Y], ax ; Bump Y coordinate + dec [Count] + jnz @@Loop + +@@Exit: + xor ax, ax + .pop ds, si + .leave ARG_SIZE + ret +mxOutText ENDP + +;----------------------------------------------------------- +; +; Sets the distance between characters. +; +; Input: +; DeltaX = horizontal distance in pixels +; DeltaY = vertical distance in pixels +; Output: +; none +; +; Note: this function may be used to set the text direction. +; +mxSetTextStep PROC FAR + ARG DeltaY:WORD, \ + DeltaX:WORD = ARG_SIZE + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [DeltaX] + mov [mx_DeltaX], ax + mov ax, [DeltaY] + mov [mx_DeltaY], ax + + .pop ds + .leave ARG_SIZE +mxSetTextStep ENDP + +;----------------------------------------------------------- +; +; Gets the current distance between characters. +; +; Input: +; DeltaX = pointer to horizontal distance in pixels (integer) +; DeltaY = pointer to vertical distance in pixels (integer) +; Output: +; none +; +mxGetTextStep PROC FAR + ARG DeltaY:DWORD, \ + DeltaX:DWORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + mov ax, [mx_DeltaX] + lds si, [DeltaX] + mov ds:[si], ax + mov ax, [mx_DeltaY] + lds si, [DeltaY] + mov ds:[si], ax + + .pop ds, si + .leave ARG_SIZE +mxGetTextStep ENDP + +MX_TEXT ENDS +END diff --git a/16/xw__/mxpb.asm b/16/xw__/mxpb.asm new file mode 100755 index 00000000..36ed3527 --- /dev/null +++ b/16/xw__/mxpb.asm @@ -0,0 +1,4103 @@ +.387 + PUBLIC MX_SCANBUFFER +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MX_SCANBUFFER: + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al + add byte ptr [bx+si],al +MX_TEXT ENDS + END diff --git a/16/xw__/mxpf.asm b/16/xw__/mxpf.asm new file mode 100755 index 00000000..3777fe5e --- /dev/null +++ b/16/xw__/mxpf.asm @@ -0,0 +1,328 @@ +.387 + PUBLIC MXFILLPOLY + EXTRN MX_CLIPX1:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE + EXTRN MX_CODESEGMENT:BYTE + EXTRN MX_SCANBUFFER:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + mov cx,word ptr [si] + sub cx,word ptr [bx] + jg L$2 + ret +L$2: + push bp + mov ax,word ptr 2[si] + mov bx,word ptr 2[bx] + sub ax,bx + jg L$4 + jl L$6 + mov ax,bx +L$3: + mov word ptr es:[di],ax + add di,4 + dec cx + jne L$3 + jmp L$8 +L$4: + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$5: + mov word ptr es:[di],ax + add di,4 + add dx,bx + adc ax,bp + dec cx + jne L$5 + jmp L$8 +L$6: + neg ax + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$7: + mov word ptr es:[di],ax + add di,4 + sub dx,bx + sbb ax,bp + dec cx + jne L$7 +L$8: + pop bp + ret +MXFILLPOLY: + push bp + mov bp,sp + sub sp,1eH + push ds + push si + push es + push di + mov cx,word ptr 10H[bp] + cmp cx,3 + jae L$9 + jmp near ptr L$36 +L$9: + les di,dword ptr 0cH[bp] + lds si,dword ptr 8[bp] + mov word ptr -16H[bp],7fffH + mov word ptr -1aH[bp],8000H + mov word ptr -18H[bp],7fffH + mov word ptr -1eH[bp],8000H + xor dx,dx +L$10: + mov bx,word ptr es:[di] + shl bx,1 + shl bx,1 + add bx,si + mov ax,word ptr [bx] + cmp ax,word ptr -16H[bp] + jge L$11 + mov word ptr -16H[bp],ax + mov word ptr -0eH[bp],dx + mov word ptr -10H[bp],dx +L$11: + cmp ax,word ptr -1aH[bp] + jle L$12 + mov word ptr -1aH[bp],ax + mov word ptr -12H[bp],dx +L$12: + mov ax,word ptr 2[bx] + cmp ax,word ptr -18H[bp] + jge L$13 + mov word ptr -18H[bp],ax +L$13: + cmp ax,word ptr -1eH[bp] + jle L$14 + mov word ptr -1eH[bp],ax +L$14: + inc di + inc dx + inc di + inc dx + dec cx + jne L$10 + mov ax,word ptr -1aH[bp] + cmp ax,word ptr cs:MX_CLIPX1 + jge L$15 + jmp near ptr L$36 +L$15: + mov bx,word ptr -16H[bp] + cmp bx,word ptr cs:MX_CLIPX2 + jle L$16 + jmp near ptr L$36 +L$16: + sub ax,bx + jg L$17 + jmp near ptr L$36 +L$17: + mov ax,word ptr -1eH[bp] + cmp ax,word ptr cs:MX_CLIPY1 + jge L$18 + jmp near ptr L$36 +L$18: + mov bx,word ptr -18H[bp] + cmp bx,word ptr cs:MX_CLIPY2 + jle L$19 + jmp near ptr L$36 +L$19: + sub ax,bx + jg L$20 + jmp near ptr L$36 +L$20: + dec word ptr 10H[bp] + shl word ptr 10H[bp],1 + mov es,word ptr cs:MX_CODESEGMENT + mov ax,offset MX_TEXT:MX_SCANBUFFER + mov word ptr -4[bp],ax + mov si,word ptr -0eH[bp] +L$21: + lds bx,dword ptr 0cH[bp] + mov di,word ptr [bx+si] + dec si + dec si + test si,si + jge L$22 + mov si,word ptr 10H[bp] +L$22: + mov word ptr -0eH[bp],si + mov si,word ptr [bx+si] + shl di,1 + shl di,1 + shl si,1 + shl si,1 + lds bx,dword ptr 8[bp] + add si,bx + add bx,di + mov di,word ptr -4[bp] + call near ptr L$1 + mov word ptr -4[bp],di + mov si,word ptr -0eH[bp] + cmp si,word ptr -12H[bp] + jne L$21 + mov ax,offset MX_TEXT:MX_SCANBUFFER+2 + mov word ptr -6[bp],ax + mov si,word ptr -10H[bp] +L$23: + lds bx,dword ptr 0cH[bp] + mov di,word ptr [bx+si] + inc si + inc si + cmp si,word ptr 10H[bp] + jbe L$24 + xor si,si +L$24: + mov word ptr -10H[bp],si + mov si,word ptr [bx+si] + shl di,1 + shl di,1 + shl si,1 + shl si,1 + lds bx,dword ptr 8[bp] + add si,bx + add bx,di + mov di,word ptr -6[bp] + call near ptr L$1 + mov word ptr -6[bp],di + mov si,word ptr -10H[bp] + cmp si,word ptr -12H[bp] + jne L$23 + mov si,offset MX_TEXT:MX_SCANBUFFER + mov ax,word ptr -16H[bp] + mov cx,word ptr -1aH[bp] + sub cx,ax + mov bx,word ptr cs:MX_CLIPX1 + sub bx,ax + jle L$25 + sub cx,bx + add ax,bx + mov word ptr -16H[bp],ax + shl bx,1 + shl bx,1 + add si,bx +L$25: + mov bx,ax + add bx,cx + sub bx,word ptr cs:MX_CLIPX2 + jle L$26 + sub cx,bx +L$26: + test cx,cx + jg L$27 + jmp near ptr L$36 +L$27: + mov word ptr -8[bp],cx + mov word ptr -4[bp],si + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr -18H[bp] + cmp ax,word ptr cs:MX_CLIPY1 + jl L$28 + mov ax,word ptr -1eH[bp] + cmp ax,word ptr cs:MX_CLIPY2 + jg L$28 + jmp L$32 +L$28: + mov di,cx + inc di + sub si,4 +L$29: + dec di + je L$32 + add si,4 + mov ax,word ptr [si] + mov cx,word ptr 2[si] + mov dx,word ptr cs:MX_CLIPY2 + cmp ax,dx + jg L$31 + cmp cx,dx + jle L$30 + mov word ptr 2[si],dx + mov bx,cx + sub bx,dx + sub cx,ax + jle L$31 + mov cx,word ptr 2[si] +L$30: + mov dx,word ptr cs:MX_CLIPY1 + cmp cx,dx + jl L$31 + sub cx,ax + jle L$31 + cmp ax,dx + jge L$29 + mov word ptr [si],dx + sub dx,ax + cmp cx,dx + ja L$29 +L$31: + mov word ptr [si],0ffffH + jmp L$29 +L$32: + mov es,word ptr cs:MX_VIDEOSEGMENT + mov si,word ptr -4[bp] + mov cl,byte ptr -16H[bp] + and cl,3 + mov al,11H + shl al,cl + mov byte ptr -2[bp],al + shr word ptr -16H[bp],1 + shr word ptr -16H[bp],1 +L$33: + mov ax,word ptr [si] + test ax,ax + js L$35 + mov cx,word ptr 2[si] + sub cx,ax + jle L$35 + mul word ptr cs:MX_BYTESPERLINE + add ax,word ptr -16H[bp] + mov di,ax + mov ah,byte ptr -2[bp] + mov dx,3c4H + mov al,2 + out dx,ax + mov ax,word ptr 6[bp] + mov dx,word ptr cs:MX_BYTESPERLINE + shr cx,1 + jae L$34 + mov byte ptr es:[di],al + add di,dx + jcxz L$35 +L$34: + mov byte ptr es:[di],al + add di,dx + mov byte ptr es:[di],al + add di,dx + dec cx + jne L$34 +L$35: + rol byte ptr -2[bp],1 + adc word ptr -16H[bp],0 + add si,4 + dec word ptr -8[bp] + jne L$33 +L$36: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +MX_TEXT ENDS + END diff --git a/16/xw__/mxpg.asm b/16/xw__/mxpg.asm new file mode 100755 index 00000000..7318f079 --- /dev/null +++ b/16/xw__/mxpg.asm @@ -0,0 +1,458 @@ +.387 + PUBLIC MXGOURAUDPOLY + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_CLIPX1:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE + EXTRN MX_CODESEGMENT:BYTE + EXTRN MX_SCANBUFFER:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + mov cx,word ptr [si] + sub cx,word ptr [bx] + jg L$2 + ret +L$2: + push bp + push di + push cx + push ax + push dx + mov ax,word ptr 2[si] + mov bx,word ptr 2[bx] + sub ax,bx + jg L$4 + jl L$6 + mov ax,bx +L$3: + mov word ptr es:[di],ax + add di,8 + dec cx + jne L$3 + jmp L$8 +L$4: + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$5: + mov word ptr es:[di],ax + add di,8 + add dx,bx + adc ax,bp + dec cx + jne L$5 + jmp L$8 +L$6: + neg ax + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$7: + mov word ptr es:[di],ax + add di,8 + sub dx,bx + sbb ax,bp + dec cx + jne L$7 +L$8: + pop bx + pop ax + pop cx + pop di + sub ax,bx + jg L$10 + jl L$12 + mov ah,bl + mov al,80H +L$9: + mov word ptr es:2[di],ax + add di,8 + dec cx + jne L$9 + jmp L$14 +L$10: + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$11: + mov byte ptr es:3[di],al + mov byte ptr es:2[di],dh + add di,8 + add dx,bx + adc ax,bp + dec cx + jne L$11 + jmp L$14 +L$12: + neg ax + cwd + div cx + mov bp,ax + xor ax,ax + div cx + xchg ax,bx + mov dx,8000H +L$13: + mov byte ptr es:3[di],al + mov byte ptr es:2[di],dh + add di,8 + sub dx,bx + sbb ax,bp + dec cx + jne L$13 +L$14: + pop bp + ret +L$15: + mov ax,word ptr 6[si] + mov bx,word ptr 2[si] + cmp ah,bh + jg L$17 + jl L$19 + add ax,dx + mov dx,word ptr cs:MX_BYTESPERLINE +L$16: + mov byte ptr es:[di],ah + add di,dx + dec cx + jne L$16 + ret +L$17: + push bp + push si + mov si,bx + add si,dx + sub ax,bx + xor dx,dx + div cx + mov bp,ax + xor ax,ax + div cx + mov bx,ax + mov dx,8000H + mov ax,word ptr cs:MX_BYTESPERLINE + xchg ax,si +L$18: + mov byte ptr es:[di],ah + add dx,bx + adc ax,bp + add di,si + dec cx + jne L$18 + pop si + pop bp + ret +L$19: + push bp + push si + mov si,bx + add si,dx + sub ax,bx + neg ax + xor dx,dx + div cx + mov bp,ax + xor ax,ax + div cx + mov bx,ax + mov dx,8000H + mov ax,word ptr cs:MX_BYTESPERLINE + xchg ax,si +L$20: + mov byte ptr es:[di],ah + sub dx,bx + sbb ax,bp + add di,si + dec cx + jne L$20 + pop si + pop bp + ret +MXGOURAUDPOLY: + push bp + mov bp,sp + sub sp,1eH + push ds + push si + push es + push di + mov cx,word ptr 14H[bp] + cmp cx,3 + jae L$21 + jmp near ptr L$47 +L$21: + les di,dword ptr 10H[bp] + lds si,dword ptr 0cH[bp] + mov word ptr -16H[bp],7fffH + mov word ptr -1aH[bp],8000H + mov word ptr -18H[bp],7fffH + mov word ptr -1eH[bp],8000H + xor dx,dx +L$22: + mov bx,word ptr es:[di] + shl bx,1 + shl bx,1 + add bx,si + mov ax,word ptr [bx] + cmp ax,word ptr -16H[bp] + jge L$23 + mov word ptr -16H[bp],ax + mov word ptr -0eH[bp],dx + mov word ptr -10H[bp],dx +L$23: + cmp ax,word ptr -1aH[bp] + jle L$24 + mov word ptr -1aH[bp],ax + mov word ptr -12H[bp],dx +L$24: + mov ax,word ptr 2[bx] + cmp ax,word ptr -18H[bp] + jge L$25 + mov word ptr -18H[bp],ax +L$25: + cmp ax,word ptr -1eH[bp] + jle L$26 + mov word ptr -1eH[bp],ax +L$26: + inc di + inc di + inc dx + inc dx + dec cx + jne L$22 + mov ax,word ptr -1aH[bp] + cmp ax,word ptr cs:MX_CLIPX1 + jge L$27 + jmp near ptr L$47 +L$27: + mov bx,word ptr -16H[bp] + cmp bx,word ptr cs:MX_CLIPX2 + jle L$28 + jmp near ptr L$47 +L$28: + sub ax,bx + jg L$29 + jmp near ptr L$47 +L$29: + mov ax,word ptr -1eH[bp] + cmp ax,word ptr cs:MX_CLIPY1 + jge L$30 + jmp near ptr L$47 +L$30: + mov bx,word ptr -18H[bp] + cmp bx,word ptr cs:MX_CLIPY2 + jle L$31 + jmp near ptr L$47 +L$31: + sub ax,bx + jg L$32 + jmp near ptr L$47 +L$32: + dec word ptr 14H[bp] + shl word ptr 14H[bp],1 + mov es,word ptr cs:MX_CODESEGMENT + mov ax,offset MX_TEXT:MX_SCANBUFFER + mov word ptr -4[bp],ax + mov si,word ptr -0eH[bp] +L$33: + lds bx,dword ptr 10H[bp] + mov di,word ptr [bx+si] + dec si + dec si + test si,si + jge L$34 + mov si,word ptr 14H[bp] +L$34: + mov word ptr -0eH[bp],si + mov si,word ptr [bx+si] + lds bx,dword ptr 8[bp] + shl di,1 + shl si,1 + mov ax,word ptr [bx+si] + mov dx,word ptr [bx+di] + lds bx,dword ptr 0cH[bp] + shl si,1 + shl di,1 + add si,bx + add bx,di + mov di,word ptr -4[bp] + call near ptr L$1 + mov word ptr -4[bp],di + mov si,word ptr -0eH[bp] + cmp si,word ptr -12H[bp] + jne L$33 + mov ax,offset MX_TEXT:MX_SCANBUFFER+4 + mov word ptr -6[bp],ax + mov si,word ptr -10H[bp] +L$35: + lds bx,dword ptr 10H[bp] + mov di,word ptr [bx+si] + inc si + inc si + cmp si,word ptr 14H[bp] + jbe L$36 + xor si,si +L$36: + mov word ptr -10H[bp],si + mov si,word ptr [bx+si] + lds bx,dword ptr 8[bp] + shl di,1 + shl si,1 + mov ax,word ptr [bx+si] + mov dx,word ptr [bx+di] + lds bx,dword ptr 0cH[bp] + shl si,1 + shl di,1 + add si,bx + add bx,di + mov di,word ptr -6[bp] + call near ptr L$1 + mov word ptr -6[bp],di + mov si,word ptr -10H[bp] + cmp si,word ptr -12H[bp] + jne L$35 + mov si,offset MX_TEXT:MX_SCANBUFFER + mov ax,word ptr -16H[bp] + mov cx,word ptr -1aH[bp] + sub cx,ax + mov bx,word ptr cs:MX_CLIPX1 + sub bx,ax + jle L$37 + sub cx,bx + add ax,bx + mov word ptr -16H[bp],ax + shl bx,1 + shl bx,1 + shl bx,1 + add si,bx +L$37: + mov bx,ax + add bx,cx + sub bx,word ptr cs:MX_CLIPX2 + jle L$38 + sub cx,bx +L$38: + test cx,cx + jg L$39 + jmp near ptr L$47 +L$39: + mov word ptr -8[bp],cx + mov word ptr -4[bp],si + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,word ptr -18H[bp] + cmp ax,word ptr cs:MX_CLIPY1 + jl L$40 + mov ax,word ptr -1eH[bp] + cmp ax,word ptr cs:MX_CLIPY2 + jg L$40 + jmp L$44 +L$40: + mov di,cx + inc di + sub si,8 +L$41: + dec di + je L$44 + add si,8 + mov ax,word ptr [si] + mov cx,word ptr 4[si] + mov dx,word ptr cs:MX_CLIPY2 + cmp ax,dx + jg L$43 + cmp cx,dx + jle L$42 + mov word ptr 4[si],dx + mov bx,cx + sub bx,dx + sub cx,ax + jle L$43 + mov ax,word ptr 2[si] + sub ax,word ptr 6[si] + imul bx + idiv cx + add word ptr 6[si],ax + mov ax,word ptr [si] + mov cx,word ptr 4[si] +L$42: + mov dx,word ptr cs:MX_CLIPY1 + cmp cx,dx + jl L$43 + sub cx,ax + jle L$43 + cmp ax,dx + jge L$41 + mov word ptr [si],dx + sub dx,ax + cmp cx,dx + jbe L$43 + mov ax,word ptr 6[si] + sub ax,word ptr 2[si] + imul dx + idiv cx + add word ptr 2[si],ax + jmp L$41 +L$43: + mov word ptr [si],0ffffH + jmp L$41 +L$44: + mov es,word ptr cs:MX_VIDEOSEGMENT + mov si,word ptr -4[bp] + mov cl,byte ptr -16H[bp] + and cl,3 + mov al,11H + shl al,cl + mov byte ptr -2[bp],al + shr word ptr -16H[bp],1 + shr word ptr -16H[bp],1 + mov ax,word ptr 6[bp] + mov ah,al + xor al,al + mov word ptr 6[bp],ax +L$45: + mov ax,word ptr [si] + test ax,ax + js L$46 + mov cx,word ptr 4[si] + sub cx,ax + jle L$46 + mul word ptr cs:MX_BYTESPERLINE + add ax,word ptr -16H[bp] + mov di,ax + mov ah,byte ptr -2[bp] + mov al,2 + mov dx,3c4H + out dx,ax + mov dx,word ptr 6[bp] + call near ptr L$15 +L$46: + rol byte ptr -2[bp],1 + adc word ptr -16H[bp],0 + add si,8 + dec word ptr -8[bp] + jne L$45 +L$47: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 10H +MX_TEXT ENDS + END diff --git a/16/xw__/mxpi.asm b/16/xw__/mxpi.asm new file mode 100755 index 00000000..3484a58d --- /dev/null +++ b/16/xw__/mxpi.asm @@ -0,0 +1,219 @@ +.387 + PUBLIC MXPUTIMAGE + EXTRN SUBCLIPIMAGE:BYTE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + DW offset L$2 + DW offset L$6 + DW offset L$10 + DW offset L$14 + DW offset L$18 + DW offset L$20 +L$2: + shr cx,1 + jb L$5 +L$3: + movsb + add si,3 + movsb + add si,3 + dec cx + jne L$3 +L$4: + ret +L$5: + movsb + add si,3 + jcxz L$4 + jmp L$3 +L$6: + shr cx,1 + jb L$9 +L$7: + mov al,byte ptr [si] + mov ah,byte ptr 4[si] + and word ptr es:[di],ax + inc di + inc di + add si,8 + dec cx + jne L$7 +L$8: + ret +L$9: + lodsb + and byte ptr es:[di],al + inc di + add si,3 + jcxz L$8 + jmp L$7 +L$10: + shr cx,1 + jb L$13 +L$11: + mov al,byte ptr [si] + mov ah,byte ptr 4[si] + or word ptr es:[di],ax + inc di + inc di + add si,8 + dec cx + jne L$11 +L$12: + ret +L$13: + lodsb + or byte ptr es:[di],al + inc di + add si,3 + jcxz L$12 + jmp L$11 +L$14: + shr cx,1 + jb L$17 +L$15: + mov al,byte ptr [si] + mov ah,byte ptr 4[si] + xor word ptr es:[di],ax + inc di + inc di + add si,8 + dec cx + jne L$15 +L$16: + ret +L$17: + lodsb + xor byte ptr es:[di],al + inc di + add si,3 + jcxz L$16 + jmp L$15 +L$18: + mov al,byte ptr [si] + cmp al,ah + je L$19 + mov byte ptr es:[di],al +L$19: + inc di + add si,4 + dec cx + jne L$18 + ret +L$20: + mov al,byte ptr [si] + add byte ptr es:[di],al + inc di + add si,4 + dec cx + jne L$20 + ret +MXPUTIMAGE: + push bp + mov bp,sp + sub sp,14H + push ds + push si + push es + push di + mov bx,word ptr 0eH[bp] + mov ax,word ptr 0cH[bp] + mov cx,word ptr 0aH[bp] + mov dx,word ptr 8[bp] + call near ptr MX_TEXT:SUBCLIPIMAGE + jae L$21 + jmp near ptr L$26 +L$21: + mov word ptr 8[bp],dx + add word ptr 10H[bp],si + mul word ptr cs:MX_BYTESPERLINE + mov di,bx + shr di,1 + shr di,1 + add di,ax + mov word ptr -0aH[bp],di + mov es,word ptr cs:MX_VIDEOSEGMENT + and bl,3 + mov byte ptr -10H[bp],bl + mov bx,cx + shr bx,1 + shr bx,1 + and cl,3 + mov al,8 + shr al,cl + mov si,6 +L$22: + mov word ptr -8[bp+si],bx + shr al,1 + adc bx,0 + dec si + dec si + jge L$22 + mov cl,byte ptr -10H[bp] + mov al,11H + shl al,cl + mov byte ptr -14H[bp],al + mov bx,word ptr 6[bp] + mov byte ptr -12H[bp],bh + xor bh,bh + cmp bl,5 + jbe L$23 + xor bl,bl +L$23: + shl bx,1 + mov ax,word ptr cs:L$1[bx] + mov word ptr -0cH[bp],ax + cld + mov byte ptr -0eH[bp],4 + lea bx,-8[bp] + mov ds,word ptr 12H[bp] +L$24: + cmp word ptr ss:[bx],0 + je L$26 + mov si,word ptr 10H[bp] + mov ah,byte ptr -14H[bp] + and ah,0fH + mov al,2 + mov dx,3c4H + out dx,ax + mov ah,byte ptr -10H[bp] + and ah,3 + mov al,4 + mov dx,3ceH + out dx,ax + mov dx,word ptr 8[bp] + mov di,word ptr -0aH[bp] +L$25: + push si + push di + mov cx,word ptr ss:[bx] + mov ah,byte ptr -12H[bp] + call word ptr -0cH[bp] + pop di + pop si + add si,word ptr 0aH[bp] + add di,word ptr cs:MX_BYTESPERLINE + dec dx + jne L$25 + inc bx + inc bx + inc byte ptr -10H[bp] + rol byte ptr -14H[bp],1 + adc word ptr -0aH[bp],0 + inc word ptr 10H[bp] + dec byte ptr -0eH[bp] + jne L$24 +L$26: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0eH +MX_TEXT ENDS + END diff --git a/16/xw__/mxpn.asm b/16/xw__/mxpn.asm new file mode 100755 index 00000000..7b60449d --- /dev/null +++ b/16/xw__/mxpn.asm @@ -0,0 +1,35 @@ +.387 + PUBLIC MXPAN + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MXWAITDISPLAY:BYTE + EXTRN MXSTARTADDRESS:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXPAN: + push bp + mov bp,sp + sub sp,0 + mov ax,word ptr 6[bp] + mul word ptr cs:MX_BYTESPERLINE + mov dx,word ptr 8[bp] + shr dx,1 + shr dx,1 + add ax,dx + push ax + call far ptr MXWAITDISPLAY + call far ptr MXSTARTADDRESS + mov dx,3daH + in al,dx + mov dx,3c0H + mov al,33H + out dx,al + mov al,byte ptr 8[bp] + and al,3 + shl al,1 + out dx,al + xor ax,ax + mov sp,bp + pop bp + retf 4 +MX_TEXT ENDS + END diff --git a/16/xw__/mxpp.asm b/16/xw__/mxpp.asm new file mode 100755 index 00000000..d15387eb --- /dev/null +++ b/16/xw__/mxpp.asm @@ -0,0 +1,85 @@ +.387 + PUBLIC MXGETPIXEL + PUBLIC MXPUTPIXEL + EXTRN MX_CLIPX1:BYTE + EXTRN MX_CLIPX2:BYTE + EXTRN MX_CLIPY1:BYTE + EXTRN MX_CLIPY2:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXGETPIXEL: + push bp + mov bp,sp + sub sp,0 + push ds + push si + xor ax,ax + mov si,word ptr 8[bp] + cmp si,word ptr cs:MX_CLIPX1 + jl L$1 + cmp si,word ptr cs:MX_CLIPX2 + jg L$1 + mov bx,word ptr 6[bp] + cmp bx,word ptr cs:MX_CLIPY1 + jl L$1 + cmp bx,word ptr cs:MX_CLIPY2 + jg L$1 + mov al,4 + mov ah,byte ptr 8[bp] + and ah,3 + mov dx,3ceH + out dx,ax + mov ds,word ptr cs:MX_VIDEOSEGMENT + mov ax,bx + mul word ptr cs:MX_BYTESPERLINE + shr si,1 + shr si,1 + add si,ax + mov al,byte ptr [si] + xor ah,ah +L$1: + pop si + pop ds + mov sp,bp + pop bp + retf 4 +MXPUTPIXEL: + push bp + mov bp,sp + sub sp,0 + push ds + push si + mov si,word ptr 0aH[bp] + cmp si,word ptr cs:MX_CLIPX1 + jl L$2 + cmp si,word ptr cs:MX_CLIPX2 + jg L$2 + mov ax,word ptr 8[bp] + cmp ax,word ptr cs:MX_CLIPY1 + jl L$2 + cmp ax,word ptr cs:MX_CLIPY2 + jg L$2 + mov ds,word ptr cs:MX_VIDEOSEGMENT + mul word ptr cs:MX_BYTESPERLINE + shr si,1 + shr si,1 + add si,ax + mov cl,byte ptr 0aH[bp] + and cl,3 + mov ax,102H + shl ah,cl + mov dx,3c4H + out dx,ax + mov al,byte ptr 6[bp] + mov byte ptr [si],al +L$2: + xor ax,ax + pop si + pop ds + mov sp,bp + pop bp + retf 6 +MX_TEXT ENDS + END diff --git a/16/xw__/mxra.asm b/16/xw__/mxra.asm new file mode 100755 index 00000000..539f4ee7 --- /dev/null +++ b/16/xw__/mxra.asm @@ -0,0 +1,18 @@ +.387 + PUBLIC MXROWADDRESS +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXROWADDRESS: + push bp + mov bp,sp + sub sp,0 + mov dx,3d4H + mov al,13H + mov ah,byte ptr 6[bp] + out dx,ax + xor ax,ax + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw__/mxrp.asm b/16/xw__/mxrp.asm new file mode 100755 index 00000000..be508c59 --- /dev/null +++ b/16/xw__/mxrp.asm @@ -0,0 +1,73 @@ +.387 + PUBLIC MXROTATEPALETTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXROTATEPALETTE: + push bp + mov bp,sp + sub sp,300H + push ds + push si + push es + push di + mov bx,word ptr 8[bp] + add bx,bx + add bx,word ptr 8[bp] + lds si,dword ptr 0aH[bp] + push ss + pop es + lea di,-300H[bp] + cld + mov ax,word ptr 6[bp] + mov dx,ax + test ax,ax + je L$2 + jl L$1 + add ax,ax + add dx,ax + sub bx,dx + add si,bx + push si + mov cx,dx + rep movsb + mov es,word ptr 0cH[bp] + mov di,si + dec di + pop si + dec si + mov cx,bx + std + rep movsb + push ss + pop ds + lea si,-300H[bp] + les di,dword ptr 0aH[bp] + mov cx,dx + cld + rep movsb + jmp L$2 +L$1: + add ax,ax + add dx,ax + neg dx + sub bx,dx + mov cx,dx + rep movsb + les di,dword ptr 0aH[bp] + mov cx,bx + rep movsb + push ss + pop ds + lea si,-300H[bp] + mov cx,dx + rep movsb +L$2: + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw__/mxsa.asm b/16/xw__/mxsa.asm new file mode 100755 index 00000000..8504fa95 --- /dev/null +++ b/16/xw__/mxsa.asm @@ -0,0 +1,23 @@ +.387 + PUBLIC MXSTARTADDRESS +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXSTARTADDRESS: + push bp + mov bp,sp + sub sp,0 + mov bx,word ptr 6[bp] + mov dx,3d4H + mov al,0cH + mov ah,bh + cli + out dx,ax + mov al,0dH + mov ah,bl + out dx,ax + sti + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw__/mxsc.asm b/16/xw__/mxsc.asm new file mode 100755 index 00000000..e65d8460 --- /dev/null +++ b/16/xw__/mxsc.asm @@ -0,0 +1,27 @@ +.387 + PUBLIC MXSETCOLOR +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXSETCOLOR: + push bp + mov bp,sp + sub sp,0 + push ds + push si + mov ax,word ptr 0cH[bp] + mov dx,3c8H + out dx,al + inc dx + mov al,byte ptr 0aH[bp] + out dx,al + mov al,byte ptr 8[bp] + out dx,al + mov al,byte ptr 6[bp] + out dx,al + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw__/mxsi.asm b/16/xw__/mxsi.asm new file mode 100755 index 00000000..a9179a88 --- /dev/null +++ b/16/xw__/mxsi.asm @@ -0,0 +1,221 @@ +.387 + PUBLIC MXSTRETCHIMAGE + EXTRN SUBCLIPBOX:BYTE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + DW offset L$8 + DW offset L$10 + DW offset L$12 + DW offset L$14 + DW offset L$16 + DW offset L$19 +MXSTRETCHIMAGE: + push bp + mov bp,sp + sub sp,14H + push ds + push si + push es + push di + xor dx,dx + mov ax,word ptr 0eH[bp] + mov bx,word ptr 0aH[bp] + div bx + mov word ptr -0aH[bp],ax + xor ax,ax + div bx + mov word ptr -0cH[bp],ax + xor dx,dx + mov ax,word ptr 0cH[bp] + mov bx,word ptr 8[bp] + div bx + mov word ptr -0eH[bp],ax + xor ax,ax + div bx + mov word ptr -10H[bp],ax + mov bx,word ptr 12H[bp] + mov ax,word ptr 10H[bp] + mov cx,word ptr 0aH[bp] + mov dx,word ptr 8[bp] + call near ptr MX_TEXT:SUBCLIPBOX + jae L$2 + jmp near ptr L$7 +L$2: + mov word ptr 0aH[bp],cx + mov word ptr 8[bp],dx + sub word ptr 12H[bp],bx + sub word ptr 10H[bp],ax + mul word ptr cs:MX_BYTESPERLINE + mov di,bx + shr di,1 + shr di,1 + add di,ax + mov word ptr -2[bp],di + mov es,word ptr cs:MX_VIDEOSEGMENT + and bl,3 + mov byte ptr -6[bp],bl + mov cl,bl + mov al,11H + shl al,cl + mov byte ptr -14H[bp],al + mov ax,word ptr 10H[bp] + test ax,ax + je L$3 + mov bx,ax + mul word ptr -10H[bp] + mov cx,dx + mov ax,bx + mul word ptr -0eH[bp] + add ax,cx + mul word ptr 0eH[bp] + add word ptr 14H[bp],ax +L$3: + mov ax,word ptr 12H[bp] + test ax,ax + je L$4 + mov bx,ax + mul word ptr -0cH[bp] + mov cx,dx + mov ax,bx + mul word ptr -0aH[bp] + add ax,cx + add word ptr 14H[bp],ax +L$4: + mov ax,word ptr -0eH[bp] + mul word ptr 0eH[bp] + mov word ptr -0eH[bp],ax + mov bx,word ptr 6[bp] + mov byte ptr -8[bp],bh + xor bh,bh + cmp bl,5 + jbe L$5 + xor bl,bl +L$5: + shl bx,1 + mov ax,word ptr cs:L$1[bx] + mov word ptr -4[bp],ax + mov ds,word ptr 16H[bp] + xor ax,ax + mov word ptr -12H[bp],ax +L$6: + mov si,word ptr 14H[bp] + mov ah,byte ptr -14H[bp] + and ah,0fH + mov al,2 + mov dx,3c4H + out dx,ax + mov ah,byte ptr -6[bp] + and ah,3 + mov al,4 + mov dx,3ceH + out dx,ax + mov cx,word ptr 8[bp] + mov di,word ptr -2[bp] + mov ah,byte ptr -8[bp] + xor bx,bx + mov dx,word ptr cs:MX_BYTESPERLINE + call word ptr -4[bp] + inc byte ptr -6[bp] + rol byte ptr -14H[bp],1 + adc word ptr -2[bp],0 + mov dx,word ptr -0cH[bp] + mov ax,word ptr -0aH[bp] + add word ptr -12H[bp],dx + adc word ptr 14H[bp],ax + dec word ptr 0aH[bp] + jne L$6 +L$7: + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 12H +L$8: + mov al,byte ptr [si] + mov byte ptr es:[di],al + add di,dx + dec cx + je L$9 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$8 + add si,word ptr 0eH[bp] + jmp L$8 +L$9: + ret +L$10: + mov al,byte ptr [si] + and byte ptr es:[di],al + add di,dx + dec cx + je L$11 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$10 + add si,word ptr 0eH[bp] + jmp L$10 +L$11: + ret +L$12: + mov al,byte ptr [si] + or byte ptr es:[di],al + add di,dx + dec cx + je L$13 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$12 + add si,word ptr 0eH[bp] + jmp L$12 +L$13: + ret +L$14: + mov al,byte ptr [si] + xor byte ptr es:[di],al + add di,dx + dec cx + je L$15 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$14 + add si,word ptr 0eH[bp] + jmp L$14 +L$15: + ret +L$16: + mov al,byte ptr [si] + cmp al,ah + je L$17 + mov byte ptr es:[di],al +L$17: + add di,dx + dec cx + je L$18 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$16 + add si,word ptr 0eH[bp] + jmp L$16 +L$18: + ret +L$19: + mov al,byte ptr [si] + add byte ptr es:[di],al + add di,dx + dec cx + je L$20 + add si,word ptr -0eH[bp] + add bx,word ptr -10H[bp] + jae L$19 + add si,word ptr 0eH[bp] + jmp L$19 +L$20: + ret +MX_TEXT ENDS + END diff --git a/16/xw__/mxsl.asm b/16/xw__/mxsl.asm new file mode 100755 index 00000000..2b25844a --- /dev/null +++ b/16/xw__/mxsl.asm @@ -0,0 +1,37 @@ +.387 + PUBLIC MXSTARTLINE + EXTRN MX_BYTESPERLINE:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXSTARTLINE: + push bp + mov bp,sp + sub sp,0 + mov ax,word ptr 6[bp] + mul word ptr cs:MX_BYTESPERLINE + xchg ax,bx + mov dx,3daH +L$1: + in al,dx + test al,8 + jne L$1 + mov dx,3d4H + mov al,0cH + mov ah,bh + cli + out dx,ax + mov al,0dH + mov ah,bl + out dx,ax + sti + mov dx,3daH +L$2: + in al,dx + test al,8 + je L$2 + xor ax,ax + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw__/mxsm.asm b/16/xw__/mxsm.asm new file mode 100755 index 00000000..ccad79ec --- /dev/null +++ b/16/xw__/mxsm.asm @@ -0,0 +1,450 @@ +.387 + PUBLIC MX_SCREENWIDTH + PUBLIC MX_SCREENHEIGHT + PUBLIC MX_BYTESPERLINE + PUBLIC MXSETMODE + PUBLIC MXCHANGEMODE + PUBLIC MXGETASPECT + PUBLIC MXGETSCREENSIZE + EXTRN MX_CODESEGMENT:BYTE + EXTRN MXSETSYSCLIPREGION:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MX_SCREENWIDTH: + add byte ptr [bx+si],al +MX_SCREENHEIGHT: + add byte ptr [bx+si],al +L$1: + add byte ptr [bx+si],al +L$2: + add byte ptr [bx+si],al +MX_BYTESPERLINE: + add byte ptr [bx+si],al +L$3: + or word ptr 14H[bx+si],ax + add byte ptr [bx],dl + jcxz L$4 +L$4: + DB 0 +L$5: + or word ptr 14H[bx+di],ax + add byte ptr [bx],dl + jcxz L$6 +L$6: + DB 0 +L$7: + add byte ptr 1[bx],bl + dec di + add dl,byte ptr 3[bx+si] + add byte ptr [si],54H + add ax,1380H + sub byte ptr [bx+si],al + DB 0 +L$8: + add byte ptr 1[bp+di],ch + pop cx + add bl,byte ptr 3[bp+si] + mov es,word ptr [si] + pop si + add ax,138aH + sub ax,0 + push es + mov di,1f07H + adc byte ptr -7aefH[bp+di],al + adc bl,byte ptr 15H[di] + arpl word ptr ds:[0baH],dx + DB 0 +L$9: + push es + DD ds:[7bfH] + pushf + adc word ptr -70eeH[bp],cx + adc ax,1696H + mov cx,0 +L$10: + push es + or ax,3e07H + adc dl,ch + adc word ptr -20eeH[si],cx + adc ax,16e7H + push es + add byte ptr [bx+si],al +L$11: + add byte ptr 1[si],dh + arpl word ptr [bp+si],ax + add dx,word ptr fs:6804H[bx] + add ax,695H + xchg byte ptr [bx],al + lock or word ptr 0fH[bx+si],sp + xor word ptr [bx+si],dx + pop bx + adc word ptr 5712H[di],cx + adc si,word ptr [bp+si] + adc al,0 + adc ax,1660H + adc byte ptr [bx],0e3H + add byte ptr [bx+si],al +L$12: + arpl word ptr ds:[500H],ax + add byte ptr 1[bx+si],al + enter 1a00H,0 + DW offset L$9 + DW offset L$5 + add byte ptr [bx+si],al + xor ax,word ptr [bp+di] +L$13: + jcxz L$14 + DB 0 +L$14: + add word ptr [bx+si],ax + inc ax + add ax,si + add byte ptr [bp+si],bl + add byte ptr [bp+si],bl + DW offset L$5 + add byte ptr [bx+si],al + xor ax,word ptr [bp+di] +L$15: + arpl word ptr ds:[0a00H],ax + add byte ptr 1[bx+si],al + nop + add word ptr [bp+si],bx + add byte ptr [bp+si],cl + DW offset L$3 + add byte ptr [bx+si],al + xor ax,word ptr [bp+di] +L$16: + jcxz L$17 + DB 0 +L$17: + add al,byte ptr [bx+si] + inc ax + add ax,sp + DD L$18 +L$18: + add byte ptr [bp+si],cl + add byte ptr [bx+si],al + add byte ptr [bp+di],dh + DB 3 +L$19: + sbb ax,word ptr [eax] + adc al,0 + push 0c801H + add byte ptr [bp+si],ch + add byte ptr [bp+si],cl + DW offset L$5 + add byte ptr [bx+si],al + fadd dword ptr [bp+si] +L$20: + out 9,ax + add byte ptr [bx+si],cl + add byte ptr 1[bx+si],ch + lock add byte ptr [bp+si],ch + add byte ptr [bp+si],bl + DW offset L$5 + add byte ptr [bx+si],al + fadd dword ptr [bp+si] +L$21: + sbb ax,word ptr [eax] + sub byte ptr [bx+si],al + push 9001H + add word ptr [bp+si],bp + add byte ptr [bp+si],cl + DW offset L$3 + add byte ptr [bx+si],al + fadd dword ptr [bp+si] +L$22: + out 9,ax + add byte ptr [bx+si],dl + add byte ptr 1[bx+si],ch + loopnz L$23 + DW offset L$8 +L$23 equ $-1 + DW offset L$10 + DW offset L$3 + add byte ptr [bx+si],al + fadd dword ptr [bp+si] +L$24: + mov word ptr ds:[0],ax + add byte ptr [bx+si],al + inc ax + add word ptr 1a00H[bx],bp + add byte ptr [bp+si],bh + add byte ptr [bp+si],dl + add byte ptr [bx+si],al + add byte ptr [bp+di],dh + DB 3 +L$25: + mov word ptr 0,ax + add byte ptr [bx+si],al + inc ax + add word ptr 1a00H[bx],bp + add byte ptr [bp+si],bh + add byte ptr [bp+si],cl + add byte ptr [bx+si],al + add byte ptr [bp+di],dh + DB 3 +L$26: + cmpsw + add byte ptr [bx+si],al + add byte ptr [bx+si],al + push 0e001H + add word ptr [bp+si],bp + add byte ptr [bp+si],bh + add byte ptr [bp+si],dl + add byte ptr [bx+si],al + add al,bl + DB 2 +L$27: + cmpsw + add byte ptr [bx+si],al + add byte ptr [bx+si],al + push 0e001H + add word ptr [bp+si],bp + add byte ptr [bp+si],bh + add byte ptr [bp+si],cl + add byte ptr [bx+si],al + add al,bl + DB 2 +L$28: + out 1,ax + add byte ptr [bp+si],al + add byte ptr 5801H[bx+si],dl + add ch,byte ptr [bp+si] + add byte ptr [bx+si],al + pop word ptr [bp+si] +L$29: + DW offset L$24 + DW offset L$12 + DW offset L$13 + DW offset L$25 + DW offset L$15 + DW offset L$16 + DW offset L$26 + DW offset L$19 + DW offset L$20 + DW offset L$27 + DW offset L$21 + DW offset L$22 + DW offset L$28 +L$30: + mov ax,3 + int 10H + mov word ptr MX_SCREENHEIGHT,0 + mov word ptr MX_BYTESPERLINE,0 + ret +MXSETMODE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov ds,word ptr cs:MX_CODESEGMENT + mov si,word ptr 6[bp] + cmp si,0dH + jbe L$31 + jmp near ptr L$36 +L$31: + test si,si + jne L$32 + call near ptr L$30 + jmp near ptr L$36 +L$32: + dec si + shl si,1 + mov si,word ptr L$29[si] + cld + push si + mov ax,13H + int 10H + pop si + mov dx,3c4H + mov ax,604H + out dx,ax + mov ax,100H + out dx,ax + mov dx,3c2H + lodsb + out dx,al + mov dx,3c4H + mov ax,300H + out dx,ax + mov dx,3d4H + mov al,11H + out dx,al + inc dx + in al,dx + and al,7fH + out dx,al + lodsw + mov word ptr L$1,ax + lodsw + mov word ptr L$2,ax + lodsw + mov word ptr MX_SCREENWIDTH,ax + shr ax,1 + shr ax,1 + mov word ptr MX_BYTESPERLINE,ax + lodsw + mov word ptr MX_SCREENHEIGHT,ax + mov bx,si + mov dx,3d4H +L$33: + mov si,word ptr [bx] + inc bx + inc bx + test si,si + je L$35 +L$34: + lodsw + test ax,ax + je L$33 + out dx,ax + jmp L$34 +L$35: + push word ptr MX_SCREENWIDTH + push word ptr [bx] + push cs + call near ptr MX_TEXT:MXSETSYSCLIPREGION + mov dx,3c4H + mov ax,0f02H + out dx,ax + mov es,word ptr MX_TEXT:MX_VIDEOSEGMENT + xor di,di + mov cx,8000H + xor ax,ax + rep stosw + mov dx,3d4H + mov al,11H + out dx,al + inc dx + in al,dx + or al,80H + out dx,al +L$36: + xor ax,ax + mov ax,word ptr MX_SCREENWIDTH + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 2 +MXCHANGEMODE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov ds,word ptr cs:MX_CODESEGMENT + mov si,word ptr 6[bp] + cmp si,0dH + ja L$40 + test si,si + je L$40 + dec si + shl si,1 + mov si,word ptr L$29[si] + cld + mov dx,3c4H + mov ax,604H + out dx,ax + mov ax,100H + out dx,ax + mov dx,3c2H + lodsb + out dx,al + mov dx,3c4H + mov ax,300H + out dx,ax + mov dx,3d4H + mov al,11H + out dx,al + inc dx + in al,dx + and al,7fH + out dx,al + lodsw + mov word ptr L$1,ax + lodsw + mov word ptr L$2,ax + lodsw + mov word ptr MX_SCREENWIDTH,ax + lodsw + mov word ptr MX_SCREENHEIGHT,ax + mov bx,si + mov dx,3d4H +L$37: + mov si,word ptr [bx] + inc bx + inc bx + test si,si + je L$39 +L$38: + lodsw + test ax,ax + je L$37 + cmp al,13H + je L$38 + out dx,ax + jmp L$38 +L$39: + mov dx,3d4H + mov al,11H + out dx,al + inc dx + in al,dx + or al,80H + out dx,al +L$40: + xor ax,ax + mov ax,word ptr MX_SCREENWIDTH + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 2 +MXGETASPECT: + push bp + mov bp,sp + sub sp,0 + push ds + push si + lds si,dword ptr 0aH[bp] + mov ax,word ptr cs:L$1 + mov word ptr [si],ax + lds si,dword ptr 6[bp] + mov ax,word ptr cs:L$2 + mov word ptr [si],ax + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MXGETSCREENSIZE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + lds si,dword ptr 0aH[bp] + mov ax,word ptr cs:MX_SCREENWIDTH + mov word ptr [si],ax + lds si,dword ptr 6[bp] + mov ax,word ptr cs:MX_SCREENHEIGHT + mov word ptr [si],ax + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw__/mxsp.asm b/16/xw__/mxsp.asm new file mode 100755 index 00000000..7ed046f6 --- /dev/null +++ b/16/xw__/mxsp.asm @@ -0,0 +1,34 @@ +.387 + PUBLIC MXSETPALETTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXSETPALETTE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + lds si,dword ptr 0aH[bp] + mov cx,word ptr 6[bp] + mov ax,word ptr 8[bp] + mov dx,3c8H + out dx,al + inc dx + cld + cli +L$1: + lodsb + out dx,al + lodsb + out dx,al + lodsb + out dx,al + loop L$1 + sti + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw__/mxss.asm b/16/xw__/mxss.asm new file mode 100755 index 00000000..aba7db99 --- /dev/null +++ b/16/xw__/mxss.asm @@ -0,0 +1,45 @@ +.387 + PUBLIC MXSPLITSCREEN +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXSPLITSCREEN: + push bp + mov bp,sp + sub sp,0 + mov ax,word ptr 6[bp] + shl ax,1 + mov bh,ah + mov bl,ah + and bx,201H + mov cl,4 + shl bx,cl + shl bh,1 + mov dx,3d4H + mov ah,al + mov al,18H + out dx,ax + mov al,7 + out dx,al + inc dx + in al,dx + dec dx + mov ah,al + and ah,0efH + or ah,bl + mov al,7 + out dx,ax + mov al,9 + out dx,al + inc dx + in al,dx + dec dx + mov ah,al + and ah,0bfH + or ah,bh + mov al,9 + out dx,ax + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw__/mxtl.asm b/16/xw__/mxtl.asm new file mode 100755 index 00000000..e93aedf6 --- /dev/null +++ b/16/xw__/mxtl.asm @@ -0,0 +1,123 @@ +.387 + PUBLIC MXPUTTILE + PUBLIC MXTRANSPUTTILE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MX_VIDEOSEGMENT:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXPUTTILE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov ax,word ptr 0aH[bp] + mul word ptr cs:MX_BYTESPERLINE + mov di,word ptr 0cH[bp] + shr di,1 + shr di,1 + add di,ax + mov es,word ptr cs:MX_VIDEOSEGMENT + lds si,dword ptr 0eH[bp] + shr word ptr 8[bp],1 + shr word ptr 8[bp],1 + mov cl,byte ptr 0cH[bp] + and cl,3 + mov ah,11H + shl ah,cl + mov word ptr 0aH[bp],4 + mov bx,word ptr cs:MX_BYTESPERLINE + sub bx,word ptr 8[bp] +L$1: + mov al,2 + mov dx,3c4H + out dx,ax + mov word ptr 0cH[bp],di + mov dx,word ptr 6[bp] +L$2: + mov cx,word ptr 8[bp] + shr cx,1 + rep movsw + rcl cx,1 + rep movsb + add di,bx + dec dx + jne L$2 + mov di,word ptr 0cH[bp] + rol ah,1 + adc di,0 + dec word ptr 0aH[bp] + jne L$1 + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +MXTRANSPUTTILE: + push bp + mov bp,sp + sub sp,0 + push ds + push si + push es + push di + mov ax,word ptr 0aH[bp] + mul word ptr cs:MX_BYTESPERLINE + mov di,word ptr 0cH[bp] + shr di,1 + shr di,1 + add di,ax + mov es,word ptr cs:MX_VIDEOSEGMENT + lds si,dword ptr 0eH[bp] + shr word ptr 8[bp],1 + shr word ptr 8[bp],1 + mov cl,byte ptr 0cH[bp] + and cl,3 + mov ah,11H + shl ah,cl + mov word ptr 0aH[bp],4 + mov bx,word ptr cs:MX_BYTESPERLINE + sub bx,word ptr 8[bp] +L$3: + mov al,2 + mov dx,3c4H + out dx,ax + mov word ptr 0cH[bp],di + mov dx,word ptr 6[bp] +L$4: + mov cx,word ptr 8[bp] + jcxz L$7 +L$5: + mov al,byte ptr [si] + test al,al + je L$6 + mov byte ptr es:[di],al +L$6: + inc si + inc di + dec cx + jne L$5 +L$7: + add di,bx + dec dx + jne L$4 + mov di,word ptr 0cH[bp] + rol ah,1 + adc di,0 + dec word ptr 0aH[bp] + jne L$3 + xor ax,ax + pop di + pop es + pop si + pop ds + mov sp,bp + pop bp + retf 0cH +MX_TEXT ENDS + END diff --git a/16/xw__/mxvs.asm b/16/xw__/mxvs.asm new file mode 100755 index 00000000..feafb66a --- /dev/null +++ b/16/xw__/mxvs.asm @@ -0,0 +1,69 @@ +.387 + PUBLIC MXSETVIRTUALSCREEN + PUBLIC MXGETVIRTUALSCREEN + EXTRN MX_CODESEGMENT:BYTE + EXTRN MX_BYTESPERLINE:BYTE + EXTRN MXROWADDRESS:BYTE + EXTRN MXSETSYSCLIPREGION:BYTE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +L$1: + add byte ptr [bx+si],al +L$2: + add byte ptr [bx+si],al +MXSETVIRTUALSCREEN: + push bp + mov bp,sp + sub sp,0 + push ds + mov ds,word ptr cs:MX_CODESEGMENT + mov ax,1 + cmp word ptr 8[bp],140H + jb L$3 + push ax + mov dx,4 + xor ax,ax + div word ptr 8[bp] + cmp word ptr 6[bp],ax + pop ax + ja L$3 + mov ax,word ptr 8[bp] + and ax,0fff8H + mov word ptr L$1,ax + shr ax,1 + shr ax,1 + mov word ptr MX_TEXT:MX_BYTESPERLINE,ax + shr ax,1 + push ax + call far ptr MXROWADDRESS + mov ax,word ptr 6[bp] + mov word ptr L$2,ax + push word ptr 8[bp] + push word ptr 6[bp] + call far ptr MXSETSYSCLIPREGION + xor ax,ax +L$3: + pop ds + mov sp,bp + pop bp + retf 4 +MXGETVIRTUALSCREEN: + push bp + mov bp,sp + sub sp,0 + push ds + push si + mov ax,word ptr cs:L$1 + lds si,dword ptr 0aH[bp] + mov word ptr [si],ax + mov ax,word ptr cs:L$2 + lds si,dword ptr 6[bp] + mov word ptr [si],ax + xor ax,ax + pop si + pop ds + mov sp,bp + pop bp + retf 8 +MX_TEXT ENDS + END diff --git a/16/xw__/mxwd.asm b/16/xw__/mxwd.asm new file mode 100755 index 00000000..7f491f39 --- /dev/null +++ b/16/xw__/mxwd.asm @@ -0,0 +1,13 @@ +.387 + PUBLIC MXWAITDISPLAY +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXWAITDISPLAY: + mov dx,3daH +L$1: + in al,dx + test al,8 + jne L$1 + retf +MX_TEXT ENDS + END diff --git a/16/xw__/mxwm.asm b/16/xw__/mxwm.asm new file mode 100755 index 00000000..271eebad --- /dev/null +++ b/16/xw__/mxwm.asm @@ -0,0 +1,19 @@ +.387 + PUBLIC MXWRITEMODE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXWRITEMODE: + push bp + mov bp,sp + sub sp,0 + mov dx,3ceH + mov ah,byte ptr 6[bp] + and ah,3 + or ah,40H + mov al,5 + out dx,ax + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw__/mxwp.asm b/16/xw__/mxwp.asm new file mode 100755 index 00000000..45e32f37 --- /dev/null +++ b/16/xw__/mxwp.asm @@ -0,0 +1,31 @@ +.387 + PUBLIC MXWRITEPLANE + PUBLIC MXREADPLANE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXWRITEPLANE: + push bp + mov bp,sp + sub sp,0 + mov ah,byte ptr 6[bp] + and ah,0fH + mov al,2 + mov dx,3c4H + out dx,ax + mov sp,bp + pop bp + retf 2 +MXREADPLANE: + push bp + mov bp,sp + sub sp,0 + mov al,4 + mov ah,byte ptr 6[bp] + and ah,3 + mov dx,3ceH + out dx,ax + mov sp,bp + pop bp + retf 2 +MX_TEXT ENDS + END diff --git a/16/xw__/mxwr.asm b/16/xw__/mxwr.asm new file mode 100755 index 00000000..5fccb47d --- /dev/null +++ b/16/xw__/mxwr.asm @@ -0,0 +1,13 @@ +.387 + PUBLIC MXWAITRETRACE +MX_TEXT SEGMENT PARA PUBLIC USE16 'CODE' + ASSUME CS:MX_TEXT, DS:DGROUP, SS:DGROUP +MXWAITRETRACE: + mov dx,3daH +L$1: + in al,dx + test al,8 + je L$1 + retf +MX_TEXT ENDS + END diff --git a/16/xw__/readme.txt b/16/xw__/readme.txt new file mode 100755 index 00000000..306e8b9a --- /dev/null +++ b/16/xw__/readme.txt @@ -0,0 +1,8 @@ +ModeX - A graphical library for DOS programs +Copyright (c) 1993-1994 Alessandro Scotti +http://www.ascotti.org/ + +Please look at the above site in the "Art of..." and +then in the "Old programs" section for more information. + + diff --git a/16/xw__/xw.bat b/16/xw__/xw.bat new file mode 100755 index 00000000..1fd24399 --- /dev/null +++ b/16/xw__/xw.bat @@ -0,0 +1,39 @@ +@echo off +wdis -a MXBB.OBJ > mxbb.asm +wdis -a MXCC.OBJ > mxcc.asm +wdis -a MXCG.OBJ > mxcg.asm +wdis -a MXCL.OBJ > mxcl.asm +wdis -a MXCR.OBJ > mxcl.asm +wdis -a MXFB.OBJ > mxfb.asm +wdis -a MXFP.OBJ > mxfp.asm +wdis -a MXGC.OBJ > mxgc.asm +wdis -a MXGI.OBJ > mxgi.asm +wdis -a MXGM.OBJ > mxgm.asm +wdis -a MXGP.OBJ > mxgp.asm +wdis -a MXGV.OBJ > mxgv.asm +wdis -a MXHL.OBJ > mxhl.asm +wdis -a MXIT.OBJ > mxit.asm +wdis -a MXLL.OBJ > mxll.asm +wdis -a MXLN.OBJ > mxln.asm +wdis -a MXOT.OBJ > mxot.asm +wdis -a MXPB.OBJ > mxpb.asm +wdis -a MXPF.OBJ > mxpf.asm +wdis -a MXPG.OBJ > mxpg.asm +wdis -a MXPI.OBJ > mxpi.asm +wdis -a MXPN.OBJ > mxpn.asm +wdis -a MXPP.OBJ > mxpp.asm +wdis -a MXRA.OBJ > mxra.asm +wdis -a MXRP.OBJ > mxrp.asm +wdis -a MXSA.OBJ > mxsa.asm +wdis -a MXSC.OBJ > mxsc.asm +wdis -a MXSI.OBJ > mxsi.asm +wdis -a MXSL.OBJ > mxsl.asm +wdis -a MXSM.OBJ > mxsm.asm +wdis -a MXSP.OBJ > mxsp.asm +wdis -a MXSS.OBJ > mxss.asm +wdis -a MXTL.OBJ > mxtl.asm +wdis -a MXVS.OBJ > mxvs.asm +wdis -a MXWD.OBJ > mxwd.asm +wdis -a MXWM.OBJ > mxwm.asm +wdis -a MXWP.OBJ > mxwp.asm +wdis -a MXWR.OBJ > mxwr.asm diff --git a/exmmtest.exe b/exmmtest.exe index dac0a57c6e4d4e0482a6b3267c6b6dc00ef7634f..c0993838b7dc70822af8e5066e419761613b90a2 100755 GIT binary patch delta 29064 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 A?*IS* diff --git a/makefile b/makefile index 7e02f9ba..f89a9290 100755 --- a/makefile +++ b/makefile @@ -442,9 +442,7 @@ mx: .symbolic @wmake all @cd ../../ -x: .symbolic - @cd 16/x - @wmake -f makefile.wat pee - @cd ../xw_/ - @wmake all +mx_: .symbolic + @cd 16/xw_ + @wmake -f makefile.wat all @cd ../../ diff --git a/planrpcx.exe b/planrpcx.exe index 532074f8fbd475138284179daba599362f29b637..405c702757a05014a0d6c0c1a4c32e300246f9b6 100755 GIT binary patch delta 10315 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 R{Z|hJ0C-wm*~M0u{{xBFj|l(( delta 10311 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

tnzaWiZth-h)BRuQRuxKmfn-08t!8MA>6Zx zY>cLhnW{}o|DnnJwej#H_(8Jf&rwMu@T0t6Hlh@xh1oB6k`Q*9bk&5Npsnm*bb@G+ zQNWtyjY^mb(4}w0?DC>7L|i#AUeI6>V}E36GbA(lpE-JBmj5Fp_;>39iE1z~SMBQm zo2AirF$;aFEITQwH$|0C6tJ|RAXDV*yU*n!shvUr0GUpp<1Q{ANfupmp)Y3%NUi`v zv(Q^=P~HdMWBY1O@GI3KI$IQFaMQ09i9Tn=vnMLV-cf^}g@CqmY;Ns`KrWmquk&ZC z-*#0fMO?6w%37WNOux0x$`!9|9ih26IHqOO)BUM|s10|0j5@?%Kj_)d88k|zkGM3zPa@e{a zGLQOWb{PsU=VhomVf9M`tC)U;e0fn_n*OC@Wz^3dHWSVR<&Yxx zwMI}o6sngHF|)AnC8;rTmgFKhec|ML;d($)731E_2Dtt8{7$9_U z*^Uf2oAfsrKn6qcx@+>6K6Hz=7b_~t=32d*n<{?0pdo+*EqK9%0_}fdag*ixWmIZ;mR4l(N)X#ip4yKUZ^N zk=nXO2ysYcmWCFIhm|~Nxx{(%WM6FzcvndFe%HYbUOi78DZM{*Vt!><;U}u*=eqU} ztpn6VxK51c8$pb7^X){L?Q?b^oEBr~Evm7H(tu;ys*E39Zq4?flWT2t@{*aHZ|aA66=J zQxZ0%YBPlBp0@Qkfr!se-u=)(Z|Yx~G3^}4=cKt0uTf8n=636ZQEx1O` zO%dWJF_V+i$-Kn$S`8r=|0SZmk?b37P}L6|`XptL*HJC!H~=}IpwUTu6{$Lh)#3f> zJzy!QQ#P_j;uXq>kTbNci>)uzP=%6t+5xW)Lob!C*?K>4CNsD3o|Pr1MyT%tAg#sD zE8d02q|c~w96xb=w;Jv9`kJNu5Wpzads{N&-ObcR{)XWXE-;&g2 zgY7LtKcpN{lPIXYgO!Fu`AjzbcqtpJvFD>d{}Z3op{@0tjJb~-;)#9Wsn9=u_(o^$ zPVgjnvY;u(%rm{LmR_EFYZQU1QfJg4)%0OUnLh=H9z@*dT1kuAf8G`%s<|k67r(!x z#9(O6tb43Ubx_ReL_1RdI3)9xXMh{rM7|ui;IPuk)(zL%+f$ZzT>VEZ)a()#ngf~+ z9(w|9QY|5OA|I*Q6}>pM#JYj}5`-DA5X)pMm zcApP7NUt|z4r5+du@|=W*n4#c1&y2T7&kEh>SSWkWsCKnwUYvsaX<@t@>zhlY+DLE zRiJiyv1<&$V##kRT{1ws55l`s#C8Z-iHN&SCzI5Ad7ZY;zJ}f0lJdn!X;lDsxVC%` zQr)2|j~)lTEYa_l-*Ej{7BX<8JYGu}XDdD=*qn>+8pCq5Tvb83F0@*nqko7qB;vU2-Y*RYGAA)sy$S|Lnzn ze~z#3RtUjdLnko-T%L?A18`e)ESjZPOe&-HgZJ&eXNMp0qRbXOYw5TkfZZc|6|ofH ze=ibZ8%&{Zb}af+B8tmrIh8J^@IOj<1$oWte2b2>!!&<5?Max_*%6XA)s|eU7?K3T zymY71-kjk(p#*v;NA`iBnu}LZkfaz9>e+gbU0IxCu$Yp}6cGf8Rj>$34*Kp+JijOC z-4KXrZLGBDW|H{U5fF=CL`vzhls|&I??)V8OE@hJ6l@YycKA~=@8zLr{az!9r}4}l zr&_NKres=t?aJZ15_H0Eavu%D#gAXp^#hIpW^WS{!4l37r!2cBR1TYg{!5^Sfs)}L zo1>fS-N(RH*a&%x38J-qXinybM(;rVd9pwiTZGT`L|I0VQ{k2_a8e@H1^!J8F^oVU zY)OfC3y3m9 z)UujIAKDes7wpB76EVG)_sE*l4nWi7+jhq|z&^nAKW*ryXo^!;OYFH-Rx8sRKBwFx?m}DCUB3T$R3KKXc-3|TL^w|aX z?Pts~P2pH7FU5}Ow|&nuZEPSOOBkGSLXmIw#MwWU=COW(Z9B&|XEg0()zcASYZ`Q* zUVtMioOa}bFrupVY+zfq(Y}6}F*(#)5-b*e<{}bUGWDkNj=tS>yU#VFrrjY8U$!Xw zhE?=M_b6NUC3;4I^y$@Cqjcx9AXWFb4B`dg5>J#K^oB#bu}}0Mki;PfAwmvqlZ9_* zQa*SB+xwOUy_%AImwmPe>bpF{xBY3esRUC^k=5OVSIQL60m~oMRp*mp4sy2PZqjXy+C>xOW$naQ zLe8AqO7KUPzIlWy>P_OvsuNT(k@p+rmYJd|=L)>Ng08aAaw)@!l8xkEg;rD~uJLjs z6Pi=L9UD!Zot-XA)}abFaKF4}1Lu|e-sNI%UT!R(o$ts-NhDPvGO@p z=v*(-(=N?2CPgPbBH!AARKf{3Em@{hH7GgozmY}U`d{8no(4_f%ZA;Z14S~DoWHFB z(B?kryNAv;Wu*51Bm6ofP2;5g07FJOV>>&s%Yqg^;!wV*uwJWh?i43;nZ(ZR)OYVyF4~Y!u{`aMT^?&rIw zZt~m!{*ILJMd3-dMBl|$YhGyvxU=h>r7i>UR5PLv%{Au}1n>?C(OjKwv~c0nzQ3iB zN6RWvPH?*k$my`Gf+Xm^a*>8vAU$UJWFSBve8q%}8Hfp!IkFG!Wje-drFLr{^H|}S z8ReqZi~*^eCeM`X=b)~i+0OuXfbavJ{I~QoDtB#b} zNx06Tg-E=nqoa@n9BUWBH=;i~AWL4rE9ZrKsR$;sK-T zlv*+crFUnG3&`IySm18|t(7XQk+{MeicCszf~nv`6|ZwAP56i29p^IC`BJm#)ZsD- z!AaiG*9{Os{QT$5;}7%TS8cyk4?Vs)r06k>=sfp3VMvT@uBv}4j&(avWmtCb;Vq0Y zt+f{6P*6OOO)5K-@Co{OeW4Tuycu%ZNRuqmp1n}PauOtKwf>YE+8T1+0vK7;A`A)^ zAL=JRE%mV25NxpXDkw2d49Qx7ki1|i@Q79YPRcjP;Q22xSWV?%duE2!sBhhj@r^mf zXaTjvreVNK_(Ce`MJ4f@)MndfuRf}bO|EICDoH( z`^8V}seE3r!sy&!Q=Qq4p^wO)q0h{dT)uTc~yQpBtv2 zKWirmk&2^0eG4;l$Xx=w)&01qDXR0-8Lv0IA6a{^We5_*(#C~9I^Y}%f2$V);`N1l zb4vJAUJ7E3Bwz0%@&)gp?46;4k#@(hU<+;-=cr>zn(K8(`Ta;pY8y20UB`(s=$DYN z72;8i8iDVJV3nqmUE*rCgM@I@BSo)X*z>~SB)(~N?EyAf{uNl5U5`Y*SVfivDLqZl zb+o;(W}`&y#M%1PYsm;zE-O~lfLa64&lKy+9LogaNEKD+JOcEHzviQ)VvHLi9PS?r zX@BOiS{%Ts#!VFZJgtuPLS*)=alpD+O^YHZe|&Xl*okpW-Jw5iyEz>oXtB)3$h^uP zcoEp)LWbDcGbr2`o@$Ut+tA7xJtd+mzTU&Jifw4JdbuZh9q1#zLi{Xj+=0cHYZ*Sg3Q62H4iM9hrPgaC|)Ep@?mD50vQ%vb_7gRNv&B z0O84}Trt;L5))=6!HLK4Pl*h4$2^*?<_Z;dhdnERwLpc{p4>0r64bb)5&O_T-h$ZT z%FjaIfG=BxZo)-`bGr9++nlH-buI%acNO?buJREj4R(OK)MGSk+lvyoG#*z*we7wQ~ z+z;wU0?PrH9(BuCgYB%(cNJ9M(32I%9fcS18Wb6*7<*20j53^2erpJQ%VkRUE!Zgx zZwUKDd?(m^Pf9p?dZ0ZWQ$Pa;=h#Q~n4tKlMn~$9r+o6lkzHth?Dm6v6PZ`fl2uK= zZx+VpwTmQWZBL7^JH5#SZsuJW`7a?1zp`a0z zFg53nnFdrPRLo(?>V{TnyQMzhXrx;g-PK*S7*`H5nwB>favJ;9h8;0^ddn0f6^4@)?j5)8JWx zgoGHr>-)ZZR7mO`bn9_&yQ`Taa}GY|83r2Nv%Q`PHE{8*ecR@| zX}|R2^^bq;0I&tgC>7L(tH6T&HNH2cYQWGF&`K-vNGwa1w4FK9Yg@JWyk+D$-DS<~Hi`CkRb9 zCu#!)G-Y61*lc|_%nC5`_<@Uo$-d@C5Lh-RB`ZJ`t=5L%;#=o?2YU&^7!nV zQvZ1?AIxSZORcSdnq@z@NKgy6I73pI5VBp#T*6{p<HSa zTLyY~Nkl`&7IVU@R$YVj=QU=?-q^bPkH**6mVTHM0kx7EmxmjIFb6Z>8edvvJTNDY z)M)aJ9)rL67w{D+ZQ+Pmp?-2_V-@v0n$(1B;nOZrMX4qDavmDpb zQh-EKu$Us?c=pK_Q!sKxMB>B~`_>I0w;t42BN?1-E&&hUO*b=^lF6S{@EwfD9ewHX z9^M%1FR)`7kVsTOIOGR+i%rTMJQj3MvRm<6FmwW;{JE!1D8mw(YEd1pSiIl60S`Cd zP=wXLu+OZ66TxrS&~N`~*-T>Pr#-{H8up>#v$i-i8weFKCMN`_zpA$1Rp)yO_asME zU5^$5{&r5(fZ<%I^_kpgK6gnXu2ZWK>mHj^yv;!z73$1`C8a1v29;@^P0+S~p#5Y0 zam)1=u?b$h707N76aoZU3+|7bwO&31rARA>Rz?|@20hni5$&*_ ziyg^l$g(-TxIRb9_Q{wv$oCCfqP(N7nB$(19n#&Au}Vb@ejvO3VG%>F7GWnUS_5Lk zBY5?`4~jmW!8u{nLvtg*U_KrnoDpV@r zh&NKKWs7gYOwq2oDjlLDksvEC+R*>apPXTc`p1-i*Oj5})VynYK4P?`(a9V2MTx|F zX|C#{T*wJIHiX4JA_5YQ1}`fKorgYmmaSY8$!*-z0?Q|;STevPKMhG0GC%*Sx;cTV zan?^d$ek8lq&AI{)tbr0E?C`zX)g==4E{a8Bk{RaU&$>8g(Dt_{)H8v-7DWDhx-ye zbHM(N`b)(RD!^S%rH4@#i7d3Z-x)}s3qn2Uf}_!ql`n(zVLRP2i(hcND?)X*;dV9_ ztEu-*kLR!)WN+Qp8gQ~LJzV-pj{^W2EA@)r*1FrqyJ^4}LL3^eE*|bFU=}6Wmxj1O zK>;b{;$zvUOM~M<7V9^8Yb0MXdrN}L3I0oAo`9873SZ-;c+*>C!I+otp*k&y3BN&1Rrf%_4L^7Sy{T$>-PZP`zcCrg z8=-8Ae;~cB^aHFs<<0w)$Gy3jLnj6giM^1deOrd*z797Lg@t&=zlOba!=CB2Y4CgQg8cvarJmULU+DFm|y<@$w0paVVmVBaozxH-5cT{$8SJw zem&3}0+JN;XN(Gxd6j_0#2-R`NJs-WoP}Rcnhk3Up#G7d@PG7^5{_R>7cwa8c03Y zh?6lCFnqY!3a_Eq3aTz$d{x5mTfJT4U-K^9PJIFQc>wX1=X(Xv>vZy+YPf=&G1Smp za7m<9xEA0>1`6}vo`Vog>tnafMPv3Cb;yt#(?NM<8BS$Tp%} ziZQU!lth40+bBUlxm!(qTk*k{2j%Llt~$R|z8NCubB}WA9nb3xtaX8lESh`@)of7a z=PQ)K;(v)sh(xxu3*OiDwHk;s5;PTt!Vlf8E(6V1I4X&+>es-2!E4%Fl6$+JlZ2Jn zZREs}g87;j^T&b@8L>(V;aju@Q)R7Y_e{Hyx$IcaZAm>lZM#}%`njr0iDt5)6;)8m zbOj2!)mUM{jj!U@Yy`1o2I}6nv&Vh;XrYi(-L-Tz;{LMg=JzKh^dfBa3;3P2c1rVe zvxyNYBD!PCnW4>)ZeYKT>+^fkmNrZovU=%RJmD}PbL=y4{$h=`EpYC$qbNqQ3`rKr zs{y$tsuV!P6z$=2yb3cH-ZF!_mE~&gS%Yk}<_(ChYEj!wWs3uWC63zmn1J)yw*-d@ z8DHkx{$vESogT3jQ^n^;)x*rNlAGnV)g6CdNLkPK!rmJcUkq@RbTd&q_=8IR^q+AE znIK*$p}!HbthQU28=<5Ely-j7-)O*SET!Hr-xLJuK7Q+uHS3va0wu_>{d0bUFg|zP z_p*YQF@+^ZLrx(i0To8L;Dd_%_!kbR6bi)z3nQwhd^WmqwjH<&g;_SHyQl|X0w~xs z#JyEffa5=+NH4&Ubdq5fo#aB<#fF6Q4nGO%tw8t*bMAA^u45drR*;wsapXCOdxp2< z;5O=I4dtE{gsD2hpXIKc_z2<_Wwl=RXSi3{_7R5_r##_p)ZN95c6It*uY$+1=i+ur zs(4pl17uY8vnWcQXce=Kf4PfG3)1sqIAQfJBmz1VX@lty=-R&l% z>LXHA!mWR6Xaj90VQvz)=GLUeDt(C})4fNuHhk|=Q@kTw6@c$B0!$as!RQG=B3^S& z7d^2(enwhjnH*ouvJ>;izk1Q3SFNnPBzgqf@yS|Q>V^iM1^=cJEysaQH9N0XIvxY6 zZ>UQjW+CT#q@_kojX#&j`e2cu#q2DTkPmYJy$hMEG*SK0umX>nEnMb;dV@Z7&5a%HA|#z{UwTSw#UK;L0vn-x+okhuz)NfpX}QvC&X3 zsILxt@x*u@&YD_uta>8+`S>0b7K3OB3mg9Xl@}B{|TAi8FM7Kk=$Xm6I{b&H>W}gZ1aUEzC`EZm^o(Y-!{I)uM0a4Y; zhq$LGI4-nsI4NwJ_LyY;@79Y$hmSy4?MRUu^_LeT)nS3g#KjlExnP*5Mp^jc!JEsN zC>o+T&9cc!QL8{YWqGoE_Mc(7jQ=P%UL{^W{fUdf-j{&s%#c0=W6YfB-Pe?Ovtl}K`B9ahJhwU*!ALTJp}H$XEaOFbJCU~uNl{uWEcWt$$vf9VhV)tl6Rr;A64fB%HA?s zBx2k$o{{B>TapA6ounIZAC}KH;(&%HGEI`4Z-H-EGfc^~>e#mGR=sMi0-t#>Kl;i| z!+YYdQ^-h-m~)a|=pGL3pM?A`QtJ4{g>%7yItCY!+k>V1(X6~qupkV$X1Ls=&3ze-AQ^G&3>P-8$oS~OQE zFXWR3SDnBtOK(K?(%xn*qZ2RNeIOL{U;9#9bOWjL2%Urv$=!_q#VGTMJL~+Uws!E< z_5fM+Dn!Ioxj#Pj8gTJ7PpaF+V;6c){L)n>B$U6_HAW>4%b z7}*Gl@e6+`(T&gcy=}tzs;Pk2+I~14a>| znZ{pOdQJ1X>u0BN3u(LbFfw8KA$LCpLixZPzsn^f{#)JPq7qQ0YxPJsKcK*X{aRib z3&&=FL3qwnzAl@hpx46kW0z50%vJZO?V`$yuOkfwZ*hAWp6a7Rx}Q{rHX-Fpuq*BP zL>Bh-ZA(17 zXA9QC$nyh$l)WP|tG9R(F%aA$Y0v9R-S>*L<=|wJM&9F({BSG73GEdbZ$? z0|5R9Iv0GZvU$$=K*?gu`qk!`@?`aU!a;OoqLxhR1ZSzf6Ou)k?9>(Fo~trwGE0nh zjw^xB$jUP{wb6c`cVcDaCmv{;FgfbNO$5<8k&=SeNW6Mu7wvjW(nLPY3Mr}NYD%h;B>+Esg7t^>8MDK=S*AGo`-DdYfSA{P7aO= zpKH5au_i-^tWx5hFw>TAk+HSPe~bsilqMu^4Z9~gI3^Bb-F;;xvF*y66cH}Uu{8vS zozVJ1s}b3cjY$eZmZ|ViZu6H>Ivrj;NS#YkW2)nNhMAlEyK+fKO-*19Q&LiTlr8~|3+FgQBrO@UW|mI&wQ3s>e}ph>Q-B1W^siy?ZBMKg zUWzJupW+^sv=XXenC(J_?$>m6Y|OmL|Afq(lg3VDH}+bglDjz`T?1ysr02tanMeeu zhN^&o*?zty1rJHpy74xb=8`K_?|oslU{2YKZd;m-Gtv4@mNHXl3{a#W{ovN707pNp z&Qj;hu8B6AeYI^n#EqRnAdbI9?2b~9Hgx=)zYXHZ*rsqPa?cHrqsnL6N^qVqZE$H; z;psF9`_KIMw~fchKU(>T52&kOEjepqm-IhNf6NcC`Uk4#Riw%Uh<>E?m8|Yi2L*qh z65?@RphNLtpR3NB`}UnzlUz3b3ux(l6g2xhF(WaN^)g)|il>&+HkWhGXT z1NR7rB6*(*JLmIiU!tw{8ZNtf$2$8kbvfr1k0T-Sl(xaQ)Zp=7VE`0Z<@?cxYs z`n_1h`8NB%X_XHdK^ZINaAVTU@Naxll-W)1DLyS}h>o^DL-PemvsY+9!@{ z@>5OauXf{-XxU54A8(mYhPSHnlsIH^7B~lUqrd3l!Q@+vtGJh)Y{#AE&krs(-?9~y zsM*^>un+9GEAqN&?k34o0Ev3fxea@ah7i7GUxP5pFQ_S8kDVLHfP1oQEIOt>yj!hl`SB z&yKrL1uMI2z-cd-qSJts?Z4!|vp0>eRP#`NAHa4NiB1J!%m=~B@gd8t&!_(7_epgF z$rw~x_)z845Ra{>O-Mex)DNT0?hu9xp5m`2z(Q4_F-UP;zIuP9H0?2zE1mHmWUw2J zxiMsKm)L`%XsxdHp?dDGprq`UPwI+WdKDK%@0cA=)HEYOBqHs$6V=UZ$UM%Eu<1v6 zzIVu*Hszzk_$x^@b~*(dZ#Esj2Y5N{vJH`JA>518Yho$89+2M*cwpm;xEMeG|+Hm^V|dk$a*5H(>5@z-nwJgr%6%mDnolz7@G zQeEvPctb&_o9}_8MwT<#401?;pnF|GGYKMLIdN+RqaKZ3#Spx1zF&7+9Is7IP6dCm zud<^-7zxZM;S_Rko520gc|Fw6kS5ArUM|m}oP*DWxb`CG+*;>lm)Wzs8dnY-9WT?M zcLk}zZSpl}=rbw7lQPr{31h?{>SDj_LXDSrn_5(9Z?}hYLR`-EbBDZ&M9o<9Be-XtV`A?TehI)%p%C?*7z9M@#$}b}3xDmc;+qwA z!-oPUt<FYVb5&EQU0o%4=lMEOb9$iuC>q>#I;n(GBN7vhD2cuYExoi0V! zq4+Cb4tuuEl#cIFGQ>$qIN6?&WdP4u3z}|i+8kQLvp?ZLU2g0|5-TMkb7>I0&?woC ztVP%!F>)B%3WQ}{1a@kwd&jargk;s9xN$1OJqgfJIIDRg)KCV?dYFIwJpZ`;q-AA? zh%FX2(SyjR|BYuWwH_IO^*SCKPqkc`Rg)=#@*GHb2dO=@&;*5x@r!W_k@tf}ad$!M zYxK-B*R0TuJeh?@)Ae56=E=W?__d&Wa_}|mz^jVjYYv~H2TS|%zLXI>c75*e9@}M$ z{EGraXI0Ej?nnOrz+|b;3XA82xaujdTzdlUF1RIa&CMQt&qOqSF{JpYCC0g%wmqAg z*-qluKJ6Qxq|Eb=e+UY>{KqmWF55cSv9w@7Fa{MoO*2E@?zl#Q1;5)#F8OU{PcBaM zw2sxud&}4^H%;F&-9Ki_dj9d;o~zNAT=PEvIc?7=g{FZyovW9qt)Jam_f22++kFGt z3=>C}kmB2&*dI}=>mv04?%@jGz?G_`!O6F!?Q z&R)sh;@bM*+q@Sd6)nm2h4sCx3gW9Q!w%f@QBkK-ywqVzV5E8FMHvLnZP_w07I@SA z6L*8+b9|}VhYvTpGzj~X8=ldY5z)XKRwGmuk~R4$v(h9GgB3zK;dCd-oHxCM(TRT) z1HPA`TeZK3;yE257Xw8`-XvZ2WLhIdHtsRl@u{t+G-giIjy`VucjzKA_RhBkG_s0| z8Nd0jq-@oS{&Jmq)o_N3VW+T>0MP!qit=|tWB&Dd^@v z-}5p*L!vfm=LM@9^=F05@3PE~ZcTf)GXg*~&m7reMejR4E$c z%N2nw#c})cMBqz#3BG(0{G|edzCsbgr6QufViDq{5|X}B5z?hHvc7T=@?{E&eMmQ( zUG^2&E0tE9Dr{6uT~nh)b5u)PQ>R6DRPTW1!500|Lk60LEk>ipCYq)#W~1hZH7!~! zN3ETM9>kqGFv3eXmLx7kx`2E|p%s;#(R~ zR(kcC@AZiC(i;`NHzRJ9R#y2|N7R(wzT^8}#NE=`I^X(;hSGbDzV{;@lr}Z{wnRKE zee~G3HKMJw{fTc!L}%&KXTDt#&r7>|e0wAMO8WpmC??1j95u2r3e|@(j{*~_R`tC)58%l}r3enjLY2{F^Za3b$a6(ii z&!>9G?-AdeJyYSUxCHaYFsQ_Tee=BUI9bM>`*&AA0s5YkDugH3-;Y%b26{%_^ziaz zLe#!IlIR|r;3rXjFp-dZMANF1$@>HS4rhfe$whd?p&g5@$*!T^I9U2=THfD%jIT4} z0xdpd&FRiVVbkiP249av9G!zWEY0(Ky{X|`AV&#gDG9eQoy7@MWcS%W6R`L&9WRIihgO*V( z`#!m4PzZ05uYJ;1u46pL{z$UrI1@SzNAtX|1@%-BDoNyy=Zw#^>e!lINK&A1?W@Xh zlG9__65dZ9Y9AjUPb#q0ZCw3xfz(l-WXS~>55NksIZ_?}9@Y>Kvs1_(C{JdM!l)U;QGDm}Jt;=7L+fmSdEKYAY=o(jbm)DZ=P>rF*N^4BdI2 zJrpFb)D1a2i1`leD^Oci7P2oN4b6TNTZSp!VFna~4hmXMxzJ<^s`ELU zEU62L!=MN297-nw@mq#2s;REmQRW+*pz`y`fk@h&)Oib2DA1%Ypfj35Y7?G zuf0?}cmK^Qp}-qz9oN56J^tAjw6Wn(*O*6ORf#V6ACHINQaaHvYx&(t5sRJ=DZA5 z8b(AJlfATUb5_nJ2Uz@un!Y+AF3^h1YWOD2Ix&wtol>aLO5sDMo%R~5xvmHf~}O#%>6}n$HJJ;FjM8TOY&X~ zCc8JuuqOCNg{wVQeWD3r%wDfTZech7))2w!yA<(!nC;;J71(sihRpGNGemg!_vJ#` zpn@3;LJD>JqDo>uD@vZC!M&AWYr4aQ?;gFIg!b_Po_>G~rARmqcJM9543_$|p!HKX zMe666kECtV?6yGoV^!oKun?mBSAJT!8{+h9B(@Ol!YI@y#m>Ct^2}*z>BhI|{IU+{ z#wJ5D_|HTA%&|VphOi+7XVenM`b={04tp}M3DPaIWH|3&gmzcU^J?OtW~iB13IbvE zAs-z9;HC$3ib#A3RZw10H!Pc(%s!lZ_MxBuMZBBj0fEv&}w>^pjoUdq9dgSj!l^WlS>*9~-d>=6GEqd$ULHd}>)&q$oB zcfwvbG&SDi%B|OXP`ljc_1}xSvjZ8Khr)vXSP6#)`8R;LCj2>3y(a35V(n72Hk{K2a-`o;?&M|Oe+Rs1EJ>jtLu|? zs*46mPulOqt|P_}6T&u|anmqOrwu@sbhJvTHjGUXpQkX@eKcQH6 z{`tzw(5ibYZgFJiD(yvoL&kfp3$U+R1Gm@9p3jlj}JF7^o zx)WDJ5i`UN@jP6oVfhxTlT(QWH)Uf+*`uOl&ecCpAU z|Dq)+r=lp>hhb7Hh1fZD#!IKWZ4oR*LZaenqi&G zEi0}(S0l+N$DA*!bmz+x%#`pi=84=I#oKaa$~#c)2*vy6zuF`zx5zVeM8_ipEzdtC z;&>^!HjcVoIU_3_N@N*2l$SY|&NIlC^ve>`_GjpLi-y7m#wIYnJw6F9*of4WusL(; zys#OMQg;|-wm+dxLry zbGD^N*P(!;26%1(ZqlenhbntlxV>kzgHao2wF^yUDoE-k>e5sF@>_QMXI)h?D+iq#(KKp6!F`iy?oz(2F)$$q>G zuRbubKUHLx3bSp)RR zxfX7fS%PqG442eHgcDUjRW2%NvsbY332!I8>`6hOIT^HW4^b$b=?K|VDx9G2n9gY_ zjRU6J!n3cN>egV~nFP1w>pX{1%lY%7V zf#SVrnQT*^a`x{xPjo!9|7~|nozC|^jZNB`YJ?!${t#dsYN%L7_B;XZS26=n8i{q6 zZYB|~K~Go6&Q1y+d(PVp(SUonHvgvz#KrVsW-$A@wfBly61q^OqdB_DO(3G+CFP6J z82dEz-3#i>JW>c5@bLYr=9af^v2e|@R>?82JnKquVD4Qo`#T6^|J<|SkJ+IPS>izd zzvC>{_)Jw_(zJ`lCwxTa%=|dy-OBiwJ-%k+XZq&&=3Mj?7))s_Z1vB9JOUa8Xy$b}Yni2`22;_c}vEN$oMxrt2%(?FjCQU6=eOXLELTPSfuO&&E9!>(veA zSs|Z4%2Prr9+ZE|A>4bTSil&69Qtbmb;u2x5X+Tj>HaB)#*2Jj36afI?-~o^Hc~1( znx*h#a|qf}FY~1i7G^XK)(wSF5ege~&$TJA8SN9&91IVyA(bTi{QU+jgZx{dZc;|1 zUcqS$ok(fmW006%ecG4nuS*7@y6&tj!k;b9#JQjGpCfW$gJ;eH5V@|Yz7~o}d=Ex6 z28v7Iu)mW$8$@9uZh=0CxRjUhH-tD?Bp$kT2DGsKA+jQ*FF@hLyeaS#IgsD6x{Kuc zF?g_($CK-uOy9HbUuuQ=m3A3J(Q}`t%CKD9>KaT;81g?@<;P_pcw^ zK`5#Qw+d38Qg~ot+3!AD2I(F+&!L>OvtZ6axngfw7`B@J%H(hmg*ZfgyFx`J#nT$v z+`Mv85x6xgcvMWK`vep z0ty)h_$~hNWt57bW&B117@c+Uy!GJ6B#{q!SzozLa&0_c6WTD}9c&g!u|rvx{%+&r z2v*j+1{Wm&jbsE{8BqIg^}oegL~o3I=)JIW`EBjOdAkPr7WoeOfb8vI zOkALc{p7sYZ}i=9<1GFi+;$Td@d*DLnR*0wza*DOx|fEzTfdZ7hpzMQ zuBpsfi!nIW7-owBmopgwsLpAP-u&O*sF~#~IM=By0v8XoAyQ8*&C2akf&N=a{Y|wq z$xtuF9L-0q+6F66On^+TYfCGDVoQqGM!KKcwZ%-t*yBuOzJSkR-5KC zXN8L7k|#Dbf_N~tbWrU6;AXwPnpsAQ80{C5S2VDIsv#Vk?HCz+8b^S2A(|iu%ZrX7 zoSOIg5gFnpvV}HrfO*lhVke?j`2(d-Zl%2$u2$)XfkHTkrg{7Qe%B-OAe959I=wQE z`Cbm60}qvZ%fxNJiGF>tHN!pd*zwK@=}v@ipc8J&+h(>TT^g3*K>J)g zhKu~sF(?&yyhKb@Xu9$`Q*&&;1+NV~Ue3d& zpZ}J#^lB9#Bv%lbJSnuQ7uuR4A1UH83d?E4MS^gtA>G7s6)6wq>_(u| z_{m6JeC^3^J3jVX=LHhzeYrs#dqZ38aq8 za(OC4xKN>i8lfd0!Zi^Qt>XppH%}J3?fRpr7^p71kpI0%V_reg2%S5)D`2n!J+o9#hNwjxZMi%1>7K1?HnNx%%b#%YB-8PT5uf zV9LeoIlSQU<})WC)n`P+JIj72Y3*5Ly_>s6r32>~ot1e{!uN^E`2t!p|K`Z~I<(R_ zeyuHYG0Q}>y)H*m;tiZ=U5`K0z9SbiItO**$xCy~rw!fvJ&nYH$(|?9W0v3?>|+z0 zEHbGC-l#8CyAM9PJntN{dns8=NgmJ|pWFwfNu^wuDAE##%RhwnE{PmRA;Hjyx0W^k z#!oC!Wx^1H155w8gXiG7-Gh0_;2+)myc9ld?V{p(?X9ZiYcj#qxUFi8POIIxhKCV@ zOVH0;%c-Kk~Gu(xzg^g1hI?s(UqRVN&Bh z1jUxhM^%DJV3NJ&?icn1te8*CxK~+kpm5Clw@BT5bkdN(d~so~7Qya4m}D7~sjL#_ zs2=hTS~X^qJV%Fpv|I$Z;)N#7ZbJeID_JgV+Bss4ibxVE^(6MPgl4d^Y{)RnL4Fz} zQ~J|XLRqdd{j98`EZT19${=n`x7CyjP=*t1j1Rr!YZ_liT(8xzX?jRT6vq~zRr8Fh zFs@yk8TK>`qVXZt`0<$Xp6yC-&A<;>QK+_^w4+`WrsH-y(9~#$_s{^3Nlh2p{>v_& ztmC@m7#Z34GG9x0*H#Qg4E~aVap_VvMP`WgYQ;!=JftZnL2?mTJy2VAX0Gtd6qua& zoVC5irtE}>2cP@HW<~5IiTID1cR%fN!_CZdqha-1uOYGt$NAf}^(|?~;|2%sbQ#4W zI%l^G&mj33cFsP)sCBI0}gqsUg77j|RxIgMRKxg53?r&VK0 zb?2Kz@st)Q`F!L)VKRvqm-~)Nhh>;U5D5|qC$@pP9rnsU;t~>q>Ok%E>wXMc!mK3j zoCAV{(4TU{ErrG0tvy zKt)#|SDh-nO8g|KG*;P>r3a(_G+oyY;HkZgj2lW4FYEj^KI6s0&1xpJOz(Z74uYJ8 zeBlN5dreOhNmnDg_bR`GzykZw&3NQdJ)pk*yVaVb3+VuUTG2rLqEN4vF8BQCH4PpA z=PTU{D5ukJyXUu`d95P2S|hm19|d^6SHsLr#e(d(Sy(ot{1AJKq2(hd17XU==APW@6hZpf|!L`bqU=22w=Ul6EgrV}0SY)Vz(~972J3#>OfRAu!r$V-JzV`Gu0Yam`a*sX?S*YX zC$9p+z2=;(>uWGOuU)z{s~ZETSWsX{JJ0sZv^iLA$tTXJeu3X{DYYA}ZgrG`;P+By z&g23yLxPtXOt#1E`B}0n`x#`-Oe<*tzW#oS3!cK&=rgFl5t^hR0$*dq%^VduBrsb+ zVW&Q~wIWY(evx$6*;!DM>>rb!xa>DGL9(c&HPs|n>&)Z^yO5*R1i%Lp%uM2fwHuiQ zLxlIqeNE#)S{!HGOl>BKz^5xadD6F9p)ALeqMu6&^_uK!R>48uczp%-%V$XcO0%^42u-BtUgPb8VU-C0fPsl>DO`vlsc?Rw?-1K^nkk|P06M_ABPc%W7AEGe0#~;B;UM8v6 zh#tN|=oOZ?Jwftmsh0XfFq~#_VtBj@Aj7tIFf-g6>KFimJMDZL$(hKPDbl?F7CJOg z_+Z!NPuzYypl0|*(0FJ7h(R0 zm=pa+4hpu}bKY@0XE}jQTFFcj$TEg;Ap=v*x5m(!JWu2e-?O0)CR=-nt9P7&#somi z=;AdQkRT+T8_gIHtX`IT?`oaAJH$Q+0!7bUXvB?N>TuwIvVxQ#+R1wruf4%NLNSbE z!_I;8kmKv;U|?_bJXH2NZxLaB(f>qzJ4sml+2~6TO)yG+zEbn6^?WevR@6lXBcj;Z z=HYro-$3%`e2I5z#B=Kl-$E}2udcJj_9%l1I9;)rMP=Dx7nWEQgJCpo)qe?yYYR8D z<8-(Mnm6Jw!vX8LtE}-;Hy;{<-TyW^PYIgZgO3SgFV`Pe398<)e0Af(DawXANDb>l zydIW}7eTd#z6miY9?IX!JW&)RIB8Kh9v8ss_^Vxky)71W^ddyL5sqkC4bam4 zzRyauq}3%a$q8IZ7|{HxTP+fj?a^1f3At{o3`?@J-3}){SN#zKrxf*xWV-Ads7BC#}B(ZAKwXh#M5WtlqzS zXJ0NZshvRhdvF7d5G?_ujWl+8=xb@>o|G06*S{xy*w9Sg^|3opn>!cFdayg^M_B-1 z$flKOWZP!GEQ>Oi`Mkzpyz7+GHL#e`T7v8*2U% z%m{W%sIt3UW;0tCWa24xlt|h8gErV$rRLBDL&^gdbQtMHTiD5vwnPwt_#j|tZ=p;o!l z{6~^EHYuEE>fE(A{=0GeMzuftUGhnO7`EM!MAtl%it2^ZRNH2Q(jwWJiobskL#HdM z2J21V0ag7e$n~mT-9UjraNOdp@cbNY5pCYfVZouTkC762>L3O;yfVBzyfnl5y`sQc z$b&LW8kM*oo5P&`?1g6zuAx@AVS?EWtm0`sS;S*7!r2jXP@9_}XH~anv*sG{!a_sO zCfr-aE<78M@_4);n%S15sy(TW6S2Ux7XXMt5B)vuU&@=vB`p!GizW^|nS@qllBa8$ zt3N2uRF3g}jG066B@4xX6h*8hDN=aG+U;km##?&8^b5LX>^j!02<3!!L>~vd>4WeM z0dQAfL|{hXErsjfs*k`HEMmBHa%@y2#fZw}jgz8&oY~JbBi?ntg*-pqMDGRYAGe-6 zTe5_q%brpOD8VC|t*bDReu)2nzUytHXK@@5$Hpz;R>;P#HmMkM_H){V#s>B04+7^0 z|7rfYn6YMD{$XZ^vn3Y*-NpZ3?bgxk{rl|5Tw)T{d_xrVL5m{(N->C ziv@-;Fgh4W;4d#S@6Sr=xE?}jiJ5a#mcKQfo)@WZh(7`HaY1LF>kunnB1%FAuUQa{ zri5a$SjmYDdH#{Li(!15l_fD_|E+>ywt0uScC9)Gif{TP({F|V8??MA^sJ21&E^>1 zXfoP^uTQJYHtD2Oe$C9`Qbj9O8n(=KbIH=%xlfOAaZfk)^{*e_1>Xd6C&-hSZ&otousFvo<1$JM+s%)SkJp5iLT|1rLKt}pC4Y! z9s^k^jSrX^xG4!}wGs9~!BJPmPrI?oNT~@Iamw>19Z7zm-f#e&D+ z1P`WN7L#-bu_5$8;4$sv)1D67b-t1bjH1Qz#ZV7>R~kFH6Kkq!DwY-^mehqu>qet6 z_UE;hw?q{04t?UofBJt5zKbNBM|W9_^v22iEjZ zLQTLK$a+z5kPgDq%sO7_%tCPR8Dp|&Jjd!7pZ%di@xIrs6Y-Jc;UqJ$V8%$)ff(sO zL7ysPz=)TFF-a1SWm4_i@siQYr*9@7PkWdGq(0{)kZ9BT#wo3WabZ#S%|k4H$`U10 z#YTaZ8@BY13-r=>0G${lE3JQ;pJ&ZAC>vO|3Horc+1awNAS&Hi91Q9a%^<8t01JFU zWYMV6CQ>yx_p&t#%(IL)skippfVTn3UUeT$I;s99R{&9Xj^wEYMHu zaU9xG91lm6xe4C(_R!A@LBk2g!%Ezs66_qC<$CH}GeilBHL z`A-zrz<~TjSm{^OC4uDUL$%OjGCiVP$J8mIuk1xJLR04cjl4`m7J_1t2Ze|(Fn^H> z44sluyaTK`aZRoPA)bl94&s}v2m!$ZT0TOlE&`65NQJW5bN-urw^~`iH>-z?%YkRE zGGfdg`Xgm8GVA>F`EK;F5A_5s|9IVS@s-n*s4{5Syr4G%qWqyoS|7wtApBfIsL<5dAXn z^u|JvXo_@66oF>m=$loYm%cOabrW$P^z6>dpn7ES-@RYUjN+A@NhF+#chfRgA$9KzkmZlbfgwIG(w?66sffW4 zF$dEA>{&u}k60K1Hxp244hNG^^e`(3J!TWih?=xozHK3=SEeJ|dRQ`9{0o`;tmLLQ zCAB@$iMQv2clO!EA#ap}<$9wxa`B3{@w7^|w`}f<9)vREtckC;?yH`yjH}AJnH$&X z+(ou`uY*u0$kSC?PjPQ(TBk;Fo|w~sa>de%4IETlJ*OWCC$!EJ1-re3I-dRY68C*1 zFOmI-o+WFF?&O!;JrT&ADe*zUCybi5-&zn$#hoWV@VcSWE|Zd{&?=W&xOSB!B-f(ypz1XU!_AmtyiN=L(}V?)to5T zG4|BtSGc2d&$G|SAi9hBW3s_W$Wu36L^PWZI`Y>;Q>>fH_vNGrIM2&wS#y#rBhCgr z^HAh`nU5ckuxO-ta1_q5;;+u9f*ua>R_D{_QvtPuF3eLNjN$YxmS%({b;I7{qqMmP zce>m%Yx}q!UWgQ$E?;W6|Dagy$l7OxQgHzDf>u1lprJziKllY ze@o@2Q%3~cynkMDrN)2LqCEbWVA9S7)Mc+{CvcN*B*U{P-~T%Gpl>{ghx7b!fmL+V zikH9nof)Iw%)}e_DLQ^mFEDI|^^_)4uY@vOdF8{n#8NF>b+1_HxiUJbnBzDk5i*Gwmd5iYy(k->Q@Vjr^JEg-@9HV7?2pAL`g(`x}QAk8oPU<#T>Fd*V|eWN+Y78Vs!Iiw5n@gbk-e3A!G%xr?&2-mW4l1M zi>6%3q${kG8S2tqf#>f9LL;)d$9Ldyv+)#f@hVf_NHR=m{MwS(Ei6(cMSL_ed`!^g+fz+-nA5O z=0IGCPd=?N{aB}<G_)rX!X*_V0H|(E}us_&vR9L&!X11P=^Qx@R9f~wIuo^72d)XrP--Ppo z)3D1?(b!uh?CV}Yk64S2|AeI7G7IU*RK5r!-pMvX751}voW52%^+t$pztWzz>2czY z&rhY?_w=oDT*X9U-14tHYIk9<=vo3wNCk$^65_=n>8T&ZQ~ zdrlH{!(YYGXxXFa<7d+D9>GmC=}H8J`Ip@K0~|RokpvVTaWSGqzn$CP$|n9tx+Q}C zzo-^R_7^pzVp8RpY9Q$VJ4E8_H@~ym@DSUe2a@qt9p=9rhb6vj#4B1&zk27`D;r0@2o>6p8fqLTQ<|U$3f|;m{sO*okRMg?-xpeg!sfSz{b*GL+Z86Z8B&tBzo7m6DuQf*8W2$MmQa3V|q$O5INaT zLmyFlYHIJwWrsm^_9)qh9MoNR`He+l;tMoTSAKvgBxxH}#FZYgs^uTVYEuhXd

b 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 delta 59727 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 E0d6kvjsO4v diff --git a/test.exe b/test.exe index ba00aa39d5edb4c9220c7758b4f70229aca179bc..81a42db9789bf379c4e1825291816a21a3571b4e 100755 GIT binary patch delta 28690 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 B8~OkM delta 28689 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 BPE-H@ diff --git a/tesuto.exe b/tesuto.exe index 8e9cad2c76727ec0b778c02dd77d09fc0896e8c5..6dbf027edf2117d3a5a54f2fd40b88760076686f 100755 GIT binary patch literal 19486 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�T*I{zzV8d_EjJJQgkFVI3n0kNY1f!qLhc zfXzR_>qR(PY>Q)Hibbq{ScIcxwD^o*I=&nZEgp+j&El*#9p5Cv(cer);Y5Kk$$-9L z!37a6s)GUgtNnlAJw3yVITxy-me6Vya=`nch*Q*YC`ojQIqO86XaNa88oWnDoM;SA zUE?F4lBOgrg;zc=XW`obH`i69!fmcr03b0f6oXrY^B2XAzE8 zRsamcTOIl|J#&aTe-&|}<&t>q(fkRg*rrg#iPk^j>IMBNzTDvtEIJ+GT8Q9f;dcfm zzs;h9`+t06LX^tT%t$0)6v9?QIqVD!Mg=FWL{w4Kk)A80ZH8uGR>-3&V23USQ!nC{!T$^u$&H0a;4w@v{+!5-WWZmvvM1gt zED8gj2T#1x&|l4tvr-}>S=6M7H##LstVjF}5i*M!LuFAJQK&3C4jzrc%@|nc=`Xen JKXqX`|3A2m5vl+H literal 8612 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 V>$;W=xjtg7bM-T*t`}{D{4aj5)t&$V -- 2.39.2