From 7e5115774a8978fd85ac90c2c3c072b2b6a31d0e Mon Sep 17 00:00:00 2001 From: sparky4 Date: Thu, 16 Jul 2015 09:33:33 -0500 Subject: [PATCH] removed modex library because of copyrights new file: 16/lib/x.zip deleted: 16/lib/x/DEFAULT.FNT deleted: 16/lib/x/MAKEFILE deleted: 16/lib/x/MODEX.BAK deleted: 16/lib/x/MODEX.DEF deleted: 16/lib/x/MODEX.H deleted: 16/lib/x/MODEX.LBR deleted: 16/lib/x/MODEX.LIB deleted: 16/lib/x/MODEX.PAS deleted: 16/lib/x/MXBB.ASM deleted: 16/lib/x/MXCC.ASM deleted: 16/lib/x/MXCG.ASM deleted: 16/lib/x/MXCL.ASM deleted: 16/lib/x/MXCR.ASM deleted: 16/lib/x/MXEL.ASM deleted: 16/lib/x/MXFB.ASM deleted: 16/lib/x/MXFP.ASM deleted: 16/lib/x/MXGC.ASM deleted: 16/lib/x/MXGI.ASM deleted: 16/lib/x/MXGM.ASM deleted: 16/lib/x/MXGP.ASM deleted: 16/lib/x/MXGV.ASM deleted: 16/lib/x/MXHL.ASM deleted: 16/lib/x/MXIT.ASM deleted: 16/lib/x/MXLL.ASM deleted: 16/lib/x/MXLN.ASM deleted: 16/lib/x/MXOT.ASM deleted: 16/lib/x/MXPB.ASM deleted: 16/lib/x/MXPF.ASM deleted: 16/lib/x/MXPG.ASM deleted: 16/lib/x/MXPI.ASM deleted: 16/lib/x/MXPN.ASM deleted: 16/lib/x/MXPP.ASM deleted: 16/lib/x/MXRA.ASM deleted: 16/lib/x/MXRP.ASM deleted: 16/lib/x/MXSA.ASM deleted: 16/lib/x/MXSC.ASM deleted: 16/lib/x/MXSI.ASM deleted: 16/lib/x/MXSL.ASM deleted: 16/lib/x/MXSM.ASM deleted: 16/lib/x/MXSP.ASM deleted: 16/lib/x/MXSS.ASM deleted: 16/lib/x/MXTL.ASM deleted: 16/lib/x/MXVS.ASM deleted: 16/lib/x/MXWD.ASM deleted: 16/lib/x/MXWM.ASM deleted: 16/lib/x/MXWP.ASM deleted: 16/lib/x/MXWR.ASM deleted: 16/lib/x/readme.txt --- 16/lib/x.zip | Bin 0 -> 81620 bytes 16/lib/x/DEFAULT.FNT | 260 ----------------- 16/lib/x/MAKEFILE | 81 ------ 16/lib/x/MODEX.BAK | Bin 25600 -> 0 bytes 16/lib/x/MODEX.DEF | 163 ----------- 16/lib/x/MODEX.H | 153 ---------- 16/lib/x/MODEX.LBR | 39 --- 16/lib/x/MODEX.LIB | Bin 25600 -> 0 bytes 16/lib/x/MODEX.PAS | 194 ------------- 16/lib/x/MXBB.ASM | 278 ------------------- 16/lib/x/MXCC.ASM | 644 ------------------------------------------- 16/lib/x/MXCG.ASM | 69 ----- 16/lib/x/MXCL.ASM | 151 ---------- 16/lib/x/MXCR.ASM | 380 ------------------------- 16/lib/x/MXEL.ASM | 167 ----------- 16/lib/x/MXFB.ASM | 194 ------------- 16/lib/x/MXFP.ASM | 326 ---------------------- 16/lib/x/MXGC.ASM | 54 ---- 16/lib/x/MXGI.ASM | 132 --------- 16/lib/x/MXGM.ASM | 63 ----- 16/lib/x/MXGP.ASM | 56 ---- 16/lib/x/MXGV.ASM | 25 -- 16/lib/x/MXHL.ASM | 76 ----- 16/lib/x/MXIT.ASM | 98 ------- 16/lib/x/MXLL.ASM | 82 ------ 16/lib/x/MXLN.ASM | 414 ---------------------------- 16/lib/x/MXOT.ASM | 330 ---------------------- 16/lib/x/MXPB.ASM | 22 -- 16/lib/x/MXPF.ASM | 420 ---------------------------- 16/lib/x/MXPG.ASM | 589 --------------------------------------- 16/lib/x/MXPI.ASM | 267 ------------------ 16/lib/x/MXPN.ASM | 60 ---- 16/lib/x/MXPP.ASM | 121 -------- 16/lib/x/MXRA.ASM | 37 --- 16/lib/x/MXRP.ASM | 101 ------- 16/lib/x/MXSA.ASM | 44 --- 16/lib/x/MXSC.ASM | 50 ---- 16/lib/x/MXSI.ASM | 317 --------------------- 16/lib/x/MXSL.ASM | 62 ----- 16/lib/x/MXSM.ASM | 508 ---------------------------------- 16/lib/x/MXSP.ASM | 57 ---- 16/lib/x/MXSS.ASM | 72 ----- 16/lib/x/MXTL.ASM | 169 ------------ 16/lib/x/MXVS.ASM | 110 -------- 16/lib/x/MXWD.ASM | 28 -- 16/lib/x/MXWM.ASM | 39 --- 16/lib/x/MXWP.ASM | 62 ----- 16/lib/x/MXWR.ASM | 28 -- 16/lib/x/readme.txt | 8 - 49 files changed, 7600 deletions(-) create mode 100644 16/lib/x.zip delete mode 100644 16/lib/x/DEFAULT.FNT delete mode 100644 16/lib/x/MAKEFILE delete mode 100644 16/lib/x/MODEX.BAK delete mode 100644 16/lib/x/MODEX.DEF delete mode 100644 16/lib/x/MODEX.H delete mode 100644 16/lib/x/MODEX.LBR delete mode 100644 16/lib/x/MODEX.LIB delete mode 100644 16/lib/x/MODEX.PAS delete mode 100644 16/lib/x/MXBB.ASM delete mode 100644 16/lib/x/MXCC.ASM delete mode 100644 16/lib/x/MXCG.ASM delete mode 100644 16/lib/x/MXCL.ASM delete mode 100644 16/lib/x/MXCR.ASM delete mode 100644 16/lib/x/MXEL.ASM delete mode 100644 16/lib/x/MXFB.ASM delete mode 100644 16/lib/x/MXFP.ASM delete mode 100644 16/lib/x/MXGC.ASM delete mode 100644 16/lib/x/MXGI.ASM delete mode 100644 16/lib/x/MXGM.ASM delete mode 100644 16/lib/x/MXGP.ASM delete mode 100644 16/lib/x/MXGV.ASM delete mode 100644 16/lib/x/MXHL.ASM delete mode 100644 16/lib/x/MXIT.ASM delete mode 100644 16/lib/x/MXLL.ASM delete mode 100644 16/lib/x/MXLN.ASM delete mode 100644 16/lib/x/MXOT.ASM delete mode 100644 16/lib/x/MXPB.ASM delete mode 100644 16/lib/x/MXPF.ASM delete mode 100644 16/lib/x/MXPG.ASM delete mode 100644 16/lib/x/MXPI.ASM delete mode 100644 16/lib/x/MXPN.ASM delete mode 100644 16/lib/x/MXPP.ASM delete mode 100644 16/lib/x/MXRA.ASM delete mode 100644 16/lib/x/MXRP.ASM delete mode 100644 16/lib/x/MXSA.ASM delete mode 100644 16/lib/x/MXSC.ASM delete mode 100644 16/lib/x/MXSI.ASM delete mode 100644 16/lib/x/MXSL.ASM delete mode 100644 16/lib/x/MXSM.ASM delete mode 100644 16/lib/x/MXSP.ASM delete mode 100644 16/lib/x/MXSS.ASM delete mode 100644 16/lib/x/MXTL.ASM delete mode 100644 16/lib/x/MXVS.ASM delete mode 100644 16/lib/x/MXWD.ASM delete mode 100644 16/lib/x/MXWM.ASM delete mode 100644 16/lib/x/MXWP.ASM delete mode 100644 16/lib/x/MXWR.ASM delete mode 100644 16/lib/x/readme.txt diff --git a/16/lib/x.zip b/16/lib/x.zip new file mode 100644 index 0000000000000000000000000000000000000000..5df7472a647572ad74f53f3964a0e3126276f107 GIT binary patch literal 81620 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 - 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/lib/x/MAKEFILE b/16/lib/x/MAKEFILE deleted file mode 100644 index d3ad8b71..00000000 --- a/16/lib/x/MAKEFILE +++ /dev/null @@ -1,81 +0,0 @@ -# -# 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/lib/x/MODEX.BAK b/16/lib/x/MODEX.BAK deleted file mode 100644 index 560a1c68304c56844f41325820f296a21192ac4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25600 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 diff --git a/16/lib/x/MODEX.DEF b/16/lib/x/MODEX.DEF deleted file mode 100644 index 45bd900f..00000000 --- a/16/lib/x/MODEX.DEF +++ /dev/null @@ -1,163 +0,0 @@ -;------------------------------------------------------------ -; -; 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/lib/x/MODEX.H b/16/lib/x/MODEX.H deleted file mode 100644 index 2c1f1ebe..00000000 --- a/16/lib/x/MODEX.H +++ /dev/null @@ -1,153 +0,0 @@ -/* - 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/lib/x/MODEX.LBR b/16/lib/x/MODEX.LBR deleted file mode 100644 index 93fc7801..00000000 --- a/16/lib/x/MODEX.LBR +++ /dev/null @@ -1,39 +0,0 @@ -+-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/lib/x/MODEX.LIB b/16/lib/x/MODEX.LIB deleted file mode 100644 index 560a1c68304c56844f41325820f296a21192ac4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25600 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 diff --git a/16/lib/x/MODEX.PAS b/16/lib/x/MODEX.PAS deleted file mode 100644 index 7d9d26ed..00000000 --- a/16/lib/x/MODEX.PAS +++ /dev/null @@ -1,194 +0,0 @@ -(* - 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/lib/x/MXBB.ASM b/16/lib/x/MXBB.ASM deleted file mode 100644 index ac6668ce..00000000 --- a/16/lib/x/MXBB.ASM +++ /dev/null @@ -1,278 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXCC.ASM b/16/lib/x/MXCC.ASM deleted file mode 100644 index 4f78adb9..00000000 --- a/16/lib/x/MXCC.ASM +++ /dev/null @@ -1,644 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXCG.ASM b/16/lib/x/MXCG.ASM deleted file mode 100644 index 42163d7a..00000000 --- a/16/lib/x/MXCG.ASM +++ /dev/null @@ -1,69 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXCL.ASM b/16/lib/x/MXCL.ASM deleted file mode 100644 index aaa0bac3..00000000 --- a/16/lib/x/MXCL.ASM +++ /dev/null @@ -1,151 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXCR.ASM b/16/lib/x/MXCR.ASM deleted file mode 100644 index ca1fa7bb..00000000 --- a/16/lib/x/MXCR.ASM +++ /dev/null @@ -1,380 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXEL.ASM b/16/lib/x/MXEL.ASM deleted file mode 100644 index 2c9dda2a..00000000 --- a/16/lib/x/MXEL.ASM +++ /dev/null @@ -1,167 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXFB.ASM b/16/lib/x/MXFB.ASM deleted file mode 100644 index 41ea5deb..00000000 --- a/16/lib/x/MXFB.ASM +++ /dev/null @@ -1,194 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXFP.ASM b/16/lib/x/MXFP.ASM deleted file mode 100644 index 8eea25be..00000000 --- a/16/lib/x/MXFP.ASM +++ /dev/null @@ -1,326 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXGC.ASM b/16/lib/x/MXGC.ASM deleted file mode 100644 index 85edf7a6..00000000 --- a/16/lib/x/MXGC.ASM +++ /dev/null @@ -1,54 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXGI.ASM b/16/lib/x/MXGI.ASM deleted file mode 100644 index 7037d411..00000000 --- a/16/lib/x/MXGI.ASM +++ /dev/null @@ -1,132 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXGM.ASM b/16/lib/x/MXGM.ASM deleted file mode 100644 index a67476a0..00000000 --- a/16/lib/x/MXGM.ASM +++ /dev/null @@ -1,63 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXGP.ASM b/16/lib/x/MXGP.ASM deleted file mode 100644 index 6c143173..00000000 --- a/16/lib/x/MXGP.ASM +++ /dev/null @@ -1,56 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXGV.ASM b/16/lib/x/MXGV.ASM deleted file mode 100644 index 2a54b1d0..00000000 --- a/16/lib/x/MXGV.ASM +++ /dev/null @@ -1,25 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXHL.ASM b/16/lib/x/MXHL.ASM deleted file mode 100644 index 049a0566..00000000 --- a/16/lib/x/MXHL.ASM +++ /dev/null @@ -1,76 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXIT.ASM b/16/lib/x/MXIT.ASM deleted file mode 100644 index c0d9cedd..00000000 --- a/16/lib/x/MXIT.ASM +++ /dev/null @@ -1,98 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXLL.ASM b/16/lib/x/MXLL.ASM deleted file mode 100644 index 34fec043..00000000 --- a/16/lib/x/MXLL.ASM +++ /dev/null @@ -1,82 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXLN.ASM b/16/lib/x/MXLN.ASM deleted file mode 100644 index fbc4ab94..00000000 --- a/16/lib/x/MXLN.ASM +++ /dev/null @@ -1,414 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXOT.ASM b/16/lib/x/MXOT.ASM deleted file mode 100644 index 62547665..00000000 --- a/16/lib/x/MXOT.ASM +++ /dev/null @@ -1,330 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXPB.ASM b/16/lib/x/MXPB.ASM deleted file mode 100644 index 8c6aa449..00000000 --- a/16/lib/x/MXPB.ASM +++ /dev/null @@ -1,22 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXPF.ASM b/16/lib/x/MXPF.ASM deleted file mode 100644 index db0da898..00000000 --- a/16/lib/x/MXPF.ASM +++ /dev/null @@ -1,420 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXPG.ASM b/16/lib/x/MXPG.ASM deleted file mode 100644 index caa7cf1b..00000000 --- a/16/lib/x/MXPG.ASM +++ /dev/null @@ -1,589 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXPI.ASM b/16/lib/x/MXPI.ASM deleted file mode 100644 index 9e8525f5..00000000 --- a/16/lib/x/MXPI.ASM +++ /dev/null @@ -1,267 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXPN.ASM b/16/lib/x/MXPN.ASM deleted file mode 100644 index eaaf61b4..00000000 --- a/16/lib/x/MXPN.ASM +++ /dev/null @@ -1,60 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXPP.ASM b/16/lib/x/MXPP.ASM deleted file mode 100644 index fc1755a3..00000000 --- a/16/lib/x/MXPP.ASM +++ /dev/null @@ -1,121 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXRA.ASM b/16/lib/x/MXRA.ASM deleted file mode 100644 index dd8e6839..00000000 --- a/16/lib/x/MXRA.ASM +++ /dev/null @@ -1,37 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXRP.ASM b/16/lib/x/MXRP.ASM deleted file mode 100644 index de820c16..00000000 --- a/16/lib/x/MXRP.ASM +++ /dev/null @@ -1,101 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXSA.ASM b/16/lib/x/MXSA.ASM deleted file mode 100644 index 3ebae67d..00000000 --- a/16/lib/x/MXSA.ASM +++ /dev/null @@ -1,44 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXSC.ASM b/16/lib/x/MXSC.ASM deleted file mode 100644 index bcae45e6..00000000 --- a/16/lib/x/MXSC.ASM +++ /dev/null @@ -1,50 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXSI.ASM b/16/lib/x/MXSI.ASM deleted file mode 100644 index b88d3b11..00000000 --- a/16/lib/x/MXSI.ASM +++ /dev/null @@ -1,317 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXSL.ASM b/16/lib/x/MXSL.ASM deleted file mode 100644 index d7908855..00000000 --- a/16/lib/x/MXSL.ASM +++ /dev/null @@ -1,62 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXSM.ASM b/16/lib/x/MXSM.ASM deleted file mode 100644 index 183fba1e..00000000 --- a/16/lib/x/MXSM.ASM +++ /dev/null @@ -1,508 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXSP.ASM b/16/lib/x/MXSP.ASM deleted file mode 100644 index 1d08e711..00000000 --- a/16/lib/x/MXSP.ASM +++ /dev/null @@ -1,57 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXSS.ASM b/16/lib/x/MXSS.ASM deleted file mode 100644 index 97df7366..00000000 --- a/16/lib/x/MXSS.ASM +++ /dev/null @@ -1,72 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXTL.ASM b/16/lib/x/MXTL.ASM deleted file mode 100644 index 69900c88..00000000 --- a/16/lib/x/MXTL.ASM +++ /dev/null @@ -1,169 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXVS.ASM b/16/lib/x/MXVS.ASM deleted file mode 100644 index 992eabab..00000000 --- a/16/lib/x/MXVS.ASM +++ /dev/null @@ -1,110 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXWD.ASM b/16/lib/x/MXWD.ASM deleted file mode 100644 index de55208f..00000000 --- a/16/lib/x/MXWD.ASM +++ /dev/null @@ -1,28 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXWM.ASM b/16/lib/x/MXWM.ASM deleted file mode 100644 index 06158859..00000000 --- a/16/lib/x/MXWM.ASM +++ /dev/null @@ -1,39 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXWP.ASM b/16/lib/x/MXWP.ASM deleted file mode 100644 index 19ca99d0..00000000 --- a/16/lib/x/MXWP.ASM +++ /dev/null @@ -1,62 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/MXWR.ASM b/16/lib/x/MXWR.ASM deleted file mode 100644 index bd29fe59..00000000 --- a/16/lib/x/MXWR.ASM +++ /dev/null @@ -1,28 +0,0 @@ -;----------------------------------------------------------- -; -; 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/lib/x/readme.txt b/16/lib/x/readme.txt deleted file mode 100644 index 306e8b9a..00000000 --- a/16/lib/x/readme.txt +++ /dev/null @@ -1,8 +0,0 @@ -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. - - -- 2.39.5