36 Commits

Author SHA1 Message Date
alanh
747e6ee3df commit FreeBSD version of glide3 to new branch 2001-05-31 19:05:53 +00:00
alanh
5653005997 default to ev5 for alpha platforms 2001-04-22 22:15:51 +00:00
alanh
cbe7c38855 set FX_GLIDE_SWAPINTERVAL to 0 by default 2001-03-05 15:04:08 +00:00
alanh
d58fb3563c turn on some compiler optimizations for alpha 2000-11-27 22:06:25 +00:00
alanh
6eb73cf6c1 Add new grStippleMode and grStipplePattern functions for Voodoo3 and Voodoo5. 2000-11-24 18:38:46 +00:00
alanh
77a9dd13d3 cast &ADY and &DX to int* instead of long* 2000-11-20 16:30:11 +00:00
alanh
3093a8a5f4 update new grLfbReadRegion for 64bit. 2000-11-20 16:17:54 +00:00
alanh
95b6aa00da hopefully bring everything in line now. 2000-11-18 16:00:38 +00:00
alanh
c025951e50 merge trunk into 64bit branch. 2000-11-18 14:37:45 +00:00
alanh
5345122667 merge in trunk. 2000-11-18 14:22:26 +00:00
alanh
4e5ad8319b sync with trunk 2000-11-17 15:29:09 +00:00
alanh
ef07fcc06b *** empty log message *** 2000-11-17 11:29:53 +00:00
alanh
9bcd91c23a fix a typo 2000-11-16 20:25:59 +00:00
alanh
21130b308d fix a regression problem from the import of the trunk. 2000-11-16 20:22:57 +00:00
alanh
7816b80116 merge trunk into 64bit branch. 2000-11-16 20:03:20 +00:00
alanh
985b19361e merge trunk onto 64bit branch. 2000-11-16 20:00:53 +00:00
alanh
2de5d67c15 merge trunk into 64bit branch. 2000-11-16 19:54:49 +00:00
alanh
9f97da914e merge trunk into 64bit branch. 2000-11-16 19:45:52 +00:00
alanh
ccf55bd6d7 merge trunk into 64bit branch. 2000-11-16 19:38:57 +00:00
alanh
32c9fceb2b merge trunk into 64bit branch. 2000-11-16 19:32:35 +00:00
alanh
b17cdee744 merge trunk into 64bit branch. 2000-11-16 19:04:35 +00:00
alanh
65e9e693f1 merge trunk in 64bit branch. 2000-11-16 19:02:15 +00:00
alanh
68adba47ab add a linux specific grRenderBuffer to fix switching between FRONT and
BACK buffers.
2000-11-16 18:56:49 +00:00
alanh
08ef754384 merge in trunk updates, fixup pci code, and fix texus2 code pointers. 2000-11-14 14:11:20 +00:00
alanh
bc03716156 Commit some of Dave Mosberger's code:
If mode is not zero, initialize "stride" to the
number of floats that corresponds to the size of a pointer (1 on a
32-bit platform, 2 on a 64-bit platform).  This code works
properly as long as sizeof(void*)==N*sizeof(float) for some
integer constant N.
2000-11-02 10:27:24 +00:00
alanh
fc7d1171eb Fix depth offset problem on v3
Fix ix86 build problem
2000-10-27 11:20:00 +00:00
alanh
5b2cccf44f merge trunk into Glide3-64bit branch. 2000-10-03 08:18:09 +00:00
alanh
3f90077226 fix for stride width at <=1024 resolutions 2000-09-14 08:05:44 +00:00
alanh
f69716c149 64bit updates for texus & texus2 libraries 2000-09-11 08:48:09 +00:00
alanh
f3f29b54f5 fix white space 2000-09-07 15:29:52 +00:00
alanh
8b7ff82e87 IA64 patch to switch to C versions of TRI Setup 2000-09-07 15:27:52 +00:00
alanh
13692f96c6 remove white spaces 2000-09-07 15:14:11 +00:00
alanh
f0e606b604 Changes for Voodoo3 for 64bit architectures 2000-08-30 08:47:03 +00:00
alanh
ef7301331f Voodoo5 changes for 64bit architectures 2000-08-30 08:37:53 +00:00
alanh
bc31dae192 swlibs patches for 64bit issues. 2000-08-30 08:26:57 +00:00
FIXME
6acad1fd79 This commit was manufactured by cvs2svn to create branch 'Glide3-64bit'. 2000-08-25 17:33:27 +00:00
1112 changed files with 48868 additions and 350904 deletions

9
.gitignore vendored
View File

@@ -1,9 +0,0 @@
*.o
*.a
*.lo
*.so
*.exe
fxgasm.h
*.exe
fxgasm
fxinline.h

File diff suppressed because it is too large Load Diff

View File

@@ -1,300 +0,0 @@
2011-07-03 Guillem Jover <guillem@hadrons.org>
* Makefile (KBUILD): Handle Linux 3.x versions.
2011-07-03 Guillem Jover <guillem@hadrons.org>
* Makefile (help): Do not print command only their output.
2011-05-27 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c (MODULE_VERSION): Bump to '2011.05.27'.
2011-05-27 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c [HAVE_UNLOCKED_IOCTL] (ioctl_3dfx): Use new
prototype for unlocked_ioctl.
(fops_3dfx) [HAVE_UNLOCKED_IOCTL]: Assign ioctl_3dfx to
.unlocked_ioctl instead of .ioctl.
2011-05-27 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c: On Linux >= 2.6.33, use <generated/autoconf.h>
instead of <linux/autoconf.h>. Include it after <linux/version.h>.
* Makefile (VERSION_HEADER): Use generated/utsrelease.h if present
instead of linux/utsrelease.h or linux/version.h.
2011-05-27 Guillem Jover <guillem@hadrons.org>
* Makefile: Do not use negative exit codes.
2008-06-24 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c (MODULE_VERSION): Bump to '2008.06.24'.
2008-06-24 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c (KERNEL_MIN_VER): Remove defenition, and replace all
users with its contents.
2008-06-24 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c (pci_dev_put): Define to nothing on kernels < 2.5.73.
(setmtrr_3dfx): Call pci_dev_put to release the refcount on the
Intel 82441FX PCI device when done with it.
2008-06-22 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c (id_table_3dfx): Terminate the list with an empty
element.
2008-06-22 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c (pci_get_device): On Linux < 2.5.73 define it as
pci_find_device.
(findCardType, setmtrr_3dfx): Use pci_get_device instead of deprecated
pci_find_device.
2008-06-22 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c (cleanup_module): Ignore return value from
unregister_chrdev as it actually returns void now.
2007-02-06 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c (MODULE_VERSION): Bump to '2007.02.06'.
2007-02-06 Guillem Jover <guillem@hadrons.org>
Fix warnings when not checking pci_register_driver return codes.
* 3dfx_driver.c (findCards): Return int instead of void, and normalize
error code to be always negative, otherwise return numCards.
(init_module): Check for findCards return code, print a warning and
exit the module on error.
(init_3dfx): Likewise.
2007-02-06 Guillem Jover <guillem@hadrons.org>
* 3dfx_driver.c (HAVE_DEVFS): Define to 1 if
LINUX_VERSION_CODE >= 2.3.46 and LINUX_VERSION_CODE <= 2.6.17 or
if DEVFS_SUPPORT is defined, define to 0 otherwise.
(devfs_handle): Only use if HAVE_DEVFS.
(init_module): Only use devfs_mk_cdev or devfs_register if HAVE_DEVFS.
(cleanup_module): Only use devfs_remove or devfs_unregister if
HAVE_DEVFS.
2007-02-06 Guillem Jover <guillem@hadrons.org>
* Makefile (CFLAGS): Use '-march' instead of the deprecated '-mcpu'.
2007-02-06 Guillem Jover <guillem@hadrons.org>
* kinfo.c: Removed.
* kver.c: New file.
* Makefile: Include kver.mak.
(KVERS): Move this variable to 'kver.mak', which is a generated file.
(VERSION_HEADER): New variable to cope with UTS_RELEASE being moved
from 'linux/version.h' to 'linux/utsrelease.h' in 2.6.18.
(kver, kver.mak): New targets.
(KBUILD): New variable.
(KVER_MAJOR, KVER_MINOR, BUILD_TYPE, MODULE_TDFX): Likewise, moved
from the generated file 'config'.
(config, kinfo, kinfo.h): Remove targets.
(modules, intstall, clean): Do not depend on config target.
(modules, intstall): Depend on sanity target .
2007-02-06 Guillem Jover <guillem@hadrons.org>
* Makefile (.PHONY): Add clean_kbuild. Rename modules-legacy,
modules-kbuild, install-legacy, install-kbuild and clean-legacy to
modules_legacy, modules_kbuild, install_legacy, install_kbuild
and clean_legacy.
2007-01-31 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c (cardInfo_t): Make dev be 'struct pci_dev *' even for
kernels < 2.6.0.
(findCardType): Assign to cards[n].dev the dev variable instead of
devfn. Fix macro to use devfn instead.
2006-12-03 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c (my_remap_page_range): Define as remap_pfn_range for
linux 2.6.10 or higher.
2006-12-03 Guillem Jover <guillem@hadrons.org>
Use the "new" kernel level exception handling for memory accesses
introduced in linux 2.1.8, which obsoletes verify_aread.
* 3dfx_device.c (doQueryFetch): Remove verify_area and check for
copy_to_user return values.
(doPIORead): Likewise.
(doQueryUpdate): Remove verify_area and check for copy_from_user
return values.
(doQuery): Likewise.
(doPIOWrite): Likewise.
(doPIO): Likewise.
(verify_area) [DEBUG]: Remove function.
(a_last_dummy_function) [DEBUG]: Likewise.
2006-12-03 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c (doQueryFetch): Assign desc->device to i, and use it
when referencing cards.
2006-12-03 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c (setmtrr_3dfx): Make it static.
(resetmtrr_3dfx): Likewise.
2006-12-03 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c (id_table_3dfx): Move near the corresponding ifdef
for older kernels.
(findCards): Likewise.
(driver_3dfx): Forward declare.
2006-12-03 Guillem Jover <guillem@hadrons.org>
Rename functions obsoleted in linux 2.1.93.
* 3dfx_device.c (pcibios_read_config_byte): Rename to ...
(pci_read_config_byte): ... this and remove first argument.
(pcibios_read_config_word): Rename to ...
(pci_read_config_word): ... this and remove first argument.
(pcibios_read_config_dword): Rename to ...
(pci_read_config_dword): ... this and remove first argument.
(pcibios_write_config_dword): Rename to ...
(pci_write_config_dword): ... this and remove first argument.
2006-12-03 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c (VM_OFFSET_ALIGNED): New macro.
(mmap_3dfx): Use VM_OFFSET_ALIGNED, instead of checking for specific
kernel versions and changing behaviour.
2006-12-03 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c: Indentation fixes.
2006-03-03 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c: Rename HAVE_MTRR to CONFIG_MTRR.
2005-04-23 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c: Add GPL notice.
2005-04-24 Ozkan Sezer <sezeroz@gmail.com>
* 3dfx_device.c: Add Macronix MX86251 Voodoo Rush support.
2005-04-24 Ozkan Sezer <sezeroz@gmail.com>
* 3dfx_device.c (setmtrr_3dfx): Add missing break on default case.
2005-04-23 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c: Fix comment format. Remove obsolete compiler flags
info.
2005-04-23 Guillem Jover <guillem@hadrons.org>
* 3dfx_device.c: Move ChangeLog entries to ...
* ChangeLog: ... here.
2004-05-05 Guillem Jover <guillem@debian.org>
* Use designators in fops_3dfx instead of the obsolete colon syntax.
2004-05-04 Guillem Jover <guillem@debian.org>
* Cleaned new kernel build system.
* Indentation fixes. Normalized ChangeLog date format.
2004-02-13 Aristeu Sergio Rozanski Filho <aris@cathedrallabs.org>
* Use kernel build system.
* Use new pci probe present in 2.6.x kernels.
* Use module auto-loading.
2004-01-22 Guillem Jover <guillem@debian.org>
* Ported to 2.6 kernels.
2002-05-05 Guillem Jover <guillem@hadrons.org>
* Re-included VOODOO pci id, accidentally removed in last patch,
thanks to Jan Kuipers to point this out.
2002-01-29 Guillem Jover <guillem@hadrons.org>
* Fixed bug when compiling for 2.4 kernels with modversions.
* Added devfs support.
* Added MODULE_* declarations.
* Cleaned detection code.
2000-02-04 Joseph Kain <joseph@3dfx.com>
* Updated Carlo Woord's email address.
1999-12-22 Joseph Kain <joseph@3dfx.com>
* Support for new VMA structure in Kernels 2.3.14 and higher.
This patch is based on Dieter Nuetzel's work.
1999-11-09 Joseph Kain <joseph@3dfx.com>
* Made cards static to remove conflict with hisax ISDN driver.
1998-10-30 Carlo Wood <carlo@alinoe.com>
* Re-included module versions (this source was based on the
source by Jon Taylor which was based on an older version
by Daryll Straus. I now included the later changes made
by Daryll in this source too).
* Use pci_find_device for 2.1/2.2 kernels instead of the old
pcibios_find_device. Idem pci_present().
1998-10-21 Carlo Wood <carlo@alinoe.com>
* Fixed compile bugs related to 2.0 kernels.
1998-10-21 Carlo Wood <carlo@alinoe.com>
* `struct file_operations' was changed as of kernel 2.1.118,
fixed this module to also work with versions > 2.1.117.
* Machines that don't have mtrr still need <asm/uaccess.h>.
1998-10-20 Carlo Wood <carlo@alinoe.com>
* Finally fixed in init_module() the right way. This time I tested
it too (it now really works).
* Added resetmtrr_3dfx() to clean up the MTRR settings when the
module is unloaded. This is not really necessary but its clean.
It allows to compare using this device WITH MTRR with another
method WITHOUT MTRR, without being confused by sticky MTRR settings
for instance.
1998-10-18 Carlo Wood <carlo@alinoe.com>
* Forgot the '== -EBUSY' in init_module(), causing the registration
of character device to always fail. You need to reboot if you
tried the previous version (if there is junk in `cat /proc/devices'
major 107).
1998-10-18 Carlo Wood <carlo@alinoe.com>
* struct file_operations fops_3dfx was initialized wrong:
`release_3dfx' was put on the place of `fsync', causing weird
behaviour :).
* Several warning fixes.
* setmtrr_3dfx did not always return a value, and the value was
ignored, effectively ignoring errors returned by mtrr_add().

View File

@@ -1,160 +0,0 @@
Summary: Device driver for 3Dfx boards for Linux kernels
Name: Device3Dfx
Version: 2.3
Release: 5
Icon: 3dfx.gif
Source: Device3Dfx.tar.gz
License: GPL
Group: Drivers
%changelog
* Sat Apr 08 2000 Joseph Kain <joseph@3dfx.com>
Release 2.3-5
- Check both the kernel and the processor for MTRR support before enabling.
* Wed Jan 04 2000 Joseph Kain <joseph@3dfx.com>
Release 2.3-4
- Forgot to include kinfo.h in 3dfx_driver.c in the last release. This
fixes some build problems for SMP kernels.
* Wed Dec 22 1999 Joseph Kain <joseph@3dfx.com>
Release 2.3-3
- Fixes to the Makefile to stop grepping the header files. Changes to
mtrr.c and 3dfx_driver.c to support these Makefile changes.
- 3dfx_driver.c now supports 2.3.14+ kernels.
* Mon Dec 13 1999 Joseph Kain <joseph@3dfx.com>
Release 2.3-2
- Removed depmod -a from the Makefile. This elliminates errors in the
build on systems with modules with broken depedancies (Happens on Madrake)
- Changed depmod -a to depmod -a > /dev/null in the post and postun to
elliminate any warnings/errors with modules that don't have anything
to do with Device3Dfx. Warnings scare people.
* Tue Nov 09 1999 Joseph Kain <joseph@3dfx.com>
Release 2.3:
- Made cards static to remove conflict with hisax ISDN driver.
- Removed 3dfx.o from the source distribution
* Fri Jun 25 1999 Daryll Strauss <daryll@harlot.rb.ca.us>
Release 2.2:
- Set MTRR for VB/V3 boards
- Allow build without kernel sources installed
- Code cleanup
- Improvements in /etc/conf.modules setup
* Sun May 16 1999 Daryll Strauss <daryll@harlot.rb.ca.us>
Release 2.1:
- Added support for multiple board mappings
- Enlarged size of mappings
- Changes to support VB/V3 boards
* Sun Apr 4 1999 Daryll Strauss <daryll@harlot.rb.ca.us>
Release 2.0-1:
- This is just a rename of Michael's version to return it to my original
naming scheme.
- Added the License field to the spec file.
* Thu Mar 11 1999 Michael Vance <mkv102@psu.edu>
Release 2.5-2:
- Fixed for 2.2.3 kernels because of an mmap() update
* Fri Oct 30 1998 Carlo Wood <carlo@runaway.xs4all.nl>
Release 2.5-1:
- Upped source to Dev3Dfx-2.5.tar.gz
- Boosted version number of rpm to the version of the tar.gz.
Moved everything to the Makefile, so Dev3Dfx-2.5.tar.gz is
self containing and will work without rpm too.
* Wed Oct 21 1998 Carlo Wood <carlo@runaway.xs4all.nl>
Release 1.2-5:
- Upped source to Dev3Dfx-2.4.tar.gz
- Removed dangerous and confusing use of /lib/modules/preferred
- Removed the use of `uname': It now will compile for the kernel
version in /usr/src/linux and not be bothered by the running
kernel version.
* Wed Oct 21 1998 Carlo Wood <carlo@runaway.xs4all.nl>
Release 1.2-4:
- Upped source to Dev3Dfx-2.3.tar.gz
* Mon Oct 19 1998 Carlo Wood <carlo@runaway.xs4all.nl>
Release 1.2-3:
- Corrected Summary and Description to refer to 2.x rather
then 2.1 kernels.
- Removed script lines that write an `option' line to /etc/conf.modules.
- Upped source to Dev3Dfx-2.2.tar.gz
* Sun Oct 18 1998 Carlo Wood <carlo@runaway.xs4all.nl>
Release 1.2-2:
- Added OPT_CFLAGS stuff.
* Sun Oct 18 1998 Carlo Wood <carlo@runaway.xs4all.nl>
Release 1.2-1:
- Packaged version 1.2 with support for 2.1 kernels by John Taylor and
MTRR settings added by Jens Axboe.
%description
This package installs the 3Dfx device driver to allow access to 3Dfx
boards without the user having root privledges. It should work on >= 2.x
kernels and set the MTRR settings correctly. It should also work with
SMP kernels (>= 2.1).
%prep
%setup -c
%build
make OPT_CFLAGS="$RPM_OPT_FLAGS"
%install
make RPM_INSTALL="1" install | grep '^/lib/modules/' > modules-file-list
%post
if [ "$1" = 1 ]; then
grep -v 3dfx /etc/conf.modules > /etc/conf.modules.tmp
echo alias char-major-107 3dfx >> /etc/conf.modules.tmp
mv /etc/conf.modules.tmp /etc/conf.modules
fi
/sbin/depmod -a > /dev/null
%postun
if [ "$1" = 0 ]; then
grep -v 3dfx /etc/conf.modules > /etc/conf.modules.tmp
mv /etc/conf.modules.tmp /etc/conf.modules
fi
/sbin/depmod -a > /dev/null
%verifyscript
inconf=`grep 'alias char-major-107 3dfx' /etc/conf.modules`
if [ "x$inconf" = "x" ]; then
echo "3dfx entry not included in /etc/conf.modules"
fi
%files -f modules-file-list
%verify(not mode user group) /dev/3dfx

View File

@@ -1,155 +0,0 @@
###############################################################################
# Makefile by Carlo Wood (and others)
# Determine the machine type
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
# Setup machine dependant compiler flags
ifeq ($(ARCH), i386)
CFLAGS ?= -O2 -march=pentium -fomit-frame-pointer -fno-strength-reduce \
-falign-loops=2 -falign-jumps=2 -falign-functions=2
endif
ifeq ($(ARCH), alpha)
CFLAGS ?= -O2 -mno-fp-regs -mcpu=ev4 -ffixed-8 -Wa,-mev6 \
-fomit-frame-pointer -fno-strict-aliasing
endif
KSRC ?= /usr/src/linux
KHEADERS ?= $(KSRC)/include
-include kver.mak
MODULES_DIR = $(DESTDIR)/lib/modules/$(KVERS)
ALL_CFLAGS := -DMODULE -D__KERNEL__ \
-I$(KHEADERS) -I$(KHEADERS)/asm/mach-default \
$(CFLAGS)
ifneq ($(wildcard $(KHEADERS)/generated/utsrelease.h),)
VERSION_HEADER := $(KHEADERS)/generated/utsrelease.h
else
ifneq ($(wildcard $(KHEADERS)/linux/utsrelease.h),)
VERSION_HEADER := $(KHEADERS)/linux/utsrelease.h
else
VERSION_HEADER := $(KHEADERS)/linux/version.h
endif
endif
###############################################################################
# You should never need to change anything below.
NAME := 3dfx
all: modules
kver: kver.c
$(CC) -include $(VERSION_HEADER) -x c -o $@ $<
kver.mak: kver
./$^ > $@
# Sanity checks
sanity:
@( \
if [ ! -r $(KHEADERS)/linux ]; then \
echo "Expect readable headers in $(KHEADERS)/linux"; \
exit 1; \
fi; \
if [ ! -r $(KHEADERS)/linux/version.h ]; then \
echo "Missing $(KHEADERS)/linux/version.h"; \
echo "Configure and install the kernel first"; \
exit 1; \
fi; \
if [ ! -e /proc/cpuinfo ]; then \
echo "You need the /proc file system"; \
echo "Reconfigure kernel and say Yes to CONFIG_PROC_FS"; \
exit 1; \
fi; \
)
KVER_MAJOR = $(shell echo "$(KVERS)" | cut -d. -f1 )
KVER_MINOR = $(shell echo "$(KVERS)" | cut -d. -f2 )
KBUILD = $(shell [ "$(KVER_MAJOR)" = 2 ] && [ "$(KVER_MINOR)" -ge 6 ] || \
[ "$(KVER_MAJOR)" -ge 3 ] && echo yes )
help:
@echo KVER_MAJOR = $(KVER_MAJOR)
@echo KVER_MINOR = $(KVER_MINOR)
@echo KBUILD = $(KBUILD)
ifeq ($(KBUILD),yes)
BUILD_TYPE = kbuild
MODULE_TDFX = kbuild/$(NAME).ko
else
BUILD_TYPE = legacy
MODULE_TDFX = $(NAME).o
endif
clean_type = clean_$(BUILD_TYPE)
module_type = module_$(BUILD_TYPE)
###############################################################################
modules: sanity $(module_type)
module_legacy: $(NAME).o
$(NAME).o: 3dfx_driver.c Makefile
$(CC) $(ALL_CFLAGS) -c -o $@ 3dfx_driver.c
module_kbuild:
$(MAKE) -C kbuild
###############################################################################
install: sanity install_modules
@( \
if [ -e $(MODULES_DIR)/modules.dep ]; then \
indep=`grep '$(NAME)/$(MODULE_TDFX):' $(MODULES_DIR)/modules.dep`; \
if [ -z "$$indep" ]; then \
echo "$(MODULES_DIR)/$(NAME)/$(MODULE_TDFX):" >> $(MODULES_DIR)/modules.dep; \
echo "" >> $(MODULES_DIR)/modules.dep; \
fi; \
fi; \
if [ ! -e $(DESTDIR)/dev/.devfsd -a ! -c $(DESTDIR)/dev/$(NAME) ]; then \
mknod $(DESTDIR)/dev/$(NAME) c 107 0; \
chmod go+w $(DESTDIR)/dev/$(NAME); \
fi; \
if [ "$(RPM_INSTALL)" = "1" ]; then \
echo "$(MODULES_DIR)/$(NAME)/$(MODULE_TDFX)"; \
else \
inconf=`grep 'alias char-major-107 $(NAME)' $(DESTDIR)/etc/modules.conf`; \
if [ -z "$$inconf" ]; then \
echo "alias char-major-107 $(NAME)" >> $(DESTDIR)/etc/modules.conf; \
fi; \
fi; \
)
install_modules: modules
mkdir -p $(MODULES_DIR)/$(NAME)
cp $(MODULE_TDFX) $(MODULES_DIR)/$(NAME)/
###############################################################################
# This is for debugging purposes by the developers:
clean: $(clean_type)
rm -f kver.mak kver
clean_legacy:
rm -f *.ko *.o *.mod.* .*.mod.* .*.cmd
clean_kbuild:
$(MAKE) -C kbuild clean
tar:
tar czf ../../SOURCES/Dev3Dfx-2.5.tar.gz 3dfx_driver.c Makefile
debug:
$(MAKE) CFLAGS="-g -Wall -Wstrict-prototypes -DDEBUG"
.PHONY: all sanity modules modules_legacy modules_kbuild
.PHONY: install install_legacy install_kbuild
.PHONY: clean clean_legacy clean_kbuild tar debug

View File

@@ -1,20 +0,0 @@
Build instructions
------------------
The new build system supports Linux kernel legacy build systems
as used on 2.4.x or earlier and the new kbuild system used on 2.6
and up.
Current make targets are:
modules
clean
install
If your kernel source is in some place different than /usr/src/linux
specify the KSRC variable, like:
$ make KSRC=~/src/linux
If you want to install in a different base dir specify DESTDIR.

View File

@@ -1,5 +0,0 @@
device3dfx (2.3-1) unstable; urgency=low
* Initial package.
-- RetroDebian <root@retrodebian.local> Thu, 20 Mar 2026 10:00:00 +0000

View File

@@ -1 +0,0 @@
5

View File

@@ -1,14 +0,0 @@
Source: device3dfx
Section: misc
Priority: optional
Maintainer: RetroDebian <root@retrodebian.local>
Standards-Version: 3.7.3
Package: device3dfx-modules-_KVERS_
Architecture: any
Provides: device3dfx-modules
Depends: linux-modules-_KVERS_ | linux-image-_KVERS_
Description: Device3Dfx kernel module for Debian Linux kernels
External kernel module providing /dev/3dfx support for 3dfx hardware.
.
This package contains the compiled kernel module for _KVERS_.

View File

@@ -1,37 +0,0 @@
#!/usr/bin/make -f
# -*- mode: makefile; coding: utf-8 -*-
PACKAGE=device3dfx-modules
MA_DIR ?= /usr/share/modass
-include $(MA_DIR)/include/generic.make
-include $(MA_DIR)/include/common-rules.make
kdist_config: prep-deb-files
ln -sf ../3dfx_driver.c kbuild/3dfx.c
kdist_clean:
rm -f kbuild/3dfx.c
$(MAKE) -C $(KSRC) M=$(PWD)/kbuild clean
binary-modules:
dh_testroot
dh_clean -k
dh_installdirs
ln -sf ../3dfx_driver.c kbuild/3dfx.c
$(MAKE) -C $(KSRC) M=$(PWD)/kbuild modules
mkdir -p debian/$(PACKAGE)-$(KVERS)/lib/modules/$(KVERS)/extra
cp kbuild/3dfx.ko debian/$(PACKAGE)-$(KVERS)/lib/modules/$(KVERS)/extra/
dh_installdocs
dh_installchangelogs
dh_installmodules
dh_compress
dh_fixperms
dh_installdeb
dh_gencontrol -- -v$(VERSION)
dh_md5sums
dh_builddeb --destdir=$(DEB_DESTDIR)
dh_clean -k

View File

@@ -1,16 +0,0 @@
KSRC ?= /usr/src/linux
obj-m += 3dfx.o
modules:
ln -sf ../3dfx_driver.c 3dfx.c
$(MAKE) -C $(KSRC) M=$(shell pwd) modules
clean:
rm -f 3dfx.c
$(MAKE) -C $(KSRC) M=$(shell pwd) clean
install: modules
$(MAKE) -C $(KSRC) M=$(shell pwd) INSTALL_MOD_PATH="$(DESTDIR)" \
modules_install

View File

@@ -1,8 +0,0 @@
#include <stdio.h>
int main()
{
printf("KVERS = %s\n", UTS_RELEASE);
return 0;
}

255
LICENSE
View File

@@ -1,255 +0,0 @@
3DFX GLIDE Source Code General Public License
1. PREAMBLE
This license is for software that provides a 3D graphics application
program interface (API).The license is intended to offer terms similar
to some standard General Public Licenses designed to foster open
standards and unrestricted accessibility to source code. Some of these
licenses require that, as a condition of the license of the software,
any derivative works (that is, new software which is a work containing
the original program or a portion of it) must be available for general
use, without restriction other than for a minor transfer fee, and that
the source code for such derivative works must likewise be made
available. The only restriction is that such derivative works must be
subject to the same General Public License terms as the original work.
This 3dfx GLIDE Source Code General Public License differs from the
standard licenses of this type in that it does not require the entire
derivative work to be made available under the terms of this license
nor is the recipient required to make available the source code for
the entire derivative work. Rather, the license is limited to only the
identifiable portion of the derivative work that is derived from the
licensed software. The precise terms and conditions for copying,
distribution and modification follow.
2. DEFINITIONS
2.1 This License applies to any program (or other "work") which
contains a notice placed by the copyright holder saying it may be
distributed under the terms of this 3dfx GLIDE Source Code General
Public License.
2.2 The term "Program" as used in this Agreement refers to 3DFX's
GLIDE source code and object code and any Derivative Work.
2.3 "Derivative Work" means, for the purpose of the License, that
portion of any work that contains the Program or the identifiable
portion of a work that is derived from the Program, either verbatim or
with modifications and/or translated into another language, and that
performs 3D graphics API operations. It does not include any other
portions of a work.
2.4 "Modifications of the Program" means any work, which includes a
Derivative Work, and includes the whole of such work.
2.5 "License" means this 3dfx GLIDE Source Code General Public License.
2.6 The "Source Code" for a work means the preferred form of the work
for making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, any
associated interface definition files, and the scripts used to control
compilation and installation of the executable work.
2.7 "3dfx" means 3dfx Interactive, Inc.
3. LICENSED ACTIVITIES
3.1 COPYING - You may copy and distribute verbatim copies of the
Program's Source Code as you receive it, in any medium, subject to the
provision of section 3.3 and provided also that:
(a) you conspicuously and appropriately publish on each copy
an appropriate copyright notice (3dfx Interactive, Inc. 1999), a notice
that recipients who wish to copy, distribute or modify the Program can
only do so subject to this License, and a disclaimer of warranty as
set forth in section 5;
(b) keep intact all the notices that refer to this License and
to the absence of any warranty; and
(c) do not make any use of the GLIDE trademark without the prior
written permission of 3dfx, and
(d) give all recipients of the Program a copy of this License
along with the Program or instructions on how to easily receive a copy
of this License.
3.2 MODIFICATION OF THE PROGRAM/DERIVATIVE WORKS - You may modify your
copy or copies of the Program or any portion of it, and copy and
distribute such modifications subject to the provisions of section 3.3
and provided that you also meet all of the following conditions:
(a) you conspicuously and appropriately publish on each copy
of a Derivative Work an appropriate copyright notice, a notice that
recipients who wish to copy, distribute or modify the Derivative Work
can only do so subject to this License, and a disclaimer of warranty
as set forth in section 5;
(b) keep intact all the notices that refer to this License and
to the absence of any warranty; and
(c) give all recipients of the Derivative Work a copy of this
License along with the Derivative Work or instructions on how to easily
receive a copy of this License.
(d) You must cause the modified files of the Derivative Work
to carry prominent notices stating that you changed the files and the
date of any change.
(e) You must cause any Derivative Work that you distribute or
publish to be licensed at no charge to all third parties under the
terms of this License.
(f) You do not make any use of the GLIDE trademark without the
prior written permission of 3dfx.
(g) If the Derivative Work normally reads commands
interactively when run, you must cause it, when started running for
such interactive use, to print or display an announcement as follows:
"COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED THIS
SOFTWARE IS FREE AND PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESSED OR IMPLIED. THERE IS NO RIGHT TO USE THE GLIDE
TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX INTERACTIVE,
INC. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A FULL TEXT OF THE
DISTRIBUTION AND NON-WARRANTY PROVISIONS (REQUEST COPY FROM
INFO@3DFX.COM)."
(h) The requirements of this section 3.2 do not apply to the
modified work as a whole but only to the Derivative Work. It is not
the intent of this License to claim rights or contest your rights to
work written entirely by you; rather, the intent is to exercise the
right to control the distribution of Derivative Works.
3.3 DISTRIBUTION
(a) All copies of the Program or Derivative Works which are
distributed must include in the file headers the following language
verbatim:
"THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED
ONLY PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO
RIGHT TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF
3DFX INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM
THE DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC (info@3dfx.com).
THIS PROGRAM. IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
FULL TEXT OF THE NON-WARRANTY PROVISIONS.
USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS
IN TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
THE UNITED STATES.
COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED"
(b) You may distribute the Program or a Derivative Work in
object code or executable form under the terms of Sections 3.1 and 3.2
provided that you also do one of the following:
(1) Accompany it with the complete corresponding
machine-readable source code, which must be distributed under the
terms of Sections 3.1 and 3.2; or,
(2) Accompany it with a written offer, valid for at
least three years, to give any third party, for a charge no more than
your cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 3.1 and 3.2 on a medium
customarily used for software interchange; or,
(3) Accompany it with the information you received as
to the offer to distribute corresponding source code. (This alternative
is allowed only for noncommercial distribution and only if you received
the program in object code or executable form with such an offer, in
accord with Subsection 3.3(b)(2) above.)
(c) The source code distributed need not include anything
that is normally distributed (in either source or binary form) with
the major components (compiler, kernel, and so on) of the operating
system on which the executable runs, unless that component itself
accompanies the executable code.
(d) If distribution of executable code or object code is made
by offering access to copy from a designated place, then offering
equivalent access to copy the source code from the same place counts
as distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
(e) Each time you redistribute the Program or any Derivative
Work, the recipient automatically receives a license from 3dfx and
successor licensors to copy, distribute or modify the Program and
Derivative Works subject to the terms and conditions of the License.
You may not impose any further restrictions on the recipients'
exercise of the rights granted herein. You are not responsible for
enforcing compliance by third parties to this License.
(f) You may not make any use of the GLIDE trademark without
the prior written permission of 3dfx.
(g) You may not copy, modify, sublicense, or distribute the
Program or any Derivative Works except as expressly provided under
this License. Any attempt otherwise to copy, modify, sublicense or
distribute the Program or any Derivative Works is void, and will
automatically terminate your rights under this License. However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.
4. MISCELLANEOUS
4.1 Acceptance of this License is voluntary. By using, modifying or
distributing the Program or any Derivative Work, you indicate your
acceptance of this License to do so, and all its terms and conditions
for copying, distributing or modifying the Program or works based on
it. Nothing else grants you permission to modify or distribute the
Program or Derivative Works and doing so without acceptance of this
License is in violation of the U.S. and international copyright laws.
4.2 If the distribution and/or use of the Program or Derivative Works
is restricted in certain countries either by patents or by copyrighted
interfaces, the original copyright holder who places the Program under
this License may add an explicit geographical distribution limitation
excluding those countries, so that distribution is permitted only in
or among countries not thus excluded. In such case, this License
incorporates the limitation as if written in the body of this License.
4.3 This License is to be construed according to the laws of the
State of California and you consent to personal jurisdiction in the
State of California in the event it is necessary to enforce the
provisions of this License.
5. NO WARRANTIES
5.1 TO THE EXTENT PERMITTED BY APPLICABLE LAW, THERE IS NO WARRANTY
FOR THE PROGRAM. OR DERIVATIVE WORKS THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE PROGRAM AND ANY DERIVATIVE WORKS"AS IS"
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY
AND PERFORMANCE OF THE PROGRAM AND ANY DERIVATIVE WORK IS WITH YOU.
SHOULD THE PROGRAM OR ANY DERIVATIVE WORK PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
5.2 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL 3DFX
INTERACTIVE, INC., OR ANY OTHER COPYRIGHT HOLDER, OR ANY OTHER PARTY
WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM OR DERIVATIVE WORKS AS
PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
INABILITY TO USE THE PROGRAM OR DERIVATIVE WORKS (INCLUDING BUT NOT
LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES
SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM OR
DERIVATIVE WORKS TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

5
README
View File

@@ -1,5 +0,0 @@
This is the source code to 3Dfx Glide for Voodoo graphics accelerators.
It's forked from the original CVS repo of Glide open source project at
sourceforge: https://sourceforge.net/projects/glide/
Source is licensed under 3DFX GLIDE Source Code General Public License.

View File

@@ -1,31 +0,0 @@
Here are a few notes about building Glide3x from CVS.
The Glide source trees are branced by platform and the platform names are
internal names used at 3dfx. Since these name may not make sense to others
here is a quick list.
sst1: Voodoo Graphics
sst96: Voodoo Rush
cvg: Voodoo 2
h3: Voodoo Banshee/Voodoo 3
There is a single toplevel makefile for glide2x. To select a build
for either sst1, cvg or h3 set FX_GLIDE_HW to either sst1, cvg or h3. The
default is to build for h3.
There are many other environment variables used to control the Glide
build. Here is a listing of some of the important ones:
DEBUG=1: Turn on debugging information, note this disables
the asm optimizations.
FX_GLIDE_PIC=1: Enable PIC in shared libraries.
FX_GLIDE_CTRISETUP=1: Use C versions as opposed to ASM versions of triangle
setup code.
GL_AMD3D=1: Enable AMD 3DNow! optimizations. Note this is
currently broken on several platforms.
All glide source trees use a common set of libraries kept in the
swlibs branch. In order to build any glide library the swlibs branch
must be moved inside the glide3x directory. The swlibs branch is not
stored here within the glide2x cvs tree because it is also shared with
the glide3x branch.

View File

@@ -1,26 +0,0 @@
#
# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
# FULL TEXT OF THE NON-WARRANTY PROVISIONS.
#
# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
# THE UNITED STATES.
#
# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
#
# $Revision$
# $Date$
#
LDIRT = $(patsubst CVS,,$(patsubst makefile%,,$(wildcard *)))
include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak

View File

@@ -1,27 +0,0 @@
#
# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
# FULL TEXT OF THE NON-WARRANTY PROVISIONS.
#
# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
# THE UNITED STATES.
#
# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
#
# $Revision$
# $Date$
#
THISDIR = cmd
SUBDIRS = pass
include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak

View File

@@ -1,40 +0,0 @@
#
# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
# FULL TEXT OF THE NON-WARRANTY PROVISIONS.
#
# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
# THE UNITED STATES.
#
# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
#
# $Revision$
# $Date$
#
# local defines, options, includes
LCDEFS =
LCOPTS =
LCINCS = -I$(BUILD_ROOT)/$(FX_GLIDE_HW)/include
# sources
CFILES = pass.c
LLDLIBS = -L$(BUILD_ROOT)/$(FX_GLIDE_HW)/lib -lsst1init \
-L$(BUILD_ROOT_SWLIBS)/lib -lfxmisc -lfxpci
# targets
PROGRAM = pass
INSTALL_DESTINATION = $(BUILD_ROOT)/$(FX_GLIDE_HW)
include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak

View File

@@ -1,48 +0,0 @@
/*
* THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
* PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
* TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
* INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
* DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
* THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
* FULL TEXT OF THE NON-WARRANTY PROVISIONS.
*
* USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
* RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
* TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
* AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
* SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
* THE UNITED STATES.
*
* COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
*/
#include <stdio.h>
#include <stdlib.h>
#include <3dfx.h>
#include <glide.h>
#include <sst1init.h>
/* This should be exported, but isn't yet */
#define SST1INIT_MAX_BOARDS 16
int main (int argc, char* argv[])
{
FxU32* sst[SST1INIT_MAX_BOARDS];
int num_sst;
int i;
/* Map all the boards in the system */
num_sst = 0;
do {
sst[num_sst] = sst1InitMapBoard (num_sst);
} while (sst[num_sst++] != NULL);
/* Shut them all down */
for (i = 0; i < num_sst; i += 1)
sst1InitVgaPassCtrl(sst[i], 1);
return 0;
}

View File

@@ -1,31 +0,0 @@
#
# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
# FULL TEXT OF THE NON-WARRANTY PROVISIONS.
#
# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
# THE UNITED STATES.
#
# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
#
# $Revision$
# $Date$
#
THISDIR = glide
!if "$(FX_TARGET)" == "DOS"
SUBDIRS = src tests
!else
SUBDIRS = oem src tests
!endif
!include $(BUILD_ROOT_SWLIBS)/include/nmake/3dfx.mak

View File

@@ -1,24 +0,0 @@
#
# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
# FULL TEXT OF THE NON-WARRANTY PROVISIONS.
#
# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
# THE UNITED STATES.
#
# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
#
THISDIR = glide
SUBDIRS = oem src tests
include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak

View File

@@ -1,24 +0,0 @@
#
# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
# FULL TEXT OF THE NON-WARRANTY PROVISIONS.
#
# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
# THE UNITED STATES.
#
# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
#
THISDIR = glide
SUBDIRS = oem src tests
include $(BUILD_ROOT_SWLIBS)/include/make/3dfx.mak

View File

@@ -1,52 +0,0 @@
/*
* THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
* PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
* TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
* INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
* DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
* THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
* FULL TEXT OF THE NON-WARRANTY PROVISIONS.
*
* USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
* RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
* TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
* AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
* SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
* THE UNITED STATES.
*
* COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
*
* $Header$
* $Log$
*
* 1 7/25/97 9:05a Pgj
* generate fxbldno.h which defines BUILD_NUMBER
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
main(int argc, char **argv)
{
struct tm locTime;
time_t sysTime;
char *build;
time(&sysTime);
locTime = *localtime(&sysTime);
if (build = getenv("BUILD_NUMBER")) {
printf("#define BUILD_NUMBER %s\n", build);
} else {
unsigned short magic;
magic = (locTime.tm_yday << 7) |
(locTime.tm_hour << 2) |
(locTime.tm_min / 15);
printf("#define BUILD_NUMBER %d\n", magic);
}
return 0;
} /* end main() */

View File

@@ -1,63 +0,0 @@
#
# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
# FULL TEXT OF THE NON-WARRANTY PROVISIONS.
#
# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
# THE UNITED STATES.
#
# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
!if "$(FX_GLIDE_HW)" == "sst96"
GLIDE_SRC_BASE = sst1
!else
GLIDE_SRC_BASE = $(FX_GLIDE_HW)
!endif
LCINCS = $(LCINCS) -I$(BUILD_ROOT)\$(GLIDE_SRC_BASE)\include \
-I$(BUILD_ROOT)\$(GLIDE_SRC_BASE)\glide\src
!if "$(DEBUG)" == "1"
LCDEFS = -DDEBUG=1
!endif
CFILES = oeminit.c
RCFILE = oeminit.rc
HEADERS = oeminit.h
PRIVATE_HEADERS = rcver.h
LIBRARIES = fxoem2x.lib
INSTALL_DESTINATION = $(BUILD_ROOT)\$(GLIDE_SRC_BASE)
# Make a static link library for things like the diags.
!if "$(FX_DLL_BUILD)" == "1"
FX_DLL_LIBRARY = 1
!else
LCDEFS = $(LCDEFS) -DFX_STATIC_BUILD
!endif
LCDEFS = $(LCDEFS)
!include $(BUILD_ROOT)\swlibs/include/nmake/3dfx.mak
!if "$(FX_TARGET)" == "WIN32"
!if "$(FX_DLL_BUILD)" != ""
fxoem2x.dll:
!endif
!endif
fxbldno.exe: fxbldno.c $(HEADERS) $(PRIVATE_HEADERS)
$(CC) -o $@ fxbldno.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) $(LDFLAGS)
fxbldno.h: fxbldno.exe
fxbldno > fxbldno.h
oeminit.res: rcver.h fxbldno.h

View File

@@ -1,49 +0,0 @@
#
# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
# FULL TEXT OF THE NON-WARRANTY PROVISIONS.
#
# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
# THE UNITED STATES.
#
# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
ifeq ($(FX_GLIDE_HW),sst96)
GLIDE_SRC_BASE = sst1
else
GLIDE_SRC_BASE = $(FX_GLIDE_HW)
endif
LCINCS += -I$(BUILD_ROOT)\$(GLIDE_SRC_BASE)/include \
-I$(BUILD_ROOT)/$(GLIDE_SRC_BASE)/glide/src
ifeq ($(DEBUG),1)
DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON
GLIDE_SANITY_ALL = 1
endif
CFILES = oeminit.c
HEADERS = oeminit.h
INSTALL_DESTINATION = $(BUILD_ROOT)/$(GLIDE_SRC_BASE)
LIBRARIES = libfxoem2x.a
# Make a static link library for things like the diags.
ifeq ($(FX_DLL_BUILD),1)
FX_DLL_LIBRARY = 1
else
LCDEFS += -DFX_STATIC_BUILD
endif
include $(BUILD_ROOT)/swlibs/include/make/3dfx.mak

View File

@@ -1,372 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
*/
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#ifndef __linux__
#include <windows.h>
#endif
#define FX_DLL_DEFINITION
#include <3dfx.h>
#include <fxdll.h>
#include "oeminit.h"
const OemPciRegister OEM_PCI_VENDOR_ID = { 0x0, 2, OEM_READ_ONLY };
const OemPciRegister OEM_PCI_DEVICE_ID = { 0x2, 2, OEM_READ_ONLY };
const OemPciRegister OEM_PCI_COMMAND = { 0x4, 2, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_STATUS = { 0x6, 2, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_REVISION_ID = { 0x8, 1, OEM_READ_ONLY };
const OemPciRegister OEM_PCI_CLASS_CODE = { 0x9, 3, OEM_READ_ONLY };
const OemPciRegister OEM_PCI_CACHE_LINE_SIZE = { 0xC, 1, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_LATENCY_TIMER = { 0xD, 1, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_HEADER_TYPE = { 0xE, 1, OEM_READ_ONLY };
const OemPciRegister OEM_PCI_BIST = { 0xF, 1, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_BASE_ADDRESS_0 = { 0x10, 4, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_BASE_ADDRESS_1 = { 0x14, 4, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_BASE_ADDRESS_2 = { 0x18, 4, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_BASE_ADDRESS_3 = { 0x1C, 4, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_BASE_ADDRESS_4 = { 0x20, 4, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_BASE_ADDRESS_5 = { 0x24, 4, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_BASE_ADDRESS_6 = { 0x28, 4, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_BASE_ADDRESS_7 = { 0x2c, 4, OEM_READ_WRITE };
const OemPciRegister OEM_PCI_BASE_ADDRESS_8 = { 0x30, 4, OEM_READ_WRITE };
static FILE* outFile = NULL;
static const char*
myGetenv(const char* envKey)
{
FxBool callRealGetenvP = FXTRUE;
#if __WIN32__
/* NB: If were being called from cya code in
* DllMain(DLL_PROCESS_DETACH) because the current app has called
* exit() or dropped off of the end of main the per dll environ
* string table has been freed by the c runtime but has not been set
* to NULL. Bad things happen if this memory has been unmapped by
* the system or if the string cannot be found.
*/
{
HANDLE curProcessHandle = GetCurrentProcess();
DWORD exitCode = STILL_ACTIVE;
callRealGetenvP = ((curProcessHandle != NULL) &&
GetExitCodeProcess(curProcessHandle, &exitCode) &&
(exitCode == STILL_ACTIVE));
}
#endif /* __WIN32__ */
return (callRealGetenvP
? getenv(envKey)
: NULL);
}
static void
MyDebugPrintf(FILE* outputFile, const char* fmtString, ...)
{
static FxBool debugDumpP = FXFALSE;
static FxBool calledP = FXFALSE;
if (!calledP) {
const char* envStr = myGetenv("GDBG_LEVEL");
debugDumpP = ((envStr != NULL) &&
(atoi(envStr) >= 80));
calledP = FXTRUE;
}
if (debugDumpP) {
va_list args;
#if !DIRECTX
va_start(args, fmtString);
if (outputFile != NULL) vfprintf(outputFile, fmtString, args);
va_end(args);
#endif /* !DIRECTX */
va_start(args, fmtString);
{
//char msgBuf[256];
vfprintf(stderr, fmtString, args);
//vsprintf(msgBuf, fmtString, args);
//OutputDebugString(msgBuf);
}
va_end(args);
}
}
static struct {
const char* resName;
GrScreenResolution_t resId;
} resTable[] = {
{ "320x200", GR_RESOLUTION_320x200 }, /* 0x0 */
{ "320x240", GR_RESOLUTION_320x240 }, /* 0x1 */
{ "400x256", GR_RESOLUTION_400x256 }, /* 0x2 */
{ "512x384", GR_RESOLUTION_512x384 }, /* 0x3 */
{ "640x200", GR_RESOLUTION_640x200 }, /* 0x4 */
{ "640x350", GR_RESOLUTION_640x350 }, /* 0x5 */
{ "640x400", GR_RESOLUTION_640x400 }, /* 0x6 */
{ "640x480", GR_RESOLUTION_640x480 }, /* 0x7 */
{ "800x600", GR_RESOLUTION_800x600 }, /* 0x8 */
{ "960x720", GR_RESOLUTION_960x720 }, /* 0x9 */
{ "856x480", GR_RESOLUTION_856x480 }, /* 0xA */
{ "512x256", GR_RESOLUTION_512x256 }, /* 0xB */
{ "1024x768", GR_RESOLUTION_1024x768 }, /* 0xC */
{ "1280x1024", GR_RESOLUTION_1280x1024 }, /* 0xD */
{ "1600x1200", GR_RESOLUTION_1600x1200 }, /* 0xE */
{ "400x300", GR_RESOLUTION_400x300 } /* 0xF */
};
static const char*
GlideRes2String(GrScreenResolution_t res)
{
int i;
const char* retVal = NULL;
for(i = 0; i < sizeof(resTable) / sizeof(resTable[0]); i++) {
if (resTable[i].resId == res) {
retVal = resTable[i].resName;
break;
}
}
return ((retVal == NULL)
? "Unknown"
: retVal);
}
static const char*
GlideRefresh2String(GrScreenRefresh_t refresh)
{
static const char* refreshStrings[] = {
"60", "70", "72", "75", "80", "90", "100", "85", "120"
};
return ((refresh > sizeof(refreshStrings) / sizeof(refreshStrings[0]))
? "Unknown"
: refreshStrings[refresh]);
}
static void
DumpOemVideoInfo(const OemVideoTimingInfo* videoInfo)
{
if ((outFile != NULL) && (videoInfo != NULL)) {
MyDebugPrintf(outFile, "VideoTimingInfo:\n");
MyDebugPrintf(outFile, "\tGlideResolution: (0x%lX : %s)\n",
videoInfo->res, GlideRes2String(videoInfo->res));
MyDebugPrintf(outFile, "\tGlideRefreshRate: (0x%lX : %s Mhz)\n",
videoInfo->refresh, GlideRefresh2String(videoInfo->refresh));
MyDebugPrintf(outFile, "\tDepth: %ld\n", videoInfo->depth);
MyDebugPrintf(outFile, "\tHSyncOn: 0x%lX\n", videoInfo->hSyncOn);
MyDebugPrintf(outFile, "\tHSyncOff: 0x%lX\n", videoInfo->hSyncOff);
MyDebugPrintf(outFile, "\tVSyncOn: 0x%lX\n", videoInfo->vSyncOn);
MyDebugPrintf(outFile, "\tVSyncOn: 0x%lX\n", videoInfo->vSyncOff);
MyDebugPrintf(outFile, "\tHBackPorch: 0x%lX\n", videoInfo->hBackPorch);
MyDebugPrintf(outFile, "\tVBackPorch: 0x%lX\n", videoInfo->vBackPorch);
MyDebugPrintf(outFile, "\tXDimension: 0x%lX\n", videoInfo->xDimension);
MyDebugPrintf(outFile, "\tYDimension: 0x%lX\n", videoInfo->yDimension);
MyDebugPrintf(outFile, "\tClkFreq 16bpp: %g\n", videoInfo->clkFreq16bpp);
MyDebugPrintf(outFile, "\tClkFreq 24bpp: %g\n", videoInfo->clkFreq24bpp);
}
}
static void
DumpOemInitInfo(const char* fnName, const OemInitInfo* oemInfo)
{
const char* envStr = myGetenv("GDBG_LEVEL");
if ((envStr != NULL) && (atoi(envStr) >= 80)) {
if (outFile == NULL) outFile = fopen("oemdll.txt", "w");
if (outFile != NULL) {
MyDebugPrintf(outFile, "%s: \n", fnName);
if (oemInfo == NULL) goto __errExit;
MyDebugPrintf(outFile, "\tVersion: %d.%d\n",
(oemInfo->version >> 16UL), (oemInfo->version & 0xFFFFUL));
MyDebugPrintf(outFile, "\tVendorId: 0x%lX\n", oemInfo->vendorID);
MyDebugPrintf(outFile, "\tSubVendorId: 0x%lX\n", oemInfo->subvendorID);
MyDebugPrintf(outFile, "\tDeviceId: 0x%lX\n", oemInfo->deviceID);
MyDebugPrintf(outFile, "\tBoardId: 0x%lX\n", oemInfo->boardID);
MyDebugPrintf(outFile, "\tHW BaseAddr: 0x%lX\n", (FxU32)oemInfo->linearAddress);
MyDebugPrintf(outFile, "\tSliSlaveAddr: 0x%lX\n", (FxU32)oemInfo->slaveAddress);
DumpOemVideoInfo(&oemInfo->vid);
__errExit:
MyDebugPrintf(outFile, "\n");
}
}
}
/*-------------------------------------------------------------------
Function: fxoemInitMapBoard
Date: 04-Feb-98
Implementor(s): atai
Description:
null function for oem dll
Arguments:
oem - information for oem dll
Return:
-------------------------------------------------------------------*/
FX_EXPORT FxU32 FX_CSTYLE fxoemInitMapBoard(OemInitInfo *oem)
{
#define FN_NAME "fxoemInitMapBoard"
DumpOemInitInfo(FN_NAME, oem);
return 1;
#undef FN_NAME
} /* fxoemInitMapBoard */
/*-------------------------------------------------------------------
Function: fxoemGet
Date: 12-Mar-98
Implementor(s): atai
Description:
null function for oem dll
Arguments:
pname - selector to query oem dll functions
plenth - length of the parameter in bytes
param - data field
Return:
size of the parameter. O on error or not supported
-------------------------------------------------------------------*/
FX_EXPORT FxI32 FX_CSTYLE fxoemGet(FxU32 pname, FxU32 plength, FxI32 *params)
{
#define FN_NAME "fxoemGet"
switch(pname) {
case FX_OEM_TVOUT:
if (plength == 4) {
*params = FXFALSE;
return 4;
}
break;
case FX_OEM_SLIMASTER:
if (plength == 8) {
*params = 0;
*(params +1) = 0;
return 8;
}
break;
case FX_OEM_SLISLAVE:
if (plength == 8) {
*params = 0;
*(params +1) = 0;
return 8;
}
break;
}
return 0;
#undef FN_NAME
} /* fxoemGet */
/*-------------------------------------------------------------------
Function: fxoemInitVideoTiming
Date: 23-Feb-98
Implementor(s): atai
Description:
null function for oem dll
Arguments:
vid - video timing data
Return:
1 if video timing is modified
0 if video timing is unchanged
-------------------------------------------------------------------*/
FX_EXPORT FxU32 FX_CSTYLE fxoemInitVideoTiming(OemVideoTimingInfo *vid)
{
#define FN_NAME "fxoemInitVideoTiming"
DumpOemVideoInfo(vid);
return 0;
#undef FN_NAME
} /* fxoemInitSetVideo */
/*-------------------------------------------------------------------
Function: fxoemInitSetVideo
Date: 04-Feb-98
Implementor(s): atai
Description:
null function for oem dll
Arguments:
oem - information for oem dll
Return:
-------------------------------------------------------------------*/
FX_EXPORT FxU32 FX_CSTYLE fxoemInitSetVideo(OemInitInfo *oem)
{
#define FN_NAME "fxoemInitSetVideo"
DumpOemInitInfo(FN_NAME, oem);
return 1;
#undef FN_NAME
} /* fxoemInitSetVideo */
/*-------------------------------------------------------------------
Function: fxoemRestoreVideo
Date: 04-Feb-98
Implementor(s): atai
Description:
null function for oem dll
Arguments:
oem - information for oem dll
Return:
-------------------------------------------------------------------*/
FX_EXPORT FxU32 FX_CSTYLE fxoemRestoreVideo(OemInitInfo *oem)
{
#define FN_NAME "fxoemRestoreVideo"
DumpOemInitInfo(FN_NAME, oem);
if (outFile != NULL) {
fclose(outFile);
outFile = NULL;
}
return 1;
#undef FN_NAME
} /* fxoemRestoreVideo */
/*-------------------------------------------------------------------
Function: fxoemControl
Date: 23-Feb-98
Implementor(s): atai
Description:
null function for oem dll
Arguments:
mode - determine whether the VGA display or Voodoo Graphics is visiable
Return:
-------------------------------------------------------------------*/
FX_EXPORT FxU32 FX_CSTYLE fxoemControl(FxU32 mode)
{
#define FN_NAME "fxoemControlMode"
DumpOemInitInfo(FN_NAME, NULL);
return 1;
#undef FN_NAME
} /* fxoemRestoreVideo */

View File

@@ -1,93 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
*/
#ifndef __OEMINIT_H__
#define __OEMINIT_H__
#define OEMINIT_INVALID_BOARD_ID 0xdeadfeed
#define OEMINIT_VERSION 0x10001
#include "3dfx.h"
#define FX_DLL_DEFINITION
#include "fxdll.h"
#include "sst1vid.h"
#define FX_OEM_CONTROL_ACTIVATE 1
#define FX_OEM_CONTROL_DEACTIVATE 2
#define FX_OEM_TVOUT 1
#define FX_OEM_SLIMASTER 2
#define FX_OEM_SLISLAVE 3
#define FX_OEM_FBI_CONFIG_SHIFT 8
typedef enum {
OEM_READ_ONLY,
OEM_WRITE_ONLY,
OEM_READ_WRITE
} OemPciIOFlag;
typedef struct {
FxU32 regAddress;
FxU32 sizeInBytes;
OemPciIOFlag rwFlag;
} OemPciRegister;
typedef FxU32 (FX_CALL *PciConfigProc)(OemPciRegister, FxU32, FxU32 *);
typedef struct {
GrScreenResolution_t res;
GrScreenRefresh_t refresh;
FxU32 depth;
FxU32 hSyncOn;
FxU32 hSyncOff;
FxU32 vSyncOn;
FxU32 vSyncOff;
FxU32 hBackPorch;
FxU32 vBackPorch;
FxU32 xDimension;
FxU32 yDimension;
float clkFreq16bpp;
float clkFreq24bpp;
} OemVideoTimingInfo;
typedef struct {
FxU32 version; /* Version for this structure */
FxU32 vendorID; /* PCI Vendor ID field */
FxU32 subvendorID; /* PCI sub Vendor ID field */
FxU32 deviceID; /* PCI Device ID field */
FxU32 boardID; /* Board ID: defined for Voodoo2 only!!! */
FxU32 *linearAddress; /* address for primary board */
FxU32 *slaveAddress; /* address for slave board */
PciConfigProc fxoemPciWriteConfig;
PciConfigProc fxoemPciReadConfig;
OemVideoTimingInfo vid;
FxU32 reserved[42];
} OemInitInfo;
FX_EXPORT FxU32 FX_CSTYLE fxoemInitMapBoard(OemInitInfo *oem);
FX_EXPORT FxI32 FX_CSTYLE fxoemGet(FxU32 pname, FxU32 plength, FxI32 *params);
FX_EXPORT FxU32 FX_CSTYLE fxoemInitVideoTiming(OemVideoTimingInfo *vid);
FX_EXPORT FxU32 FX_CSTYLE fxoemInitSetVideo(OemInitInfo *oem);
FX_EXPORT FxU32 FX_CSTYLE fxoemRestoreVideo(OemInitInfo *oem);
FX_EXPORT FxU32 FX_CSTYLE fxoemControl(FxU32 mode);
#endif /* __OEMINIT_H__ */

View File

@@ -1,71 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*/
#define OFFICIAL 1
#define FINAL 1
#include <fxver.h>
#include "rcver.h"
#include "fxbldno.h"
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
#ifndef GLIDE3
#define VERSIONNAME "oeminit2x.dll\0"
#else
#define VERSIONNAME "oeminit3x.dll\0"
#endif
VS_VERSION_INFO VERSIONINFO
FILEVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER
PRODUCTVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER
FILEFLAGSMASK 0x0030003FL
FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG)
FILEOS VOS_DOS_WINDOWS32
FILETYPE VFT_DRV
FILESUBTYPE VFT2_DRV_INSTALLABLE
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", "3Dfx Interactive, Inc.\0"
VALUE "FileDescription", "3Dfx Interactive, Inc. OEM DLL\0"
VALUE "FileVersion", VERSIONSTR
VALUE "InternalName", VERSIONNAME
VALUE "LegalCopyright", "Copyright \251 3Dfx Interactive, Inc. 1997\0"
VALUE "OriginalFilename", VERSIONNAME
VALUE "ProductName", PRODNAME
VALUE "ProductVersion", VERSIONSTR
VALUE "Graphics Subsystem", HWSTR
END
END
BLOCK "VarFileInfo"
BEGIN
/* the following line should be extended for localized versions */
VALUE "Translation", 0x409, 1252
END
END

View File

@@ -1,47 +0,0 @@
/*
* THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
* PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
* TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
* INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
* DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
* THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
* FULL TEXT OF THE NON-WARRANTY PROVISIONS.
*
* USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
* RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
* TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
* AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
* SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
* THE UNITED STATES.
*
* COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
*/
#define MANVERSION 2
#define MANREVISION 53
#ifndef GLIDE3
#define VERSIONSTR "2.53\0"
#else
#define VERSIONSTR "3.0\0"
#endif
#if defined(CVG) || defined(VOODOO2)
# define HWSTR " Voodoo(tm)\0"
# ifdef NT_BUILD
# define PRODNAME "Glide(tm) for Voodoo\251 and Windows\256 NT\0"
# else
# define PRODNAME "Glide(tm) for Voodoo\251 and Windows\256 95/98\0"
# endif /* NT_BUILD */
#elif defined(H3)
# define HWSTR " Banshee(tm)\0"
# ifdef NT_BUILD
# define PRODNAME "Glide(tm) for Banshee\251 and Windows\256 NT\0"
# else
# define PRODNAME "Glide(tm) for Banshee\251 and Windows\256 95/98\0"
# endif /* NT_BUILD */
#else
# define PRODNAME "Something really, really important\0"
# define HWSTR " Unknown Chip\0"
#endif

View File

@@ -1,352 +0,0 @@
# Win32 makefile for Glide2/CVG and Texus2
# This makefile MUST be processed by GNU make!!!
#
# Copyright (c) 2004
#
# Daniel Borca
# Email : dborca@users.sourceforge.net
# Web : http://www.geocities.com/dborca
#
# Hiroshi Morii
# Email : koolsmoky@users.sourceforge.net
# Web : http://www.3dfxzone.it/koolsmoky
#
#
# Available options:
#
# Environment variables:
# FX_GLIDE_HW build for the given ASIC (cvg).
# default = cvg
# CPU optimize for the given processor.
# default = 6 (PentiumPro)
# DEBUG=1 disable optimizations and build for debug.
# default = no
# USE_X86=1 use assembler triangle specializations; req by CVG
# default = yes
# USE_3DNOW=1 allow 3DNow! specializations. However, the true CPU
# capabilities are still checked at run-time to avoid
# crashes.
# default = no
# USE_MMX=1 allow MMX specializations.
# default = no
# TEXUS2=1 embed Texus2 functions into Glide2.
# default = no
# FXOEM2X=1 build fxoem2x.dll
# default = no
#
# Targets:
# all: build everything
# glide2x: build Glide2x lib
# clean: remove object files
# realclean: remove all generated files
#
.PHONY: all glide2x clean realclean
.INTERMEDIATE: fxgasm.exe
.SUFFIXES: .c .obj .rc .res
###############################################################################
# general defines (user settable?)
###############################################################################
GLIDE_RES = glide.res
GLIDE_DLL = glide2x.dll
GLIDE_IMP = glide2x.lib
TEXUS_EXE = texus2.exe
FX_GLIDE_HW ?= cvg
FX_GLIDE_SW = ../../../swlibs
GLIDE_LIBDIR = ../../lib
TEXUS_EXEDIR = $(FX_GLIDE_SW)/bin
###############################################################################
# tools
###############################################################################
CC = cl
AS = nasm
LD = link
RC = rc
ifeq ($(wildcard $(addsuffix /rm.exe,$(subst ;, ,$(PATH)))),)
UNLINK = del $(subst /,\,$(1))
else
UNLINK = $(RM) $(1)
endif
###############################################################################
# defines
###############################################################################
# platform
CDEFS = -D__WIN32__ -DDIRECTX -DFX_DLL_ENABLE -D__3Dfx_PCI_CFG__
# general
CDEFS += -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKED_RGB=1 -DGLIDE_TRI_CULLING=1 -DGLIDE_DEFAULT_GAMMA=1.3f -DGLIDE_LIB=1
#CDEFS += -DGLIDE3 -DGLIDE3_ALPHA -DGLIDE3_SCALER
# special sli buffer clears
CDEFS += -DGLIDE_BLIT_CLEAR=1
# workaround for CVGs with broken tsus which cannot send commands to multiple
# tmus using chipfield. chipfield will always be set to 0xf
CDEFS += -DGLIDE_CHIP_BROADCAST=1
# subsystem
CDEFS += -DCVG
# debug
ifdef DEBUG
CDEFS += -DGDBG_INFO_ON -DGLIDE_DEBUG -DGLIDE_SANITY_ASSERT -DGLIDE_SANITY_SIZE
endif
override USE_FIFO = 1
#override USE_X86 = 1
ifeq ($(USE_X86),1)
CDEFS += -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_DISPATCH_DOWNLOAD=1
override USE_FIFO = 1
else
CDEFS += -DGLIDE_USE_C_TRISETUP=1
endif
# fifo
ifeq ($(USE_FIFO),1)
CDEFS += -DUSE_PACKET_FIFO=1 -DGLIDE_PACKET3_TRI_SETUP=1
endif
# other
CDEFS += -DGLIDE_PLUG -DGLIDE_SPLASH
ifeq ($(TEXUS2),1)
CDEFS += -DHAVE_TEXUS2
endif
###############################################################################
# flags
###############################################################################
# linker
LDFLAGS = -nologo -dll -opt:WIN98 -machine:IX86 -nodefaultlib
# assembler
ASFLAGS = -O6 -fwin32 -D__WIN32__ --prefix _
ASFLAGS += $(CDEFS)
# compiler
CFLAGS = -nologo -W3 -WX -D__MSC__=1
LDLIBS = user32.lib kernel32.lib advapi32.lib
ifdef DEBUG
CFLAGS += -Od -MTd -Zi
LDFLAGS += -debugtype:both -debug
LDLIBS += LIBCMTD.lib
else
CPU ?= 6
CFLAGS += -DNDEBUG -G$(CPU) -O2 -MT
LDLIBS += LIBCMT.lib
endif
CFLAGS += -I. -I../../incsrc -I../../init
CFLAGS += -I$(FX_GLIDE_SW)/fxmisc -I$(FX_GLIDE_SW)/newpci/pcilib -I$(FX_GLIDE_SW)/fxmemmap
CFLAGS += -I$(FX_GLIDE_SW)/texus2/lib
CFLAGS += $(CDEFS)
# cpu optimized triangle
ifeq ($(USE_MMX),1)
CFLAGS += -DGL_MMX
override USE_X86 = 1
endif
ifeq ($(USE_3DNOW),1)
CFLAGS += -DGL_AMD3D
override USE_X86 = 1
endif
###############################################################################
# objects
###############################################################################
GLIDE_OBJECTS = \
fifo.obj \
gsplash.obj \
g3df.obj \
gu.obj \
guclip.obj \
gpci.obj \
gump.obj \
diglide.obj \
disst.obj \
ditex.obj \
gbanner.obj \
gerror.obj \
gmovie.obj \
digutex.obj \
ddgump.obj \
gaa.obj \
gdraw.obj \
gglide.obj \
glfb.obj \
gsst.obj \
gtex.obj \
gtexdl.obj \
gutex.obj \
cpuid.obj \
fpu.obj \
xtexdl_def.obj
ifeq ($(USE_X86),1)
GLIDE_OBJECTS += \
xdraw2_def.obj
ifeq ($(USE_MMX),1)
GLIDE_OBJECTS += \
xtexdl_mmx.obj
endif
ifeq ($(USE_3DNOW),1)
GLIDE_OBJECTS += \
xdraw2_3dnow.obj \
xtexdl_3dnow.obj
endif
else
GLIDE_OBJECTS += \
gxdraw.obj
endif
GLIDE_OBJECTS += \
$(FX_GLIDE_SW)/newpci/pcilib/fxpci.obj \
$(FX_GLIDE_SW)/newpci/pcilib/fxw32.obj \
$(FX_GLIDE_SW)/newpci/pcilib/fxvxd.obj \
$(FX_GLIDE_SW)/newpci/pcilib/fxnt.obj \
$(FX_GLIDE_SW)/newpci/pcilib/fxmsr.obj \
../../init/canopus.obj \
../../init/dac.obj \
../../init/gamma.obj \
../../init/gdebug.obj \
../../init/info.obj \
../../init/parse.obj \
../../init/print.obj \
../../init/sli.obj \
../../init/sst1init.obj \
../../init/util.obj \
../../init/video.obj \
../../init/fxremap.obj
TEXUS_SOURCES = \
$(FX_GLIDE_SW)/texus2/lib/texuslib.c \
$(FX_GLIDE_SW)/texus2/lib/clamp.c \
$(FX_GLIDE_SW)/texus2/lib/read.c \
$(FX_GLIDE_SW)/texus2/lib/resample.c \
$(FX_GLIDE_SW)/texus2/lib/mipmap.c \
$(FX_GLIDE_SW)/texus2/lib/quantize.c \
$(FX_GLIDE_SW)/texus2/lib/ncc.c \
$(FX_GLIDE_SW)/texus2/lib/nccnnet.c \
$(FX_GLIDE_SW)/texus2/lib/pal256.c \
$(FX_GLIDE_SW)/texus2/lib/pal6666.c \
$(FX_GLIDE_SW)/texus2/lib/dequant.c \
$(FX_GLIDE_SW)/texus2/lib/view.c \
$(FX_GLIDE_SW)/texus2/lib/util.c \
$(FX_GLIDE_SW)/texus2/lib/diffuse.c \
$(FX_GLIDE_SW)/texus2/lib/write.c \
$(FX_GLIDE_SW)/texus2/lib/tga.c \
$(FX_GLIDE_SW)/texus2/lib/3df.c \
$(FX_GLIDE_SW)/texus2/lib/ppm.c \
$(FX_GLIDE_SW)/texus2/lib/rgt.c \
$(FX_GLIDE_SW)/texus2/lib/txs.c \
$(FX_GLIDE_SW)/texus2/lib/codec.c \
$(FX_GLIDE_SW)/texus2/lib/eigen.c \
$(FX_GLIDE_SW)/texus2/lib/bitcoder.c
ifeq ($(TEXUS2),1)
GLIDE_OBJECTS += $(TEXUS_SOURCES:.c=.obj)
endif
###############################################################################
# rules
###############################################################################
.c.obj:
$(CC) -Fo$@ $(CFLAGS) -c $<
.rc.res:
$(RC) -Fo$@ $(CDEFS) -I$(FX_GLIDE_SW)/fxmisc $<
###############################################################################
# main
###############################################################################
all: glide2x $(TEXUS_EXEDIR)/$(TEXUS_EXE) fxoem2x
glide2x: $(GLIDE_LIBDIR)/$(GLIDE_DLL)
$(GLIDE_LIBDIR)/$(GLIDE_DLL): $(GLIDE_OBJECTS) $(GLIDE_RES)
$(LD) -out:$@ $(LDFLAGS) $(GLIDE_OBJECTS) $(LDLIBS) $(GLIDE_RES)
$(TEXUS_EXEDIR)/$(TEXUS_EXE): $(FX_GLIDE_SW)/texus2/cmd/cmd.c $(GLIDE_LIBDIR)/$(GLIDE_IMP)
#ifeq ($(TEXUS2),1)
# $(CC) -o $@ $(CFLAGS) $^
#else
# $(warning Texus2 not enabled... Skipping $(TEXUS_EXE))
#endif
fxoem2x: $(GLIDE_LIBDIR)/fxoem2x.dll
ifeq ($(FXOEM2X),1)
$(GLIDE_LIBDIR)/fxoem2x.dll: ../oem/oeminit.obj ../oem/oeminit.res
# $(LD) -out:$@ $(LDFLAGS) ../oem/oeminit.obj $(LDLIBS) ../oem/oeminit.res
else
$(GLIDE_LIBDIR)/fxoem2x.dll:
# $(warning FxOem2x not enabled... Skipping fxoem2x.dll)
endif
###############################################################################
# rules(2)
###############################################################################
#cpuid.obj: cpudtect.asm
# $(AS) -o $@ $(ASFLAGS) $<
xdraw2_def.obj: xdraw2.asm
$(AS) -o $@ $(ASFLAGS) $<
xtexdl_def.obj: xtexdl.c
$(CC) -Fo$@ $(CFLAGS) -c $<
xtexdl_mmx.obj: xtexdl.asm
$(AS) -o $@ $(ASFLAGS) -DGL_MMX=1 $<
xdraw2_3dnow.obj: xdraw2.asm
$(AS) -o $@ $(ASFLAGS) -DGL_AMD3D=1 $<
xtexdl_3dnow.obj: xtexdl.asm
$(AS) -o $@ $(ASFLAGS) -DGL_AMD3D=1 $<
$(GLIDE_OBJECTS): fxinline.h fxgasm.h
fxinline.h: fxgasm.exe
./$< -inline > $@
fxgasm.h: fxgasm.exe
./$< -hex > $@
fxgasm.exe: fxgasm.c
$(CC) -o $@ $(CFLAGS) $<
###############################################################################
# clean, realclean
###############################################################################
clean:
-$(call UNLINK,*.obj)
-$(call UNLINK,../../init/*.obj)
-$(call UNLINK,$(FX_GLIDE_SW)/newpci/pcilib/*.obj)
-$(call UNLINK,fxinline.h)
-$(call UNLINK,fxgasm.h)
-$(call UNLINK,$(FX_GLIDE_SW)/texus2/lib/*.obj)
-$(call UNLINK,../oem/oeminit.obj)
-$(call UNLINK,../oem/oeminit.res)
realclean: clean
-$(call UNLINK,$(GLIDE_LIBDIR)/glide2x.exp)
-$(call UNLINK,$(GLIDE_LIBDIR)/$(GLIDE_DLL))
-$(call UNLINK,$(GLIDE_LIBDIR)/$(GLIDE_IMP))
-$(call UNLINK,$(TEXUS_EXEDIR)/$(TEXUS_EXE))
-$(call UNLINK,$(GLIDE_LIBDIR)/fxoem2x.exp)
-$(call UNLINK,$(GLIDE_LIBDIR)/fxoem2x.dll)
-$(call UNLINK,$(GLIDE_LIBDIR)/fxoem2x.lib)

View File

@@ -1,101 +0,0 @@
static int banner_width = 180;
static int banner_height = 90;
static unsigned short banner_data[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52aa, 0xad34, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0xacee, 0x39a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x93ea, 0xd5d0, 0x944d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9383, 0xd506, 0x8beb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc63, 0xd506, 0xd58d, 0x7b6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a82, 0xd4e4, 0xd504, 0xc54d, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5202, 0xd4e3, 0xd4e3, 0xd505, 0xcd6d, 0x5aa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0xc483, 0xd503, 0xd504, 0xd569, 0x8baa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5268, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9364, 0xd4e2, 0xd4e2, 0xd4e2, 0xd505, 0xc54e, 0x4206, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3e3, 0xd504, 0xd546, 0xd504, 0xd525, 0xc54d, 0x2103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x93a4, 0xcd4c, 0x20e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc86, 0xd504, 0xd547, 0xd548, 0xd504, 0xd526, 0xbd2f, 0x2944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ae3, 0xd504, 0xd56a, 0xd634, 0xd569, 0xd525, 0xdd69, 0x8369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49c3, 0xb487, 0xd504, 0xd528, 0x5246, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0x6ac4, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x528a, 0x39e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xd526, 0xd548, 0xd5cf, 0xd613, 0xd527, 0xd505, 0xd548, 0xacae, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49a1, 0xcce5, 0xd56a, 0xde12, 0xde98, 0xddce, 0xd548, 0xdd04, 0xc52e, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c5, 0xcce7, 0xd504, 0xd503, 0xd527, 0x7b48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e2, 0x9b83, 0xc4a4, 0xac23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5247, 0xc570, 0x736a, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9363, 0xd505, 0xd58c, 0xd634, 0xd678, 0xd5f1, 0xd548, 0xd504, 0xd58b, 0x942c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a1, 0xb444, 0xdd48, 0xddf0, 0xde98, 0xdeb9, 0xde55, 0xdd6b, 0xdd03, 0xdd8b, 0x7349, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2902, 0x9be6, 0xd527, 0xd524, 0xd524, 0xdd03, 0xd526, 0x9c09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x72c4, 0xac25, 0xd4e3, 0xd4e3, 0xd4e3, 0x8345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc85, 0xd5cf, 0xacef, 0x4227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc85, 0xd526, 0xd5f1, 0xd698, 0xd6ba, 0xd699, 0xd5cf, 0xd547, 0xd525, 0xd5ae, 0x7b6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b43, 0xdd04, 0xddae, 0xde76, 0xdeda, 0xdeda, 0xdeba, 0xddcf, 0xdd25, 0xdd47, 0xbd0c, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a04, 0xbc86, 0xdd24, 0xdd26, 0xddcf, 0xddcf, 0xdd25, 0xdd26, 0xb4ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0x8b64, 0xc4a6, 0xd503, 0xd4e3, 0xd4e3, 0xd4e3, 0xd507, 0x49e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9362, 0xd4e3, 0xd56b, 0xcdb2, 0x83cc, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xd525, 0xd548, 0xd613, 0xd6b9, 0xd6ba, 0xd6ba, 0xd677, 0xddae, 0xd527, 0xdd25, 0xd58d, 0x62c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xd505, 0xdd68, 0xde34, 0xdeda, 0xdedb, 0xdedb, 0xdeda, 0xde33, 0xdd8a, 0xdd25, 0xdd8c, 0x6b09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72e5, 0xcd06, 0xdd24, 0xdd68, 0xde33, 0xdeb9, 0xde34, 0xdd46, 0xdd25, 0xcd49, 0x20c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c1, 0x6aa4, 0xa404, 0xd4e4, 0xd504, 0xd549, 0xd5ae, 0xd5ad, 0xd548, 0xd505, 0xbc86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xd4e2, 0xd4e3, 0xd506, 0xd58c, 0xb531, 0x5248, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9363, 0xd504, 0xd5ad, 0xd655, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xde76, 0xddae, 0xdd04, 0xdd47, 0xc54d, 0x4a06, 0x0000, 0x0000, 0x0000, 0x2921, 0xbc84, 0xdd46, 0xde11, 0xde98, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb8, 0xddf0, 0xdd46, 0xdd47, 0xbcec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0x9c07, 0xdd26, 0xdd26, 0xdd8a, 0xde55, 0xdeb9, 0xdedb, 0xde55, 0xdd8b, 0xdd25, 0xdd47, 0x5246, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3983, 0x8b65, 0xbcc8, 0xd526, 0xd526, 0xd56a, 0xd612, 0xd676, 0xd698, 0xd5f2, 0xd525, 0xd506, 0x93c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a1, 0xc462, 0xd4e3, 0xd503, 0xd504, 0xd527, 0xcdd1, 0x8c0d, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc86, 0xd505, 0xd5f1, 0xde98, 0xd6ba, 0xdeda, 0xdedb, 0xdedb, 0xdeba, 0xde55, 0xdd8c, 0xdd25, 0xdd26, 0xbd2e, 0x2943, 0x0000, 0x0000, 0x9b83, 0xdd26, 0xddcd, 0xde77, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde33, 0xdd89, 0xdd25, 0xddad, 0x6ae9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5204, 0xbca8, 0xdd46, 0xdd48, 0xddcf, 0xdeb8, 0xdeda, 0xdedb, 0xdedb, 0xde97, 0xddee, 0xdd25, 0xdd46, 0x7b68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a44, 0xa3e6, 0xcce5, 0xd504, 0xd547, 0xd58c, 0xd633, 0xd698, 0xd6ba, 0xd6ba, 0xd678, 0xd5d0, 0xd504, 0xd527, 0x6286, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b82, 0xd548, 0xd58b, 0xd549, 0xd4e3, 0xd505, 0xd58c, 0xbd51, 0x5aa9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a24, 0xd526, 0xd526, 0xde35, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde34, 0xdd6a, 0xdd25, 0xdd26, 0xacac, 0x1081, 0x6aa3, 0xd504, 0xdd48, 0xde76, 0xdeda, 0xdedb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xde97, 0xddcf, 0xdd25, 0xdd47, 0xb4ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b25, 0xd507, 0xdd24, 0xdd8a, 0xde32, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xde97, 0xddef, 0xdd46, 0xdd46, 0x9c2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0x7b26, 0xbc86, 0xd525, 0xdd04, 0xd546, 0xddd0, 0xde55, 0xd699, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd634, 0xd58c, 0xd504, 0xc4e9, 0x20c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a62, 0xd527, 0xd5d0, 0xd656, 0xd5ad, 0xd527, 0xd505, 0xd527, 0xd5b0, 0x944d, 0x2924, 0x0000, 0x0000, 0x0000, 0x0000, 0x9384, 0xd525, 0xd58a, 0xde56, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde55, 0xdd48, 0xdd24, 0xdd24, 0xa3c3, 0xc4a4, 0xdd48, 0xde10, 0xdeb9, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xde54, 0xdd68, 0xdd26, 0xdd8a, 0x5a87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2922, 0xa407, 0xdd26, 0xdd45, 0xddab, 0xde55, 0xdeda, 0xdedb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdeb8, 0xde32, 0xdd46, 0xdd25, 0xb4cb, 0x0000, 0x0000, 0x0000, 0x5224, 0x9be7, 0xcce7, 0xdd04, 0xdd47, 0xdd8b, 0xde11, 0xde97, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd6b9, 0xd612, 0xd569, 0xd504, 0xa3e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0xc4c5, 0xd5af, 0xd698, 0xd698, 0xd634, 0xd58c, 0xd525, 0xd526, 0xd56a, 0xbd70, 0x62e9, 0x0000, 0x0000, 0x0000, 0xbc85, 0xd526, 0xddf0, 0xde98, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeb9, 0xde32, 0xdd48, 0xdd25, 0xdd24, 0xdd46, 0xddcd, 0xdeb8, 0xdeda, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xde97, 0xddee, 0xdd46, 0xdd46, 0xacad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5224, 0xc4e9, 0xdd25, 0xdd47, 0xde10, 0xde97, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde75, 0xdd68, 0xdd25, 0xcd29, 0x3142, 0x7306, 0xb467, 0xd527, 0xdd25, 0xdd48, 0xddce, 0xde54, 0xde98, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde98, 0xd5d0, 0xd546, 0xd526, 0x7305, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c2, 0x39a5, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3e4, 0xd56b, 0xd655, 0xd6ba, 0xd6ba, 0xd698, 0xd5f1, 0xd549, 0xd504, 0xd525, 0xd5ad, 0x9c6d, 0x3163, 0x5a23, 0xd525, 0xdd47, 0xde55, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde32, 0xddce, 0xddcd, 0xde11, 0xde97, 0xdeda, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xded9, 0xde54, 0xdd47, 0xdd46, 0xddcd, 0x5246, 0x0000, 0x0000, 0x0000, 0x0000, 0x8347, 0xd527, 0xdd46, 0xdd8a, 0xde32, 0xded9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde97, 0xddab, 0xdd46, 0xdd24, 0xcd06, 0xdd46, 0xdd46, 0xdd8b, 0xddcd, 0xde76, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd654, 0xd58b, 0xd525, 0xcd4a, 0x3163, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3143, 0x5a65, 0x7b27, 0x9bc7, 0xac46, 0xc4a5, 0x93e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72a2, 0xd548, 0xd5f1, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6b9, 0xd656, 0xd5ae, 0xd525, 0xd504, 0xdd47, 0xc4c6, 0xb444, 0xdd26, 0xdd8a, 0xde97, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefa, 0xde97, 0xddab, 0xdd46, 0xdd67, 0xa48d, 0x0000, 0x0000, 0x3163, 0xac27, 0xdd68, 0xdd45, 0xddcd, 0xde75, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde97, 0xddcd, 0xdd47, 0xdd24, 0xdd67, 0xddac, 0xde12, 0xde76, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde12, 0xd569, 0xd526, 0xb468, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2103, 0x4a26, 0x7307, 0x93a6, 0xa426, 0xbca7, 0xd506, 0xd4e3, 0xd4e2, 0xd4e2, 0xd4e3, 0xb445, 0x18a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3141, 0xcce5, 0xd5ad, 0xd6b9, 0xd6ba, 0xd6ba, 0xd6ba, 0xdeba, 0xde99, 0xd654, 0xd56a, 0xd525, 0xdd03, 0xdd03, 0xdd48, 0xddef, 0xdeb8, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xded9, 0xde52, 0xdd68, 0xdd45, 0xd5af, 0x4a05, 0x5a65, 0xc4e7, 0xdd46, 0xdd68, 0xddef, 0xde96, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde76, 0xddef, 0xde31, 0xdeb8, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xddce, 0xdd25, 0xd547, 0x8366, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39a4, 0x62c7, 0x8388, 0x9c29, 0xb487, 0xccc5, 0xd507, 0xd504, 0xd504, 0xd505, 0xd527, 0xd528, 0xd548, 0xd505, 0xd4e2, 0xc4c6, 0x4182, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xabe2, 0xd56b, 0xd678, 0xd6ba, 0xdeba, 0xd6ba, 0xdeda, 0xdeda, 0xdeba, 0xde98, 0xd5f0, 0xddad, 0xdd8c, 0xddcf, 0xde97, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xded9, 0xddab, 0xdd45, 0xdd68, 0xc4a7, 0xd548, 0xdd46, 0xdd89, 0xde32, 0xe6d9, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde98, 0xdd8c, 0xdd04, 0xd56b, 0x4a04, 0x0000, 0x2944, 0x5a87, 0x7b48, 0x93e7, 0xac68, 0xc4ea, 0xd56a, 0xd527, 0xd525, 0xd505, 0xd526, 0xd549, 0xd58c, 0xd5d0, 0xd5f3, 0xd635, 0xd656, 0xd655, 0xd58c, 0xd506, 0xccc4, 0x6264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ae2, 0xd549, 0xd634, 0xd6b9, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeda, 0xdeda, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe6fa, 0xde31, 0xdd89, 0xe546, 0xdd45, 0xe567, 0xddaa, 0xe696, 0xe6fa, 0xe71b, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeba, 0xde54, 0xdd6b, 0xdd03, 0xcd08, 0xa448, 0xbcc9, 0xd528, 0xd526, 0xd525, 0xd505, 0xd505, 0xd526, 0xd528, 0xd56a, 0xd5ce, 0xd633, 0xd677, 0xd699, 0xd699, 0xd6ba, 0xd6ba, 0xd6ba, 0xd677, 0xd5cf, 0xd506, 0xd505, 0x8345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a48, 0xa48c, 0x940a, 0x734a, 0x4207, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0xd506, 0xd5cf, 0xde98, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xad75, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x8430, 0x94b2, 0xb5b6, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71b, 0xe6d9, 0xe653, 0xe5ed, 0xe5cc, 0xe631, 0xe6b8, 0xe6fb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde10, 0xdd49, 0xdd03, 0xdd03, 0xdd04, 0xdd27, 0xd547, 0xd569, 0xd5ae, 0xddf1, 0xd634, 0xd676, 0xd698, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd678, 0xd5f1, 0xd506, 0xd504, 0xa427, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a43, 0xc4a5, 0xd505, 0xd56c, 0xbd2d, 0xa4ae, 0x83cc, 0x5ac8, 0x2124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb446, 0xddab, 0xde97, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0x8430, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x39e7, 0x4208, 0x738e, 0xa534, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71b, 0xe71b, 0xe71b, 0xe71b, 0xe71b, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xde75, 0xddce, 0xddcd, 0xde11, 0xde54, 0xde55, 0xde77, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xdeba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd699, 0xd5f2, 0xd547, 0xd504, 0xbc85, 0x2922, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xc482, 0xd4e3, 0xd504, 0xd505, 0xd527, 0xd56b, 0xcd90, 0xb4cd, 0x942c, 0x734b, 0x39c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8323, 0xdd47, 0xde54, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0x5aeb, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0xb5b6, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xdeda, 0xdeba, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd613, 0xd56a, 0xd505, 0xcd08, 0x5204, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xc4a3, 0xd526, 0xd569, 0xd526, 0xd505, 0xd505, 0xd504, 0xd525, 0xd548, 0xd5ae, 0xbd4e, 0xa48e, 0x838a, 0x5a45, 0x51e2, 0xd506, 0xddf0, 0xde97, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xb5b6, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0xad55, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe71c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xd6ba, 0xd6ba, 0xd6ba, 0xd655, 0xd58d, 0xd503, 0xd549, 0x72e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xc4c6, 0xd5ae, 0xd677, 0xd655, 0xd612, 0xd5cf, 0xd56a, 0xd525, 0xd503, 0xd503, 0xd504, 0xd526, 0xd547, 0xccc4, 0xd505, 0xddce, 0xde77, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0x738e, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xdedb, 0xd6ba, 0xd677, 0xd58c, 0xd526, 0xd505, 0x93c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a21, 0xccc6, 0xd5cd, 0xd677, 0xd699, 0xd6ba, 0xd6b9, 0xd699, 0xde77, 0xd611, 0xd58b, 0xdd47, 0xdd26, 0xdd26, 0xdd69, 0xde33, 0xdeb8, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xd69a, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0xc638, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xa514, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xd6ba, 0xd6ba, 0xd698, 0xd5ad, 0xd526, 0xd505, 0xb48a, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xccc6, 0xd5f1, 0xd677, 0xd6ba, 0xdeba, 0xd6ba, 0xdeba, 0xdeba, 0xdeb9, 0xde98, 0xde55, 0xde76, 0xde97, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xd6ba, 0x8430, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0xad55, 0xe71c, 0xe71c, 0xe71c, 0xad75, 0x4228, 0x4a49, 0x7bcf, 0xad75, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde98, 0xd611, 0xd527, 0xd504, 0xc52b, 0x39a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xccc5, 0xd5f1, 0xd698, 0xd6ba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0x8430, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x7bcf, 0xe71c, 0xe71c, 0xe71c, 0x7bcf, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x8c71, 0xbdf7, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xad75, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde98, 0xde33, 0xd547, 0xd525, 0xcd28, 0x6286, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcce7, 0xd5f1, 0xde98, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xc638, 0xb5b6, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xb5b6, 0x9cd3, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x52aa, 0xce59, 0xe71c, 0xce59, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0xa514, 0xce79, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0x9cf3, 0x4a49, 0x4a49, 0x9cf3, 0xbdf7, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde34, 0xdd69, 0xdd25, 0xd569, 0x8389, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcce6, 0xd5f0, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xc638, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0xbdf7, 0xe73c, 0x8c71, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x7bef, 0xb596, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xce79, 0x4a69, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0xad55, 0x9cf3, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde55, 0xddad, 0xdd04, 0xdd26, 0xb4cb, 0x3185, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcd09, 0xde11, 0xdeb9, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xbdd7, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x9cf3, 0xce59, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0xb5b6, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0x7bef, 0x4a69, 0x4a69, 0x632c, 0x4a49, 0x4a49, 0x528a, 0x4a49, 0x630c, 0x4228, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xddf0, 0xdd47, 0xdd04, 0xdd26, 0xd58b, 0xd5d0, 0xc56f, 0xbcee, 0xa46c, 0x940b, 0x838a, 0x6b09, 0x5247, 0x2123, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b03, 0xdd47, 0xde32, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xbdd7, 0xbdd7, 0xbdd7, 0x9cd3, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x8c71, 0x9cf3, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0xc638, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0x4a69, 0x7bef, 0x4a69, 0x632c, 0x4a69, 0x630c, 0x4a49, 0x7bcf, 0x4a49, 0x8c71, 0x630c, 0x4228, 0xe71c, 0xd6ba, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeba, 0xde75, 0xddef, 0xdd69, 0xdd26, 0xdd26, 0xdd26, 0xdd05, 0xd505, 0xd525, 0xd526, 0xd526, 0xd548, 0xd549, 0xd56c, 0xc4e8, 0xb4a9, 0xa44a, 0x93eb, 0x7b6a, 0x62c8, 0x41e5, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5204, 0x8b86, 0xbc86, 0xd505, 0xdd26, 0xddce, 0xdeb9, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0x9492, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4a49, 0x7bcf, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0xbdd7, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0x9492, 0xb596, 0xc618, 0x7bef, 0x4a69, 0x7bef, 0x4a49, 0x8c71, 0x4a49, 0x4a49, 0xad75, 0x4a49, 0x7bcf, 0x9cf3, 0x4228, 0x8c51, 0xce59, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde76, 0xde54, 0xde33, 0xd611, 0xd5d0, 0xd5ae, 0xd58d, 0xd56b, 0xd549, 0xd527, 0xd525, 0xd504, 0xd4e3, 0xd4e3, 0xd504, 0xd504, 0xd506, 0xbc65, 0x4a25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a44, 0x9385, 0xbc65, 0xd527, 0xdd26, 0xdd46, 0xddad, 0xde55, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0x630c, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x5acb, 0xad55, 0xef7d, 0xef7d, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xc638, 0xd69a, 0xef5d, 0xef5d, 0xc618, 0xc618, 0x4a69, 0x9492, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0xce79, 0x9cf3, 0x4228, 0x4228, 0x630c, 0x4228, 0x9cd3, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeda, 0xdeba, 0xdeba, 0xd6ba, 0xd6b9, 0xd699, 0xd698, 0xd678, 0xd677, 0xd656, 0xd5f2, 0xd548, 0xd504, 0xd4c2, 0x9bc4, 0x3121, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a44, 0x93a6, 0xbca6, 0xd525, 0xd526, 0xdd47, 0xdd8c, 0xde11, 0xde76, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xad55, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x528a, 0x528a, 0x52aa, 0x52aa, 0x52aa, 0x52aa, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0xce59, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xc638, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xd69a, 0xce59, 0xef5d, 0x9492, 0x8c71, 0x4a49, 0x4a49, 0xbdf7, 0xbdf7, 0x4228, 0x4228, 0x4228, 0x73ae, 0x4228, 0x4208, 0x73ae, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd6ba, 0xd6ba, 0xd698, 0xd634, 0xd56a, 0xd505, 0xbc85, 0x6262, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c1, 0x5a65, 0x93a4, 0xc4a5, 0xd525, 0xd505, 0xd548, 0xd5ad, 0xd633, 0xde77, 0xdeb9, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x39e7, 0x2165, 0x2185, 0x2186, 0x21c6, 0x2a07, 0x3228, 0x4228, 0x4a49, 0x4a49, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x528a, 0x94b2, 0x8410, 0x52aa, 0x52aa, 0x52aa, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5acb, 0x5aeb, 0x5aeb, 0x5aeb, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xbdd7, 0x52aa, 0x52aa, 0xa534, 0xd69a, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xc618, 0x8c71, 0x7bcf, 0x4a49, 0x4228, 0x4228, 0x8c71, 0xe73c, 0x4228, 0x630c, 0x4208, 0x8c51, 0x8c51, 0xad55, 0xe71c, 0xc638, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xd6ba, 0xdeba, 0xd656, 0xd5ce, 0xd527, 0xd4e5, 0x9ba3, 0x2901, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c1, 0x6264, 0x9bc5, 0xc4a5, 0xd505, 0xd525, 0xd549, 0xd5ae, 0xd634, 0xde98, 0xdeba, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x1904, 0x08e3, 0x0903, 0x0944, 0x0985, 0x09c6, 0x09e6, 0x09e6, 0x21e7, 0x3a08, 0x4a49, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x528a, 0x8410, 0xef7d, 0xef7d, 0xd6ba, 0xad55, 0x8430, 0x5acb, 0x5acb, 0x5acb, 0x5aeb, 0x5aeb, 0x5aeb, 0x5aeb, 0x630c, 0x5aeb, 0xbdf7, 0xf7be, 0xf7be, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0x5acb, 0x52aa, 0x52aa, 0x52aa, 0x528a, 0xd69a, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0x8c71, 0xbdf7, 0x8430, 0x7bcf, 0x8c71, 0x4228, 0x73ae, 0x4228, 0x630c, 0x4208, 0x9cd3, 0x4208, 0x4208, 0xce79, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xd698, 0xd612, 0xd56b, 0xd504, 0xbc85, 0x5a43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x6a83, 0x9bc4, 0xc4c6, 0xd505, 0xd526, 0xd569, 0xd5cf, 0xd655, 0xd698, 0xd6b9, 0xdeba, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4208, 0x2986, 0x08c3, 0x08e3, 0x0903, 0x0924, 0x0965, 0x09c6, 0x09e7, 0x09e6, 0x09c6, 0x0985, 0x31c7, 0x4a69, 0x4a69, 0x4a69, 0x4a69, 0x4228, 0xad75, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xbdf7, 0x8c51, 0x5aeb, 0x5aeb, 0x630c, 0x630c, 0x630c, 0x630c, 0x630c, 0x8c71, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf79e, 0xad75, 0x5acb, 0x5acb, 0x4228, 0x3186, 0x39c7, 0xb596, 0xdefb, 0xef5d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xbdd7, 0x9492, 0x4228, 0x4228, 0x4228, 0x4228, 0x4208, 0x4208, 0x4208, 0x4208, 0x9cd3, 0xbdf7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeb9, 0xde55, 0xd5ad, 0xdd27, 0xd506, 0x93a5, 0x20e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3143, 0x9bc5, 0xc4c5, 0xd4e3, 0xd4e3, 0xd505, 0xd58c, 0xd633, 0xd698, 0xd6b9, 0xd6ba, 0xd6ba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xb5b6, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xad55, 0x4208, 0x4208, 0x4208, 0x4208, 0x08e3, 0x08c3, 0x08c3, 0x0903, 0x0924, 0x0965, 0x09a6, 0x09e6, 0x09e7, 0x09c6, 0x0985, 0x0924, 0x4228, 0x4a69, 0x528a, 0x39e7, 0x08c2, 0x2165, 0x632c, 0x8c92, 0xb5b6, 0xd69a, 0xef7d, 0xf7be, 0xf7be, 0x9cf3, 0x630c, 0x630c, 0x630c, 0x632c, 0x632c, 0x632c, 0x632c, 0xdefb, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xdedb, 0x5aeb, 0x5acb, 0x52aa, 0x18e3, 0x0861, 0x0861, 0x4208, 0x73ae, 0x4208, 0x9cd3, 0x9492, 0xd69a, 0xdefb, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0x7bcf, 0x9cf3, 0x8c71, 0x4228, 0x4208, 0x4208, 0x4208, 0x4208, 0x9cd3, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdeba, 0xde97, 0xde11, 0xdd47, 0xd526, 0xbc86, 0x6244, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3121, 0x6a82, 0x9b82, 0xbc63, 0xd505, 0xd58b, 0xd612, 0xd677, 0xd6b9, 0xd6ba, 0xdeba, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0x738e, 0x39e7, 0xc638, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0x9cf3, 0x4208, 0x4228, 0x4228, 0x1924, 0x08c3, 0x08e3, 0x0965, 0x0985, 0x09a6, 0x09e7, 0x0a28, 0x0a28, 0x09e7, 0x09a6, 0x0945, 0x31c6, 0x528a, 0x4a49, 0x0903, 0x08c2, 0x08c2, 0x08c2, 0x0903, 0x0965, 0x0965, 0x3a69, 0x73cf, 0x9d34, 0xce79, 0x9cf3, 0x632c, 0x632c, 0x6b4d, 0x6b4d, 0x6b4d, 0x6b4d, 0xb5b6, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xa514, 0x5aeb, 0x5aeb, 0x39c7, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x10a2, 0x0861, 0x0861, 0x632c, 0x4228, 0xce59, 0x7bcf, 0xa534, 0xdefb, 0xdedb, 0xe73c, 0xe73c, 0xce79, 0x4228, 0xe73c, 0xce59, 0xbdf7, 0x8c51, 0x4208, 0x4208, 0xbdd7, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeb8, 0xde54, 0xdd8c, 0xdd25, 0xd505, 0x93a5, 0x20e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4181, 0x7ae3, 0xa3e5, 0xc4a5, 0xd548, 0xd5cf, 0xde55, 0xde77, 0xdeb9, 0xdeba, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xbdd7, 0x39e7, 0x39e7, 0x39e7, 0x8430, 0xce59, 0xe73c, 0xe71c, 0xe73c, 0xad75, 0x4208, 0x4208, 0x4208, 0x2985, 0x08e3, 0x0985, 0x09c6, 0x0a27, 0x0a28, 0x09e7, 0x0a07, 0x0a68, 0x0aa9, 0x0a69, 0x09c6, 0x2165, 0x4a69, 0x2185, 0x08e3, 0x08c2, 0x08c2, 0x08a2, 0x0903, 0x0944, 0x0965, 0x0965, 0x0965, 0x0985, 0x0985, 0x2a28, 0x3a28, 0x52cb, 0x6b4d, 0x6b4d, 0x6b6d, 0x6b6d, 0xad55, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xe71c, 0x630c, 0x630c, 0x52aa, 0x2104, 0x3186, 0x0861, 0x0861, 0x31a6, 0x0861, 0x6b4d, 0x0861, 0x39c7, 0x4a49, 0x6b4d, 0xad55, 0x0861, 0x0861, 0x4a69, 0x0861, 0x8c51, 0x7bcf, 0xbdd7, 0xc618, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xbdf7, 0xce59, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xde97, 0xddcf, 0xdd46, 0xdd26, 0xbc86, 0x5a43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a1, 0x5202, 0x8b43, 0xac25, 0xcd07, 0xdd8c, 0xddf0, 0xde54, 0xde98, 0xdeda, 0xdeda, 0xdedb, 0xdedb, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0x8430, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x8c51, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x31c7, 0x0944, 0x09a6, 0x09a5, 0x09e7, 0x0a27, 0x0a68, 0x0a28, 0x0a07, 0x0a28, 0x0a89, 0x0a89, 0x09c6, 0x31e7, 0x0903, 0x08e3, 0x08c2, 0x08e3, 0x08c2, 0x08c3, 0x0944, 0x0965, 0x0965, 0x0965, 0x0985, 0x0985, 0x09a6, 0x0985, 0x0965, 0x3a28, 0x632c, 0x738e, 0x738e, 0x738e, 0xffff, 0xffff, 0xffff, 0xffff, 0x9492, 0x632c, 0x630c, 0x5acb, 0x39e7, 0x5acb, 0xc638, 0xc618, 0xbdd7, 0x39e7, 0x7bcf, 0x0861, 0x4208, 0x0861, 0x6b4d, 0x8c51, 0x0861, 0x2945, 0x2945, 0x8430, 0x10a2, 0x10a2, 0x10a2, 0x94b2, 0x738e, 0xdedb, 0xad75, 0xb5b6, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeb9, 0xde32, 0xdd8a, 0xdd47, 0xd506, 0x8b86, 0x20c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e1, 0x6262, 0x9384, 0xb465, 0xd548, 0xddce, 0xde33, 0xde76, 0xdeb9, 0xdeda, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x39e7, 0x39e7, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4208, 0x31e7, 0x2186, 0x52ca, 0x634d, 0x1144, 0x09a6, 0x0a48, 0x0a89, 0x0a68, 0x0a48, 0x0a68, 0x0a48, 0x0965, 0x0924, 0x08e3, 0x0924, 0x0965, 0x0944, 0x0924, 0x0965, 0x09a6, 0x0985, 0x0965, 0x0965, 0x0985, 0x09a6, 0x0985, 0x0965, 0x0965, 0x1985, 0x632c, 0x73ae, 0x738e, 0xdedb, 0xffff, 0xffff, 0xb596, 0x6b4d, 0x632c, 0x4208, 0x2124, 0x31a6, 0x7bef, 0xe73c, 0xf7be, 0xef5d, 0xc618, 0x528a, 0x4228, 0x73ae, 0x7bcf, 0x8c71, 0x10a2, 0x4a49, 0x94b2, 0x3186, 0x7bcf, 0x2945, 0x4a49, 0x0861, 0x2104, 0x2945, 0x8c51, 0x0861, 0x39c7, 0xdefb, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde76, 0xdd8a, 0xdd46, 0xdd25, 0xd56b, 0xac8d, 0x6b09, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0x72c3, 0x9bc4, 0xcce6, 0xddab, 0xde33, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x3186, 0x0903, 0x0924, 0x0903, 0x08e3, 0x0944, 0x0965, 0x0a68, 0x0aca, 0x0aca, 0x0aa9, 0x0a89, 0x09c6, 0x0924, 0x0903, 0x0985, 0x09c6, 0x09e7, 0x09e6, 0x09a6, 0x09c6, 0x0a27, 0x0a07, 0x09e7, 0x09e7, 0x09e6, 0x09a6, 0x0985, 0x0965, 0x0944, 0x2165, 0x6b6d, 0x7bcf, 0xffff, 0xffff, 0xffff, 0x6b6d, 0x6b4d, 0x5acb, 0x0861, 0x0861, 0x0861, 0x0861, 0xb596, 0xf7be, 0xf7be, 0xf7be, 0x7bef, 0x528a, 0x528a, 0x8410, 0xef7d, 0xdedb, 0xe73c, 0xdedb, 0x7bcf, 0x738e, 0x39c7, 0x2104, 0x0861, 0x10a2, 0x528a, 0x2104, 0x0861, 0x94b2, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde75, 0xddcd, 0xdd47, 0xdd25, 0xdd47, 0xddce, 0xc56f, 0x8c2d, 0x4207, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4181, 0xbc85, 0xdd68, 0xde11, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x39e7, 0x08e3, 0x08e3, 0x0944, 0x0903, 0x08e3, 0x0924, 0x0965, 0x0a48, 0x0aa9, 0x0aea, 0x0b0b, 0x0aca, 0x09c6, 0x0924, 0x0985, 0x0944, 0x0965, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x0a48, 0x0a89, 0x0aa9, 0x0a89, 0x0a28, 0x09c6, 0x0945, 0x0904, 0x5acb, 0x7bef, 0xc638, 0xe71c, 0xce79, 0x738e, 0x6b4d, 0x2945, 0x0861, 0x0861, 0x0861, 0x0861, 0xa514, 0xf7be, 0xf7be, 0xf7be, 0xbdd7, 0x528a, 0x528a, 0x528a, 0xd6ba, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xce59, 0x8c51, 0x94b2, 0xa534, 0xad75, 0x9cd3, 0x4a49, 0x39c7, 0xc638, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xde97, 0xddef, 0xdd69, 0xdd46, 0xdd25, 0xdd47, 0xd5af, 0xacce, 0x6b2a, 0x10a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a1, 0xc4a6, 0xdd47, 0xde11, 0xdeb8, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x31a6, 0x08c2, 0x08c2, 0x0924, 0x0904, 0x08e3, 0x0904, 0x09e6, 0x0a48, 0x0a89, 0x0aaa, 0x0aca, 0x0a89, 0x0924, 0x0985, 0x09e7, 0x0985, 0x0944, 0x0944, 0x0985, 0x638d, 0x4aeb, 0x09c6, 0x09c6, 0x09e7, 0x0a48, 0x0aa9, 0x0aca, 0x0aaa, 0x0a89, 0x0a28, 0x0965, 0x3a08, 0x8410, 0x7bef, 0x7bcf, 0x7bcf, 0x738e, 0x4a49, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a49, 0xef5d, 0xffdf, 0xf7be, 0xf7be, 0xdefb, 0x52aa, 0x528a, 0x528a, 0xbdd7, 0xf79e, 0xef7d, 0xef7d, 0xd69a, 0xa514, 0x4208, 0x94b2, 0xd69a, 0xef5d, 0xef5d, 0xce79, 0xd69a, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xde98, 0xde54, 0xddce, 0xdd48, 0xdd25, 0xdd48, 0xdd8c, 0xc570, 0x942d, 0x4a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49c2, 0xc4a5, 0xdd46, 0xddf0, 0xdeb7, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0x8c51, 0x39e7, 0x39e7, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4228, 0x4228, 0x39e7, 0x08c2, 0x08c2, 0x0944, 0x0924, 0x0924, 0x0944, 0x0985, 0x09e7, 0x0a28, 0x0a68, 0x0a69, 0x09a5, 0x0944, 0x0985, 0x0985, 0x0985, 0x0965, 0x0965, 0x73cf, 0xffdf, 0xffdf, 0xa534, 0x52cb, 0x3a69, 0x19e7, 0x0a27, 0x0a69, 0x0aa9, 0x0a89, 0x0a89, 0x0a68, 0x1985, 0x7bef, 0x8410, 0x7bef, 0x7bcf, 0x632c, 0x1082, 0x0861, 0x0861, 0x0861, 0x0861, 0xc618, 0xffdf, 0xdedb, 0x9492, 0xb5b6, 0xd6ba, 0x94b2, 0x528a, 0x528a, 0x8410, 0xf79e, 0xc638, 0x9492, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4228, 0x5aeb, 0x8c71, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdeda, 0xde97, 0xddf0, 0xdd6a, 0xdd26, 0xdd26, 0xdd47, 0xd58d, 0xaccd, 0x732a, 0x18e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e2, 0xc4c5, 0xdd46, 0xddef, 0xde98, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xad75, 0x8c51, 0x4208, 0x4208, 0x4208, 0x31a6, 0x31c7, 0x4208, 0x4208, 0x4228, 0x4228, 0x4228, 0x10e3, 0x0924, 0x0965, 0x0944, 0x0944, 0x0944, 0x0924, 0x0944, 0x0985, 0x09a6, 0x0944, 0x08e3, 0x09c6, 0x09a6, 0x0965, 0x0965, 0x0965, 0x21e7, 0xb5b6, 0xa514, 0x632c, 0x632c, 0x6b4d, 0x6b6d, 0x6b6d, 0x428a, 0x0a48, 0x0a89, 0x0a89, 0x0a68, 0x0a27, 0x09c6, 0x73ae, 0x8430, 0x7bef, 0x7bcf, 0x3186, 0x0861, 0x0861, 0x0861, 0x0861, 0x3186, 0xc618, 0xffff, 0xef7d, 0x2124, 0x0861, 0x0861, 0x4228, 0x4a69, 0x528a, 0x528a, 0x8410, 0x4a69, 0x4a69, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4a49, 0x4228, 0x4228, 0xb596, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xde98, 0xde34, 0xddcf, 0xdd47, 0xdd04, 0xd525, 0xd569, 0xc54e, 0x940b, 0x4a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5203, 0xccc5, 0xdd68, 0xde10, 0xdeb9, 0xdedb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xbdf7, 0x9cf3, 0x6b4d, 0x08e3, 0x08e3, 0x2165, 0x31c7, 0x39e7, 0x3a07, 0x7bef, 0x4249, 0x0985, 0x09c6, 0x09a6, 0x0965, 0x0985, 0x1185, 0x1965, 0x0903, 0x08e3, 0x08a2, 0x0924, 0x09c6, 0x09a6, 0x0985, 0x0985, 0x09a6, 0x3a49, 0x5aeb, 0x630c, 0x632c, 0x6b4d, 0x6b4d, 0x6b6d, 0x738e, 0x3208, 0x09e7, 0x0a89, 0x0a89, 0x0a48, 0x09c6, 0x0944, 0xad96, 0x9cd3, 0x8410, 0x52aa, 0x0861, 0x0861, 0x0861, 0x0861, 0x18c3, 0x5aeb, 0x630c, 0xffff, 0xffff, 0x9cd3, 0x0861, 0x0861, 0x0861, 0x39c7, 0x528a, 0x528a, 0x4a69, 0x4a69, 0x4a49, 0x39c7, 0x39e7, 0x4228, 0x4a49, 0x4228, 0x7bcf, 0xad55, 0xd69a, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdedb, 0xdedb, 0xdeda, 0xdeba, 0xde98, 0xde11, 0xdd6a, 0xd504, 0xd504, 0xd505, 0xd549, 0xb445, 0x7305, 0x2102, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0xcce6, 0xdd69, 0xde10, 0xded9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0x634d, 0x08c2, 0x08e3, 0x0903, 0x0924, 0x0944, 0x0944, 0x0924, 0x08e3, 0x0944, 0x09a6, 0x09a6, 0x0985, 0x0965, 0x31c7, 0x29a6, 0x08e3, 0x08e3, 0x08c2, 0x0944, 0x0985, 0x0985, 0x0965, 0x0944, 0x21c6, 0x5acb, 0x5aeb, 0x630c, 0x632c, 0x6b4d, 0x6b4d, 0x6b6d, 0x4aaa, 0x0944, 0x0985, 0x0a69, 0x0a68, 0x0a28, 0x09a6, 0x0965, 0x3a69, 0x4228, 0x528a, 0x10a2, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a69, 0x632c, 0x630c, 0xffff, 0xffff, 0xc638, 0x31a6, 0x0861, 0x0861, 0x10a2, 0x4a69, 0x4a69, 0x4208, 0x2965, 0x10a2, 0x0861, 0x0861, 0x1082, 0x39e7, 0x7bcf, 0xdefb, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdedb, 0xdeda, 0xdeda, 0xdeb9, 0xde97, 0xde54, 0xde12, 0xddcf, 0xdd6a, 0xdd25, 0xd504, 0xc4a4, 0xac04, 0x8b64, 0x6aa4, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a42, 0xccc5, 0xdd68, 0xde10, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xe71c, 0x3a28, 0x08a2, 0x08e3, 0x08e3, 0x0924, 0x0944, 0x0965, 0x0944, 0x08e3, 0x08e3, 0x0965, 0x09a6, 0x09a6, 0x0985, 0x1185, 0x0924, 0x08e3, 0x08e3, 0x0924, 0x0924, 0x0944, 0x0965, 0x09a6, 0x11a6, 0x4a8a, 0x5aeb, 0x5aeb, 0x630c, 0x632c, 0x632c, 0x634d, 0x4289, 0x09a6, 0x0965, 0x0985, 0x0a89, 0x0a89, 0x0a27, 0x09c6, 0x0944, 0x0903, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x31a6, 0x9cf3, 0x630c, 0xa534, 0xb5b6, 0x5aeb, 0x5acb, 0x4228, 0x0861, 0x0861, 0x0861, 0x2945, 0x18e3, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0xb596, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdeda, 0xdeda, 0xdeb8, 0xde54, 0xddee, 0xdd69, 0xdd46, 0xdd26, 0xcce6, 0xb444, 0x9b83, 0x72c2, 0x49c2, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6242, 0xcce5, 0xdd68, 0xde32, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0x7bef, 0x08a2, 0x0924, 0x0903, 0x0924, 0x0944, 0x0944, 0x0944, 0x0903, 0x08e3, 0x0985, 0x09c6, 0x0985, 0x0965, 0x0965, 0x0924, 0x0903, 0x0924, 0x09a6, 0x09a6, 0x0965, 0x0944, 0x0965, 0x3a28, 0x5acb, 0x5aeb, 0x5aeb, 0x630c, 0x630c, 0x52aa, 0x2a28, 0x09a6, 0x09a6, 0x0985, 0x09c6, 0x0aa9, 0x0aa9, 0x0a68, 0x09e7, 0x0965, 0x08c3, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x39c7, 0x630c, 0x5aeb, 0x5aeb, 0x5acb, 0x528a, 0x18e3, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a49, 0x9492, 0xd6ba, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe6fb, 0xded9, 0xde96, 0xde53, 0xde10, 0xddac, 0xdd68, 0xdd45, 0xd505, 0xbc64, 0xa3c4, 0x8303, 0x5a22, 0x20c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a62, 0xd4e6, 0xdd68, 0xde32, 0xdeb8, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xa555, 0x08a2, 0x0944, 0x0944, 0x0965, 0x0944, 0x0965, 0x0965, 0x0924, 0x0924, 0x0985, 0x0965, 0x0924, 0x0944, 0x0965, 0x0944, 0x0924, 0x0985, 0x09c6, 0x09c6, 0x09e7, 0x09a6, 0x0965, 0x21a6, 0x31e7, 0x3a28, 0x3269, 0x3248, 0x11a6, 0x0985, 0x09e6, 0x09a6, 0x0985, 0x09a6, 0x09e6, 0x0a48, 0x0a89, 0x0a68, 0x0a07, 0x3269, 0x7c10, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x5acb, 0x52aa, 0x4208, 0x2945, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x4a69, 0x94b2, 0xce59, 0xef7d, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71b, 0xe6fb, 0xe6d9, 0xe674, 0xe630, 0xe5aa, 0xdd68, 0xdd47, 0xdd47, 0xccc6, 0xac25, 0x8b64, 0x6284, 0x3142, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6aa3, 0xd505, 0xdd48, 0xde54, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xce79, 0x0944, 0x0965, 0x0985, 0x0985, 0x0985, 0x0985, 0x09a6, 0x09a6, 0x0985, 0x0985, 0x0965, 0x0945, 0x0985, 0x0985, 0x0965, 0x09a6, 0x0a07, 0x0a07, 0x09e7, 0x09e7, 0x09e7, 0x0985, 0x0924, 0x0944, 0x0985, 0x0a07, 0x09e7, 0x0985, 0x0965, 0x09c6, 0x09c6, 0x0985, 0x0a27, 0x0a48, 0x0a28, 0x0a48, 0x0a48, 0x0a28, 0xa555, 0xb5b6, 0x0861, 0x0861, 0x0861, 0x0861, 0x2104, 0x2124, 0x0861, 0x0861, 0x2945, 0x4228, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x10a2, 0x3186, 0xb5b6, 0xf79e, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6f9, 0xe631, 0xe5cc, 0xe568, 0xe568, 0xd507, 0xb466, 0x93a5, 0x72a3, 0x4182, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c3, 0xd505, 0xdd69, 0xde33, 0xdeb9, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xb5b6, 0x52eb, 0x09a6, 0x0985, 0x0944, 0x0924, 0x0944, 0x0985, 0x0965, 0x0965, 0x0944, 0x636d, 0x532c, 0x0985, 0x09c6, 0x0a28, 0x0a27, 0x0a28, 0x0a07, 0x0a07, 0x09c6, 0x0965, 0x0944, 0x0944, 0x0965, 0x09e6, 0x0a07, 0x09a6, 0x0965, 0x09c6, 0x09e7, 0x09c6, 0x0a48, 0x0a89, 0x0aca, 0x0aa9, 0x0a69, 0x6c0f, 0xf7be, 0xc618, 0x0861, 0x0861, 0x0861, 0x1082, 0x5acb, 0x6b4d, 0x4228, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x18c3, 0x0861, 0x0861, 0x2104, 0x4a49, 0xad55, 0xf7be, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6d8, 0xe5ec, 0xe589, 0xe566, 0x9be6, 0x1081, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c3, 0xd4e4, 0xdd6a, 0xde32, 0xdeb9, 0xdeda, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xdefb, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe71c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xe73c, 0xc659, 0x9d13, 0x73ef, 0x4aca, 0x4289, 0x428a, 0x5b4d, 0x8c92, 0xc638, 0xf79e, 0x9d14, 0x0985, 0x0a69, 0x0a89, 0x0a28, 0x0a07, 0x0a07, 0x0a28, 0x09e7, 0x0985, 0x0944, 0x0924, 0x0944, 0x09c6, 0x0a07, 0x09c6, 0x0965, 0x09a6, 0x0a27, 0x0a28, 0x0a48, 0x0a69, 0x0aca, 0x0aea, 0x53ef, 0xef7d, 0xffff, 0xe73c, 0x18c3, 0x0861, 0x0861, 0x0861, 0x18c3, 0x2965, 0x39c7, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x2124, 0x7bef, 0xc638, 0xc618, 0x0861, 0x0861, 0x0861, 0x39c7, 0x8410, 0xf7be, 0xf7be, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe6f9, 0xe5ee, 0xe567, 0xdd68, 0x8326, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ae3, 0xd505, 0xdd04, 0xdd26, 0xdd48, 0xdd69, 0xdd6a, 0xdd8b, 0xdd8b, 0xddab, 0xddab, 0xddcc, 0xddee, 0xddee, 0xde0f, 0xe60f, 0xe630, 0xe674, 0xe6b7, 0xe6d7, 0xe6d8, 0xe6d7, 0xe6f9, 0xe71b, 0xe73c, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xc659, 0x0a07, 0x0a89, 0x0a89, 0x0a28, 0x09c6, 0x09c6, 0x0a07, 0x0a48, 0x0a27, 0x09c6, 0x0985, 0x0985, 0x09c6, 0x0a27, 0x09e6, 0x09a5, 0x09a6, 0x09c6, 0x0a07, 0x0a48, 0x0a68, 0x0a89, 0x7491, 0xef7d, 0xffff, 0xffff, 0xffff, 0x9492, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x5aeb, 0xad55, 0xb5b6, 0x9492, 0x630c, 0x52aa, 0xad55, 0xe73c, 0xffff, 0xffff, 0xffdf, 0x5acb, 0x0861, 0x0861, 0x10a2, 0x4228, 0xce59, 0x9cf3, 0x632c, 0x9492, 0xd6ba, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6d8, 0xe60f, 0xe588, 0xdd69, 0x7b06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0x49c2, 0x5202, 0x5a22, 0x6a62, 0x6aa3, 0x7ae3, 0x8303, 0x8b44, 0x8b64, 0x93a4, 0x9bc5, 0xa3e5, 0xac25, 0xb446, 0xb466, 0xbca6, 0xc4c7, 0xcce7, 0xcd08, 0xd528, 0xdd68, 0xe5cc, 0xe693, 0xe71b, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xef7d, 0xadd7, 0x84d2, 0x536d, 0x1a68, 0x0a07, 0x09c6, 0x09e6, 0x0a28, 0x0a48, 0x0a48, 0x09e7, 0x0985, 0x0965, 0x0985, 0x09a6, 0x0985, 0x0944, 0x0924, 0x0965, 0x09a6, 0x3aeb, 0xb5d7, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xf7be, 0xad55, 0x39e7, 0x0861, 0x0861, 0x0861, 0x52aa, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xb5b6, 0x0861, 0x0861, 0x0861, 0x630c, 0x9cd3, 0x3186, 0x2124, 0x31a6, 0xa534, 0xf79e, 0xf79e, 0xf79e, 0xef7d, 0xf79e, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6b6, 0xe60f, 0xe567, 0xdd6a, 0x72e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0xbc86, 0xe60f, 0xe6b6, 0xe73b, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xe75d, 0xce79, 0xa575, 0x7c71, 0x434c, 0x0a89, 0x0a68, 0x0a28, 0x09c6, 0x0944, 0x0924, 0x0965, 0x0965, 0x0944, 0x21c6, 0x634c, 0xb5b6, 0xf79e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf79e, 0xce79, 0x9cf3, 0x7bcf, 0x5acb, 0xf79e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xef7d, 0x9cf3, 0x73ae, 0x39e7, 0x630c, 0xb596, 0x0861, 0x0861, 0x39e7, 0xce59, 0xf79e, 0xf79e, 0xf79e, 0xf79d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe696, 0xe5ec, 0xe568, 0xdd48, 0x6ae6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20c1, 0xb446, 0xe5aa, 0xe651, 0xe71b, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xe73c, 0xce9a, 0xb5f7, 0x9d34, 0x94b2, 0x94b2, 0x9d34, 0xad75, 0xc659, 0xef5d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf79e, 0xdefb, 0xe71c, 0x94b2, 0x9cf3, 0xad55, 0xf7be, 0xf7be, 0xf79e, 0xf77c, 0xf739, 0xf6f6, 0xef39, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe6b6, 0xe5cc, 0xe568, 0xd548, 0x62a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3e5, 0xe5a9, 0xe630, 0xe6f9, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf79e, 0xf738, 0xf671, 0xf62e, 0xf64f, 0xf64f, 0xee91, 0xeed6, 0xef3a, 0xef5c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71b, 0xe6b7, 0xe5ab, 0xe567, 0xd549, 0x6285, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b65, 0xe588, 0xe631, 0xe6f8, 0xef3c, 0xef3c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf79d, 0xf738, 0xf670, 0xf5ea, 0xf5eb, 0xf62c, 0xee0b, 0xedeb, 0xee0c, 0xee71, 0xeeb5, 0xeef8, 0xef19, 0xef3b, 0xef3c, 0xef3c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71b, 0xe695, 0xe5cc, 0xe568, 0xd549, 0x6264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b05, 0xe568, 0xe60f, 0xe6d7, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef5d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xef7d, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf7be, 0xf738, 0xf670, 0xf5eb, 0xd54b, 0x8bca, 0xb4ce, 0xcd6e, 0xe60d, 0xedeb, 0xedca, 0xedeb, 0xedec, 0xee2e, 0xee73, 0xeed7, 0xef1a, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe73c, 0xe71c, 0xe71b, 0xe695, 0xe5cd, 0xe546, 0xd54b, 0x5a45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6aa3, 0xdd48, 0xe5ed, 0xe6d7, 0xe73b, 0xe73c, 0xef5d, 0xef5d, 0xef5d, 0xef3b, 0xef19, 0xeef8, 0xeeb4, 0xee71, 0xee70, 0xeed5, 0xf75a, 0xf79e, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff12, 0xfed0, 0xff34, 0xffbb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf759, 0xf691, 0xf5eb, 0xcd2c, 0x0000, 0x0000, 0x0000, 0x2924, 0x62e9, 0x93ea, 0xb48a, 0xcd2b, 0xe5cc, 0xedca, 0xeda9, 0xedca, 0xe60e, 0xe674, 0xe6b6, 0xe6d8, 0xe6f9, 0xe6fa, 0xe71b, 0xe71c, 0xe71b, 0xe674, 0xe5ab, 0xe567, 0xcd29, 0x5224, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a23, 0xdd48, 0xe5cb, 0xe6b7, 0xe73b, 0xef3c, 0xef3c, 0xef3b, 0xef19, 0xeeb4, 0xee50, 0xedec, 0xedca, 0xdd69, 0xcd29, 0xedea, 0xee2d, 0xf718, 0xf79e, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xff76, 0xff76, 0xfffd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffba, 0xfed0, 0xfeae, 0xfe8e, 0xfed1, 0xff57, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffde, 0xf7be, 0xf79c, 0xf6b3, 0xf60b, 0xdd8c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3163, 0x6ac7, 0x93c9, 0xb48a, 0xcd2a, 0xe58a, 0xe5aa, 0xe5cb, 0xe5cc, 0xe5cd, 0xe60f, 0xe673, 0xe6b7, 0xe6d8, 0xe653, 0xe5aa, 0xe567, 0xcd08, 0x5205, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e2, 0xcd08, 0xe5cc, 0xe6b5, 0xe71a, 0xe71b, 0xe6f9, 0xeeb5, 0xee30, 0xedcb, 0xedca, 0xd54a, 0xac27, 0x72c5, 0x20c1, 0xa407, 0xedeb, 0xf670, 0xf719, 0xf79e, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff77, 0xfecf, 0xfecf, 0xff33, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff76, 0xfed0, 0xbceb, 0xc50b, 0xfe8f, 0xfeaf, 0xff13, 0xffbc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xf7be, 0xf7be, 0xf6d5, 0xf60b, 0xe5ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3984, 0x6ac6, 0x93a7, 0xac47, 0xcce8, 0xe589, 0xe588, 0xe588, 0xe5aa, 0xe5ed, 0xe5cd, 0xe567, 0xe547, 0xcd09, 0x49e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3962, 0xc4a6, 0xe5cb, 0xe672, 0xe6f9, 0xe673, 0xe60f, 0xe5cb, 0xeda9, 0xcd08, 0x9be6, 0x6284, 0x1081, 0x0000, 0x0000, 0x0000, 0xbcc9, 0xedeb, 0xf6b3, 0xf75a, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffdf, 0xffdf, 0xffde, 0xffde, 0xffde, 0xffde, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff77, 0xfef1, 0xfed0, 0xfecf, 0xfecf, 0xff54, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff55, 0xfed0, 0x7b69, 0x0000, 0x8389, 0xee2e, 0xfeaf, 0xfed1, 0xff78, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffdf, 0xffbe, 0xf6f5, 0xf62c, 0xee2e, 0x3163, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3162, 0x6aa5, 0x93a6, 0xac46, 0xccc6, 0xdd47, 0xe567, 0xdd46, 0xe546, 0xcd09, 0x41c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2901, 0xbc86, 0xe587, 0xe5aa, 0xe5ec, 0xe5a9, 0xe568, 0xc4c7, 0x93a6, 0x5a24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd6a, 0xf60c, 0xf6f7, 0xf77c, 0xf79e, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffde, 0xffde, 0xffbd, 0xff16, 0xfed2, 0xfef3, 0xff79, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffb9, 0xff32, 0xff12, 0xaced, 0xacec, 0xff11, 0xfed0, 0xff75, 0xfffc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff54, 0xfeb0, 0x41e5, 0x0000, 0x0000, 0x39a4, 0xbccb, 0xfe8f, 0xfe8f, 0xff14, 0xffbb, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffbe, 0xf6f5, 0xf62c, 0xf64d, 0x4a05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3983, 0x6ac4, 0x9385, 0xac25, 0xccc6, 0xc4ea, 0x41c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20c1, 0xac26, 0xe567, 0xe567, 0xdd47, 0xbc87, 0x8b86, 0x49c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41c3, 0xedeb, 0xf64e, 0xf718, 0xf79d, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffbe, 0xffbd, 0xff59, 0xfeb1, 0xfe6e, 0xfe6d, 0xfe8e, 0xff14, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xff55, 0xfef0, 0xde53, 0x2103, 0x0000, 0xacee, 0xff11, 0xff11, 0xff75, 0xfffd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff11, 0xe60e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7327, 0xe5ee, 0xfe8f, 0xfed1, 0xff57, 0xffde, 0xffff, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffdf, 0xffbe, 0xf6f6, 0xf64d, 0xf64d, 0x62a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9be6, 0xdd27, 0xb446, 0x8324, 0x41a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b05, 0xf5eb, 0xf690, 0xf739, 0xf79d, 0xf7be, 0xf7be, 0xf7be, 0xf7be, 0xffbd, 0xff7a, 0xfef4, 0xfe6e, 0xfe4d, 0xf66f, 0xee0d, 0xfe6e, 0xfed1, 0xff78, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xff97, 0xff12, 0xf713, 0x62e8, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff32, 0xff11, 0xff75, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xfef1, 0xc54d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3163, 0xb4ab, 0xfe6e, 0xfeaf, 0xfef3, 0xffbb, 0xffde, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffdf, 0xffde, 0xff37, 0xf66e, 0xf64d, 0x7b26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0x72e5, 0x3121, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9be7, 0xf60c, 0xf6b3, 0xf75b, 0xf79d, 0xf7be, 0xf7be, 0xf7be, 0xff7b, 0xfef4, 0xfe6f, 0xfe4d, 0xfe90, 0xd5af, 0x6ae8, 0x7b48, 0xfeb0, 0xfe8e, 0xff14, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffb, 0xff33, 0xff33, 0xa4ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff11, 0xff12, 0xff75, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xfef1, 0xa48c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ac6, 0xddcd, 0xfe8e, 0xfeb0, 0xff58, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffdf, 0xffde, 0xff37, 0xf66f, 0xf64d, 0x8b88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbca8, 0xf60c, 0xf6f6, 0xf77c, 0xf7be, 0xf7be, 0xf77c, 0xf716, 0xf66f, 0xfe4d, 0xfe4d, 0xe610, 0x83aa, 0x18a2, 0x0000, 0x0000, 0xcd8f, 0xfe6e, 0xfed1, 0xff98, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff54, 0xff11, 0xd674, 0x2123, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff11, 0xff11, 0xff75, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffb9, 0xfef1, 0x7b69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2943, 0xa449, 0xf64e, 0xfe8f, 0xff14, 0xff9b, 0xfffe, 0xffff, 0xffdf, 0xffdf, 0xff37, 0xfe8f, 0xf64d, 0x9be8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd54a, 0xf62d, 0xf75a, 0xf79d, 0xf77c, 0xf738, 0xf691, 0xfe4d, 0xfe4d, 0xee50, 0xa46c, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x62a7, 0xfe8f, 0xfeaf, 0xfef2, 0xffdd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xffb8, 0xfef1, 0xf6f3, 0x62e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff11, 0xff11, 0xff97, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff97, 0xfef2, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6286, 0xd58d, 0xfe6e, 0xfed1, 0xff37, 0xffbd, 0xffde, 0xffdf, 0xff79, 0xfeb1, 0xfe4d, 0xac49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a3, 0xedeb, 0xf64e, 0xf75a, 0xf75a, 0xf6d4, 0xf62d, 0xf62d, 0xf64f, 0xb4ed, 0x4a06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbd2e, 0xfeaf, 0xfeb0, 0xff77, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffb, 0xff33, 0xff32, 0xa4cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaced, 0xff32, 0xff12, 0xffb8, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffd, 0xff96, 0xe650, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e2, 0x9c09, 0xf62e, 0xfe8e, 0xfed1, 0xff9c, 0xffde, 0xff79, 0xfed2, 0xfe4d, 0xb48a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72e5, 0xf60c, 0xf66f, 0xf6b2, 0xf66f, 0xf62c, 0xf66e, 0xcd8e, 0x6ae8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a06, 0xf690, 0xfeaf, 0xff12, 0xffdc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xff76, 0xff32, 0xd652, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff32, 0xff32, 0xffb8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffc, 0xff75, 0xc56e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5205, 0xcd2b, 0xfe6e, 0xfeb0, 0xff36, 0xff36, 0xfed2, 0xfe4d, 0xc4ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bc7, 0xf60b, 0xf60b, 0xf60b, 0xf62c, 0xddce, 0x838a, 0x18a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xacad, 0xfeb0, 0xfed0, 0xffb9, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xff98, 0xff11, 0xf714, 0x5ac8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff31, 0xff53, 0xffb8, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffb, 0xff53, 0xa4ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ba8, 0xeded, 0xfe6d, 0xfe8f, 0xfe8f, 0xfe4d, 0xcd2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb489, 0xf60b, 0xf60c, 0xe60e, 0x9c2a, 0x2943, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3184, 0xee2f, 0xfed0, 0xff33, 0xffdb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffda, 0xff55, 0xff75, 0x9ccf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff32, 0xff53, 0xffb8, 0xffff, 0xffff, 0xffff, 0xffda, 0xff33, 0x7b89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x49e4, 0xc4eb, 0xfe4d, 0xfe4d, 0xfe4d, 0xdd6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd54b, 0xee0e, 0xb4ab, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x940b, 0xfef1, 0xfef1, 0xff98, 0xfffe, 0xffff, 0xffff, 0xfffe, 0xff76, 0xff53, 0xd654, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff32, 0xff33, 0xffd8, 0xffff, 0xfffd, 0xffb8, 0xff13, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b27, 0xe5cc, 0xfe4d, 0xe5ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39c7, 0xc5b4, 0x6ae7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2103, 0xde0f, 0xfef1, 0xff34, 0xffdb, 0xffff, 0xffff, 0xff97, 0xff32, 0xf736, 0x52a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaced, 0xff32, 0xff32, 0xffb7, 0xff96, 0xff32, 0xe691, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3983, 0xb48a, 0xee2f, 0x2103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c3, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7348, 0xff12, 0xfef0, 0xff77, 0xfffe, 0xfffc, 0xff33, 0xff74, 0x9c8e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff33, 0xff32, 0xff32, 0xff11, 0xc58e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7329, 0x2944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcdb0, 0xfed0, 0xff11, 0xff33, 0xff32, 0xff33, 0xd655, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xff32, 0xff32, 0xff11, 0xa48c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62a7, 0xfed1, 0xfef1, 0xfef1, 0xff12, 0xf734, 0x5268, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0d, 0xff53, 0xff32, 0x7b68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb52e, 0xff11, 0xff11, 0xff75, 0x948e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad0e, 0xfef1, 0x41e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a05, 0xf6b0, 0xff33, 0xce12, 0x18c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x940a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa48c, 0xef15, 0x4a47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2964, 0x73ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
#define banner_pixel 16200
#define MAXR 31
#define MINR 0
#define MAXG 63
#define MING 0
#define MAXB 31
#define MINB 0

View File

@@ -1,48 +0,0 @@
/*
* THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
* PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
* TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
* INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
* DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
* THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
* FULL TEXT OF THE NON-WARRANTY PROVISIONS.
*
* USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
* RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
* TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
* AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
* SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
* THE UNITED STATES.
*
* COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
*/
#include <sys/utsname.h>
#include <stdio.h>
#include <string.h>
int _cpu_detect_asm() {
struct utsname name;
uname(&name);
if (!strcmp(name.machine, "i386")) return 3;
if (!strcmp(name.machine, "i486")) return 4;
if (!strcmp(name.machine, "i586")) return 5;
if (!strcmp(name.machine, "i686")) return 6;
fprintf(stderr, "Couldn't determine cpu type. Using i586\n");
return 5;
}
void single_precision_asm() {
asm("push %eax \n fnclex \n fstcw (%esp) \n movl (%esp), %eax \n "
"and $0x0000fcff, %eax \n movl %eax, (%esp) \n fldcw (%esp) \n pop %eax");
}
void double_precision_asm() {
asm("push %eax \n fnclex \n fstcw (%esp) \n movw (%esp), %eax \n "
"and $0x0000fcff, %eax \n or $0x000002ff, %eax \n mov %eax, (%esp) \n "
"fldcw (%esp) \n pop %eax");
}

View File

@@ -1,127 +0,0 @@
#
# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
# FULL TEXT OF THE NON-WARRANTY PROVISIONS.
#
# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
# THE UNITED STATES.
#
# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
#
# $Header$
# $Log$
# Revision 1.1.1.1 1999/12/07 21:49:08 joseph
# Initial checkin into SourceForge.
#
#
# 2 3/04/97 9:10p Dow
# Neutered mutiplatform multiheaded monster.
#
#
.file "cpudtect.s"
# 586P
# model FLAT,C
# Data for data segment goes here
# DATA SEGMENT DWORD USE32 PUBLIC DATA;
# DATA ENDS
# Some useful constants
# CPU Type
CPUTypeUnknown .ASSIGNA 0xffffffff
CPUTypePrePent .ASSIGNA 4
CPUTypeP5 .ASSIGNA 5
CPUTypeP6 .ASSIGNA 6
# References to external data:
#_TEXT SEGMENT
#
# _cpu_detect_asm - detect the type of CPU
#
# USAGE:
#
# int __cdecl _cpu_detect_asm(void);
#
# returns 4 for non-pen
.text
.align 4
.globl _cpu_detect_asm
_cpu_detect_asm:
P6Stuff:
pusha # save all regs.
# First, determine whether CPUID instruction is available.
# If it's not, then it's a 386 or 486.
pushf # push original EFLAGS.
pop %eax # pop into eax
mov %eax, %ecx # save original EFLAGS in ecx
xor $0x200000, %eax # flip ID bit in EFLAGS
push %eax # put it back on stack
popf # pop into EFLAGS
pushf # get EFLAGS back
pop %eax # into eax
xor %ecx, %eax # check to see if we could toggle ID
jz NotPentium # Sorry, not P5 or P6.
#
# Now determine whether it's an intel P6 CPU.
#
## Is it an Intel CPU?
xor %eax, %eax # eax = 0.
cpuid # get cpuid
xor $0x756e6547, %ebx # "Genu"
jnz NotIntel
xor $0x49656e69, %edx # "ineI"
jnz NotIntel
xor $0x6c65746e, %ecx # "ntel"
jnz NotIntel #
## Verifying architecture family
mov $1, %eax
cpuid # get family/model/stepping
shr $8, %eax # rid of model & stepping number
and $0xf, %eax # use only family
cmp $6, %eax
jl IsP5 # It's a P5
## Else it's a P6
#
# Intel P6 processor.
# Make sure it supports Memory Type Range Request registers
#
IsP6:
popa
mov $6, %eax #
ret # return
IsP5:
popa
mov $5, %eax #
ret
NotPentium:
popa
mov $4, %eax
ret
NotIntel:
popa
mov $0xffffffff, %eax
ret
.L_end__cpu_detect_asm:
.size _cpu_detect_asm,.L_end__cpu_detect_asm-_cpu_detect_asm
.END

View File

@@ -1,163 +0,0 @@
;;
;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
;; FULL TEXT OF THE NON-WARRANTY PROVISIONS.
;;
;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
;; THE UNITED STATES.
;;
;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
;;
;; $Header$
;; $Log$
;
; 4 5/28/97 8:23a Peter
; Merge w/ original glide source
;
; 2 3/04/97 9:10p Dow
; Neutered mutiplatform multiheaded monster.
;;
;;
TITLE cpudtect.asm
.586P
.model FLAT,C ; Flat memory, mangle publics with leading '_'
;; Data for data segment goes here
;_DATA SEGMENT DWORD USE32 PUBLIC 'DATA';
;_DATA ENDS
;;; Some useful constants
; CPU Type
CPUTypeUnknown = 0ffffffffh
CPUTypePrePent = 4h
CPUTypeP5 = 5h
CPUTypeP6 = 6h
;;; References to external data:
_TEXT SEGMENT
;;
;; _cpu_detect_asm - detect the type of CPU
;;
;; USAGE:
;;
;; int __cdecl _cpu_detect_asm(void);
;;
;; returns 4 for non-pen
PUBLIC _cpu_detect_asm
_cpu_detect_asm PROC NEAR
P6Stuff:
.586
pushad ; save all regs.
; First, determine whether CPUID instruction is available.
; If it's not, then it's a 386 or 486.
pushfd ; push original EFLAGS.
pop eax ; pop into eax
mov ecx, eax ; save original EFLAGS in ecx
xor eax, 0200000h ; flip ID bit in EFLAGS
push eax ; put it back on stack
popfd ; pop into EFLAGS
pushfd ; get EFLAGS back
pop eax ; into eax
xor eax, ecx ; check to see if we could toggle ID
jz NotPentium ; Sorry, not P5 or P6.
;
; Now determine whether it's an intel P6 CPU.
;
;; Is it an Intel CPU?
xor eax, eax ; eax = 0.
cpuid ; get cpuid
xor ebx, 0756e6547h ; "Genu"
jnz NotIntel
xor edx, 049656e69h ; "ineI"
jnz NotIntel
xor ecx, 06c65746eh ; "ntel"
jnz NotIntel ;
;; Verifying architecture family
mov eax, 1
cpuid ; get family/model/stepping
shr eax, 8 ; rid of model & stepping number
and eax, 0fh ; use only family
cmp eax, 6
jl IsP5 ; It's a P5
;; Else it's a P6
;
; Intel P6 processor.
; Make sure it supports Memory Type Range Request registers
;
IsP6:
popad
mov eax, 6 ;
ret ; return
IsP5:
popad
mov eax, 5 ;
ret
NotPentium:
popad
mov eax, 4
ret
NotIntel:
popad
mov eax, 0ffffffffh
ret
_cpu_detect_asm ENDP
;------------------------------------------------------------------------------
; this routine sets the precision to single
; which effects all adds, mults, and divs
align 4 ;
PUBLIC single_precision_asm
single_precision_asm PROC NEAR
.586
push eax ; make room
fnclex ; clear pending exceptions
fstcw WORD PTR [esp]
mov eax, DWORD PTR [esp]
and eax, 0000fcffh ; clear bits 9:8
mov DWORD PTR [esp], eax
fldcw WORD PTR [esp]
pop eax
ret 0
single_precision_asm ENDP
;------------------------------------------------------------------------------
; this routine sets the precision to double
; which effects all adds, mults, and divs
align 4 ;
PUBLIC double_precision_asm
double_precision_asm PROC NEAR
.586
push eax ; make room
fnclex ; clear pending exceptions
fstcw WORD PTR [esp]
mov eax, DWORD PTR [esp]
and eax, 0000fcffh ; clear bits 9:8
or eax, 000002ffh ; set 9:8 to 10
mov DWORD PTR [esp], eax
fldcw WORD PTR [esp]
pop eax
ret 0
double_precision_asm ENDP
_TEXT ENDS
END

View File

@@ -1,352 +0,0 @@
/*
* CPU detection code
*
*
* Revision 1.1.2.2 2006/09/02 03:12:29 guillemj
* Backport glide3 fix for PIC compilation with gcc 4.1 from Hans de Goede.
*
* Revision 1.1.2.1 2004/12/12 15:16:02 koolsmoky
* new cpuid
*
* Revision 1.1.2.10 2004/10/05 14:54:29 dborca
* DOS/OpenWatcom woes
*
* Revision 1.1.2.9 2003/08/04 12:45:47 dborca
* Preparing for MinGW 2.0
*
* Revision 1.1.2.8 2003/07/29 10:04:32 dborca
* Shamelessness.
* Safeguard in CPUID.
* Changed contact address!
* Koolsmoky's texture download fixes.
*
* Revision 1.1.2.7 2003/07/25 07:14:58 dborca
* ... in the name of the Linux, DRI and the sacred Glide...
*
* Revision 1.1.2.6 2003/07/24 13:13:03 koolsmoky
* use __try/__except mechanism for win32 to catch SSE sigillegal in win95
*
* Revision 1.1.2.5 2003/07/01 11:16:42 dborca
* fixed a bug in GNUC code when running Intel; also removed detritus
*
* Revision 1.1.2.3 2003/06/13 07:22:58 dborca
* more fixes to NASM sources
*
*/
#include <signal.h>
#include <setjmp.h>
#include <string.h>
#include "cpuid.h"
#if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ > 3)))
typedef unsigned int __attribute__((__may_alias__)) word32;
#else
typedef unsigned int word32;
#endif
/* These are the bit flags that get set on calling cpuid
* with register eax set to 1
*/
#define _MMX_FEATURE_BIT 0x00800000
#define _SSE_FEATURE_BIT 0x02000000
#define _SSE2_FEATURE_BIT 0x04000000
/* This bit is set when cpuid is called with
* register set to 80000001h (only applicable to AMD)
*/
#define _3DNOW_FEATURE_BIT 0x80000000
#define _3DNOWPLUS_FEATURE_BIT 0x40000000
#define _MMXPLUS_FEATURE_BIT 0x00400000
/* Testing code:
* TEST_SSE = xorps xmm0, xmm0
* TEST_SSE2 = xorpd xmm0, xmm0
* TEST_3DNOW = femms
* TEST_MMX = emms
* TEST_3DNOWPLUS = femms | pswapd mm0, mm0 | femms
* TEST_MMXPLUS = emms | pminsw mm0, mm0 | emms
*/
#ifdef __GNUC__
#define TEST_CPUID(f) __asm __volatile ("pushl %%ebx; cpuid; popl %%ebx"::"a"(f):"%ecx", "%edx")
#define TEST_SSE() __asm __volatile (".byte 0x0f, 0x57, 0xc0")
#define TEST_SSE2() __asm __volatile (".byte 0x66, 0x0f, 0x57, 0xc0")
#define TEST_3DNOW() __asm __volatile (".byte 0x0f, 0x0e")
#define TEST_MMX() __asm __volatile (".byte 0x0f, 0x77")
#define TEST_3DNOWPLUS() __asm __volatile (".byte 0x0f, 0x0e, 0x0f, 0x0f, 0xc0, 0xbb, 0x0f, 0x0e")
#define TEST_MMXPLUS() __asm __volatile (".byte 0x0f, 0x77, 0x0f, 0xea, 0xc0, 0x0f, 0x77")
#else
#define TEST_CPUID(f) __asm { _asm mov eax, f _asm cpuid }
#define TEST_SSE() __asm { _asm _emit 0x0f _asm _emit 0x57 _asm _emit 0xc0 }
#define TEST_SSE2() __asm { _asm _emit 0x66 _asm _emit 0x0f _asm _emit 0x57 _asm _emit 0xc0 }
#define TEST_3DNOW() __asm { _asm _emit 0x0f _asm _emit 0x0e }
#define TEST_MMX() __asm { _asm _emit 0x0f _asm _emit 0x77 }
#define TEST_3DNOWPLUS() __asm { _asm _emit 0x0f _asm _emit 0x0e _asm _emit 0x0f _asm _emit 0x0f _asm _emit 0xc0 _asm _emit 0xbb _asm _emit 0x0f _asm _emit 0x0e }
#define TEST_MMXPLUS() __asm { _asm _emit 0x0f _asm _emit 0x77 _asm _emit 0x0f _asm _emit 0xea _asm _emit 0xc0 _asm _emit 0x0f _asm _emit 0x77 }
#endif
#ifndef __MSC__
static jmp_buf j;
/* Desc: signal handler
*
* In : signal number
* Out : -
*
* Note: returns by `longjmp'ing
*/
static void handler (int signal)
{
longjmp(j, signal + 1); /* so we can tell... also ensure we don't pass 0 */
}
/* Desc: check if CPU has specific feature
*
* In : feature request
* Out : 0 == fail, input == pass
*
* Note: this should be in the `has_feature' body. The reason it isn't:
* under some systems (notably Linux), the `setjmp' may thrash EBX,
* which is used for PositionIndependentCode/GlobalOffsetTable system.
* Since EBX is non-volatile register, it should be restored upon return.
*/
static int check_feature (int feature)
{
if (setjmp(j)) {
/* we got here only when `longjmp'ed by signal handlers */
return 0;
} else {
/* we have signals and jump buffer set */
switch (feature) {
case _CPU_HAS_CPUID: TEST_CPUID(0); break;
case _CPU_FEATURE_SSE: TEST_SSE(); break;
case _CPU_FEATURE_SSE2: TEST_SSE2(); break;
case _CPU_FEATURE_3DNOW: TEST_3DNOW(); break;
case _CPU_FEATURE_MMX: TEST_MMX(); break;
case _CPU_FEATURE_3DNOWPLUS: TEST_3DNOWPLUS(); break;
case _CPU_FEATURE_MMXPLUS: TEST_MMXPLUS(); break;
default: return 0;
}
return feature;
}
}
#endif
/* Desc: perform (possibly faulting) instructions in a safe manner
*
* In : feature request
* Out : 0 == fail, input == pass
*
* Note: pure ANSI code; stupid Watcom cannot handle this.
*/
static int has_feature (int feature)
{
#ifndef __MSC__
int rv;
/* register signal handlers */
void (*old_sigill)(int) = signal(SIGILL, handler);
if (old_sigill == SIG_ERR) {
return 0;
}
rv = check_feature(feature);
/* restore the signal handlers */
signal(SIGILL, old_sigill);
return rv;
#else
/* Use the non-standard __try/__except mechanism because win95 fails to catch
* sigillegal for SSE using standard signal mechanism.
* HACK ALERT! HACK ALERT! HACK ALERT!
* This means the MinGW version cannot be safely run under Win95!
*/
#define _TRY() __try {
#define _EXCEPTION() } __except(1) { return 0; } /* EXCEPTION_EXECUTE_HANDLER=1 */
switch (feature) {
case _CPU_HAS_CPUID: _TRY() TEST_CPUID(0) _EXCEPTION() break;
case _CPU_FEATURE_SSE: _TRY() TEST_SSE() _EXCEPTION() break;
case _CPU_FEATURE_SSE2: _TRY() TEST_SSE2() _EXCEPTION() break;
case _CPU_FEATURE_3DNOW: _TRY() TEST_3DNOW() _EXCEPTION() break;
case _CPU_FEATURE_MMX: _TRY() TEST_MMX() _EXCEPTION() break;
case _CPU_FEATURE_3DNOWPLUS: _TRY() TEST_3DNOWPLUS() _EXCEPTION() break;
case _CPU_FEATURE_MMXPLUS: _TRY() TEST_MMXPLUS() _EXCEPTION() break;
default: return 0;
}
return feature;
#endif
}
/* Desc: get CPU info
*
* In : pointer to _p_info
* Out : features
*
* Note: -
*/
int _cpuid (_p_info *pinfo)
{
word32 dwId = 0;
word32 dwFeature = 0;
word32 dwExt = 0;
int feature = 0, os_support = 0;
char Ident[13];
if (!has_feature(_CPU_HAS_CPUID)) {
return 0;
}
#ifdef __GNUC__
__asm("\n\
/* get the vendor string */ \n\
pushl %%ebx \n\
xorl %%eax, %%eax \n\
cpuid \n\
movl %%ebx, %%eax \n\
popl %%ebx \n\
movl %%eax, %3 \n\
movl %%edx, %4 \n\
movl %%ecx, %5 \n\
/* get the Standard bits */ \n\
pushl %%ebx \n\
movl $1, %%eax \n\
cpuid \n\
popl %%ebx \n\
movl %%eax, %1 \n\
movl %%edx, %2 \n\
/* get AMD-specials */ \n\
pushl %%ebx \n\
movl $0x80000000, %%eax \n\
cpuid \n\
popl %%ebx \n\
cmpl $0x80000000, %%eax \n\
jc 0f \n\
pushl %%ebx \n\
movl $0x80000001, %%eax \n\
cpuid \n\
popl %%ebx \n\
movl %%edx, %0 \n\
0: \n\
":"=g"(dwExt), "=g"(dwId), "=g"(dwFeature),
"=g"(((long *)Ident)[0]), "=g"(((long *)Ident)[1]), "=g"(((long *)Ident)[2])
::"%eax", "%ecx", "%edx");
#else
_asm
{
push ebx
push ecx
push edx
/* get the vendor string */
xor eax,eax
cpuid
mov dword ptr [Ident],ebx
mov dword ptr [Ident+4],edx
mov dword ptr [Ident+8],ecx
/* get the Standard bits */
mov eax,1
cpuid
mov dwId,eax
mov dwFeature,edx
/* get AMD-specials */
mov eax,80000000h
cpuid
cmp eax,80000000h
jc notamd
mov eax,80000001h
cpuid
mov dwExt,edx
notamd:
pop ecx
pop ebx
pop edx
}
#endif
#ifndef __WATCOMC__
/* stupid watcom does not sigill... */
if (dwFeature & _MMX_FEATURE_BIT) {
feature |= _CPU_FEATURE_MMX;
os_support |= has_feature(_CPU_FEATURE_MMX);
}
if (dwExt & _3DNOW_FEATURE_BIT) {
feature |= _CPU_FEATURE_3DNOW;
os_support |= has_feature(_CPU_FEATURE_3DNOW);
}
if (dwExt & _3DNOWPLUS_FEATURE_BIT) {
feature |= _CPU_FEATURE_3DNOWPLUS;
os_support |= has_feature(_CPU_FEATURE_3DNOWPLUS);
}
if (dwExt & _MMXPLUS_FEATURE_BIT) {
feature |= _CPU_FEATURE_MMXPLUS;
os_support |= has_feature(_CPU_FEATURE_MMXPLUS);
}
if (dwFeature & _SSE_FEATURE_BIT) {
feature |= _CPU_FEATURE_SSE;
os_support |= has_feature(_CPU_FEATURE_SSE);
}
if (dwFeature & _SSE2_FEATURE_BIT) {
feature |= _CPU_FEATURE_SSE2;
os_support |= has_feature(_CPU_FEATURE_SSE2);
}
#endif
if (pinfo) {
memset(pinfo, 0, sizeof(_p_info));
pinfo->os_support = os_support;
pinfo->feature = feature;
pinfo->family = (dwId >> 8) & 0xF; /* retrieving family */
pinfo->model = (dwId >> 4) & 0xF; /* retrieving model */
pinfo->stepping = dwId & 0xF; /* retrieving stepping */
Ident[12] = 0;
strcpy(pinfo->v_name, Ident);
}
return feature;
}
#if CPUTEST
#include <stdio.h>
/* Desc:
*
* In :
* Out :
*
* Note:
*/
int main (void)
{
_p_info p;
_cpuid(&p);
printf("vendor : %s\n", p.v_name);
printf("family : %d\n", p.family);
printf("model : %d\n", p.model);
printf("stepping: %X\n", p.stepping);
printf("feature : %08x\n", p.feature);
printf("support : %08x\n", p.os_support);
printf("--------\n");
printf("cpuid : %d\n", has_feature(_CPU_HAS_CPUID));
printf("MMX : %d\n", has_feature(_CPU_FEATURE_MMX));
printf("SSE : %d\n", has_feature(_CPU_FEATURE_SSE));
printf("SSE2 : %d\n", has_feature(_CPU_FEATURE_SSE2));
printf("3DNow! : %d\n", has_feature(_CPU_FEATURE_3DNOW));
printf("3DNow!+ : %d\n", has_feature(_CPU_FEATURE_3DNOWPLUS));
printf("MMX+ : %d\n", has_feature(_CPU_FEATURE_MMXPLUS));
return 0;
}
#endif

View File

@@ -1,581 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.2.2.1 2005/01/22 14:52:01 koolsmoky
** enabled packed argb for cmd packet type 3
**
** Revision 1.2 2000/10/03 18:28:33 mercury
** 003-clean_up_cvg-000, cvg tree cleanup.
**
** Revision 1.1.1.1 1999/12/07 21:49:08 joseph
** Initial checkin into SourceForge.
**
**
** 16 2/20/98 11:00a Peter
** removed glide3 from glid2 tree
*
* 15 12/17/97 4:45p Peter
* groundwork for CrybabyGlide
*
* 14 12/15/97 5:51p Atai
* disable obsolete glide2 api for glide3
*
* 13 12/08/97 12:06p Atai
* change prototype for grDrawPoint, grDrawLine, grDrawTriangel
*
* 12 11/18/97 4:36p Peter
* chipfield stuff cleanup and w/ direct writes
*
* 11 11/17/97 4:55p Peter
* watcom warnings/chipfield stuff
*
* 10 11/03/97 3:43p Peter
* h3/cvg cataclysm
*
* 9 10/27/97 1:16p Peter
* fixed silliness
*
* 8 10/27/97 11:10a Peter
* starting cleanup
*
* 7 9/15/97 7:31p Peter
* more cmdfifo cleanup, fixed normal buffer clear, banner in the right
* place, lfb's are on, Hmmmm.. probably more
*
* 6 9/04/97 3:32p Peter
* starting grouping serial reg writes
*
* 5 6/06/97 10:47a Peter
* texture downloading, fixed 640x480 dimension, changed cvg dep to be the
* same as sst1
*
* 4 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 3 5/21/97 6:04a Peter
*
* 2 3/04/97 9:08p Dow
*
* 1 12/23/96 1:39p Dow
* Changes for multiplatform
**
*/
/* Implements multipass drawing */
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
#include "gump.h"
/* gump.c */
extern GrMPState _gumpState;
/*
** _gumpTexCombineFunction
**
** Sets the texture combine function. For a dual TMU system this function
** will configure the TEXTUREMODE registers as appropriate. For a
** single TMU system this function will configure TEXTUREMODE if
** possible, or defer operations until grDrawTriangle() is called.
*/
GR_DDFUNC(_gumpTexCombineFunction, void, (int virtual_tmu))
{
#define FN_NAME "_gumpTexCombineFunction"
FxU32 texmode;
GrMPTextureCombineFnc_t tc;
GR_BEGIN_NOFIFOCHECK("_gumpTexCombineFunction",99);
GDBG_INFO_MORE(gc->myLevel,"(%d)\n",virtual_tmu);
texmode = gc->state.tmu_config[0].textureMode;
texmode &= ~(SST_TCOMBINE | SST_TACOMBINE);
tc = _gumpState.tc_fnc;
switch (tc) {
case GR_MPTEXTURECOMBINE_ADD:
/* tmu0: other + local */
/* tmu1: local */
/* pass0(tm0): local */
/* pass1(tm1): local */
if (virtual_tmu == 0) {
texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE);
} else {
texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE);
}
break;
case GR_MPTEXTURECOMBINE_MULTIPLY:
/* tmu0: other * local */
/* tmu1: local */
/* pass0(tm0): local */
/* pass1(tm1): local */
if (virtual_tmu == 0) {
texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE);
} else {
texmode |= (SST_TC_REPLACE | SST_TCA_REPLACE);
}
break;
case GR_MPTEXTURECOMBINE_DETAIL0:
/* tmu0: (other - local) * lod + local */
/* = lod * other + (1 - lod) * local */
/* tmu1: local */
/* pass0(tm0): (-local) * lod + local */
/* = (1 - lod) * local */
/* pass1(tm1): (-local) * (1 - lod) + local */
/* = lod * local */
if (virtual_tmu == 0) {
texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD |
SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER);
} else {
texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD |
SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND |
SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER);
}
break;
case GR_MPTEXTURECOMBINE_DETAIL1:
/* tmu0: (other - local) * (1 - lod) + local */
/* = (1 - lod) * other + lod * local */
/* tmu1: local */
/* pass0(tm0): (-local) * (1 - lod) + local */
/* = lod * local */
/* pass1(tm1): (-local) * lod + local */
/* = (1 - lod) * local */
if (virtual_tmu == 0) {
texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD |
SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND |
SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER);
} else {
texmode |= (SST_TC_BLEND_LOD | SST_TCA_BLEND_LOD |
SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER);
}
break;
case GR_MPTEXTURECOMBINE_TRILINEAR0:
/* tmu0: (other - local) * lodbfrac + local */
/* = lodbfrac * other + (1 - lodbfrac) * local */
/* tmu1: local */
/* pass0(tm0): (-local) * lodbfrac + local */
/* = (1 - lodbfrac) * local */
/* pass1(tm1): (-local) * (1 - lodbfrac) + local */
/* = lodbfrac * local */
if (virtual_tmu == 0) {
texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC |
SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER);
} else {
texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC |
SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND |
SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER);
}
break;
case GR_MPTEXTURECOMBINE_TRILINEAR1:
/* tmu0: (other - local) * (1 - lodbfrac) + local
= (1 - lodbfrac) * other + lodbfrac * local
tmu1: local
pass0(tm0): (-local) * (1 - lodbfrac) + local
= lodbfrac * local
pass1(tm1): (-local) * lodbfrac + local
= (1 - lodbfrac) * local
*/
if (virtual_tmu == 0) {
texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC |
SST_TC_REVERSE_BLEND | SST_TCA_REVERSE_BLEND |
SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER);
} else {
texmode |= (SST_TC_BLEND_LODFRAC | SST_TCA_BLEND_LODFRAC |
SST_TC_ZERO_OTHER | SST_TCA_ZERO_OTHER);
}
break;
case GR_MPTEXTURECOMBINE_SUBTRACT:
/*
tmu0: other - local
tmu1: local
doesn't work, alpha blender can't subtract
*/
GrErrorCallback("_gumpTexCombineFunction: TEXTURE_SUBTRACT not supported", FXFALSE);
return;
break;
default:
GrErrorCallback("_gumpTexCombineFunction: Unsupported function", FXFALSE);
return;
break;
}
GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1);
{
SstRegs* tmuRegs = SST_TMU(hw, 0);
GR_SET(eChipTMU0, tmuRegs, textureMode, texmode);
}
GR_CHECK_SIZE();
GR_END();
#undef _gumpTexCombineFunction
} /* _gumpTexCombineFunction */
GR_ENTRY(guMPDrawTriangle, void, (const GrVertex *a, const GrVertex *b, const GrVertex *c))
{
GR_BEGIN_NOFIFOCHECK("guMPDrawTriangle",98);
GDBG_INFO_MORE(gc->myLevel,"(0x%x,0x%x,0x%x)\n",a,b,c);
GR_CHECK_F(myName, !a || !b || !c, "NULL pointer passed");
/* check for multipass texture modes */
/* xxx complex multipass mode checks should be moved into gtex/gglide */
/* specific color combine modes use texture */
/* this is equivalent to
fbzColorPath & SST_ENTEXTREMAP
cc_state & STATE_CC_REQUIRES_DECAL_STW */
/* specific texture combine modes */
/* xxx don't even check anymore, because you can't */
{
/* check for not possible on one tmu modes */
/* alpha blend enabled (grAlphaBlendMode)
xxx some can work, with some cheats, even more
low bit alpha switches between iterated and constant rgb
(grAlphaControlsITRGBLighting)
alpha test (grAlphaTestFunction)
xxx actually, NEVER is ok too
chromakey
*/
if ((gc->state.fbi_config.alphaMode & SST_ENALPHABLEND) ||
(gc->state.fbi_config.fbzColorPath & SST_LOCALSELECT_OVERRIDE_WITH_ATEX) ||
(gc->state.fbi_config.alphaMode & SST_ENALPHAFUNC) ||
(gc->state.fbi_config.fbzMode & SST_ENCHROMAKEY)) {
GrErrorCallback("guMPDrawTriangle: Illegal state", FXFALSE);
}
if (_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_ADD ||
_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_DETAIL0 ||
_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_DETAIL1 ||
_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_TRILINEAR0 ||
_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_TRILINEAR1) {
/* render pass with all effects */
/* select other texture map */
/* set alpha blend to add to dest buffer */
/* if depth buffering, save depth buffer function,
set to z-equal */
/* disable fog and color combine bias */
/* render other pass */
/* restore depth buffer function, restore alpha blend, enable fog
and color combine bias */
FxU32 alphamode, alphamode_orig;
FxU32 fbzcolorpath, fbzcolorpath_orig;
FxU32 fbzmode, fbzmode_orig = 0;
FxU32 fogmode, fogmode_orig = 0;
alphamode = alphamode_orig = gc->state.fbi_config.alphaMode;
fbzcolorpath = fbzcolorpath_orig = gc->state.fbi_config.fbzColorPath;
GR_CHECK_SIZE();
/* first pass */
/* tmu setup */
guTexSource(_gumpState.mmid[0]);
_gumpTexCombineFunction(0);
/* render first pass */
grDrawTriangle(a, b, c);
/* second pass */
/* xxx may need to copy texture coordinates, see
grTexCombineFunction's second parameter. if so,
we have to disable the second coordinate when drawing. */
/* tmu setup */
guTexSource(_gumpState.mmid[1]);
_gumpTexCombineFunction(1);
{
const FxBool depthP = ((gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER) == SST_ENDEPTHBUFFER);
const FxBool fogP = ((gc->state.fbi_config.fogMode & SST_ENFOGGING) == SST_ENFOGGING);
const FxU32 regCount = (2 + depthP + fogP);
const FxU32 regMask = (0x05 | MaskSelect(depthP, 0x08UL) | MaskSelect(fogP, 0x02UL));
REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask);
{
/* disable biasing in color combine */
/* this can change the parameters output */
/* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA
does not work, you need to do this instead of below.
if (gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA)
{
fbzcolorpath &= ~SST_CC_ADD_CLOCAL;
}
*/
fbzcolorpath &= ~(SST_CC_ADD_CLOCAL | SST_CC_ADD_ALOCAL | SST_CC_SUB_CLOCAL);
REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath);
/* disable (fogta * fogColor) bias */
/* xxx setting ADD_FOG with fog disabled is harmless */
if (fogP) {
fogmode = fogmode_orig = gc->state.fbi_config.fogMode;
fogmode |= SST_FOGADD;
REG_GROUP_SET(hw, fogMode, fogmode);
}
/* enable alpha blend to add to destination buffers */
alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT);
alphamode |= (SST_ENALPHABLEND |
(SST_A_ONE << SST_RGBSRCFACT_SHIFT) |
(SST_A_ONE << SST_RGBDSTFACT_SHIFT) |
(SST_A_ONE << SST_ASRCFACT_SHIFT) |
(SST_A_ONE << SST_ADSTFACT_SHIFT));
REG_GROUP_SET(hw, alphaMode, alphamode);
/* if depth buffering, set to z= mode and disable writes */
if (depthP) {
fbzmode = fbzmode_orig = gc->state.fbi_config.fbzMode;
fbzmode &= ~(SST_ZAWRMASK | SST_ZFUNC);
fbzmode |= GR_CMP_EQUAL;
REG_GROUP_SET(hw, fbzMode, fbzmode);
}
}
REG_GROUP_END();
/* render other pass */
grDrawTriangle(a, b, c);
/* restore */
REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask);
{
/* restore ccu/acu state */
REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath_orig);
/* restore fog state */
if (fogP) REG_GROUP_SET(hw, fogMode, fogmode_orig);
/* restore alpha blending state */
REG_GROUP_SET(hw, alphaMode, alphamode_orig);
/* restore depth buffer state */
if (depthP) REG_GROUP_SET(hw, fbzMode, fbzmode_orig);
}
REG_GROUP_END();
}
goto all_done;
} else if (_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_MULTIPLY) {
/* disable fog and color combine bias */
/* render pass with all other effects */
/* select other texture map */
/* set alpha blend to multiply to dest buffer */
/* if depth buffering, save depth buffer function,
set to z-equal */
/* disable fog and color combine factor */
/* render other pass */
/* if fog or color combine w/bias */
/* disable tmu */
/* set alpha blend to add to dest buffer */
/* enable fog and color combine bias */
/* render bias pass */
/* restore depth buffer function, restore alpha blend, enable fog
and color combine bias */
FxU32 alphamode, alphamode_orig;
FxU32 fbzcolorpath, fbzcolorpath_orig;
FxU32 fbzmode, fbzmode_orig = 0;
FxU32 fogmode, fogmode_orig = 0;
alphamode = alphamode_orig = gc->state.fbi_config.alphaMode;
fbzcolorpath = fbzcolorpath_orig = gc->state.fbi_config.fbzColorPath;
/* first pass */
/* tmu setup */
guTexSource(_gumpState.mmid[0]);
_gumpTexCombineFunction(0);
/* disable bias */
{
const FxBool depthP = ((gc->state.fbi_config.fbzMode & SST_ENDEPTHBUFFER) == SST_ENDEPTHBUFFER);
const FxBool fogP = ((gc->state.fbi_config.fogMode & SST_ENFOGGING) == SST_ENFOGGING);
const FxU32 regCount = (2 + depthP + fogP);
const FxU32 regMask = (0x05 | MaskSelect(depthP, 0x08UL) | MaskSelect(fogP, 0x02UL));
REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, (1 + fogP), (0x01UL | MaskSelect(fogP, 0x02UL)));
{
/* disable biasing in color combine */
/* this can change the parameters output */
/* xxx consult add path for switch version */
/* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA
does not work, you need to do this instead of below.
if (gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA)
{
fbzcolorpath &= ~SST_CC_ADD_CLOCAL;
}
*/
fbzcolorpath &= ~(SST_CC_ADD_CLOCAL | SST_CC_ADD_ALOCAL | SST_CC_SUB_CLOCAL);
REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath);
/* disable (fogta * fogColor) bias */
/* xxx setting ADD_FOG with fog disabled is harmless */
if (fogP) {
fogmode = fogmode_orig = gc->state.fbi_config.fogMode;
fogmode |= SST_FOGADD;
REG_GROUP_SET(hw, fogMode, fogmode);
}
}
REG_GROUP_END();
/* render first pass */
grDrawTriangle(a, b, c);
/* second pass */
/* xxx may sometimes need to copy texture coordinates */
/* tmu setup */
guTexSource(_gumpState.mmid[1]);
_gumpTexCombineFunction(1);
REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask);
{
/* disable factor and bias in color combine--
decal, except for the cases that need texture alpha */
/* this can change the parameters output */
fbzcolorpath = fbzcolorpath_orig;
fbzcolorpath &= ~( SST_RGBSELECT |
SST_LOCALSELECT |
SST_CC_ZERO_OTHER |
SST_CC_SUB_CLOCAL |
SST_CC_MSELECT |
SST_CC_REVERSE_BLEND |
SST_CC_ADD_CLOCAL |
SST_CC_ADD_ALOCAL |
SST_CC_INVERT_OUTPUT |
SST_CC_REVERSE_BLEND );
/* xxx the equivalent of GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA
does not work, you need to do this instead of below.
if ( gc->state.cc_fnc == GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA )
{
xxx see implementation notes on why this isn't implemented yet
GrErrorCallback("guDrawTriangleMP: "
"MULTIPLY and BLEND_ITRGB_ON_TEXALPHA not implemented yet!", FXFALSE );
goto all_done;
}
*/
fbzcolorpath |= SST_RGBSEL_TMUOUT;
REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath);
/* disable fog */
if (fogP) REG_GROUP_SET(hw, fogMode, 0);
/* enable alpha blend to multiply to destination buffers */
/* xxx alpha component blender can only handle factors of
0 and 1 */
alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT);
alphamode |= (SST_ENALPHABLEND |
(SST_A_COLOR << SST_RGBSRCFACT_SHIFT) |
(SST_A_ZERO << SST_RGBDSTFACT_SHIFT) |
(SST_A_ONE << SST_ASRCFACT_SHIFT) |
(SST_A_ZERO << SST_ADSTFACT_SHIFT));
REG_GROUP_SET(hw, alphaMode, alphamode);
/* if depth buffering, set to z= mode and disable writes */
if (depthP) {
fbzmode = fbzmode_orig = gc->state.fbi_config.fbzMode;
fbzmode &= ~(SST_ZAWRMASK | SST_ZFUNC);
fbzmode |= GR_CMP_EQUAL;
REG_GROUP_SET(hw, fbzMode, fbzmode);
}
}
REG_GROUP_END();
/* render second pass */
grDrawTriangle(a, b, c);
/* if bias, third pass */
if (fogP) {
/* enable alpha blend to add to destination buffers */
REG_GROUP_BEGIN(BROADCAST_ID, fogMode, 2, 0x03);
{
/* disable fog factor, leave fog bias enabled */
/* xxx setting ADD_MULT with fog disabled is harmless */
fogmode = fogmode_orig;
fogmode |= SST_FOGMULT;
REG_GROUP_SET(hw, fogMode, fogmode);
alphamode &= ~(SST_RGBSRCFACT | SST_RGBDSTFACT | SST_ASRCFACT | SST_ADSTFACT);
alphamode |= (SST_ENALPHABLEND |
(SST_A_ONE << SST_RGBSRCFACT_SHIFT) |
(SST_A_ONE << SST_RGBDSTFACT_SHIFT) |
(SST_A_ONE << SST_ASRCFACT_SHIFT) |
(SST_A_ONE << SST_ADSTFACT_SHIFT));
REG_GROUP_SET(hw, alphaMode, alphamode);
}
REG_GROUP_END();
/* render third pass */
grDrawTriangle(a, b, c);
}
REG_GROUP_BEGIN(BROADCAST_ID, fbzColorPath, regCount, regMask);
{
/* restore ccu/acu state */
REG_GROUP_SET(hw, fbzColorPath, fbzcolorpath_orig);
/* restore fog state */
if (fogP) REG_GROUP_SET(hw, fogMode, fogmode_orig);
/* restore alpha blending state */
REG_GROUP_SET(hw, alphaMode, alphamode_orig);
/* restore depth buffer state */
if (depthP) REG_GROUP_SET(hw, fbzMode, fbzmode_orig);
}
REG_GROUP_END();
}
goto all_done;
} else if (_gumpState.tc_fnc == GR_MPTEXTURECOMBINE_SUBTRACT) {
GrErrorCallback("gumpDrawTriangle: GR_MPTEXCOMBINE_SUBTRACT not implemented", FXFALSE);
goto all_done;
}
}
all_done:
GR_END();
}

View File

@@ -1,420 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.1.1.1.2.3 2005/01/22 14:52:01 koolsmoky
** enabled packed argb for cmd packet type 3
**
** Revision 1.1.1.1.2.2 2004/12/23 20:45:56 koolsmoky
** converted to nasm syntax
** added x86 asm, 3dnow! triangle and mmx, 3dnow! texture download optimizations
**
** Revision 1.1.1.1.2.1 2004/12/12 15:18:58 koolsmoky
** changes to support new cpuid; moved single_precision_asm(), double_precision_asm() from cpudetect.asm
**
** Revision 1.1.1.1 1999/12/07 21:49:08 joseph
** Initial checkin into SourceForge.
**
**
** 40 6/23/98 5:38p Peter
** lfb hinting
**
** 39 3/17/98 3:00p Peter
** removed unused stats
**
** 38 3/02/98 7:22p Peter
** moved internal function to where it is used
**
** 37 2/20/98 11:00a Peter
** removed glide3 from glid2 tree
**
** 36 2/20/98 9:05a Peter
** removed remnants of comdex grot
**
** 35 1/30/98 4:31p Peter
** general clenaup
**
** 34 1/20/98 10:48a Atai
** validate state in grGlideGetState
*
* 33 1/07/98 10:22a Peter
* lod dithering env var
*
* 32 1/06/98 3:53p Atai
* remove grHint, modify grLfbWriteRegion and grGet
*
* 31 12/17/97 4:05p Atai
* added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet()
* functions
*
* 30 12/09/97 12:20p Peter
* mac glide port
*
* 29 12/01/97 5:46p Peter
* fixed variable names in swizzle
*
* 28 12/01/97 5:17p Peter
*
* 27 11/18/97 4:36p Peter
* chipfield stuff cleanup and w/ direct writes
*
* 26 11/14/97 5:02p Peter
* more comdex stuff
*
* 25 11/14/97 12:09a Peter
* comdex thing and some other stuff
*
* 24 11/12/97 2:27p Peter
*
* 23 11/12/97 11:39a Dow
* H3 Stuff
*
* 22 11/12/97 9:21a Dow
* Changed CVG_FIFO to USE_PACKET_FIFO
*
* 21 11/04/97 4:00p Dow
* Banshee Mods
*
* 20 11/03/97 3:43p Peter
* h3/cvg cataclysm
*
* 19 10/16/97 3:40p Peter
* packed rgb
*
* 18 9/20/97 10:53a Peter
* keep track of palette stats
*
* 17 9/15/97 7:31p Peter
* more cmdfifo cleanup, fixed normal buffer clear, banner in the right
* place, lfb's are on, Hmmmm.. probably more
*
* 16 9/10/97 10:13p Peter
* fifo logic from GaryT, non-normalized fp first cut
*
* 15 7/25/97 11:40a Peter
* removed dHalf, change field name to match real use for cvg
*
* 14 7/08/97 2:48p Peter
*
* 13 6/30/97 3:20p Peter
* error callback
*
* 12 6/23/97 4:43p Peter
* cleaned up #defines etc for a nicer tree
*
**
*/
#include <string.h>
#include <3dfx.h>
#include <glidesys.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
#include "rcver.h"
static char glideIdent[] = "@#%" VERSIONSTR ;
/* the root of all EVIL */
struct _GlideRoot_s GR_CDECL _GlideRoot;
/* This is global to speed up the function call wrappers */
/*---------------------------------------------------------------------------
**
*/
void
_grDisplayStats(void)
{
int frames = _GlideRoot.stats.bufferSwaps;
if (frames <= 0) frames = 1;
gdbg_info(80,"GLIDE STATISTICS:\n");
gdbg_info(80," triangles processed: %7d tris drawn: %7d\n",
_GlideRoot.stats.trisProcessed, _GlideRoot.stats.trisDrawn);
gdbg_info(80," buffer swaps: %7d tris/frame: %7d , %d\n",
_GlideRoot.stats.bufferSwaps,
_GlideRoot.stats.trisProcessed/frames,
_GlideRoot.stats.trisDrawn/frames);
gdbg_info(80," points: %7d pnts/frame: %7d\n",
_GlideRoot.stats.pointsDrawn, _GlideRoot.stats.pointsDrawn/frames);
gdbg_info(80," lines: %7d lines/frame: %7d\n",
_GlideRoot.stats.linesDrawn, _GlideRoot.stats.linesDrawn/frames);
gdbg_info(80," texture downloads: %7d texture bytes: %7d\n",
_GlideRoot.stats.texDownloads, _GlideRoot.stats.texBytes);
gdbg_info(80," palette downloads: %7d palette bytes: %7d\n",
_GlideRoot.stats.palDownloads, _GlideRoot.stats.palBytes);
gdbg_info(80," NCC downloads: %7d NCC bytes: %7d\n",
_GlideRoot.stats.nccDownloads, _GlideRoot.stats.nccBytes);
#if USE_PACKET_FIFO
gdbg_info(80,"\tCommandFifo:\n");
gdbg_info(80,"\t\tWraps: %ld\n", _GlideRoot.stats.fifoWraps);
if (_GlideRoot.stats.fifoWraps > 0) {
gdbg_info(80,"\t\tAvg Drain Depth: %g\n",
(double)_GlideRoot.stats.fifoWrapDepth / _GlideRoot.stats.fifoWraps);
}
gdbg_info(80,"\t\tStalls: %ld\n", _GlideRoot.stats.fifoStalls);
if (_GlideRoot.stats.fifoStalls > 0) {
gdbg_info(80,"\t\tAvg Stall Depth: %g\n",
(double)_GlideRoot.stats.fifoStallDepth / _GlideRoot.stats.fifoStalls);
}
#endif /* CVG_FIFO */
}
#if !USE_PACKET_FIFO
/*
** fifoFree is kept in bytes, each fifo entry is 8 bytes, but since there
** are headers involved, we assume an average of 2 registers per 8 bytes
** or 4 bytes of registers stored in every fifo entry
*/
void
_grReCacheFifo(FxI32 n)
{
#if !(GLIDE_PLATFORM & GLIDE_HW_H3)
GR_DCL_GC;
gc->state.fifoFree = ((grSstStatus() >> SST_MEMFIFOLEVEL_SHIFT) & 0xffff)<<2;
#if 0
gc->state.fifoFree -= gc->hwDep.sst1Dep.swFifoLWM + n;
#endif
#endif
}
FxI32 GR_CDECL
_grSpinFifo(FxI32 n)
{
GR_DCL_GC;
do {
_grReCacheFifo(n);
} while (gc->state.fifoFree < 0);
return gc->state.fifoFree;
}
#endif /* !USE_PACKET_FIFO */
/*---------------------------------------------------------------------------
**
*/
void
_grSwizzleColor(GrColor_t *color)
{
GR_DCL_GC;
FxU32 red, green, blue, alpha;
switch(gc->state.color_format) {
case GR_COLORFORMAT_ARGB:
break;
case GR_COLORFORMAT_ABGR:
red = (*color & 0x000000ff) << 16; /* 00RR0000 */
blue = (*color & 0x00ff0000) >> 16; /* 000000BB */
*color &= 0xff00ff00; /* AA00GG00 */
*color |= (red | blue); /* AARRGGBB */
break;
case GR_COLORFORMAT_RGBA:
blue = (*color & 0x0000ff00) >> 8; /* 000000BB */
green = (*color & 0x00ff0000) >> 8; /* 0000GG00 */
red = (*color & 0xff000000) >> 8; /* 00RR0000 */
alpha = (*color & 0x000000ff) << 24; /* AA000000 */
*color = alpha | red | green | blue; /* AARRGGBB */
break;
case GR_COLORFORMAT_BGRA:
blue = (*color & 0xff000000) >> 24; /* 000000BB */
green = (*color & 0x00ff0000) >> 8; /* 0000GG00 */
red = (*color & 0x0000ff00) << 8; /* 00RR0000 */
alpha = (*color & 0x000000ff) << 24; /* AA000000 */
*color = alpha | red | green | blue; /* AARRGGBB */
break;
default:
GR_ASSERT(0);
break;
}
} /* _grSwizzleColor */
/*---------------------------------------------------------------------------
** grGlideGetVersion
** NOTE: allow this to be called before grGlideInit()
*/
GR_DIENTRY(grGlideGetVersion, void, (char version[80]))
{
GDBG_INFO(87,"grGlideGetVersion(0x%x) => \"%s\"\n",version,glideIdent+3);
GR_ASSERT(version != NULL);
strcpy(version,glideIdent+3);
} /* grGlideGetVersion */
/*---------------------------------------------------------------------------
** grGlideGetState
*/
GR_DIENTRY(grGlideGetState, void, (GrState *state))
{
GR_BEGIN_NOFIFOCHECK("grGlideGetState",87);
GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",state);
GR_ASSERT(state != NULL);
*state = gc->state;
GR_END();
} /* grGlideGetState */
#ifndef GLIDE_ALPHA
/*---------------------------------------------------------------------------
** grHints
*/
GR_DIENTRY(grHints, void, (GrHint_t hintType, FxU32 hints))
{
GR_BEGIN_NOFIFOCHECK("grHints",85);
GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x)\n",hintType,hints);
switch (hintType) {
case GR_HINT_STWHINT:
if (gc->state.paramHints != hints) {
gc->state.paramHints = hints;
_grUpdateParamIndex();
}
break;
case GR_HINT_FIFOCHECKHINT:
/* swFifoLWM is kept internally in bytes, hints are in fifo entries */
gc->state.checkFifo = hints;
break;
case GR_HINT_FPUPRECISION:
hints ? double_precision_asm() : single_precision_asm();
break;
case GR_HINT_ALLOW_MIPMAP_DITHER:
/* Regardless of the game hint, force the user selection */
gc->state.allowLODdither = ((_GlideRoot.environment.texLodDither != 0) ||
hints);
break;
case GR_HINT_LFB_WRITE:
{
const FxU32 lfbRange = (((hints * gc->state.screen_height) + 0x1000UL) &
~(0x1000UL - 1));
pciLinearRangeSetPermission((const FxU32)((const FxU8*)gc->base_ptr + 0x200000UL),
0x200000UL,
FXFALSE);
pciLinearRangeSetPermission((const FxU32)gc->lfb_ptr,
lfbRange,
FXTRUE);
pciLinearRangeSetPermission((const FxU32)((const FxU8*)gc->lfb_ptr + lfbRange),
0x400000UL - lfbRange,
FXFALSE);
break;
}
case GR_HINT_LFB_PROTECT:
pciLinearRangeSetPermission((const FxU32)((const FxU8*)gc->base_ptr + 0x200000UL),
0x200000UL,
FXTRUE);
pciLinearRangeSetPermission((const FxU32)gc->lfb_ptr,
0x400000,
FXFALSE);
break;
case GR_HINT_LFB_RESET:
pciLinearRangeSetPermission((const FxU32)gc->base_ptr,
0x1000000UL,
FXTRUE);
break;
default:
GR_CHECK_F(myName, 1, "invalid hints type");
}
GR_END();
} /* grHints */
#endif
/*---------------------------------------------------------------------------
** grGlideInit
*/
GR_DIENTRY(grGlideInit, void, (void))
{
GDBG_INIT();
GDBG_INFO(80,"grGlideInit()\n");
_GlideInitEnvironment(); /* the main init code */
FXUNUSED(*glideIdent);
#if GDBG_INFO_ON
gdbg_error_set_callback(_grErrorCallback);
#endif
grResetTriStats();
GDBG_INFO(281,"grGlideInit --done---------------------------------------\n");
} /* grGlideInit */
/*---------------------------------------------------------------------------
** grGlideShamelessPlug - grGlideShamelessPlug
**
** Returns:
**
** Notes:
**
*/
GR_DIENTRY(grGlideShamelessPlug, void, (const FxBool mode))
{
GDBG_INFO(80,"grGlideShamelessPlug(%d)\n",mode);
_GlideRoot.environment.shamelessPlug = mode;
} /* grGlideShamelessPlug */
/*---------------------------------------------------------------------------
** grResetTriStats - Set triangle counters to zero.
*/
GR_DIENTRY(grResetTriStats, void, (void))
{
GDBG_INFO(80,"grResetTriStats()\n");
_GlideRoot.stats.bufferSwaps = 0;
_GlideRoot.stats.linesDrawn = 0;
_GlideRoot.stats.trisProcessed = 0;
_GlideRoot.stats.trisDrawn = 0;
_GlideRoot.stats.texDownloads = 0;
_GlideRoot.stats.texBytes = 0;
_GlideRoot.stats.palDownloads = 0;
_GlideRoot.stats.palBytes = 0;
} /* grResetTriStats */
/*---------------------------------------------------------------------------
** grResetTriStats - Set triangle counters to zero.
*/
GR_DIENTRY(grTriStats, void, (FxU32 *trisProcessed, FxU32 *trisDrawn))
{
GDBG_INFO(80,"grTriStats() => %d %d\n",
_GlideRoot.stats.trisProcessed,
_GlideRoot.stats.trisDrawn);
*trisProcessed = _GlideRoot.stats.trisProcessed;
*trisDrawn = _GlideRoot.stats.trisDrawn;
} /* grTriStats */
void GR_CDECL
_grFence(void)
{
GDBG_INFO(120,"\t\t\t\t\t\t\tFENCE\n");
P6FENCE;
}

View File

@@ -1,581 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
**
** 11 2/20/98 5:31p Peter
** crybaby glide
**
** 10 2/20/98 11:00a Peter
** removed glide3 from glid2 tree
*
* 9 1/08/98 7:09p Peter
* real hw stuff modulo makefile change
*
* 8 1/06/98 6:47p Atai
* undo grSplash and remove gu routines
*
* 7 12/15/97 5:51p Atai
* disable obsolete glide2 api for glide3
*
* 6 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 5 5/21/97 6:04a Peter
*
* 4 5/05/97 4:24p Pgj
* Neuter guTexDownloadMipMap error message
*
* 3 3/18/97 9:07p Dow
* Got rid of #$#%#$ // comments
*
* 2 3/09/97 10:31a Dow
* Added GR_DIENTRY for di glide functions
*
* 1 12/23/96 1:39p Dow
* Changes for multiplatform
**
*/
#include <string.h>
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
/* externals from ditex.c */
extern FxU32 _grMipMapHostSize[][16];
extern FxU32 _gr_aspect_index_table[];
extern FxU32 _gr_aspect_xlate_table[];
extern FxU32 _gr_evenOdd_xlate_table[];
/*---------------------------------------------------------------------------
** guTexAllocateMemory
*/
GR_DIENTRY(guTexAllocateMemory, GrMipMapId_t, ( GrChipID_t tmu,
FxU8 odd_even_mask,
int width, int height,
GrTextureFormat_t format,
GrMipMapMode_t mipmap_mode,
GrLOD_t small_lod, GrLOD_t large_lod,
GrAspectRatio_t aspect_ratio,
GrTextureClampMode_t s_clamp_mode,
GrTextureClampMode_t t_clamp_mode,
GrTextureFilterMode_t minfilter_mode,
GrTextureFilterMode_t magfilter_mode,
float lod_bias,
FxBool trilinear
))
{
FxU32
memrequired,
memavail,
baseAddress,
tLod,
texturemode,
filterMode, /* filter mode bits */
clampMode; /* clamp mode bits */
GrMipMapId_t
mmid = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE;
int
int_lod_bias;
GrTexInfo info;
GR_BEGIN_NOFIFOCHECK("guTexAllocateMemory",99);
GDBG_INFO_MORE(gc->myLevel,"(%d,%d, %d,%d, %d,%d, %d,%d,%d, %d,%d, %d,%d)\n",
tmu,odd_even_mask,width,height,format,mipmap_mode,
small_lod,large_lod,aspect_ratio,
s_clamp_mode,t_clamp_mode, minfilter_mode,magfilter_mode);
/*
** The constants are actually reverse of each other so the following
** test IS valid!
*/
GR_CHECK_F(myName, small_lod < large_lod, "smallest_lod is larger than large_lod");
info.smallLod = small_lod;
info.largeLod = large_lod;
info.aspectRatio = aspect_ratio;
info.format = format;
memrequired = grTexTextureMemRequired(odd_even_mask, &info);
/*
** Make sure to not cross 2 MByte texture boundry
*/
if ((gc->tmu_state[tmu].freemem_base < 0x200000) &&
(gc->tmu_state[tmu].freemem_base + memrequired > 0x200000))
gc->tmu_state[tmu].freemem_base = 0x200000;
/*
** If we have enough memory and a free mip map handle then go for it
*/
memavail = guTexMemQueryAvail( tmu );
if ( memavail < memrequired )
return (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE;
if (gc->mm_table.free_mmid >= MAX_MIPMAPS_PER_SST )
return (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE;
/*
** Allocate the mip map id
*/
mmid = gc->mm_table.free_mmid++;
/*
** calculate baseAddress (where LOD 0 would go)
*/
baseAddress = _grTexCalcBaseAddress( gc->tmu_state[tmu].freemem_base,
large_lod,
aspect_ratio,
format,
odd_even_mask );
GDBG_INFO(gc->myLevel," baseAddress = 0x%x (in bytes)\n",baseAddress);
/*
** reduce available memory to reflect allocation
*/
gc->tmu_state[tmu].freemem_base += memrequired;
/*
** Create the tLOD register value for this mip map
*/
int_lod_bias = _grTexFloatLODToFixedLOD( lod_bias );
tLod = mipmap_mode==GR_MIPMAP_DISABLE ? large_lod : small_lod;
tLod = SST_TLOD_MINMAX_INT(large_lod,tLod);
tLod |= _gr_evenOdd_xlate_table[odd_even_mask];
tLod |= _gr_aspect_xlate_table[aspect_ratio];
tLod |= int_lod_bias << SST_LODBIAS_SHIFT;
filterMode = (
(minfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) |
(magfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0)
);
clampMode = (
(s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) |
(t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0)
);
/*
** Create the tTextureMode register value for this mip map
*/
texturemode = ( format << SST_TFORMAT_SHIFT );
texturemode |= SST_TCLAMPW;
texturemode |= SST_TPERSP_ST;
texturemode |= filterMode;
texturemode |= clampMode;
if ( mipmap_mode == GR_MIPMAP_NEAREST_DITHER )
texturemode |= SST_TLODDITHER;
if ( trilinear ) {
texturemode |= SST_TRILINEAR;
if ( odd_even_mask & GR_MIPMAPLEVELMASK_ODD )
tLod |= SST_LOD_ODD;
if ( odd_even_mask != GR_MIPMAPLEVELMASK_BOTH )
tLod |= SST_LOD_TSPLIT;
}
/*
** Fill in the mm_table data for this mip map
*/
gc->mm_table.data[mmid].format = format;
gc->mm_table.data[mmid].mipmap_mode = mipmap_mode;
gc->mm_table.data[mmid].magfilter_mode = magfilter_mode;
gc->mm_table.data[mmid].minfilter_mode = minfilter_mode;
gc->mm_table.data[mmid].s_clamp_mode = s_clamp_mode;
gc->mm_table.data[mmid].t_clamp_mode = t_clamp_mode;
gc->mm_table.data[mmid].tLOD = tLod;
gc->mm_table.data[mmid].tTextureMode = texturemode;
gc->mm_table.data[mmid].lod_bias = int_lod_bias;
gc->mm_table.data[mmid].lod_min = small_lod;
gc->mm_table.data[mmid].lod_max = large_lod;
gc->mm_table.data[mmid].tmu = tmu;
gc->mm_table.data[mmid].odd_even_mask = odd_even_mask;
gc->mm_table.data[mmid].tmu_base_address = baseAddress;
gc->mm_table.data[mmid].trilinear = trilinear;
gc->mm_table.data[mmid].aspect_ratio = aspect_ratio;
gc->mm_table.data[mmid].data = 0;
/* gc->mm_table.data[mmid].ncc_table = 0; */
gc->mm_table.data[mmid].sst = _GlideRoot.current_sst;
gc->mm_table.data[mmid].valid = FXTRUE;
gc->mm_table.data[mmid].width = width;
gc->mm_table.data[mmid].height = height;
GR_RETURN(mmid);
} /* guTexAllocateMemory */
static void
_guTexRebuildRegisterShadows( GrMipMapId_t mmid )
{
GR_DCL_GC;
GrMipMapInfo *mminfo = &gc->mm_table.data[mmid];
int texturemode = 0;
int tLod = 0;
FxU32
filterMode, /* filter mode bits of texturemode */
clampMode; /* clamp mode bits of texturemode */
/* build filterMode */
filterMode = (
(mminfo->minfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMINFILTER : 0) |
(mminfo->magfilter_mode == GR_TEXTUREFILTER_BILINEAR ? SST_TMAGFILTER : 0)
);
clampMode = (
(mminfo->s_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPS : 0) |
(mminfo->t_clamp_mode == GR_TEXTURECLAMP_CLAMP ? SST_TCLAMPT : 0)
);
/*
** build up tTextureMode
*/
texturemode |= ( mminfo->format << SST_TFORMAT_SHIFT );
texturemode |= SST_TCLAMPW;
texturemode |= SST_TPERSP_ST;
texturemode |= filterMode;
texturemode |= clampMode;
if ( mminfo->mipmap_mode == GR_MIPMAP_NEAREST_DITHER )
texturemode |= SST_TLODDITHER;
if ( mminfo->trilinear )
texturemode |= SST_TRILINEAR;
/*
** build up tLOD
*/
tLod = mminfo->mipmap_mode == GR_MIPMAP_DISABLE ? mminfo->lod_max : mminfo->lod_min;
tLod = SST_TLOD_MINMAX_INT(mminfo->lod_max,tLod);
tLod |= _gr_evenOdd_xlate_table[mminfo->odd_even_mask];
tLod |= _gr_aspect_xlate_table[mminfo->aspect_ratio];
tLod |= mminfo->lod_bias << SST_LODBIAS_SHIFT;
/*
** assign them
*/
mminfo->tTextureMode = texturemode;
mminfo->tLOD = tLod;
} /* guTexRebuildRegisterShadows */
/*---------------------------------------------------------------------------
** guTexChangeAttributes
*/
GR_DIENTRY(guTexChangeAttributes, FxBool, ( GrMipMapId_t mmid,
int width, int height,
GrTextureFormat_t fmt,
GrMipMapMode_t mm_mode,
GrLOD_t smallest_lod, GrLOD_t largest_lod,
GrAspectRatio_t aspect,
GrTextureClampMode_t s_clamp_mode,
GrTextureClampMode_t t_clamp_mode,
GrTextureFilterMode_t minFilterMode,
GrTextureFilterMode_t magFilterMode
))
{
GrMipMapInfo *mminfo;
GR_BEGIN_NOFIFOCHECK("guTexChangeAttributes",88);
GDBG_INFO_MORE(gc->myLevel,"(%d, %d,%d, %d,%d, %d,%d,%d, %d,%d, %d,%d)\n",
mmid,width,height,fmt,mm_mode,
smallest_lod,largest_lod,aspect,
s_clamp_mode,t_clamp_mode, minFilterMode,magFilterMode);
/*
** Make sure that mmid is not NULL
*/
if ( mmid == GR_NULL_MIPMAP_HANDLE ) {
GR_RETURN(FXFALSE);
}
mminfo = &gc->mm_table.data[mmid];
/*
** Fill in the mm_table data for this mip map
*/
if ( fmt != -1 )
mminfo->format = fmt;
if ( mm_mode != -1 )
mminfo->mipmap_mode = mm_mode;
if ( smallest_lod != -1 )
mminfo->lod_min = smallest_lod;
if ( largest_lod != -1 )
mminfo->lod_max = largest_lod;
if ( minFilterMode != -1 )
mminfo->minfilter_mode = minFilterMode;
if ( magFilterMode != -1 )
mminfo->magfilter_mode = magFilterMode;
if ( s_clamp_mode != -1 )
mminfo->s_clamp_mode = s_clamp_mode;
if ( t_clamp_mode != -1 )
mminfo->t_clamp_mode = t_clamp_mode;
if ( aspect != -1 )
mminfo->aspect_ratio = aspect;
if ( width != -1 )
mminfo->width = width;
if ( height != -1 )
mminfo->height = height;
_guTexRebuildRegisterShadows( mmid );
GR_RETURN(FXTRUE);
} /* guTexChangeAttributes */
/*---------------------------------------------------------------------------
** grTexCombineFunction - obsolete
**
*/
GR_DIENTRY(grTexCombineFunction, void,
(GrChipID_t tmu, GrTextureCombineFnc_t tc))
{
guTexCombineFunction( tmu, tc );
}
/*---------------------------------------------------------------------------
** guTexCombineFunction
**
** Sets the texture combine function. For a dual TMU system this function
** will configure the TEXTUREMODE registers as appropriate. For a
** single TMU system this function will configure TEXTUREMODE if
** possible, or defer operations until grDrawTriangle() is called.
*/
GR_DIENTRY(guTexCombineFunction, void,
(GrChipID_t tmu, GrTextureCombineFnc_t tc))
{
GDBG_INFO(99,"guTexCombineFunction(%d,%d)\n",tmu,tc);
switch ( tc ) {
case GR_TEXTURECOMBINE_ZERO:
grTexCombine( tmu, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE,
GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE );
break;
case GR_TEXTURECOMBINE_DECAL:
grTexCombine( tmu, GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE,
GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE );
break;
case GR_TEXTURECOMBINE_ONE:
grTexCombine( tmu, GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE,
GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, FXTRUE, FXTRUE );
break;
case GR_TEXTURECOMBINE_ADD:
grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE,
GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE );
break;
case GR_TEXTURECOMBINE_MULTIPLY:
grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL,
GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE );
break;
case GR_TEXTURECOMBINE_DETAIL:
grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR,
GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR, FXFALSE, FXFALSE );
break;
case GR_TEXTURECOMBINE_DETAIL_OTHER:
grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_DETAIL_FACTOR,
GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_DETAIL_FACTOR, FXFALSE, FXFALSE );
break;
case GR_TEXTURECOMBINE_TRILINEAR_ODD:
grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION,
GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, FXFALSE, FXFALSE );
break;
case GR_TEXTURECOMBINE_TRILINEAR_EVEN:
grTexCombine( tmu, GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_LOD_FRACTION,
GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_LOD_FRACTION, FXFALSE, FXFALSE );
break;
case GR_TEXTURECOMBINE_SUBTRACT:
grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE,
GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE );
break;
case GR_TEXTURECOMBINE_OTHER:
grTexCombine( tmu, GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE,
GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE );
break;
default:
GrErrorCallback( "guTexCombineFunction: Unsupported function", FXTRUE );
break;
}
} /* guTexCombineFunction */
/*---------------------------------------------------------------------------
** guTexDownloadMipMap
**
** Downloads a mip map (previously allocated with guTexAllocateMemory) to
** the hardware using the given data and ncctble. The "data" is assumed
** to be in row major order from largest mip map to smallest mip map.
*/
GR_DIENTRY(guTexDownloadMipMap, void,
(GrMipMapId_t mmid, const void *src, const GuNccTable
*ncc_table ) )
{
GR_DCL_GC;
GrLOD_t lod;
const void *ptr = src;
GDBG_INFO(99,"guTexDownloadMipMap(%d,0x%x,0x%x)\n",mmid,src,ncc_table);
GR_ASSERT(gc != NULL);
GR_ASSERT(src != NULL);
GR_CHECK_F("guTexDownloadMipMap",
( mmid == GR_NULL_MIPMAP_HANDLE ) || ( mmid >= gc->mm_table.free_mmid ),
"invalid mip map handle passed");
#if 0 /* Fixme!!! XXX ??? */
GR_CHECK_F("guTexDownloadMipMap",
gc->mm_table.data[mmid].format == GR_TEXFMT_P_8,
"guTex* does not support palletted textures - use grTex* instead");
#endif /* 0 */
/*
** Bind data and ncc table to this mip map
*/
gc->mm_table.data[mmid].data = (void *) ptr;
if (gc->mm_table.data[mmid].format == GR_TEXFMT_YIQ_422)
gc->mm_table.data[mmid].ncc_table = *ncc_table;
/*
** Start downloading mip map levels, note that ptr is updated by the caller
*/
for ( lod = gc->mm_table.data[mmid].lod_max; lod <= gc->mm_table.data[mmid].lod_min; lod++ ) {
guTexDownloadMipMapLevel( mmid, lod, &ptr );
}
} /* guTexDownloadMipMap */
/*---------------------------------------------------------------------------
** guTexDownloadMipMapLevel
**
** Downloads a single mip map level to a mip map. "src" is considered to be
** row major data of the correct aspect ratio and format.
*/
GR_DIENTRY(guTexDownloadMipMapLevel, void,
(GrMipMapId_t mmid, GrLOD_t lod,
const void **src_base))
{
FxU32 i;
const GrMipMapInfo *mminfo;
GR_DCL_GC;
GDBG_INFO(99,"guTexDownloadMipMapLevel(%d,%d,0x%x)\n",mmid,lod,src_base);
GR_ASSERT(src_base != NULL);
mminfo = &gc->mm_table.data[mmid];
GR_CHECK_F( "guTexDownloadMipMapLevel",
( lod > mminfo->lod_min ) || ( lod < mminfo->lod_max ),
"specified lod is out of range");
/* GMT: replace with array access */
/* download this level */
i = _grTexCalcBaseAddress( 0,
mminfo->lod_max,
mminfo->aspect_ratio,
mminfo->format,
mminfo->odd_even_mask);
grTexDownloadMipMapLevel( mminfo->tmu,
mminfo->tmu_base_address - i,
lod,
mminfo->lod_max,
mminfo->aspect_ratio,
mminfo->format,
mminfo->odd_even_mask,
(void *)*src_base );
/* update src_base to point to next mipmap level */
*src_base = (void *) (((FxU32)*src_base) +
(_grMipMapHostSize[_gr_aspect_index_table[mminfo->aspect_ratio]][lod]
<< (mminfo->format>=GR_TEXFMT_16BIT)));
} /* guTexDownloadMipmapLevel */
/*---------------------------------------------------------------------------
** guTexGetCurrentMipMap
*/
GR_DIENTRY(guTexGetCurrentMipMap, GrMipMapId_t, ( GrChipID_t tmu ))
{
#define FN_NAME "guTexGetCurrentMipMap"
GR_BEGIN_NOFIFOCHECK("guTexGetCurrentMipMap",99);
GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu);
GR_CHECK_TMU(FN_NAME, tmu );
GR_RETURN(gc->state.current_mm[tmu]);
#undef FN_NAME
} /* guTexGetCurrentMipMap */
/*---------------------------------------------------------------------------
** guTexGetMipMapInfo
*/
GR_DIENTRY(guTexGetMipMapInfo, GrMipMapInfo *, ( GrMipMapId_t mmid ))
{
GR_BEGIN_NOFIFOCHECK("guTexGetMipMapInfo",99);
GDBG_INFO_MORE(gc->myLevel,"(%d) => 0x%x\n",mmid,&gc->mm_table.data[mmid]);
return &( gc->mm_table.data[mmid] );
} /* guTexGetMipMapInfo */
/*---------------------------------------------------------------------------
** guTexMemQueryAvail
**
** returns the amount of available texture memory on a specified TMU.
*/
GR_DIENTRY(guTexMemQueryAvail, FxU32, ( GrChipID_t tmu ))
{
#define FN_NAME "guTexMemQueryAvail"
GR_BEGIN_NOFIFOCHECK("guTexMemQueryAvail",99);
GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu);
GR_CHECK_TMU(FN_NAME, tmu );
GR_RETURN(gc->tmu_state[tmu].total_mem - gc->tmu_state[tmu].freemem_base);
#undef FN_NAME
} /* guTexQueryMemAvail */
/*---------------------------------------------------------------------------
** guTexMemReset
**
** Clears out texture buffer memory.
*/
GR_DIENTRY(guTexMemReset, void, ( void ))
{
int i;
GR_BEGIN_NOFIFOCHECK("guTexMemReset",99);
GDBG_INFO_MORE(gc->myLevel,"()\n");
memset( gc->mm_table.data, 0, sizeof( gc->mm_table.data ) );
gc->mm_table.free_mmid = 0;
for ( i = 0; i < gc->num_tmu; i++ ) {
gc->state.current_mm[i] = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE;
gc->tmu_state[i].freemem_base = 0;
gc->tmu_state[i].ncc_mmids[0] =
gc->tmu_state[i].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE;
gc->tmu_state[i].ncc_table[0] =
gc->tmu_state[i].ncc_table[1] = 0;
}
GR_END();
} /* guTexMemReset */

View File

@@ -1,216 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.1.1.1 1999/12/07 21:49:08 joseph
** Initial checkin into SourceForge.
**
**
** 22 4/21/98 10:05a Peter
** grSstSelect cleanup (Thanks John/Rufus)
**
** 21 3/17/98 6:50p Peter
** sli paired vs active
**
** 20 2/24/98 10:15a Peter
** oem dll muckage
**
** 19 2/20/98 11:00a Peter
** removed glide3 from glid2 tree
*
* 18 12/17/97 4:05p Atai
* added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet()
* functions
*
* 17 12/09/97 12:20p Peter
* mac glide port
*
* 16 11/19/97 2:49p Peter
* env vars in registry for win32
*
* 15 11/18/97 4:36p Peter
* chipfield stuff cleanup and w/ direct writes
*
* 14 10/31/97 9:15a Peter
* only lie about v2 boards
*
* 13 10/31/97 8:53a Peter
* last lying change, really
*
* 12 9/05/97 5:29p Peter
* changes for direct hw
*
* 11 6/20/97 9:56a Peter
* better lines/pts, hopefully
*
* 10 6/02/97 4:09p Peter
* Compile w/ gcc for Dural
*
* 9 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 8 5/21/97 6:04a Peter
*
* 7 5/02/97 2:07p Pgj
* grSstScreenWidth/Height now FxU32
*
* 6 3/17/97 6:25a Jdt
* Added initDeviceSelect to grSstSelect()
*
* 5 3/09/97 10:31a Dow
* Added GR_DIENTRY for di glide functions
*
* 4 3/04/97 9:08p Dow
*
* 3 1/18/97 11:39p Dow
* Changed location of _curGCFuncs
*
* 2 1/16/97 3:39p Dow
* Added ref to _curGCFuncs during grSstSelect()
*
* 1 12/23/96 1:39p Dow
* Changes for multiplatform
**
*/
#include <stdio.h>
#include <string.h>
#include <3dfx.h>
#include <glidesys.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
/*---------------------------------------------------------------------------
** grSstQueryBoards
**
** NOTE: it is OK to call this routine before grGlideInit
*/
GR_DIENTRY(grSstQueryBoards, FxBool, ( GrHwConfiguration *hwc ))
{
GDBG_INIT();
GDBG_INFO(80,"grSstQueryBoards(0x%x)\n",hwc);
#if 1 /*GLIDE_INIT_HAL*/
hwc->num_sst = (_grSstDetectResources()
? _GlideRoot.hwConfig.num_sst
: 0);
#else /* !GLIDE_INIT_HAL */
hwc->num_sst = sst1InitNumBoardsInSystem();
#endif /* !GLIDE_INIT_HAL */
return FXTRUE;
} /* grSstQueryBoards */
/*---------------------------------------------------------------------------
** grSstQueryHardware
**
*/
GR_DIENTRY(grSstQueryHardware, FxBool, ( GrHwConfiguration *hwc ))
{
FxBool retVal;
GR_BEGIN_NOFIFOCHECK("grSstQueryHardware",80);
GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",hwc);
/* init and copy the data back to the user's structure */
retVal = _GlideRoot.hwConfig.num_sst > 0;
*hwc = _GlideRoot.hwConfig;
#if (GLIDE_PLATFORM & GLIDE_HW_CVG)
/* Lie that we are an sst1 for backwards compatability */
{
int i;
const GrSstType reportType = ((GETENV("FX_GLIDE_REPORT_REAL_HW") == NULL)
? GR_SSTTYPE_VOODOO
: GR_SSTTYPE_Voodoo2);
for(i = 0; i < _GlideRoot.hwConfig.num_sst; i++) {
if (hwc->SSTs[i].type == GR_SSTTYPE_Voodoo2) hwc->SSTs[i].type = reportType;
}
}
#endif
GR_RETURN(retVal);
} /* grSstQueryHardware */
/*---------------------------------------------------------------------------
** grSstSelect
*/
GR_DIENTRY(grSstSelect, void, ( int which ))
{
GR_BEGIN_NOFIFOCHECK("grSstSelect",80);
GDBG_INFO_MORE(gc->myLevel,"(%d)\n",which);
if ( which >= _GlideRoot.hwConfig.num_sst )
GrErrorCallback( "grSstSelect: non-existent SST", FXTRUE );
_GlideRoot.current_sst = _GlideRoot.gcMap[which];
_GlideRoot.curGC = &_GlideRoot.GCs[_GlideRoot.current_sst];
#ifdef GLIDE_MULTIPLATFORM
_GlideRoot.curGCFuncs = _GlideRoot.curGC->gcFuncs;
#endif
GR_END();
} /* grSstSelect */
/*---------------------------------------------------------------------------
** grSstScreenWidth
*/
GR_DIENTRY(grSstScreenWidth, FxU32, (void))
{
GR_DCL_GC;
GR_ASSERT(gc != NULL);
return gc->state.screen_width;
} /* grSstScreenWidth */
/*---------------------------------------------------------------------------
** grSstScreenHeight
*/
GR_DIENTRY(grSstScreenHeight, FxU32, (void))
{
GR_DCL_GC;
GR_ASSERT(gc != NULL);
return gc->state.screen_height;
}
/*---------------------------------------------------------------------------
** grSstVidMode - override args to grSstOpen()
*/
GR_DIENTRY(grSstVidMode, void, (FxU32 whichSst, FxVideoTimingInfo* vidTimings))
{
GDBG_INFO(80,"grSstVidMode(%d,0x%x)\n",whichSst,vidTimings);
#ifdef GLIDE_DEBUG
if (whichSst >= MAX_NUM_SST) {
char errStr[1028];
sprintf(errStr, "grSstVidMode: %ld greater than MAX_NUM_SST (%d)\n",
whichSst, MAX_NUM_SST);
GrErrorCallback(errStr, FXTRUE);
}
#endif
_GlideRoot.GCs[whichSst].vidTimings = vidTimings;
} /* grSstVidMode */

View File

@@ -1,943 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*
* 17 1/13/98 12:42p Atai
* fixed grtexinfo, grVertexLayout, and draw triangle
*
* 16 1/10/98 4:01p Atai
* inititialize vertex layout, viewport, added defines
*
* 15 1/05/98 6:06p Atai
* glide extension stuff
*
* 14 12/17/97 4:05p Atai
* added grChromaRange(), grGammaCorrecionRGB(), grRest(), and grGet()
* functions
*
* 13 12/16/97 11:38a Atai
* added grChromaRange()
*
* 12 12/15/97 5:52p Atai
* disable obsolete glide2 api for glide3
*
* 10 12/12/97 1:30p Atai
* remove fp z buffer
*
* 8 12/08/97 10:44a Atai
* added entry point for grCoordinateSpace(), grDepthRange(), and
* grViewport()
*
* 7 11/13/97 4:38p Atai
* invalidate lfbMode and c0c1
*
* 6 11/10/97 5:20p Atai
* added factor for grAlphaCombine and remove extra _grChromakeyMode
*
* 5 11/07/97 11:22a Atai
* remove GR_*_SMOOTH. use GR_SMOOTH
*
* 4 10/15/97 7:33a Dow
* Made _grValidateState use central routine for writing data
*
* 3 10/14/97 4:18p Atai
* added grEnable and grDisable
*
* 2 10/10/97 2:57p Dow
* Minor adjustments
*
* 1 10/09/97 5:19p Dow
* State Monster file
*/
#ifdef GLIDE3
#include <3dfx.h>
#include <glidesys.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
/*=============================================================================
** Replacement state routines.
**
** These routines store away their arguments, and mark a piece of glide state
** as invalid. The next time a rendering primitive is called, the state will
** be invalid, and grValidateState will be called. See that routine for more
** info.
**===========================================================================*/
/*
Some macros for use in this file only
*/
#define STOREARG(function, arg) \
gc->state.stateArgs.##function##Args.arg = arg
#define LOADARG(function, arg) \
gc->state.stateArgs.##function##Args.arg
#define INVALIDATE(regset) \
gc->state.invalid |= ##regset##BIT
#define NOTVALID(regset) \
(gc->state.invalid & ##regset##BIT)
#define SETVALID(regset) \
(gc->state.invalid &= ~(##regset##BIT))
#define ENABLEMODE(mode) \
gc->state.grEnableArgs.##mode## = GR_MODE_ENABLE;
#define DISABLEMODE(mode) \
gc->state.grEnableArgs.##mode## = GR_MODE_DISABLE;
/*-------------------------------------------------------------------
Function: grAlphaBlendFunction
Date: 06-Oct-97
Implementor(s): dow
Description:
Inform Glide that the Alpha Blend Function has been modified.
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grAlphaBlendFunction, void , (GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df, GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df) )
{
#define FN_NAME "grAlphaBlendFunction"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 87);
/* Invalidate AlphaMode */
INVALIDATE(alphaMode);
STOREARG(grAlphaBlendFunction, rgb_sf);
STOREARG(grAlphaBlendFunction, rgb_df);
STOREARG(grAlphaBlendFunction, alpha_sf);
STOREARG(grAlphaBlendFunction, alpha_df);
#undef FN_NAME
} /* grAlphaBlendFunction */
/*-------------------------------------------------------------------
Function: grAlphaTestFunction
Date: 06-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grAlphaTestFunction, void , (GrCmpFnc_t fnc) )
{
#define FN_NAME "grAlphaTestFunction"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 87);
/* Invalidate AlphaMode */
INVALIDATE(alphaMode);
STOREARG(grAlphaTestFunction, fnc);
#undef FN_NAME
} /* grAlphaTestFunction */
/*-------------------------------------------------------------------
Function: grAlphaTestReferenceValue
Date: 06-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grAlphaTestReferenceValue, void , (GrAlpha_t value) )
{
#define FN_NAME "grAlphaTestReferenceValue"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 87);
INVALIDATE(alphaMode);
STOREARG(grAlphaTestReferenceValue,value);
#undef FN_NAME
} /* grAlphaTestReferenceValue */
/*-------------------------------------------------------------------
Function: grAlphaCombine
Date: 06-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grAlphaCombine, void ,
(GrCombineFunction_t function, GrCombineFactor_t factor,
GrCombineLocal_t local, GrCombineOther_t other, FxBool invert) )
{
#define FN_NAME "grAlphaCombine"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
INVALIDATE(fbzColorPath);
STOREARG(grAlphaCombine, function);
STOREARG(grAlphaCombine, factor);
STOREARG(grAlphaCombine, local);
STOREARG(grAlphaCombine, other);
STOREARG(grAlphaCombine, invert);
#undef FN_NAME
} /* grAlphaCombine */
/*-------------------------------------------------------------------
Function: grAlphaControlsITRGBLighting
Date: 07-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grAlphaControlsITRGBLighting, void , (FxBool enable) )
{
#define FN_NAME "grAlphaControlsITRGBLighting"
GR_BEGIN_NOFIFOCHECK("grAlphaControlsITRGBLighting",85);
INVALIDATE(fbzColorPath);
STOREARG(grAlphaControlsITRGBLighting, enable);
#undef FN_NAME
} /* grAlphaControlsITRGBLighting */
/*-------------------------------------------------------------------
Function: grColorCombine
Date: 07-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grColorCombine, void , (GrCombineFunction_t function,
GrCombineFactor_t factor,
GrCombineLocal_t local,
GrCombineOther_t other, FxBool invert) )
{
#define FN_NAME "grColorCombine"
GR_BEGIN_NOFIFOCHECK("grColorCombine",85);
INVALIDATE(fbzColorPath);
STOREARG(grColorCombine, function);
STOREARG(grColorCombine, factor);
STOREARG(grColorCombine, local);
STOREARG(grColorCombine, other);
STOREARG(grColorCombine, invert);
#undef FN_NAME
} /* grColorCombine */
/*-------------------------------------------------------------------
Function: grChromakeyMode
Date: 07-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grChromakeyMode, void , (GrChromakeyMode_t mode) )
{
#define FN_NAME "grChromakeyMode"
GR_BEGIN_NOFIFOCHECK("grChromakeyMode",85);
INVALIDATE(fbzMode);
STOREARG(grChromakeyMode, mode);
#undef FN_NAME
} /* grChromakeyMode */
#if defined(GLIDE3) && defined(GLIDE3_ALPHA)
/*-------------------------------------------------------------------
Function: grChromaModeExt
Date: 05-Jan-98
Implementor(s): atai
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
void _grChromaModeExt(GrChromakeyMode_t mode)
{
#define FN_NAME "_grChromaModeExt"
GR_BEGIN_NOFIFOCHECK("_grChromaModeExt",85);
INVALIDATE(fbzMode);
STOREARG(grChromakeyMode, mode);
#undef FN_NAME
} /* _grChromaModeExt */
/*-------------------------------------------------------------------
Function: _grChromaRangeExt
Date: 15-Dec-97
Implementor(s): atai
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
void _grChromaRangeExt(GrColor_t color, GrColor_t range, GrChromaRangeMode_t mode)
{
#define FN_NAME "_grChromaRangeExt"
GR_BEGIN_NOFIFOCHECK("_grChromaRangeExt",85);
GR_CHECK_F(myName,
(_GlideRoot.hwConfig.SSTs[_GlideRoot.current_sst].type != GR_SSTTYPE_Voodoo2),
"grChromaRange not supported.");
INVALIDATE(chromaKey);
STOREARG(grChromakeyValue, color);
STOREARG(grChromaRange, range);
STOREARG(grChromaRange, mode);
#undef FN_NAME
} /* _grChromaRangeExt */
#endif
/*-------------------------------------------------------------------
Function: grChromakeyValue
Date: 09-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_ENTRY(grChromakeyValue, void , (GrColor_t color) )
{
#define FN_NAME "grChromakeyValue"
GR_BEGIN_NOFIFOCHECK("grChromakeyMode",85);
INVALIDATE(chromaKey);
STOREARG(grChromakeyValue, color);
#undef FN_NAME
} /* grChromakeyValue */
/*-------------------------------------------------------------------
Function: grDeptMask
Date: 07-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grDepthMask, void , (FxBool enable) )
{
#define FN_NAME "grDepthMask"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
INVALIDATE(fbzMode);
STOREARG(grDepthMask, enable);
#undef FN_NAME
} /* grDeptMask */
/*-------------------------------------------------------------------
Function: grDepthBufferFunction
Date: 07-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grDepthBufferFunction, void , (GrCmpFnc_t fnc) )
{
#define FN_NAME "grDepthBufferFunction"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
INVALIDATE(fbzMode);
STOREARG(grDepthBufferFunction, fnc);
#undef FN_NAME
} /* grDepthBufferFunction */
/*-------------------------------------------------------------------
Function: grDepthBufferMode
Date: 07-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grDepthBufferMode, void , (GrDepthBufferMode_t mode) )
{
#define FN_NAME "grDepthBufferMode"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
INVALIDATE(fbzMode);
STOREARG(grDepthBufferMode, mode);
#undef FN_NAME
} /* grDepthBufferMode */
/*-------------------------------------------------------------------
Function: grDitherMode
Date: 07-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grDitherMode, void , (GrDitherMode_t mode) )
{
#define FN_NAME "grDitherMode"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
INVALIDATE(fbzMode);
STOREARG(grDitherMode, mode);
#undef FN_NAME
} /* grDitherMode */
/*-------------------------------------------------------------------
Function: grRenderBuffer
Date: 07-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grRenderBuffer, void , (GrBuffer_t buffer) )
{
#define FN_NAME "grRenderBuffer"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
INVALIDATE(fbzMode);
STOREARG(grRenderBuffer, buffer);
#undef FN_NAME
} /* grRenderBuffer */
/*-------------------------------------------------------------------
Function: grColorMask
Date: 08-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_ENTRY(grColorMask, void , (FxBool rgb, FxBool alpha) )
{
#define FN_NAME "grColorMask"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
INVALIDATE(fbzMode);
STOREARG(grColorMask, rgb);
STOREARG(grColorMask, alpha);
#undef FN_NAME
} /* grColorMask */
/*-------------------------------------------------------------------
Function: grSstOrigin
Date: 08-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grSstOrigin, void , (GrOriginLocation_t origin) )
{
#define FN_NAME "grSstOrigin"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 83);
INVALIDATE(chromaKey);
STOREARG(grSstOrigin, origin);
#undef FN_NAME
} /* grSstOrigin */
/*-------------------------------------------------------------------
Function: grClipWindow
Date: 08-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grClipWindow, void , (FxU32 minx, FxU32 miny, FxU32 maxx,
FxU32 maxy) )
{
#define FN_NAME "grClipWindow"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 83);
INVALIDATE(clipRegs);
STOREARG(grClipWindow, minx);
STOREARG(grClipWindow, miny);
STOREARG(grClipWindow, maxx);
STOREARG(grClipWindow, maxy);
#undef FN_NAME
} /* grClipWindow */
/*-------------------------------------------------------------------
Function: grDepthBiasLevel
Date: 08-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grDepthBiasLevel, void , (FxI16 level) )
{
#define FN_NAME "grDepthBiasLevel"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 83);
INVALIDATE(zaColor);
STOREARG(grDepthBiasLevel, level);
#undef FN_NAME
} /* grDepthBiasLevel */
/*-------------------------------------------------------------------
Function: grFogMode
Date: 08-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grFogMode, void , (GrFogMode_t mode) )
{
#define FN_NAME "grFogMode"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 83);
INVALIDATE(fogMode);
STOREARG(grFogMode, mode);
#undef FN_NAME
} /* grFogMode */
/*-------------------------------------------------------------------
Function: grFogColorValue
Date: 08-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grFogColorValue, void , (GrColor_t color) )
{
#define FN_NAME "grFogColorValue"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 83);
INVALIDATE(fogColor);
STOREARG(grFogColorValue, color);
#undef FN_NAME
} /* grFogColorValue */
/*-------------------------------------------------------------------
Function: grLfbWriteColorFormat
Date: 08-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grLfbWriteColorFormat, void , (GrColorFormat_t colorFormat) )
{
#define FN_NAME "grLfbWriteColorFormat"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 82);
INVALIDATE(lfbMode);
STOREARG(grLfbWriteColorFormat, colorFormat);
#undef FN_NAME
} /* grLfbWriteColorFormat */
/*-------------------------------------------------------------------
Function: grLfbWriteColorSwizzle
Date: 08-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grLfbWriteColorSwizzle, void , (FxBool swizzleBytes, FxBool
swapWords) )
{
#define FN_NAME "grLfbWriteColorSwizzle"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 82);
INVALIDATE(lfbMode);
STOREARG(grLfbWriteColorSwizzle, swizzleBytes);
STOREARG(grLfbWriteColorSwizzle, swapWords);
#undef FN_NAME
} /* grLfbWriteColorSwizzle */
/*-------------------------------------------------------------------
Function: grConstantColorValue
Date: 08-Oct-97
Implementor(s): dow
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grConstantColorValue, void , (GrColor_t color) )
{
#define FN_NAME "grConstantColorValue"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
INVALIDATE(c0c1);
STOREARG(grConstantColorValue, color);
#undef FN_NAME
} /* grConstantColorValue */
/*==========================================================================*/
/*-------------------------------------------------------------------
Function: grValidateState
Date: 08-Oct-97
Implementor(s): dow
Description:
State Validation:
Once a rendering primitive has determined that the state is invalid,
it calls this routine. grValidateState then goes through valid
markers and flushes all invalid state.
-------------------------------------------------------------------*/
void
_grValidateState()
{
#define FN_NAME "_grValidateState"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
if (NOTVALID(alphaMode)) {
_grAlphaBlendFunction(LOADARG(grAlphaBlendFunction, rgb_sf),
LOADARG(grAlphaBlendFunction, rgb_df),
LOADARG(grAlphaBlendFunction, alpha_sf),
LOADARG(grAlphaBlendFunction, alpha_df));
_grAlphaTestFunction(LOADARG(grAlphaTestFunction, fnc));
_grAlphaTestReferenceValue(LOADARG(grAlphaTestReferenceValue, value));
}
if (NOTVALID(fbzColorPath)) {
_grAlphaCombine(LOADARG(grAlphaCombine, function),
LOADARG(grAlphaCombine, factor),
LOADARG(grAlphaCombine, local),
LOADARG(grAlphaCombine, other),
LOADARG(grAlphaCombine, invert));
_grAlphaControlsITRGBLighting(LOADARG(grAlphaControlsITRGBLighting,
enable));
_grColorCombine(LOADARG(grColorCombine, function),
LOADARG(grColorCombine, factor),
LOADARG(grColorCombine, local),
LOADARG(grColorCombine, other),
LOADARG(grColorCombine, invert));
}
if (NOTVALID(fbzMode)) {
_grChromakeyMode(LOADARG(grChromakeyMode, mode));
_grDepthMask(LOADARG(grDepthMask, enable));
_grDepthBufferFunction(LOADARG(grDepthBufferFunction, fnc));
_grDepthBufferMode(LOADARG(grDepthBufferMode, mode));
_grDitherMode(LOADARG(grDitherMode, mode));
_grRenderBuffer(LOADARG(grRenderBuffer, buffer));
_grColorMask(LOADARG(grColorMask, rgb), LOADARG(grColorMask, alpha));
_grSstOrigin(LOADARG(grSstOrigin, origin));
}
if (NOTVALID(chromaKey)) {
#if defined(GLIDE3) && defined(GLIDE3_ALPHA)
_grChromaRangeExt(LOADARG(grChromakeyValue, color),LOADARG(grChromaRange, range)
, LOADARG(grChromaRange, mode));
#else
_grChromakeyValue(LOADARG(grChromakeyValue, color));
#endif
}
if (NOTVALID(clipRegs)) {
_grClipWindow(
LOADARG(grClipWindow, minx),
LOADARG(grClipWindow, miny),
LOADARG(grClipWindow, maxx),
LOADARG(grClipWindow, maxy));
}
if (NOTVALID(zaColor)) {
_grDepthBiasLevel((FxI16) LOADARG(grDepthBiasLevel, level));
}
if (NOTVALID(fogMode)) {
_grFogMode(LOADARG(grFogMode, mode));
}
if (NOTVALID(fogColor)) {
_grFogColorValue(LOADARG(grFogColorValue, color));
}
if (NOTVALID(lfbMode)) {
_grLfbWriteColorFormat(LOADARG(grLfbWriteColorFormat, colorFormat));
_grLfbWriteColorSwizzle(LOADARG(grLfbWriteColorSwizzle, swizzleBytes),
LOADARG(grLfbWriteColorSwizzle, swapWords));
}
if (NOTVALID(c0c1)) {
_grConstantColorValue(LOADARG(grConstantColorValue, color));
}
_grUpdateParamIndex();
_grFlushCommonStateRegs();
#undef FN_NAME
} /* _grValidateState */
#define IARRAY(p,i) (*((FxU32 *)(p)+(i)))
/*-------------------------------------------------------------------
Function: grEnable
Date: 10-Oct-97
Implementor(s): atai
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grEnable, void , (GrEnableMode_t mode) )
{
#define FN_NAME "grEnable"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
switch (mode) {
case GR_AA_ORDERED:
ENABLEMODE(primitive_smooth_mode);
break;
case GR_SHAMELESS_PLUG:
ENABLEMODE(shameless_plug_mode);
_GlideRoot.environment.shamelessPlug = mode;
break;
case GR_VIDEO_SMOOTHING:
ENABLEMODE(video_smooth_mode);
break;
case GR_ALLOW_MIPMAP_DITHER:
gc->state.allowLODdither = GR_MODE_ENABLE;
break;
}
#undef FN_NAME
} /* grEnable */
/*-------------------------------------------------------------------
Function: grDisable
Date: 10-Oct-97
Implementor(s): atai
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grDisable, void , (GrEnableMode_t mode) )
{
#define FN_NAME "grDisable"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
switch (mode) {
case GR_AA_ORDERED:
DISABLEMODE(primitive_smooth_mode);
break;
case GR_SHAMELESS_PLUG:
DISABLEMODE(shameless_plug_mode);
break;
case GR_VIDEO_SMOOTHING:
DISABLEMODE(video_smooth_mode);
break;
case GR_ALLOW_MIPMAP_DITHER:
gc->state.allowLODdither = GR_MODE_DISABLE;
break;
}
#undef FN_NAME
} /* grDisable */
/*-------------------------------------------------------------------
Function: grCoordinateSpace
Date: 01-Dec-97
Implementor(s): atai
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grCoordinateSpace, void , (GrCoordinateSpaceMode_t mode) )
{
#define FN_NAME "grCoordinateSpace"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
switch (mode) {
case GR_WINDOW_COORDS:
gc->state.grCoordinateSpaceArgs.coordinate_space_mode = GR_WINDOW_COORDS;
break;
case GR_CLIP_COORDS:
gc->state.grCoordinateSpaceArgs.coordinate_space_mode = GR_CLIP_COORDS;
break;
}
#undef FN_NAME
} /* grCoordinateSpace */
/*-------------------------------------------------------------------
Function: grDepthRange
Date: 01-Dec-97
Implementor(s): atai
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grDepthRange, void , (FxFloat n, FxFloat f) )
{
#define FN_NAME "grDepthRange"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
gc->state.Viewport.n = n;
gc->state.Viewport.f = f;
gc->state.Viewport.hdepth = (f - n) * 0.5f * 65535.f;
gc->state.Viewport.oz = (f + n) * 0.5f * 65535.f;
#undef FN_NAME
} /* grDepthRange */
/*-------------------------------------------------------------------
Function: grViewport
Date: 01-Dec-97
Implementor(s): atai
Description:
Arguments:
Return:
-------------------------------------------------------------------*/
GR_DIENTRY(grViewport, void , (FxI32 x, FxI32 y, FxI32 width, FxI32 height) )
{
#define FN_NAME "grViewport"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
gc->state.Viewport.ox = (FxFloat)(x + width * 0.5f);
gc->state.Viewport.oy = (FxFloat)(y + height *0.5f);
gc->state.Viewport.hwidth = width * 0.5f;
gc->state.Viewport.hheight = height * 0.5f;
#undef FN_NAME
} /* grViewport */
#endif /* GLIDE3 */

View File

@@ -1,445 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*
* 14 1/08/98 4:58p Atai
* tex table broadcast, grVertexLayout enable/disable, stq, and some
* defines
*
* 13 12/12/97 10:59a Atai
* clip space and viewport
*
* 12 12/08/97 10:42a Atai
* added grDrawVertexArrayLinear()
*
* 11 11/21/97 6:05p Atai
* use one datalist (tsuDataList) in glide3
*
* 10 11/18/97 6:11p Peter
* fixed glide3 muckage
*
* 9 11/18/97 3:24p Atai
* change grParameterData to grVertexLayout
* define GR_PARAM_*
*
* 8 11/07/97 11:22a Atai
* remove GR_*_SMOOTH. use GR_SMOOTH
*
* 7 11/06/97 6:10p Atai
* update GrState size
* rename grDrawArray to grDrawVertexArray
* update _grDrawPoint and _grDrawVertexList
*
* 6 10/21/97 8:36p Atai
* added gr_lines routines
* use dword offset
*
* 5 10/17/97 2:11p Atai
* added grContinueArray. We only support non aa mode for now.
*
* 4 10/14/97 4:34p Atai
* filled out the calls to different drawarray routines
*
* 3 9/29/97 1:26p Dow
* Fixed packed color strips/fans
*
* 2 9/26/97 10:24a Dow
* Fixed state muckage in Glide3 parameter data
*
* 1 9/23/97 2:04p Dow
* DI code for strips
**
*/
#ifdef GLIDE3
#include <3dfx.h>
#include <glidesys.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
/*-------------------------------------------------------------------
Function: grVertexLayout
Date: 17-Sep-97
Implementor(s): dow
Library: Init Code for
Description:
This routine defines the format for vertex arrays.
Arguments:
param - Type of date-i.e. vertex, color, or texture info:
GR_COLOR, GR_VERTEX, GR_TEXTURE0, GR_TEXTURE1
components - Which components are specified
Valid Components:
So, this table summarizes the legal combinations:
Param Type Size Description
=======================================================================================================
GR_PARAM_XY FxFloat 8 X and Y coordinates. Offset must be zero.
GR_PARAM_Z FxFloat 4 Z coordinate.
GR_PARAM_A FxFloat 4 Alpha value.
GR_PARAM_RGB FxFloat 12 RGB triplet.
GR_PARAM_PARGB FxU32 4 Packed ARGB. High-order byte is A, followed by R, G, and B.
GR_PARAM_STn FxFloat 8 S and T coordinates for TMU , where n is in the range [0, TBD]
GR_PARAM_Wn FxFloat 4
Return:
Nothing ever.
-------------------------------------------------------------------*/
GR_DIENTRY(grVertexLayout, void , (FxU32 param, FxI32 offset, FxU32 mode) )
{
#define FN_NAME "grParameterData"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x)\n", param, offset);
gc->state.vData.vertexInfo.param = param;
switch (param) {
case GR_PARAM_XY:
GR_CHECK_F(myName,
(offset != 0),
"Offset must be zero.");
gc->state.vData.vertexInfo.offset = offset;
gc->state.vData.vertexInfo.mode = mode;
break;
case GR_PARAM_Z:
gc->state.vData.zInfo.offset = offset;
gc->state.vData.zInfo.mode = mode;
break;
case GR_PARAM_W:
gc->state.vData.wInfo.offset = offset;
gc->state.vData.wInfo.mode = mode;
break;
case GR_PARAM_A:
gc->state.vData.aInfo.offset = offset;
gc->state.vData.colorType = GR_FLOAT;
gc->state.vData.aInfo.mode = mode;
break;
case GR_PARAM_RGB:
gc->state.vData.rgbInfo.offset = offset;
gc->state.vData.colorType = GR_FLOAT;
gc->state.vData.rgbInfo.mode = mode;
break;
case GR_PARAM_PARGB:
gc->state.vData.pargbInfo.offset = offset;
gc->state.vData.colorType = GR_U8;
gc->state.vData.pargbInfo.mode = mode;
break;
case GR_PARAM_ST0:
gc->state.vData.st0Info.offset = offset;
gc->state.vData.st0Info.mode = mode;
break;
case GR_PARAM_ST1:
gc->state.vData.st1Info.offset = offset;
gc->state.vData.st1Info.mode = mode;
break;
case GR_PARAM_Q:
gc->state.vData.qInfo.offset = offset;
gc->state.vData.qInfo.mode = mode;
break;
case GR_PARAM_Q0:
gc->state.vData.q0Info.offset = offset;
gc->state.vData.q0Info.mode = mode;
break;
case GR_PARAM_Q1:
gc->state.vData.q1Info.offset = offset;
gc->state.vData.q1Info.mode = mode;
break;
}
#if !GLIDE3_VERTEX_LAYOUT
switch (param) {
case GR_VERTEX:
GR_CHECK_F(myName,
!((components == GR_VERTEX_XYZ) ||
(components == GR_VERTEX_XYZW)),
"Bad Component for Vertex Parameter");
gc->state.vData.vertexInfo.components = components;
GR_CHECK_F(myName, !(type == GR_FLOAT), "Bad Type for Vertex Parameter");
gc->state.vData.vertexInfo.type = type;
gc->state.vData.vertexInfo.offset = offset;
GDBG_INFO(gc->myLevel, "%s: Vertex Offset = %d\n", FN_NAME,
gc->state.vData.vertexInfo.offset);
break;
case GR_COLOR:
GR_CHECK_F(myName,
!((components == GR_COLOR_RGB) || (components == GR_COLOR_RGBA)),
"Bad Component for Color Parameter");
gc->state.vData.colorInfo.components = components;
GR_CHECK_F(myName, !((type == GR_FLOAT) || (type == GR_U8)),
"Bad Type for Color Parameter");
gc->state.vData.colorInfo.type = type;
gc->state.vData.colorInfo.offset = offset;
GDBG_INFO(gc->myLevel, "%s: Color Offset = %d\n", FN_NAME,
gc->state.vData.colorInfo.offset);
break;
case GR_TEXTURE0:
GR_CHECK_F(myName,
!((components == GR_TEX_NONE) || (components == GR_TEX_ST) ||
(components == GR_TEX_STW)),
"Bad Component for Texture Parameter");
gc->state.vData.tex0Info.components = components;
GR_CHECK_F(myName, !(type == GR_FLOAT), "Bad Type for Texture Parameter");
gc->state.vData.tex0Info.type == type;
gc->state.vData.tex0Info.offset = offset;
GDBG_INFO(gc->myLevel, "%s: Tex0 Offset = %d\n", FN_NAME,
gc->state.vData.tex0Info.offset);
break;
case GR_TEXTURE1:
GR_CHECK_F(myName,
!((components == GR_TEX_NONE) || (components == GR_TEX_ST) ||
(components == GR_TEX_STW)),
"Bad Component for Texture Parameter");
gc->state.vData.tex1Info.components = components;
GR_CHECK_F(myName, !(type == GR_FLOAT), "Bad Type for Texture Parameter");
gc->state.vData.tex1Info.type == type;
gc->state.vData.tex1Info.offset = offset;
GDBG_INFO(gc->myLevel, "%s: Tex1 Offset = %d\n", FN_NAME,
gc->state.vData.tex1Info.offset);
break;
default:
GR_CHECK_F(myName, 0, "Invalid Parameter");
break;
}
#endif /* !GLIDE3_VERTEX_LAYOUT */
_grRebuildDataList();
GR_END();
#undef FN_NAME
} /* grParameterData */
/*-------------------------------------------------------------------
Function: grDrawVertexArray
Date: 18-Sep-97
Implementor(s): dow
Description:
Arguments:
mode: GR_POINTS, GR_LINE_STRIP, GR_POLYGON, GR_TRIANLGE_STRIP,
GR_TRIANGLE_FAN, GR_TRIANGLES
Return:
Nothing ever
-------------------------------------------------------------------*/
GR_DIENTRY(grDrawVertexArray, void , (FxU32 mode, FxU32 Count, void *pointers) )
{
#define FN_NAME "grDrawVertexArray"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 90);
GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x, 0x%x)\n",
mode, Count, pointers);
#ifdef GDBG_INFO_ON
{
FxU32 i;
for (i = 0; i < Count; i++)
GDBG_INFO(110, "%s: pointers[%d] = 0x%x\n",
FN_NAME, i, ((float **)pointers)[i]);
}
#endif
switch (mode) {
case GR_POINTS:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawPoints(GR_VTX_PTR_ARRAY, Count, pointers);
else
_grDrawPoints(GR_VTX_PTR_ARRAY, Count, pointers);
break;
case GR_LINE_STRIP:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, Count, pointers);
else
_grDrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, Count, pointers);
break;
case GR_LINES:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINES, Count, pointers);
else
_grDrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINES, Count, pointers);
break;
case GR_POLYGON:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers);
else
_grDrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers);
break;
case GR_TRIANGLE_STRIP:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawVertexList(kSetupStrip, GR_VTX_PTR_ARRAY, Count, pointers);
else
_grDrawVertexList(kSetupStrip, GR_VTX_PTR_ARRAY, Count, pointers);
break;
case GR_TRIANGLE_FAN:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers);
else
_grDrawVertexList(kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers);
break;
case GR_TRIANGLES:
if (gc->state.grEnableArgs.primitive_smooth_mode)
if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS)
_grAADrawTriangles(GR_VTX_PTR_ARRAY, GR_TRIANGLES, Count, pointers);
else
_grAAVpDrawTriangles(GR_VTX_PTR_ARRAY, GR_TRIANGLES, Count, pointers);
else
_grDrawTriangles(GR_VTX_PTR_ARRAY, Count, pointers);
break;
}
#undef FN_NAME
} /* grDrawVertexArray */
/*-------------------------------------------------------------------
Function: grDrawVertexArrayLinear
Date: 04-Dec-97
Implementor(s): atai
Description:
Arguments:
mode: GR_POINTS, GR_LINE_STRIP, GR_POLYGON, GR_TRIANLGE_STRIP,
GR_TRIANGLE_FAN, GR_TRIANGLES
Return:
Nothing ever
-------------------------------------------------------------------*/
GR_DIENTRY(grDrawVertexArrayLinear, void , (FxU32 mode, FxU32 Count, void *pointers, FxU32 stride) )
{
#define FN_NAME "grDrawVertexArrayLinear"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 90);
GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x, 0x%x)\n",
mode, Count, pointers);
#ifdef GDBG_INFO_ON
{
FxU32 i;
for (i = 0; i < Count; i++)
GDBG_INFO(110, "%s: pointers[%d] = 0x%x\n",
FN_NAME, i, (int)pointers + gc->state.vData.vStride * i);
}
#endif
gc->state.vData.vStride = stride >> 2;
switch (mode) {
case GR_POINTS:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawPoints(GR_VTX_PTR, Count, pointers);
else
_grDrawPoints(GR_VTX_PTR, Count, pointers);
break;
case GR_LINE_STRIP:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawLineStrip(GR_VTX_PTR, GR_LINE_STRIP, Count, pointers);
else
_grDrawLineStrip(GR_VTX_PTR, GR_LINE_STRIP, Count, pointers);
break;
case GR_LINES:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawLineStrip(GR_VTX_PTR, GR_LINES, Count, pointers);
else
_grDrawLineStrip(GR_VTX_PTR, GR_LINES, Count, pointers);
break;
case GR_POLYGON:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers);
else
_grDrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers);
break;
case GR_TRIANGLE_STRIP:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawVertexList(kSetupStrip, GR_VTX_PTR, Count, pointers);
else
_grDrawVertexList(kSetupStrip, GR_VTX_PTR, Count, pointers);
break;
case GR_TRIANGLE_FAN:
if (gc->state.grEnableArgs.primitive_smooth_mode)
_grAADrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers);
else
_grDrawVertexList(kSetupFan, GR_VTX_PTR, Count, pointers);
break;
case GR_TRIANGLES:
if (gc->state.grEnableArgs.primitive_smooth_mode)
if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS)
_grAADrawTriangles(GR_VTX_PTR, GR_TRIANGLES, Count, pointers);
else
_grAAVpDrawTriangles(GR_VTX_PTR, GR_TRIANGLES, Count, pointers);
else
_grDrawTriangles(GR_VTX_PTR, Count, pointers);
break;
}
#undef FN_NAME
} /* grDrawVertexArrayLinear */
#endif /* GLIDE3 */

View File

@@ -1,674 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
**
** 20 6/06/98 12:06p Peter
** gmt's trilinear hell bug
**
** 19 2/20/98 5:31p Peter
** crybaby glide
**
** 18 2/20/98 11:00a Peter
** removed glide3 from glid2 tree
**
** 17 1/30/98 4:31p Peter
** general clenaup
*
* 16 1/13/98 12:42p Atai
* fixed grtexinfo, grVertexLayout, and draw triangle
*
* 15 1/09/98 6:48p Atai
* grTexInfo, GR_LOD_* and GR_ASPECT_*
*
* 13 12/09/97 12:20p Peter
* mac glide port
*
* 12 12/02/97 9:49a Dow
* Got rid of Texelfx rev 0 warning
*
* 11 11/20/97 6:58p Dow
* Marked _grTexTextureMemRequired for movement
*
* 10 8/18/97 3:52p Peter
* pre-hw arrival fixes/cleanup
*
* 9 6/02/97 4:09p Peter
* Compile w/ gcc for Dural
*
* 8 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 7 5/21/97 6:04a Peter
*
* 6 3/15/97 8:09p Jdt
* Remove grTexDownloadTable from this file because I added SST-1 only
* code to it
*
* 5 3/09/97 10:31a Dow
* Added GR_DIENTRY for di glide functions
*
* 4 2/12/97 2:09p Hanson
* Hopefully removed the rest of my muckage.
*
* 3 2/12/97 12:34p Dow
* Fixed Hanson muckage
*
* 2 1/18/97 11:41p Dow
* Fixed Gary's "Last C Bug" analog
* Fixed usage of _grMipMapOffset_Tsplit
*
* 1 12/23/96 1:39p Dow
* Changes for multiplatform
**
*/
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
const FxU32 _gr_aspect_index_table[] =
{
3,
2,
1,
0,
1,
2,
3,
};
/* size in texels */
const FxU32 _grMipMapHostSize[4][16] =
{
{ /* 1:1 aspect ratio */
65536, /* 0 : 256x256 */
16384, /* 1 : 128x128 */
4096, /* 2 : 64x64 */
1024, /* 3 : 32x32 */
256, /* 4 : 16x16 */
64, /* 5 : 8x8 */
16, /* 6 : 4x4 */
4, /* 7 : 2x2 */
1, /* 8 : 1x1 */
},
{ /* 2:1 aspect ratio */
32768, /* 0 : 256x128 */
8192, /* 1 : 128x64 */
2048, /* 2 : 64x32 */
512, /* 3 : 32x16 */
128, /* 4 : 16x8 */
32, /* 5 : 8x4 */
8, /* 6 : 4x2 */
2, /* 7 : 2x1 */
1, /* 8 : 1x1 */
},
{ /* 4:1 aspect ratio */
16384, /* 0 : 256x64 */
4096, /* 1 : 128x32 */
1024, /* 2 : 64x16 */
256, /* 3 : 32x8 */
64, /* 4 : 16x4 */
16, /* 5 : 8x2 */
4, /* 6 : 4x1 */
2, /* 7 : 2x1 */
1, /* 8 : 1x1 */
},
{ /* 8:1 aspect ratio */
8192, /* 0 : 256x32 */
2048, /* 1 : 128x16 */
512, /* 2 : 64x8 */
128, /* 3 : 32x4 */
32, /* 4 : 16x2 */
8, /* 5 : 8x1 */
4, /* 6 : 4x1 */
2, /* 7 : 2x1 */
1, /* 8 : 1x1 */
}
};
const int _grMipMapHostWH[GR_ASPECT_1x8 + 1][GR_LOD_1 + 1][2] =
{
{
{ 256 , 32 },
{ 128 , 16 },
{ 64 , 8 },
{ 32 , 4 },
{ 16 , 2 },
{ 8 , 1 },
{ 4 , 1 },
{ 2 , 1 },
{ 1 , 1 }
},
{
{ 256 , 64 },
{ 128 , 32 },
{ 64 , 16 },
{ 32 , 8 },
{ 16 , 4 },
{ 8 , 2 },
{ 4 , 1 },
{ 2 , 1 },
{ 1 , 1 }
} ,
{
{ 256 , 128 },
{ 128 , 64 },
{ 64 , 32 },
{ 32 , 16 },
{ 16 , 8 },
{ 8 , 4 },
{ 4 , 2 },
{ 2 , 1 },
{ 1 , 1 }
},
{
{ 256 , 256 },
{ 128 , 128 },
{ 64 , 64 },
{ 32 , 32 },
{ 16 , 16 },
{ 8 , 8 },
{ 4 , 4 },
{ 2 , 2 },
{ 1 , 1 }
},
{
{ 128, 256 },
{ 64, 128 },
{ 32, 64 },
{ 16, 32 },
{ 8, 16 },
{ 4, 8 },
{ 2, 4 },
{ 1, 2 },
{ 1, 1 }
},
{
{ 64, 256 },
{ 32, 128 },
{ 16, 64 },
{ 8, 32 },
{ 4, 16 },
{ 2, 8 },
{ 1, 4 },
{ 1, 2 },
{ 1, 1 }
},
{
{ 32, 256 },
{ 16, 128 },
{ 8, 64 },
{ 4, 32 },
{ 2, 16 },
{ 1, 8 },
{ 1, 4 },
{ 1, 2 },
{ 1, 1 }
}
};
/* translates GR_ASPECT_* to bits for the TLOD register */
const FxU32 _gr_aspect_xlate_table[] =
{
(3<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER,
(2<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER,
(1<< SST_LOD_ASPECT_SHIFT) | SST_LOD_S_IS_WIDER,
0<< SST_LOD_ASPECT_SHIFT,
1<< SST_LOD_ASPECT_SHIFT,
2<< SST_LOD_ASPECT_SHIFT,
3<< SST_LOD_ASPECT_SHIFT
};
const FxU32 _gr_evenOdd_xlate_table[] =
{
0xFFFFFFFF, /* invalid */
SST_LOD_TSPLIT, /* even */
SST_LOD_TSPLIT | SST_LOD_ODD, /* odd */
0, /* both */
};
/* the size of each mipmap level in texels, 4 is the minimum no matter what */
/* index is [aspect_ratio][lod] */
static const FxU32 _grMipMapSize[4][16] = {
{ /* 8:1 aspect ratio */
0x02000, /* 0 : 256x32 */
0x00800, /* 1 : 128x16 */
0x00200, /* 2 : 64x8 */
0x00080, /* 3 : 32x4 */
0x00020, /* 4 : 16x2 */
0x00010, /* 5 : 8x1 */
0x00008, /* 6 : 4x1 */
0x00004, /* 7 : 2x1 */
0x00004, /* 8 : 1x1 */
},
{ /* 4:1 aspect ratio */
0x04000, /* 0 : 256x64 */
0x01000, /* 1 : 128x32 */
0x00400, /* 2 : 64x16 */
0x00100, /* 3 : 32x8 */
0x00040, /* 4 : 16x4 */
0x00010, /* 5 : 8x2 */
0x00008, /* 6 : 4x1 */
0x00004, /* 7 : 2x1 */
0x00004, /* 8 : 1x1 */
},
{ /* 2:1 aspect ratio */
0x08000, /* 0 : 256x128 */
0x02000, /* 1 : 128x64 */
0x00800, /* 2 : 64x32 */
0x00200, /* 3 : 32x16 */
0x00080, /* 4 : 16x8 */
0x00020, /* 5 : 8x4 */
0x00008, /* 6 : 4x2 */
0x00004, /* 7 : 2x1 */
0x00004, /* 8 : 1x1 */
},
{ /* 1:1 aspect ratio */
0x10000, /* 0 : 256x256 */
0x04000, /* 1 : 128x128 */
0x01000, /* 2 : 64x64 */
0x00400, /* 3 : 32x32 */
0x00100, /* 4 : 16x16 */
0x00040, /* 5 : 8x8 */
0x00010, /* 6 : 4x4 */
0x00004, /* 7 : 2x2 */
0x00004, /* 8 : 1x1 */
},
};
/* the offset from mipmap level 0 of each mipmap level in texels */
/* index is [aspect_ratio][lod] */
static FxU32 _grMipMapOffset[4][16];
static FxU32 _grMipMapOffset_Tsplit[4][16];
/* initialize the MipMap Offset arrays */
void
_grMipMapInit(void)
{
int ar,lod;
for (ar=0; ar<4; ar++) { /* for each aspect ratio */
_grMipMapOffset[ar][0] = 0; /* start off with offset=0 */
for (lod=1; lod<=9; lod++) { /* for each lod, add in prev size */
_grMipMapOffset[ar][lod] = _grMipMapOffset[ar][lod-1] +
_grMipMapSize[ar][lod-1];
}
_grMipMapOffset_Tsplit[ar][0] = 0; /* start off with offset=0 */
_grMipMapOffset_Tsplit[ar][1] = 0; /* start off with offset=0 */
for (lod=2; lod<=9; lod++) { /* for each lod, add in prev size */
_grMipMapOffset_Tsplit[ar][lod] = _grMipMapOffset_Tsplit[ar][lod-2] +
_grMipMapSize[ar][lod-2];
}
}
} /* _grMipMapInit */
/*---------------------------------------------------------------------------
** This is not DI anymore. Perhaps all of these size routines need
** to be in gtex.c now.
*/
FxU32
_grTexTextureMemRequired( GrLOD_t small_lod, GrLOD_t large_lod,
GrAspectRatio_t aspect, GrTextureFormat_t format,
FxU32 evenOdd )
{
FxU32 memrequired;
GR_CHECK_W("_grTexTextureMemRequired", small_lod < large_lod,
"small_lod bigger than large_lod" );
GR_CHECK_F( "_grTexTextureMemRequired", evenOdd > GR_MIPMAPLEVELMASK_BOTH || evenOdd == 0,
"invalid evenOdd mask" );
/* mirror aspect ratios */
if ( aspect > GR_ASPECT_1x1 ) aspect = GR_ASPECT_1x8 - aspect;
if ( evenOdd == GR_MIPMAPLEVELMASK_BOTH ) {
memrequired = _grMipMapOffset[aspect][small_lod+1];
memrequired -= _grMipMapOffset[aspect][large_lod];
} else {
memrequired = 0;
/* construct XOR mask */
evenOdd = (evenOdd == GR_MIPMAPLEVELMASK_EVEN);
while (large_lod <= small_lod) { /* sum up all the mipmap levels */
if ((large_lod ^ evenOdd) & 1) /* that match the XOR mask */
memrequired += _grMipMapSize[aspect][large_lod];
large_lod++;
}
}
if ( format >= GR_TEXFMT_16BIT ) /* convert from texels to bytes */
memrequired <<= 1; /* 2 bytes per texel */
memrequired += 7; /* round up to 8 byte boundary */
memrequired &= ~7;
return memrequired;
} /* _grTexTextureMemRequired */
FxU16
_grTexFloatLODToFixedLOD( float value )
{
float num_quarters;
int new_value;
num_quarters = ( value + .125F ) / .25F;
new_value = ( int ) num_quarters;
new_value &= 0x003F;
return new_value;
} /* _grTexFloatLODToFixedLOD */
/*---------------------------------------------------------------------------
** _grTexCalcBaseAddress
*/
FxU32
_grTexCalcBaseAddress( FxU32 start, GrLOD_t large_lod,
GrAspectRatio_t aspect, GrTextureFormat_t format,
FxU32 odd_even_mask )
{
FxU32 sum_of_lod_sizes;
/* mirror aspect ratios */
if ( aspect > GR_ASPECT_1x1 ) aspect = GR_ASPECT_1x8 - aspect;
if ( odd_even_mask == GR_MIPMAPLEVELMASK_BOTH )
sum_of_lod_sizes = _grMipMapOffset[aspect][large_lod];
else {
if (((odd_even_mask == GR_MIPMAPLEVELMASK_EVEN) && (large_lod & 1)) ||
((odd_even_mask == GR_MIPMAPLEVELMASK_ODD) && !(large_lod & 1)))
large_lod += 1;
sum_of_lod_sizes = _grMipMapOffset_Tsplit[aspect][large_lod];
}
if ( format >= GR_TEXFMT_16BIT ) sum_of_lod_sizes <<= 1;
return ( start - sum_of_lod_sizes );
} /* _grTexCalcBaseAddress */
/*---------------------------------------------------------------------------
** grTexCalcMemRequired
*/
GR_DIENTRY(grTexCalcMemRequired, FxU32,
( GrLOD_t small_lod, GrLOD_t large_lod,
GrAspectRatio_t aspect, GrTextureFormat_t format ))
{
const FxU32 memrequired = _grTexTextureMemRequired(small_lod, large_lod,
aspect, format,
GR_MIPMAPLEVELMASK_BOTH );
GDBG_INFO(88,"grTexCalcMemRequired(%d,%d,%d,%d) => 0x%x(%d)\n",
small_lod,large_lod,aspect,format,memrequired,memrequired);
return memrequired;
} /* grTexCalcMemRequired */
/*---------------------------------------------------------------------------
** grTexDetailControl
*/
GR_DIENTRY(grTexDetailControl, void,
( GrChipID_t tmu, int lod_bias, FxU8 detail_scale,
float detail_max ))
{
#define FN_NAME "grTexDetailControl"
FxU32 tDetail;
FxU32 dmax = ( FxU32 ) ( detail_max * _GlideRoot.pool.f255 );
FxU32 dscale = detail_scale;
GR_BEGIN_NOFIFOCHECK("grTexDetailControl",88);
GDBG_INFO_MORE(gc->myLevel,"(%d,%d,%g)\n",tmu,detail_scale,detail_max);
GR_CHECK_TMU( FN_NAME, tmu );
GR_CHECK_F( myName, lod_bias < -32 || lod_bias > 31, "lod_bias out of range" );
GR_CHECK_F( myName, detail_scale > 7, "detail_scale out of range" );
GR_CHECK_F( myName, detail_max < 0.0 || detail_max > 1.0, "detail_max out of range" );
tDetail = ( ( lod_bias << SST_DETAIL_BIAS_SHIFT ) & SST_DETAIL_BIAS );
tDetail |= ( ( dmax << SST_DETAIL_MAX_SHIFT ) & SST_DETAIL_MAX );
tDetail |= ( ( dscale << SST_DETAIL_SCALE_SHIFT ) & SST_DETAIL_SCALE );
/* MULTIPLAT */
_grTexDetailControl( tmu, tDetail );
GR_END();
#undef FN_NAME
} /* grTexDetailControl */
GR_DIENTRY(grTexMinAddress, FxU32, ( GrChipID_t tmu ))
{
#define FN_NAME "grTexMinAddress"
GR_BEGIN_NOFIFOCHECK("grTexMinAddress",88);
GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu);
GR_CHECK_TMU(FN_NAME, tmu);
FXUNUSED( tmu );
GR_RETURN(0);
#undef FN_NAME
} /* grTexMinAddress */
/*-------------------------------------------------------------------
Function: grTexMaxAddress
Date: 6/2
Implementor(s): GaryT
Library: glide
Description:
Returns address of maximum extent of texture ram for a given TMU
Arguments:
tmu
Return:
the largest valid texture start Address
-------------------------------------------------------------------*/
GR_DIENTRY(grTexMaxAddress, FxU32, ( GrChipID_t tmu ))
{
#define FN_NAME "grTexMaxAddress"
GR_BEGIN_NOFIFOCHECK("grTexMaxAddress",88);
GDBG_INFO_MORE(gc->myLevel,"(%d)\n",tmu);
GR_CHECK_TMU(FN_NAME, tmu );
GR_RETURN(gc->tmu_state[tmu].total_mem-8);
#undef FN_NAME
} /* grTexMaxAddress */
/*-------------------------------------------------------------------
Function: grTexTextureMemRequired
Date: 6/2
Implementor(s): GaryMcT, Jdt
Library: glide
Description:
Returns the tmu memory required to store the specified mipmap
( Gary and I don't like the name of this function, but are
a little backed into a corner because of the existence
of grTexMemRequired() which does not imply any distinction
between texture memory and system ram )
Arguments:
evenOdd - which set of mipmap levels are to be stored
One of:
GR_MIPMAPLEVELMASK_EVEN
GR_MIPMAPLEVELMASK_ODD
GR_MIPMAPLEVELMASK_BOTH
info - pointer to GrTexInfo structure defining dimensions
of texture
Return:
offset to be added to current texture base address to calculate next
valid texture memory download location
-------------------------------------------------------------------*/
GR_DIENTRY(grTexTextureMemRequired, FxU32,
( FxU32 evenOdd, GrTexInfo *info))
{
FxU32 memrequired;
GR_CHECK_F( "grTexTextureMemRequired", !info, "invalid info pointer" );
memrequired = _grTexTextureMemRequired(info->smallLod,
info->largeLod,
info->aspectRatio,
info->format,
evenOdd );
GDBG_INFO(88,"grTexTextureMemRequired(%d,0x%x) => 0x%x(%d)\n",
evenOdd,info,memrequired,memrequired);
return memrequired;
} /* grTexTextureMemRequired */
/*-------------------------------------------------------------------
Function: grTexDownloadMipMap
Date: 6/2
Implementor(s): GaryMcT, Jdt
Library: glide
Description:
Downloads a texture mipmap to the specified tmu at the specified
base address.
Arguments:
tmu - which tmu
startAddress - starting address for texture download,
evenOdd - which set of mipmap levels have been downloaded for
the selected texture
One of:
GR_MIPMAPLEVELMASK_EVEN
GR_MIPMAPLEVELMASK_ODD
GR_MIPMAPLEVELMASK_BOTH
info - pointer to GrTexInfo structure defining dimension of
texture to be downloaded and containing texture data
Return:
none
-------------------------------------------------------------------*/
GR_DIENTRY(grTexDownloadMipMap, void,
( GrChipID_t tmu, FxU32 startAddress, FxU32
evenOdd, GrTexInfo *info ))
{
GR_DCL_GC;
GrLOD_t lod;
char *src_base;
FxU32 size = grTexTextureMemRequired( evenOdd, info );
FXUNUSED(gc);
GDBG_INFO(89,"grTexDownloadMipMap(%d,0x%x,%d,0x%x\n",tmu,startAddress,evenOdd,info);
GR_CHECK_TMU( "grTexDownloadMipMap", tmu );
GR_CHECK_COMPATABILITY("grTexDownloadMipMap",
startAddress + size > gc->tmu_state[tmu].total_mem,
"insufficient texture ram at startAddress" );
GR_CHECK_F( "grTexDownloadMipMap", evenOdd > 0x3, "evenOdd mask invalid" );
GR_CHECK_F( "grTexDownloadMipMap", !info, "info invalid" );
if ((startAddress < 0x200000) && (startAddress + size > 0x200000)) {
GR_CHECK_COMPATABILITY("grTexDownloadMipMap",
((startAddress < 0x200000UL) && (startAddress + size > 0x200000UL)),
"mipmap cannot span 2 MB boundary");
GrErrorCallback("grTexDownloadMipMap: mipmap cannot span 2 Mbyte boundary", FXTRUE);
}
src_base = (char *)info->data;
/*---------------------------------------------------------------
Download one mipmap level at a time
---------------------------------------------------------------*/
for(lod = info->largeLod; lod <= info->smallLod; lod++ ) {
grTexDownloadMipMapLevel( tmu,
startAddress,
lod,
info->largeLod,
info->aspectRatio,
info->format,
evenOdd,
src_base );
src_base += (_grMipMapHostSize[_gr_aspect_index_table[info->aspectRatio]][lod] <<
(info->format >= GR_TEXFMT_16BIT));
}
} /* grTexDownloadMipMap */
/*-------------------------------------------------------------------
Function: grTexDownloadTablePartial
Date: 6/3
Implementor(s): GaryT
Library: glide
Description:
download part of a look up table data to a tmu
Arguments:
tmu - which tmu
type - what type of table to download
One of:
GR_TEXTABLE_NCC0
GR_TEXTABLE_NCC1
GR_TEXTABLE_PALETTE
void *data - pointer to table data
Return:
none
-------------------------------------------------------------------*/
GR_DIENTRY(grTexDownloadTablePartial, void,
( GrChipID_t tmu, GrTexTable_t type,
void *data, int start, int end ))
{
#define FN_NAME "grTexDownloadTablePartial"
GR_BEGIN_NOFIFOCHECK("grTexDownloadTablePartial",89);
GDBG_INFO_MORE(gc->myLevel,"(%d,%d,0x%x, %d,%d)\n",tmu,type,data,start,end);
GR_CHECK_TMU(FN_NAME,tmu);
GR_CHECK_F(myName, type > 0x2, "invalid table specified");
GR_CHECK_F(myName, !data, "invalid data pointer");
if ( type == GR_TEXTABLE_PALETTE ) /* Need Palette Download Code */
_grTexDownloadPalette( tmu, (GuTexPalette *)data, start, end );
else { /* Type is an ncc table */
_grTexDownloadNccTable( tmu, type, (GuNccTable*)data, start, end );
/* Removed redundant call
* _grTexDownloadNccTable( tmu, type, (GuNccTable*)data, start, end );
*/
}
GR_END();
#undef FN_NAME
} /* grTexDownloadTable */
/*---------------------------------------------------------------------------
** grTexDownloadMipMapLevel
*/
GR_DIENTRY(grTexDownloadMipMapLevel, void,
( GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLod,
GrLOD_t largeLod, GrAspectRatio_t aspectRatio,
GrTextureFormat_t format, FxU32 evenOdd, void *data ))
{
GR_BEGIN_NOFIFOCHECK("grTexDownloadMipMapLevel",89);
GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x)\n",
tmu,startAddress,thisLod,largeLod,aspectRatio,
format,evenOdd,data);
/*
** note for glide3 lod translation:
** we are calling gr* routine so the lod data should remain the same
*/
grTexDownloadMipMapLevelPartial( tmu, startAddress,
thisLod, largeLod,
aspectRatio, format,
evenOdd, data,
0, _grMipMapHostWH[aspectRatio][thisLod][1] - 1 );
GR_END();
} /* grTexDownloadMipmapLevel */
FxU16 rle_line[256];
FxU16 *rle_line_end;
#if (GLIDE_PLATFORM & (GLIDE_OS_WIN32 | GLIDE_OS_MACOS | GLIDE_OS_UNIX))
void rle_decode_line_asm(FxU16 *tlut,FxU8 *src,FxU16 *dest)
{
/* don't do anything just shut up the compiler */
}
#endif /* (GLIDE_PLATFORM & (GLIDE_OS_WIN32 | GLIDE_OS_MACOS)) */

View File

@@ -1,733 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.1.1.1 1999/12/07 21:49:08 joseph
** Initial checkin into SourceForge.
**
**
** 22 3/14/98 1:07p Peter
** mac port happiness
**
** 21 2/20/98 9:05a Peter
** removed remnants of comdex grot
**
** 20 2/11/98 5:22p Peter
** added fifo get stuff for hanson
**
** 19 2/01/98 7:44p Peter
** parameter dumping level
*
* 18 12/17/97 4:45p Peter
* groundwork for CrybabyGlide
*
* 17 12/09/97 12:20p Peter
* mac glide port
*
* 16 12/09/97 10:28a Peter
* cleaned up some frofanity
*
* 15 12/05/97 4:26p Peter
* watcom warnings
*
* 14 12/03/97 11:34a Peter
* dos debugging
*
* 13 11/21/97 3:53p Peter
* reset messages are controlled by gdbg_level
*
* 12 11/19/97 6:04p Peter
* actually exit if not reset
*
* 11 11/18/97 4:36p Peter
* chipfield stuff cleanup and w/ direct writes
*
* 10 11/17/97 4:55p Peter
* watcom warnings/chipfield stuff
*
* 9 11/15/97 9:20p Peter
* I am the sorriest f*cker on the face of the planet
*
**
*/
#include <stdio.h>
#include <string.h>
#if defined(__WIN32__)
#include <windows.h>
#endif
#include <3dfx.h>
#include <glidesys.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
#if GDBG_INFO_ON
static const char*
cvgRegNames[] = {
"status", /* 0x00 */
"intrCtrl", /* 0x01 */
"vAx", /* 0x02 */
"vAy", /* 0x03 */
"vBx", /* 0x04 */
"vBy", /* 0x05 */
"vCx", /* 0x06 */
"vCy", /* 0x07 */
"r", /* 0x08 */
"g", /* 0x09 */
"b", /* 0x0A */
"z", /* 0x0B */
"a", /* 0x0C */
"s", /* 0x0D */
"t", /* 0x0E */
"w", /* 0x0F */
"drdx", /* 0x10 */
"dgdx", /* 0x11 */
"dbdx", /* 0x12 */
"dzdx", /* 0x13 */
"dadx", /* 0x14 */
"dsdx", /* 0x15 */
"dtdx", /* 0x16 */
"dwdx", /* 0x17 */
"drdy", /* 0x18 */
"dgdy", /* 0x19 */
"dbdy", /* 0x1A */
"dzdy", /* 0x1B */
"dady", /* 0x1C */
"dsdy", /* 0x1D */
"dtdy", /* 0x1E */
"dwdy", /* 0x1F */
"triangleCMD", /* 0x20 */
"reserved021", /* 0x21 */
"FvAx", /* 0x22 */
"FvAy", /* 0x23 */
"FvBx", /* 0x24 */
"FvBy", /* 0x25 */
"FvCx", /* 0x26 */
"FvCy", /* 0x27 */
"Fr", /* 0x28 */
"Fg", /* 0x29 */
"Fb", /* 0x2A */
"Fz", /* 0x2B */
"Fa", /* 0x2C */
"Fs", /* 0x2D */
"Ft", /* 0x2E */
"Fw", /* 0x2F */
"Fdrdx", /* 0x30 */
"Fdgdx", /* 0x31 */
"Fdbdx", /* 0x32 */
"Fdzdx", /* 0x33 */
"Fdadx", /* 0x34 */
"Fdsdx", /* 0x35 */
"Fdtdx", /* 0x36 */
"Fdwdx", /* 0x37 */
"Fdrdy", /* 0x38 */
"Fdgdy", /* 0x39 */
"Fdbdy", /* 0x3A */
"Fdzdy", /* 0x3B */
"Fdady", /* 0x3C */
"Fdsdy", /* 0x3D */
"Fdtdy", /* 0x3E */
"Fdwdy", /* 0x3F */
"FtriangleCMD", /* 0x40 */
"fbzColorPath", /* 0x41 */
"fogMode", /* 0x42 */
"alphaMode", /* 0x43 */
"fbzMode", /* 0x44 */
"lfbMode", /* 0x45 */
"clipLeftRight", /* 0x46 */
"clipLowYHighY", /* 0x47 */
"nopCMD", /* 0x48 */
"fastfillCMD", /* 0x49 */
"swapbufferCMD", /* 0x4A */
"fogColor", /* 0x4B */
"zaColor", /* 0x4C */
"chromaKey", /* 0x4D */
"chromaRange", /* 0x4E */
"userIntrCMD", /* 0x4F */
"stipple", /* 0x50 */
"color0", /* 0x51 */
"color1", /* 0x52 */
"fbiPixelsIn", /* 0x53 */
"fbiChromaFail", /* 0x54 */
"fbiZfuncFail", /* 0x55 */
"fbiAfuncFail", /* 0x56 */
"fbiPixelsOut", /* 0x57 */
"fogTable0001", /* 0x58 */
"fogTable0203", /* 0x59 */
"fogTable0405", /* 0x5A */
"fogTable0607", /* 0x5B */
"fogTable0809", /* 0x5C */
"fogTable0A0B", /* 0x5D */
"fogTable0C0D", /* 0x5E */
"fogTable0E0F", /* 0x5F */
"fogTable1011", /* 0x60 */
"fogTable1213", /* 0x61 */
"fogTable1415", /* 0x62 */
"fogTable1617", /* 0x63 */
"fogTable1819", /* 0x64 */
"fogTable1A1B", /* 0x65 */
"fogTable1C1D", /* 0x66 */
"fogTable1E1F", /* 0x67 */
"fogTable2021", /* 0x68 */
"fogTable2223", /* 0x69 */
"fogTable2425", /* 0x6A */
"fogTable2627", /* 0x6B */
"fogTable2829", /* 0x6C */
"fogTable2A2B", /* 0x6D */
"fogTable2C2D", /* 0x6E */
"fogTable2E2F", /* 0x6F */
"fogTable3031", /* 0x70 */
"fogTable3233", /* 0x71 */
"fogTable3435", /* 0x72 */
"fogTable3637", /* 0x73 */
"fogTable3839", /* 0x74 */
"fogTable3A3B", /* 0x75 */
"fogTable3C3D", /* 0x76 */
"fogTable3E3F", /* 0x77 */
"cmdFifoBaseAddr", /* 0x78 */
"cmdFifoBump", /* 0x79 */
"cmdFifoRdPtr", /* 0x7A */
"cmdFifoAMin", /* 0x7B */
"cmdFifoAMax", /* 0x7C */
"cmdFifoDepth", /* 0x7D */
"cmdFifoHoles", /* 0x7E */
"reserved07F", /* 0x7F */
"fbiInit4", /* 0x80 */
"vRetrace", /* 0x81 */
"backPorch", /* 0x82 */
"videoDim", /* 0x83 */
"fbiInit0", /* 0x84 */
"fbiInit1", /* 0x85 */
"fbiInit2", /* 0x86 */
"fbiInit3", /* 0x87 */
"hSync", /* 0x88 */
"vSync", /* 0x89 */
"clutData", /* 0x8A */
"dacData", /* 0x8B */
"maxRGBDelta", /* 0x8C */
"hBorder", /* 0x8D */
"vBorder", /* 0x8E */
"borderColor", /* 0x8F */
"hvRetrace", /* 0x90 */
"fbiInit5", /* 0x91 */
"fbiInit6", /* 0x92 */
"fbiInit7", /* 0x93 */
"reserved094", /* 0x94 */
"reserved095", /* 0x95 */
"fbiSwapHistory", /* 0x96 */
"fbiTriOut", /* 0x97 */
"sSetupMode", /* 0x98 */
"sVx", /* 0x99 */
"sVy", /* 0x9A */
"sARGB", /* 0x9B */
"sRed", /* 0x9C */
"sGreen", /* 0x9D */
"sBlue", /* 0x9E */
"sAlpha", /* 0x9F */
"sVz", /* 0xA0 */
"sWb", /* 0xA1 */
"sWtmu0", /* 0xA2 */
"sS/W0", /* 0xA3 */
"sT/W0", /* 0xA4 */
"sWtmu1", /* 0xA5 */
"sS/Wtmu1", /* 0xA6 */
"sT/Wtmu1", /* 0xA7 */
"sDrawTriCMD", /* 0xA8 */
"sBeginTriCMD", /* 0xA9 */
"reserved0AA", /* 0xAA */
"reserved0AB", /* 0xAB */
"reserved0AC", /* 0xAC */
"reserved0AD", /* 0xAD */
"reserved0AE", /* 0xAE */
"reserved0AF", /* 0xAF */
"bltSrcBase", /* 0xB0 */
"bltDstBase", /* 0xB1 */
"bltXYStrides", /* 0xB2 */
"bltSrcChroma", /* 0xB3 */
"bltDstChroma", /* 0xB4 */
"bltClipX", /* 0xB5 */
"bltClipY", /* 0xB6 */
"reserved067", /* 0xB7 */
"bltSrcXY", /* 0xB8 */
"bltDstXY", /* 0xB9 */
"bltSize", /* 0xBA */
"bltRop", /* 0xBB */
"bltColor", /* 0xBC */
"reserved067", /* 0xBD */
"bltCommand", /* 0xBE */
"bltData", /* 0xBF */
"textureMode", /* 0xc0 */
"tLOD", /* 0xc1 */
"tDetail", /* 0xc2 */
"texBaseAddr", /* 0xc3 */
"texBaseAddr1", /* 0xc4 */
"texBaseAddr2", /* 0xc5 */
"texBaseAddr38", /* 0xc6 */
"trexInit0", /* 0xc7 */
"trexInit1", /* 0xc8 */
"nccTable0_0", /* 0xc9 */
"nccTable0_1", /* 0xca */
"nccTable0_2", /* 0xcb */
"nccTable0_3", /* 0xcc */
"nccTable0_4", /* 0xcd */
"nccTable0_5", /* 0xce */
"nccTable0_6", /* 0xcf */
"nccTable0_7", /* 0xd0 */
"nccTable0_8", /* 0xd1 */
"nccTable0_9", /* 0xd2 */
"nccTable0_A", /* 0xd3 */
"nccTable0_B", /* 0xd4 */
"nccTable1_0", /* 0xd5 */
"nccTable1_1", /* 0xd6 */
"nccTable1_2", /* 0xd7 */
"nccTable1_3", /* 0xd8 */
"nccTable1_4", /* 0xd9 */
"nccTable1_5", /* 0xda */
"nccTable1_6", /* 0xdb */
"nccTable1_7", /* 0xdc */
"nccTable1_8", /* 0xdd */
"nccTable1_9", /* 0xde */
"nccTable1_A", /* 0xdf */
"nccTable1_B", /* 0xe0 */
"reserved0E1", /* 0xe1 */
"reserved0E2", /* 0xe2 */
"reserved0E3", /* 0xe3 */
"reserved0E4", /* 0xe4 */
"reserved0E5", /* 0xe5 */
"reserved0E6", /* 0xe6 */
"reserved0E7", /* 0xe7 */
"reserved0E8", /* 0xe8 */
"reserved0E9", /* 0xe9 */
"reserved0EA", /* 0xea */
"reserved0EB", /* 0xeb */
"reserved0EC", /* 0xec */
"reserved0ED", /* 0xed */
"reserved0EE", /* 0xee */
"reserved0EF", /* 0xef */
"reserved0F0", /* 0xf0 */
"reserved0F1", /* 0xf1 */
"reserved0F2", /* 0xf2 */
"reserved0F3", /* 0xf3 */
"reserved0F4", /* 0xf4 */
"reserved0F5", /* 0xf5 */
"reserved0F6", /* 0xf6 */
"reserved0F7", /* 0xf7 */
"reserved0F8", /* 0xf8 */
"reserved0F9", /* 0xf9 */
"reserved0FA", /* 0xfa */
"reserved0FB", /* 0xfb */
"reserved0FC", /* 0xfc */
"reserved0FD", /* 0xfd */
"reserved0FE", /* 0xfe */
"reserved0FF", /* 0xff */
};
#define GEN_INDEX(a) ((((FxU32) a) - ((FxU32) gc->reg_ptr)) >> 2)
void
_grFifoWriteDebug(FxU32 addr, FxU32 val, FxU32 fifoPtr)
{
GR_DCL_GC;
FxU32 index = GEN_INDEX(addr);
GDBG_INFO(gc->myLevel + 199, "Storing to FIFO:\n");
GDBG_INFO(gc->myLevel + 199, " FIFO Ptr: 0x%x : 0x%X\n", fifoPtr, gc->cmdTransportInfo.fifoRoom);
if (index <= 0xff) {
GDBG_INFO(gc->myLevel + 199, " Reg Name: %s\n", cvgRegNames[index]);
GDBG_INFO(gc->myLevel + 199, " Reg Num: 0x%X\n", index);
} else {
const char* strP;
const FxU32 offset = (addr - (FxU32)gc->reg_ptr);
if (offset >= HW_TEXTURE_OFFSET) {
strP = "Texture";
} else if (offset >= HW_LFB_OFFSET) {
strP = "LFB";
index = addr;
} else if (offset >= HW_FIFO_OFFSET) {
strP = "Cmd FIFO";
} else {
strP = "Woah!";
}
GDBG_INFO(gc->myLevel + 199, " %s Addr: 0x%X\n",
strP, index);
}
GDBG_INFO(gc->myLevel + 199, " Value: 0x%X 0x%X\n", (index << 2), val);
GDBG_INFO(120, " SET(0x%X, %ld(0x%X)) 0 %s (0x%X)\n",
0x10000000UL + (FxU32)(index << 2), val, val,
cvgRegNames[index & 0xFF], fifoPtr);
} /* _grFifoWriteDebug */
void
_grFifoFWriteDebug(FxU32 addr, float val, FxU32 fifoPtr)
{
GR_DCL_GC;
FxU32 index = GEN_INDEX(addr);
GDBG_INFO(gc->myLevel + 200, "Storing to FIFO:\n");
GDBG_INFO(gc->myLevel + 200, " FIFO Ptr: 0x%x\n", fifoPtr);
if (index <= 0xff) {
GDBG_INFO(gc->myLevel + 200, " Reg Name: %s\n", cvgRegNames[index]);
GDBG_INFO(gc->myLevel + 200, " Reg Num: 0x%x\n", index);
}
GDBG_INFO(gc->myLevel + 200, " Value: %4.2f\n", val);
GDBG_INFO(120, " SET(0x%X, %4.2f (0x%X)) 0 %s\n",
0x10000000UL + (FxU32)(index << 2), val, *(const FxU32*)&val,
cvgRegNames[index & 0xFF]);
} /* _grFifoFWriteDebug */
extern void
_grCVGFifoDump_TriHdr(const FxU32 hdrVal)
{
GR_DCL_GC;
/* Dump Packet Header */
GDBG_INFO(gc->myLevel + 200, "CMD Fifo Triangle Packet (0x%X)\n", hdrVal);
GDBG_INFO(gc->myLevel + 200, " # Vertex: 0x%X\n",
(hdrVal & SSTCP_PKT3_NUMVERTEX) >> SSTCP_PKT3_NUMVERTEX_SHIFT);
GDBG_INFO(gc->myLevel + 200, " RGB: %s\n",
(hdrVal & SSTCP_PKT3_PACKEDCOLOR) ? "Packed" : "Separate");
GDBG_INFO(gc->myLevel + 200, " StripMode: %s\n",
(((hdrVal & (0x01 << 22)) == 0) ? "Strip" : "Fan"));
GDBG_INFO(gc->myLevel + 200, " Culling: %s\n",
(((hdrVal & (0x01 << 23)) == 0) ? "Disable" : "Enable"));
GDBG_INFO(gc->myLevel + 200, " CullingSign: %s\n",
(((hdrVal & (0x01 << 24)) == 0) ? "Positive" : "Negative"));
GDBG_INFO(gc->myLevel + 200, " PingPongSign: %s\n",
(((hdrVal & (0x01 << 25)) == 0) ? "Normal" : "Disable"));
if (GDBG_GET_DEBUGLEVEL(gc->myLevel + 200)) {
const FxU32 temp = (hdrVal & SSTCP_PKT3_PMASK);
int i;
GDBG_INFO(gc->myLevel + 200, " Params: X Y");
for(i = 10; i <= 17; i++) {
static const char* paramSel[] = { "RGB", "Alpha", "Z", "Wb", "W0", "ST[0]", "W1", "ST[1]" };
if ((temp & (0x01UL << i)) != 0) GDBG_PRINTF("%s ", paramSel[i - 10]);
}
GDBG_INFO(gc->myLevel + 200, "\n");
}
{
const FxU32 temp = (hdrVal & SSTCP_PKT3_CMD) >> SSTCP_PKT3_CMD_SHIFT;
const char* tempStr;
switch(temp) {
case 0x00: tempStr = "Independent"; break;
case 0x01: tempStr = "NewStrip"; break;
case 0x02: tempStr = "ContinueStrip"; break;
default: tempStr = "Reserved"; break;
}
GDBG_INFO(gc->myLevel + 200, " Command: 0x%X(%s)\n", temp, tempStr);
}
}
extern void
_grCVGFifoDump_Linear(const FxU32* const linearPacketAddr)
{
}
void
_grErrorCallback(const char* const procName,
const char* const format,
va_list args)
{
static FxBool inProcP = FXFALSE;
if (!inProcP) {
static char errMsgBuf[1024];
inProcP = FXTRUE;
{
extern void (*GrErrorCallback)( const char *string, FxBool fatal );
vsprintf(errMsgBuf, format, args);
(*GrErrorCallback)(errMsgBuf, (GETENV("FX_ERROR_FAIL") != NULL));
}
inProcP = FXFALSE;
}
}
#endif /* GDBG_INFO_ON */
#if USE_PACKET_FIFO
/* Routines privately exported so that the manufacturing diags
* and other things can do register writes etc w/o having access
* to the glide internals etc.
*/
extern void
_grSet32(volatile FxU32* const sstAddr, const FxU32 val)
{
#define FN_NAME "_grSet32"
GR_DCL_GC;
GR_ASSERT(sstAddr >= gc->base_ptr);
GR_ASSERT(sstAddr < &SST_TMU(gc->reg_ptr, GR_TMU0)->status);
GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1);
GR_SET_INDEX(BROADCAST_ID, gc->reg_ptr, (sstAddr - gc->reg_ptr), val);
GR_CHECK_SIZE();
#undef FN_NAME
}
extern FxU32
_grGet32(volatile FxU32* const sstAddr)
{
return GR_GET(*sstAddr);
}
#if FIFO_ASSERT_FULL
const FxU32 kFifoCheckMask = 0xFFFF;
FxU32 gFifoCheckCount = 0;
#endif
void FX_CALL
_FifoMakeRoom(const FxI32 blockSize, const char* fName, const int fLine)
{
#define FN_NAME "_FifoMakeRoom"
FxU32 wrapAddr = 0x00UL;
GR_BEGIN_NOFIFOCHECK(FN_NAME, 400);
GR_ASSERT(blockSize > 0);
GR_ASSERT((FxU32)blockSize < gc->cmdTransportInfo.fifoSize);
FIFO_ASSERT();
/* Update the roomToXXX values w/ the # of writes since the last
* fifo stall/wrap.
*/
{
const FxI32 writes = (MIN(gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd) -
gc->cmdTransportInfo.fifoRoom);
gc->cmdTransportInfo.roomToReadPtr -= writes;
gc->cmdTransportInfo.roomToEnd -= writes;
#if GDBG_INFO_ON
GDBG_INFO_MORE(gc->myLevel, ": (%s : %d)\n"
"\tfifoBlock: (0x%X : 0x%X)\n"
"\tfifoRoom: (0x%X : 0x%X) : (0x%X : 0x%X)\n"
"\tfifo hw: (0x%X : 0x%X)\n",
((fName == NULL) ? "Unknown" : fName), fLine,
(FxU32)gc->cmdTransportInfo.fifoPtr, blockSize,
gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd,
gc->cmdTransportInfo.fifoRoom, writes,
HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoRead);
#if !GLIDE_INIT_HAL
if (gc->scanline_interleaved) {
SstRegs* slaveHw = (SstRegs*)gc->slave_ptr;
GDBG_INFO_MORE(gc->myLevel, "\tsli: 0x%X : (0x%X : 0x%X : 0x%X)\n",
HW_FIFO_PTR(FXFALSE),
GR_GET(slaveHw->cmdFifoDepth),
GR_GET(slaveHw->cmdFifoHoles),
GR_GET(slaveHw->status));
}
#endif /* !GLIDE_INIT_HAL */
#endif /* GDBG_INFO_ON */
ASSERT_FAULT_IMMED((gc->cmdTransportInfo.roomToReadPtr >= 0) &&
(gc->cmdTransportInfo.roomToEnd >= 0));
}
again:
/* do we need to stall? */
{
FxU32 lastHwRead = gc->cmdTransportInfo.fifoRead;
FxI32 roomToReadPtr = gc->cmdTransportInfo.roomToReadPtr;
while (roomToReadPtr < blockSize) {
FxU32 curReadPtr = HW_FIFO_PTR(FXTRUE);
FxU32 curReadDist = curReadPtr - lastHwRead;
GR_ASSERT((curReadPtr >= (FxU32)gc->cmdTransportInfo.fifoStart) &&
(curReadPtr < (FxU32)gc->cmdTransportInfo.fifoEnd));
#if !GLIDE_INIT_HAL
/* If we're in an sli configuration then we need to make sure
* that we don't catch up to either the slave as well.
*/
if (gc->scanline_interleaved) {
const FxU32 slaveReadPtr = HW_FIFO_PTR(FXFALSE);
const FxU32 slaveReadDist = (slaveReadPtr - lastHwRead);
FxI32 distSlave = (FxI32)slaveReadDist;
FxI32 distMaster = (FxI32)curReadDist;
GR_ASSERT((slaveReadPtr >= (FxU32)gc->cmdTransportInfo.fifoStart) &&
(slaveReadPtr < (FxU32)gc->cmdTransportInfo.fifoEnd));
/* Get the actual absolute distance to the respective fifo ptrs */
if (distSlave < 0) distSlave += (FxI32)gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST;
if (distMaster < 0) distMaster += (FxI32)gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST;
/* Is the slave closer than the master? */
if (distSlave < distMaster) {
#if GDBG_INFO_ON
{
SstRegs* slaveHw = (SstRegs*)gc->slave_ptr;
GDBG_INFO(gc->myLevel, " Wait sli: 0x%X : (0x%X : 0x%X : 0x%X)\n"
"\tMaster: 0x%X : 0x%X\n"
"\tSlave : 0x%X : 0x%X\n",
HW_FIFO_PTR(FXFALSE),
GR_GET(slaveHw->cmdFifoDepth),
GR_GET(slaveHw->cmdFifoHoles),
GR_GET(slaveHw->status),
curReadPtr, curReadDist,
slaveReadPtr, slaveReadDist);
}
#endif /* GDBG_INFO_ON */
curReadDist = slaveReadDist;
curReadPtr = slaveReadPtr;
}
}
#endif /* !GLIDE_INIT_HAL */
roomToReadPtr += curReadDist;
#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_USE_DEBUG_FIFO
_GlideRoot.stats.fifoStalls++;
_GlideRoot.stats.fifoStallDepth += GR_GET(hw->cmdFifoDepth);
#endif
/* Have we wrapped yet? */
if (lastHwRead > curReadPtr) roomToReadPtr += (FxI32)gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST;
lastHwRead = curReadPtr;
}
GR_ASSERT((lastHwRead >= (FxU32)gc->cmdTransportInfo.fifoStart) &&
(lastHwRead < (FxU32)gc->cmdTransportInfo.fifoEnd));
/* Update cached copies */
gc->cmdTransportInfo.fifoRead = lastHwRead;
gc->cmdTransportInfo.roomToReadPtr = roomToReadPtr;
GDBG_INFO(gc->myLevel, " Wait: (0x%X : 0x%X) : 0x%X\n",
gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd,
gc->cmdTransportInfo.fifoRead);
}
/* Do we need to wrap to front? */
if (gc->cmdTransportInfo.roomToEnd <= blockSize) {
GDBG_INFO(gc->myLevel + 10, " Pre-Wrap: (0x%X : 0x%X) : 0x%X\n",
gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd,
gc->cmdTransportInfo.fifoRead);
/* Set the jsr packet.
* NB: This command must be fenced.
*/
FIFO_ASSERT();
{
SET(*gc->cmdTransportInfo.fifoPtr, gc->cmdTransportInfo.fifoJmpHdr);
P6FENCE;
}
FIFO_ASSERT();
wrapAddr = (FxU32)gc->cmdTransportInfo.fifoPtr;
/* Update roomXXX fields for the actual wrap */
gc->cmdTransportInfo.roomToReadPtr -= gc->cmdTransportInfo.roomToEnd;
gc->cmdTransportInfo.roomToEnd = gc->cmdTransportInfo.fifoSize - FIFO_END_ADJUST;
#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_USE_DEBUG_FIFO
_GlideRoot.stats.fifoWraps++;
_GlideRoot.stats.fifoWrapDepth += GR_GET(hw->cmdFifoDepth);
#endif
/* Reset fifo ptr to start */
gc->cmdTransportInfo.fifoPtr = gc->cmdTransportInfo.fifoStart;
#if GLIDE_USE_SHADOW_FIFO
{
FxU32* fifoPtr = gc->cmdTransportInfo.fifoShadowPtr;
while(fifoPtr < gc->cmdTransportInfo.fifoShadowBase + (kDebugFifoSize >> 2))
*fifoPtr++ = 0x00UL;
gc->cmdTransportInfo.fifoShadowPtr = gc->cmdTransportInfo.fifoShadowBase;
}
#endif /* GLIDE_USE_SHADOW_FIFO */
GDBG_INFO(gc->myLevel + 10, " Post-Wrap: (0x%X : 0x%X) : 0x%X\n",
gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd,
gc->cmdTransportInfo.fifoRead);
goto again;
}
/* compute room left */
gc->cmdTransportInfo.fifoRoom = MIN(gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd);
#if GDBG_INFO_ON
#if (GLIDE_PLATFORM & GLIDE_HW_CVG)
GDBG_INFO(gc->myLevel, FN_NAME"_Done:\n"
"\tfifoBlock: (0x%X : 0x%X)\n"
"\tfifoRoom: (0x%X : 0x%X : 0x%X)\n"
"\tfifo hw: (0x%X : 0x%X) : (0x%X : 0x%X : 0x%X)\n",
(FxU32)gc->cmdTransportInfo.fifoPtr, blockSize,
gc->cmdTransportInfo.roomToReadPtr,
gc->cmdTransportInfo.roomToEnd, gc->cmdTransportInfo.fifoRoom,
HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoRead,
GR_GET(hw->cmdFifoDepth), GR_GET(hw->cmdFifoHoles), GR_GET(hw->status));
#endif
#if !GLIDE_INIT_HAL
if (gc->scanline_interleaved) {
SstRegs* slaveHw = (SstRegs*)gc->slave_ptr;
GDBG_INFO_MORE(gc->myLevel, "\tsli: 0x%X : (0x%X : 0x%X : 0x%X)\n",
HW_FIFO_PTR(FXFALSE),
GR_GET(slaveHw->cmdFifoDepth),
GR_GET(slaveHw->cmdFifoHoles),
GR_GET(slaveHw->status));
}
#endif /* !GLIDE_INIT_HAL */
#endif /* GDBG_INFO_ON */
FIFO_ASSERT();
GR_TRACE_EXIT(FN_NAME);
#undef FN_NAME
}
extern void
_grGetCommandTransportInfo(GrCmdTransportInfo* info)
{
GR_DCL_GC;
GR_ASSERT(info != NULL);
*info = gc->cmdTransportInfo;
}
#endif /* USE_PACKET_FIFO */

View File

@@ -1,85 +0,0 @@
/*
* FPU handling code
*
* $Id$
*
*/
/*
* This routine sets the precision to single which effects all
* adds, mults, and divs.
*/
#if defined(__i386__) || defined(__x86_64__)
void single_precision_asm()
{
#if defined(__MSC__)
__asm {
push eax ; make room
fnclex ; clear pending exceptions
fstcw WORD PTR [esp]
mov eax, DWORD PTR [esp]
and eax, 0000fcffh ; clear bits 9:8
mov DWORD PTR [esp], eax
fldcw WORD PTR [esp]
pop eax
}
#elif defined(__GNUC__)
asm("push %eax\n"
"fnclex\n"
"fstcw (%esp)\n"
"movl (%esp), %eax\n"
"and $0x0000fcff, %eax\n"
"movl %eax, (%esp)\n"
"fldcw (%esp)\n"
"pop %eax");
#else
#error "Need to implement single_precision_asm() for this compiler"
#endif
}
#else
#warning "Using a stub for single_precision_asm() for this architecture"
void single_precision_asm()
{
}
#endif
/*
* This routine sets the precision to double which effects all
* adds, mults, and divs.
*/
#if defined(__i386__) || defined(__x86_64__)
void double_precision_asm()
{
#if defined(__MSC__)
__asm {
push eax ; make room
fnclex ; clear pending exceptions
fstcw WORD PTR [esp]
mov eax, DWORD PTR [esp]
and eax, 0000fcffh ; clear bits 9:8
or eax, 000002ffh ; set 9:8 to 10
mov DWORD PTR [esp], eax
fldcw WORD PTR [esp]
pop eax
}
#elif defined(__GNUC__)
asm("push %eax\n"
"fnclex\n"
"fstcw (%esp)\n"
"movw (%esp), %eax\n"
"and $0x0000fcff, %eax\n"
"or $0x000002ff, %eax\n"
"mov %eax, (%esp)\n"
"fldcw (%esp)\n"
"pop %eax");
#else
#error "Need to implement double_precision_asm() for this compiler"
#endif
}
#else
#warning "Using a stub for double_precision_asm() for this architecture"
void double_precision_asm()
{
}
#endif

View File

@@ -1,52 +0,0 @@
/*
* THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
* PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
* TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
* INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
* DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
* THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
* FULL TEXT OF THE NON-WARRANTY PROVISIONS.
*
* USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
* RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
* TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
* AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
* SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
* THE UNITED STATES.
*
* COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
*
* $Header$
* $Log$
*
* 1 7/25/97 9:05a Pgj
* generate fxbldno.h which defines BUILD_NUMBER
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
main(int argc, char **argv)
{
struct tm locTime;
time_t sysTime;
char *build;
time(&sysTime);
locTime = *localtime(&sysTime);
if (build = getenv("BUILD_NUMBER")) {
printf("#define BUILD_NUMBER %s\n", build);
} else {
unsigned short magic;
magic = (locTime.tm_yday << 7) |
(locTime.tm_hour << 2) |
(locTime.tm_min / 15);
printf("#define BUILD_NUMBER %d\n", magic);
}
return 0;
} /* end main() */

View File

@@ -1,184 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Revision$
** $Date$
*/
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <3dfx.h>
#include <glidesys.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
/*----------------------------------------------------------------------
* macros for creating assembler offset files
*----------------------------------------------------------------------*/
#define NEWLINE printf("\n")
#define COMMENT printf(";----------------------------------------------------------------------\n")
#define HEADER(str) NEWLINE; COMMENT; \
printf("; Assembler offsets for %s struct\n",str);\
COMMENT; NEWLINE
#define OFFSET(p,o,pname) if (hex) \
printf("%s\tequ %08xh\n",pname,((int)&p.o)-(int)&p); \
else printf("%s\tequ %10d\n",pname,((int)&p.o)-(int)&p)
#define OFFSET2(p,o,pname) if (hex) \
printf("%s\tequ %08xh\n",pname,((int)&o)-(int)&p); \
else printf("%s\tequ %10d\n",pname,((int)&o)-(int)&p)
#define SIZEOF(p,pname) if (hex) \
printf("SIZEOF_%s\tequ %08lxh\n",pname,sizeof(p)); \
else printf("SIZEOF_%s\tequ %10ld\n",pname,sizeof(p))
int
main (int argc, char **argv)
{
int hex=0; /* default is print in decimal */
static struct _GlideRoot_s gr;
static GrGC gc;
#if !GLIDE_HW_TRI_SETUP
static SstRegs sst;
static struct dataList_s dl;
#endif /* !GLIDE_HW_TRI_SETUP */
if (argc > 1) {
if (strcmp("-inline", argv[1]) == 0) {
SstRegs dummyRegs = { 0x00UL };
printf("#ifndef __FX_INLINE_H__\n");
printf("#define __FX_INLINE_H__\n");
printf("\n");
#if GLIDE_DISPATCH_SETUP
printf("#define kCurGCOffset 0x%lXUL\n",
offsetof(struct _GlideRoot_s, curGC));
printf("#define kTriProcOffset 0x%lXUL\n",
offsetof(struct GrGC_s, curArchProcs.triSetupProc));
printf("#define kTriProcOffsetClean %d\n",
offsetof(struct GrGC_s, curArchProcs.triSetupProc));
#endif /* GLIDE_DISPATCH_SETUP */
printf("/* The # of 2-byte entries in the hw fog table */\n");
printf("#define kInternalFogTableEntryCount 0x%lXUL\n",
sizeof(dummyRegs.fogTable) >> 1);
printf("\n");
printf("#endif /* __FX_INLINE_H__ */\n");
return 0;
}
hex = 1;
}
HEADER ("SSTREGS");
NEWLINE;
HEADER ("GC");
OFFSET (gc,base_ptr,"base_ptr\t");
OFFSET (gc,reg_ptr,"reg_ptr\t\t");
OFFSET (gc,lfb_ptr,"lfb_ptr\t\t");
OFFSET (gc,tex_ptr,"tex_ptr\t\t");
OFFSET (gc,state.cull_mode,"cull_mode\t");
OFFSET (gc, regDataList,"regDataList\t");
OFFSET (gc, tsuDataList,"tsuDataList\t");
OFFSET (gc, cmdTransportInfo.triPacketHdr, "triPacketHdr");
OFFSET (gc, cmdTransportInfo.cullStripHdr, "cullStripHdr");
OFFSET (gc, cmdTransportInfo.paramMask, "paramMask");
OFFSET (gc, cmdTransportInfo.fifoStart, "fifoStart");
OFFSET (gc, cmdTransportInfo.fifoEnd, "fifoEnd");
OFFSET (gc, cmdTransportInfo.fifoOffset, "fifoOffset");
OFFSET (gc, cmdTransportInfo.fifoSize, "fifoSize");
OFFSET (gc, cmdTransportInfo.fifoJmpHdr, "fifoJmpHdr");
OFFSET (gc, cmdTransportInfo.fifoPtr, "fifoPtr");
OFFSET (gc, cmdTransportInfo.fifoRead, "fifoRead");
OFFSET (gc, cmdTransportInfo.fifoRoom, "fifoRoom");
OFFSET (gc, cmdTransportInfo.roomToReadPtr, "roomToReadPtr");
OFFSET (gc, cmdTransportInfo.roomToEnd, "roomToEnd");
OFFSET (gc, cmdTransportInfo.fifoLfbP, "fifoLfbP");
OFFSET (gc, cmdTransportInfo.lfbLockCount, "lfbLockCount");
#if GLIDE_DISPATCH_SETUP
OFFSET (gc,curArchProcs.triSetupProc,"kTriProcOffset\t\t");
#endif
SIZEOF (gr.GCs[0].state,"GrState\t");
SIZEOF (gr.hwConfig,"GrHwConfiguration");
SIZEOF (gr.GCs[0],"GC\t");
NEWLINE;
HEADER ("GlideRoot");
OFFSET (gr,p6Fencer,"p6Fencer\t");
OFFSET (gr,current_sst,"current_sst\t");
OFFSET (gr,CPUType,"CPUType\t\t");
OFFSET (gr,curGC,"curGC\t\t");
OFFSET (gr,curTriSize,"curTriSize\t");
OFFSET (gr,stats.trisProcessed,"trisProcessed\t");
OFFSET (gr,stats.trisDrawn,"trisDrawn\t");
#if GLIDE_PACKED_RGB
OFFSET (gr, pool.ftemp1, "fTemp1");
OFFSET (gr, pool.ftemp2, "fTemp2");
OFFSET (gr, pool.fBiasHi,"fBiasHi");
OFFSET (gr, pool.fBiasLo,"fBiasLo");
#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && GLIDE_PACKED_RGB */
SIZEOF (gr,"GlideRoot");
NEWLINE;
HEADER ("GrVertex");
{
GrVertex v;
OFFSET(v, x, "x");
OFFSET(v, y, "y");
OFFSET(v, r, "r");
OFFSET(v, g, "g");
OFFSET(v, b, "b");
OFFSET(v, a, "a");
SIZEOF(v, "GrVertex");
}
NEWLINE;
#if !GLIDE_HW_TRI_SETUP
HEADER ("dataList");
OFFSET (dl,i,"dl_i\t\t");
OFFSET (dl,addr,"dl_addr\t\t");
SIZEOF (dl,"dataList\t");
NEWLINE;
#endif /* !GLIDE_HW_TRI_SETUP */
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,61 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log:
** 3 3dfx 1.0.1.0.1.0 10/11/00 Brent Forced check in to enforce
** branching.
** 2 3dfx 1.0.1.0 06/20/00 Joseph Kain Changes to support the
** Napalm Glide open source release. Changes include cleaned up offensive
** comments and new legal headers.
** 1 3dfx 1.0 09/11/99 StarTeam VTS Administrator
** $
**
** 1 2/19/99 5:50p Peter
** type definitions for new splash screen
*/
#ifndef _FX_SPLASH_H_
#define _FX_SPLASH_H_
#include "3dfx.h"
#define FX_DLL_DEFINITION
#include "fxdll.h"
#include "glide.h"
typedef FxBool
(FX_CALL* GrSplashInitProc)(FxU32 hWnd,
FxU32 screenWidth, FxU32 screenHeight,
FxU32 numColBuf, FxU32 numAuxBuf,
GrColorFormat_t colorFormat);
typedef void
(FX_CALL* GrSplashShutdownProc)(void);
typedef void
(FX_CALL* GrSplashProc)(float x, float y,
float w, float h,
FxU32 frameNumber);
typedef const void*
(FX_CALL* GrSplashPlugProc)(FxU32* w, FxU32* h,
FxI32* strideInBytes,
GrLfbWriteMode_t* format);
#endif /* _FX_SPLASH_H_ */

View File

@@ -1,562 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.1.1.1.2.2 2006/12/03 04:49:19 guillemj
** Backport "sequence point" fix for string upper code from glide3x.
**
** Revision 1.1.1.1.2.1 2004/12/12 15:20:35 koolsmoky
** use toupper for __MSC__
**
** Revision 1.1.1.1 1999/12/07 21:49:09 joseph
** Initial checkin into SourceForge.
**
**
** 17 2/20/98 11:00a Peter
** removed glide3 from glid2 tree
*
* 16 1/13/98 7:48p Atai
* fixed gu3dfGetInfo, grBufferClear, and GrState size
*
* 15 1/13/98 12:42p Atai
* fixed grtexinfo, grVertexLayout, and draw triangle
*
* 14 1/09/98 6:48p Atai
* grTexInfo, GR_LOD_* and GR_ASPECT_*
*
* 12 12/17/97 4:45p Peter
* groundwork for CrybabyGlide
*
* 11 12/09/97 12:20p Peter
* mac glide port
*
* 10 6/06/97 5:56p Peter
* fixed gcc/dural compilation things
*
* 9 6/02/97 4:09p Peter
* Compile w/ gcc for Dural
*
* 8 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 7 5/21/97 6:05a Peter
*
* 6 3/09/97 10:31a Dow
* Added GR_DIENTRY for di glide functions
**
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
#ifdef __linux__
#include <ctype.h>
#endif
extern const int _grMipMapHostWH[GR_ASPECT_1x8 + 1][GR_LOD_1 + 1][2];
extern FxU32 _gr_aspect_index_table[];
extern FxU32 _grMipMapHostSize[4][16];
static FxU16 ReadDataShort(FILE *);
static FxU32 ReadDataLong(FILE *);
static void Read8Bit(FxU8 *dst, FILE *image, int small_lod, int large_lod, GrAspectRatio_t aspect);
static void Read16Bit(FxU16 *dst, FILE *image, int small_lod, int large_lod, GrAspectRatio_t aspect);
#if ((GLIDE_PLATFORM & (GLIDE_OS_DOS32 | GLIDE_OS_WIN32 | GLIDE_OS_MACOS)) != 0)
const char *openmode = "rb";
#else
const char *openmode = "r";
#endif
typedef struct
{
const char *name;
GrTextureFormat_t fmt;
FxBool valid;
} CfTableEntry;
static FxBool
_grGet3dfHeader(FILE* stream, char* const buffer, const FxU32 bufSize)
{
int numLines = 0;
FxU32 bufPos = 0;
while(numLines < 4) {
/* Handle stream errors */
if (fgets(buffer + bufPos, bufSize - bufPos, stream) == NULL) break;
bufPos += strlen(buffer + bufPos);
/* fgets includes the '\n' in the buffer. If this is not there
* then the buffer is too small so fail.
*/
if (*(buffer + bufPos - sizeof(char)) != '\n') break;
numLines++;
}
return (numLines == 4);
}
/*---------------------------------------------------------------------------
** gu3dfGetInfo
*/
GR_DIENTRY(gu3dfGetInfo, FxBool,
(const char *FileName, Gu3dfInfo *Info))
{
FILE *image_file;
FxU32 i;
char version[5];
char color_format[10];
int aspect_width, aspect_height;
char buffer[100];
int small_lod, large_lod;
FxBool ratio_found = FXFALSE;
FxBool format_found = FXFALSE;
GrAspectRatio_t wh_aspect_table[] =
{
GR_ASPECT_1x1,
GR_ASPECT_1x2,
GR_ASPECT_1x4,
GR_ASPECT_1x8
};
GrAspectRatio_t hw_aspect_table[] =
{
GR_ASPECT_1x1,
GR_ASPECT_2x1,
GR_ASPECT_4x1,
GR_ASPECT_8x1
};
CfTableEntry cftable[] =
{
{ "I8", GR_TEXFMT_INTENSITY_8, FXTRUE },
{ "A8", GR_TEXFMT_ALPHA_8, FXTRUE },
{ "AI44", GR_TEXFMT_ALPHA_INTENSITY_44, FXTRUE },
{ "YIQ", GR_TEXFMT_YIQ_422, FXTRUE },
{ "RGB332", GR_TEXFMT_RGB_332, FXTRUE },
{ "RGB565", GR_TEXFMT_RGB_565, FXTRUE },
{ "ARGB8332", GR_TEXFMT_ARGB_8332, FXTRUE },
{ "ARGB1555", GR_TEXFMT_ARGB_1555, FXTRUE },
{ "AYIQ8422", GR_TEXFMT_AYIQ_8422, FXTRUE },
{ "ARGB4444", GR_TEXFMT_ARGB_4444, FXTRUE },
{ "AI88", GR_TEXFMT_ALPHA_INTENSITY_88, FXTRUE },
{ "P8", GR_TEXFMT_P_8, FXTRUE },
{ "AP88", GR_TEXFMT_AP_88, FXTRUE },
{ 0, 0, FXFALSE }
};
GDBG_INFO(81,"gu3dfGetInfo(%s,0x%x)\n",FileName,Info);
/*
** open the filen
*/
if((image_file = fopen(FileName, openmode)) == NULL) return FXFALSE;
if (!_grGet3dfHeader(image_file, buffer, sizeof(buffer))) return FXFALSE;
/*
** grab statistics out of the header
*/
if(sscanf(buffer,"3df v%s %s lod range: %i %i aspect ratio: %i %i\n",
version,
color_format,
&small_lod, &large_lod,
&aspect_width, &aspect_height) == 0)
return FXFALSE;
/*
** determine aspect ratio, height, and width
*/
i = 0;
ratio_found = FXFALSE;
while ((i < 4) && (!ratio_found)) {
if ((aspect_width << i) == aspect_height) {
Info->header.aspect_ratio = wh_aspect_table[i];
ratio_found = FXTRUE;
}
i++;
}
i = 0;
while ((i < 4) && (!ratio_found)) {
if ((aspect_height << i) == aspect_width) {
Info->header.aspect_ratio = hw_aspect_table[i];
ratio_found = FXTRUE;
}
i++;
}
if (!ratio_found) return FXFALSE;
/*
** determine height and width of the mip map
*/
if (aspect_width >= aspect_height) {
Info->header.width = large_lod;
Info->header.height = large_lod / aspect_width;
} else {
Info->header.height = large_lod;
Info->header.width = large_lod / aspect_height;
}
/*
** calculate proper LOD values
*/
/*
** note for glide3 lod translation:
** we should return the new defines for glide3
*/
switch (small_lod) {
case 1:
Info->header.small_lod = GR_LOD_1;
break;
case 2:
Info->header.small_lod = GR_LOD_2;
break;
case 4:
Info->header.small_lod = GR_LOD_4;
break;
case 8:
Info->header.small_lod = GR_LOD_8;
break;
case 16:
Info->header.small_lod = GR_LOD_16;
break;
case 32:
Info->header.small_lod = GR_LOD_32;
break;
case 64:
Info->header.small_lod = GR_LOD_64;
break;
case 128:
Info->header.small_lod = GR_LOD_128;
break;
case 256:
Info->header.small_lod = GR_LOD_256;
break;
}
switch (large_lod) {
case 1:
Info->header.large_lod = GR_LOD_1;
break;
case 2:
Info->header.large_lod = GR_LOD_2;
break;
case 4:
Info->header.large_lod = GR_LOD_4;
break;
case 8:
Info->header.large_lod = GR_LOD_8;
break;
case 16:
Info->header.large_lod = GR_LOD_16;
break;
case 32:
Info->header.large_lod = GR_LOD_32;
break;
case 64:
Info->header.large_lod = GR_LOD_64;
break;
case 128:
Info->header.large_lod = GR_LOD_128;
break;
case 256:
Info->header.large_lod = GR_LOD_256;
break;
}
/*
** determine the color format of the input image
*/
{
char *tempStr = (char*)color_format;
while (*tempStr != '\0') {
*tempStr = toupper(*tempStr);
tempStr++;
}
}
i = 0;
format_found = FXFALSE;
while ((cftable[i].name != 0) && (!format_found)) {
if (strcmp(color_format, cftable[i].name) == 0) {
Info->header.format = cftable[i].fmt;
format_found = FXTRUE;
}
i++;
}
/*
** close the input file
*/
if (image_file != NULL) fclose(image_file);
if (format_found) {
FxI32 lod;
Info->mem_required = 0;
for(lod = Info->header.large_lod; lod <= Info->header.small_lod; lod++) {
Info->mem_required += (_grMipMapHostSize[_gr_aspect_index_table[Info->header.aspect_ratio]]
[lod] << (Info->header.format >= GR_TEXFMT_16BIT));
}
}
return format_found;
}
/*---------------------------------------------------------------------------
** gu3dfLoad
*/
GR_DIENTRY(gu3dfLoad, FxBool, (const char *filename, Gu3dfInfo *info))
{
FILE *image_file = 0;
FxU32 index = 0;
char buffer[100] = "";
GDBG_INFO(81,"gu3dfLoad(%s,0x%x)\n",filename,info);
/*
** open the file
*/
if ((image_file = fopen(filename, openmode)) == NULL) return FXFALSE;
if (!_grGet3dfHeader(image_file, buffer, sizeof(buffer))) return FXFALSE;
/*
** If necessary, read in the YIQ decompression table
*/
if ((info->header.format == GR_TEXFMT_YIQ_422) ||
(info->header.format == GR_TEXFMT_AYIQ_8422))
{
/*
** read in Y
*/
for (index = 0; index < 16; index++)
info->table.nccTable.yRGB[index] = ((FxI16) ReadDataShort(image_file)) & 0xFF;
/*
** read in I
*/
for (index = 0; index < 4; index++) {
info->table.nccTable.iRGB[index][0] = ((FxI16) ReadDataShort(image_file)) & 0x1FF;
info->table.nccTable.iRGB[index][1] = ((FxI16) ReadDataShort(image_file)) & 0x1FF;
info->table.nccTable.iRGB[index][2] = ((FxI16) ReadDataShort(image_file)) & 0x1FF;
}
/*
** read in Q
*/
for (index = 0; index < 4; index++) {
info->table.nccTable.qRGB[index][0] = ((FxI16) ReadDataShort(image_file)) & 0x1FF;
info->table.nccTable.qRGB[index][1] = ((FxI16) ReadDataShort(image_file)) & 0x1FF;
info->table.nccTable.qRGB[index][2] = ((FxI16) ReadDataShort(image_file)) & 0x1FF;
}
/*
** pack the table Y entries
*/
for (index = 0; index < 4; index++) {
FxU32 packedvalue;
packedvalue = ((FxU32) info->table.nccTable.yRGB[index*4+0]);
packedvalue |= ((FxU32) info->table.nccTable.yRGB[index*4+1]) << 8;
packedvalue |= ((FxU32) info->table.nccTable.yRGB[index*4+2]) << 16;
packedvalue |= ((FxU32) info->table.nccTable.yRGB[index*4+3]) << 24;
info->table.nccTable.packed_data[index] = packedvalue;
}
/*
** pack the table I entries
*/
for (index = 0; index < 4; index++) {
FxU32 packedvalue;
packedvalue = ((FxU32) info->table.nccTable.iRGB[index][0]) << 18;
packedvalue |= ((FxU32) info->table.nccTable.iRGB[index][1]) << 9;
packedvalue |= ((FxU32) info->table.nccTable.iRGB[index][2]) << 0;
info->table.nccTable.packed_data[index+4] = packedvalue;
}
/*
** pack the table Q entries
*/
for (index = 0; index < 4; index++) {
FxU32 packedvalue;
packedvalue = ((FxU32) info->table.nccTable.qRGB[index][0]) << 18;
packedvalue |= ((FxU32) info->table.nccTable.qRGB[index][1]) << 9;;
packedvalue |= ((FxU32) info->table.nccTable.qRGB[index][2]) << 0;
info->table.nccTable.packed_data[index+8] = packedvalue;
}
}
/*
** If necessary, read in the Palette
*/
if ((info->header.format == GR_TEXFMT_P_8) ||
(info->header.format == GR_TEXFMT_AP_88)) {
FxU32 i;
for(i = 0; i < 256; i++)
info->table.palette.data[i] = ReadDataLong(image_file);
}
/*
** Read in the image
*/
switch (info->header.format)
{
case GR_TEXFMT_INTENSITY_8:
case GR_TEXFMT_ALPHA_8:
case GR_TEXFMT_ALPHA_INTENSITY_44:
case GR_TEXFMT_YIQ_422:
case GR_TEXFMT_RGB_332:
case GR_TEXFMT_P_8:
Read8Bit(info->data, image_file,
info->header.small_lod,
info->header.large_lod,
info->header.aspect_ratio);
break;
case GR_TEXFMT_RGB_565:
case GR_TEXFMT_ARGB_8332:
case GR_TEXFMT_ARGB_1555:
case GR_TEXFMT_AYIQ_8422:
case GR_TEXFMT_ARGB_4444:
case GR_TEXFMT_ALPHA_INTENSITY_88:
case GR_TEXFMT_AP_88:
Read16Bit(info->data, image_file,
info->header.small_lod,
info->header.large_lod,
info->header.aspect_ratio);
break;
default:
return FXFALSE;
}
/*
** close the file
*/
fclose(image_file);
return FXTRUE;
}
/*
** Read8Bit
**
** Read in an 8-bit texture map, unpacked.
*/
static void
Read8Bit(FxU8 *data, FILE *image_file,
int small_lod, int large_lod,
GrAspectRatio_t aspect_ratio)
{
int lod;
int width, height;
for (lod = large_lod; lod <= small_lod; lod++) {
width = _grMipMapHostWH[aspect_ratio][lod][0];
height = _grMipMapHostWH[aspect_ratio][lod][1];
fread(data, sizeof(char), width*height, image_file);
data += width*height;
}
}
/*
** Read16Bit
**
** Read in a 16-bit texture map, unpacked.
*/
static void Read16Bit(FxU16 *data, FILE *image_file,
int small_lod, int large_lod,
GrAspectRatio_t aspect_ratio)
{
int index;
int lod;
int width, height;
for (lod = large_lod; lod <= small_lod; lod++) {
width = _grMipMapHostWH[aspect_ratio][lod][0];
height = _grMipMapHostWH[aspect_ratio][lod][1];
for (index = 0; index < (width * height); index++) {
*data = ReadDataShort(image_file);
data++;
}
}
}
/*
** FxU16 ReadDataShort
*/
static FxU16 ReadDataShort(FILE *fp)
{
FxU16 b1 = (FxU16)getc(fp);
FxU16 b2 = (FxU16)getc(fp);
#define kShiftB1 8
#define kShiftB2 0
return (((b1 & 0xFF) << kShiftB1) | ((b2 & 0xFF) << kShiftB2));
}
/*
** ReadDataLong
*/
static FxU32 ReadDataLong(FILE *fp)
{
FxU32 data;
FxU8 byte[4];
fread(byte, 4, 1, fp);
data = (((FxU32) byte[0]) << 24) |
(((FxU32) byte[1]) << 16) |
(((FxU32) byte[2]) << 8) |
((FxU32) byte[3]);
return data;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,170 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*
* 17 1/05/98 6:06p Atai
* glide extension stuff
*
* 16 12/15/97 5:52p Atai
* disable obsolete glide2 api for glide3
*
* 15 11/18/97 4:36p Peter
* make thing more translucent
*
* 14 9/15/97 7:31p Peter
* more cmdfifo cleanup, fixed normal buffer clear, banner in the right
* place, lfb's are on, Hmmmm.. probably more
*
* 13 7/26/97 3:04p Peter
* gratuitous plug is translucent
*
* 12 7/08/97 2:48p Peter
* shameless plug just uses lfb routines
*
* 11 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 10 5/21/97 6:05a Peter
*
* 9 5/02/97 2:08p Pgj
* screen_width/height now FxU32
*
* 8 3/16/97 2:24a Jdt
* Fixed bug. Didn't initialize info.
*
* 7 3/12/97 11:51p Jdt
* Watcom warning.
*
* 6 3/12/97 4:20p Jdt
* Fixed for VG96 and optimized SST-1
*
* 5 2/26/97 11:55a Jdt
* Updated banner for new lfb api
*
* 4 12/23/96 1:37p Dow
* chagnes for multiplatform glide
**
*/
#include <3dfx.h>
#include <glidesys.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
#ifdef GLIDE_PLUG
#include "banner.inc"
#endif
/* display the translucent 3Dfx powerfield logo */
void
_grShamelessPlug(void)
{
#ifdef GLIDE_PLUG
GrState state;
GR_BEGIN_NOFIFOCHECK("_grShamelessPlug", 80);
GDBG_INFO_MORE(gc->myLevel, "()\n");
grGlideGetState(&state);
grDisableAllEffects();
grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_ONE,
GR_COMBINE_LOCAL_CONSTANT,
GR_COMBINE_OTHER_TEXTURE, FXFALSE);
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_ONE,
GR_COMBINE_LOCAL_NONE,
GR_COMBINE_OTHER_TEXTURE,
FXFALSE);
grAlphaBlendFunction(GR_BLEND_SRC_ALPHA,
GR_BLEND_ONE_MINUS_SRC_ALPHA,
GR_BLEND_ZERO, GR_BLEND_ZERO);
grClipWindow(0, 0,
gc->state.screen_width - 1,
gc->state.screen_height - 1);
grDepthMask(FXFALSE);
grDepthBufferFunction(GR_CMP_ALWAYS);
grDepthBufferMode(GR_DEPTHBUFFER_DISABLE);
#if defined(GLIDE3) && defined(GLIDE3_ALPHA)
_grChromaRangeExt(0x0000, 0x0000, GR_CHROMARANGE_RGB_ALL);
#else
grChromakeyValue(0x0000);
#endif
grChromakeyMode(GR_CHROMAKEY_ENABLE);
grLfbConstantAlpha((FxU8) 0x40);
grLfbWriteColorFormat(GR_COLORFORMAT_ARGB);
#if 1
/* NB: The banner image is actually upside down. Hence the
* negative stride and starting address calculation.
*/
_grLfbWriteRegion(FXTRUE, GR_BUFFER_BACKBUFFER,
gc->state.screen_width - (banner_width + 1),
gc->state.screen_height - (banner_height + 1),
GR_LFBWRITEMODE_565,
banner_width, banner_height,
-(banner_width << 1),
banner_data + (banner_width * (banner_height - 1)));
#else
{
const FxI32 maxY = gc->state.screen_height - (banner_height + 1);
const FxI32 maxX = gc->state.screen_width - (banner_width + 1);
static FxI32 y = 0;
static FxI32 x = 0;
static FxI32 plugDir;
{
const FxI32* maxP;
const FxI32* valP;
if (maxX > maxY) {
maxP = &maxY;
valP = &y;
} else {
maxP = &maxX;
valP = &x;
}
if (*valP == 0) plugDir = 1;
else if (*valP >= *maxP) plugDir = -1;
}
_grLfbWriteRegion(FXTRUE, GR_BUFFER_BACKBUFFER,
x += plugDir,
y += plugDir,
GR_LFBWRITEMODE_565,
banner_width, banner_height,
-(banner_width << 1),
banner_data + (banner_width * (banner_height - 1)));
}
#endif
grGlideSetState(&state);
GR_END();
#endif /* GLIDE_PLUG */
} /* _grShamelessPlug */

File diff suppressed because it is too large Load Diff

View File

@@ -1,281 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
**
** $Header$
** $Log$
** Revision 1.1.1.1 1999/12/07 21:49:10 joseph
** Initial checkin into SourceForge.
**
**
** 28 3/14/98 1:07p Peter
** mac port happiness
**
** 27 2/11/98 5:23p Peter
** no more infinite recursion
*
* 26 12/18/97 2:13p Peter
* cleaned up the error code
*
* 25 12/09/97 12:20p Peter
* mac glide port
*
* 24 12/05/97 4:38p Peter
* sli vs assertions
*
* 23 12/03/97 11:34a Peter
* dos debugging
*
* 22 11/17/97 4:55p Peter
* watcom warnings/chipfield stuff
*
* 21 11/15/97 8:55p Peter
* Removed OutputDebugString
*
* 20 11/15/97 7:43p Peter
* more comdex silliness
*
* 19 11/12/97 2:27p Peter
*
* 18 11/12/97 11:16a Peter
* cleaned up assertions
*
* 17 11/04/97 5:04p Peter
* cataclysm part deux
*
* 16 11/03/97 4:02p Peter
* cataclysm fix
*
* 15 11/03/97 3:43p Peter
* h3/cvg cataclysm
*
* 14 10/23/97 5:28p Peter
* sli fifo thing
*
* 13 9/24/97 1:29p Peter
* more assertion spewage
*
* 12 9/05/97 5:29p Peter
* changes for direct hw
*
* 11 5/30/97 5:44p Peter
* Version that does basic triangles/registers w/ command fifo. Does not
* currently download textures correctly.
*
* 10 5/28/97 9:05a Peter
* Merge w/ latest glide changes
*
* 9 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 8 5/21/97 6:05a Peter
*
* 7 5/20/97 9:47a Pgj
* Use OutputDebugString for non-fatal errors under windows
*
* 6 5/19/97 7:35p Pgj
* Print cogent error message if h/w not found
*
* 5 3/09/97 10:31a Dow
* Added GR_DIENTRY for di glide functions
*
* 4 12/23/96 1:37p Dow
* chagnes for multiplatform glide
**
*/
#include <stdio.h>
#ifdef __DOS__
# include <malloc.h>
#endif
#ifdef __WIN32__
# include <windows.h>
#endif
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
void (*GrErrorCallback)( const char *string, FxBool fatal );
void _doGrErrorCallback( const char *name, const char *msg, FxBool fatal )
{
char buf[1024];
#if GDBG_INFO_ON
/* Neuter any fifo checking from the failing
* call. Otherwise entries into the shutdown
* calls cause spurious crap.
*/
if (fatal) {
GR_DCL_GC;
gc->checkCounter =
gc->expected_counter = 0;
gc->checkCounter =
gc->checkPtr = 0UL;
}
#endif /* GDBG_INFO_ON */
gdbg_printf("%s: %s.\n", name, msg);
sprintf(buf,"%s: %s.\n", name, msg);
GrErrorCallback(buf, fatal);
if (fatal) exit(1);
}
GR_DIENTRY(grErrorSetCallback, void,
( void (*function) ( const char *string, FxBool fatal ) ))
{
GDBG_INFO(80,"grErrorSetCallback(0x%x)",function);
GrErrorCallback = function;
}
#ifdef __WIN32__
void
_grErrorWindowsCallback( const char *s, FxBool fatal )
{
if ( fatal ) {
GDBG_ERROR("glide", s);
grGlideShutdown();
MessageBox(NULL, s, NULL, MB_OK);
}
}
#endif
void
_grErrorDefaultCallback( const char *s, FxBool fatal )
{
if ( fatal ) {
GDBG_ERROR("glide",s);
grGlideShutdown();
#if (GLIDE_PLATFORM & GLIDE_OS_MACOS)
{
Str255 errBuf;
errBuf[0] = sprintf((char*)(errBuf + 1), "%s", s);
DebugStr(errBuf);
}
#endif /* (GLIDE_PLATFORM * GLIDE_OS_MACOS) */
}
}
#ifdef __DOS__
int _guHeapCheck( void )
{
int i = _heapchk();
if ( i != _HEAPOK )
printf( "heapchk: %d\n", i );
return ( i == 0 );
}
#endif
void
_grAssert(char *exp, char *fileName, int lineNo)
{
GR_DCL_GC;
GR_DCL_HW;
/* No recursive re-entry thank you very much */
{
static FxBool inProcP = FXFALSE;
if (inProcP) return;
inProcP = FXTRUE;
}
/* dpc - 28 may 1997 - FixMe!
* What to do here?
*/
#if GLIDE_INIT_HAL
#else /* !GLIDE_INIT_HAL */
/* initRestoreVideo(); */
sst1InitShutdown(gc->base_ptr);
#endif /* !GLIDE_INIT_HAL */
gdbg_printf("ASSERTION FAILED:\n");
gdbg_printf("\tExpression: %s\n", exp);
gdbg_printf("\tFile: %s\n", fileName);
gdbg_printf("\tLine: %d\n", lineNo);
#if (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO
/* Spew about the state of the fifo since that's what most of the
* assertions are about anyway.
*/
{
gdbg_printf("Command Fifo:\n");
gdbg_printf("\tfifoPtr: 0x%X\n"
"\tfifoParams: 0x%X : (0x%X : 0x%X)\n"
"\tfifoRoom: 0x%X : (0x%X : 0x%X)\n"
"\tfifo hw: (0x%X : 0x%X) : (0x%X : 0x%X : 0x%X)\n"
"\tStatus: 0x%X\n",
gc->cmdTransportInfo.fifoPtr,
gc->cmdTransportInfo.fifoStart, gc->cmdTransportInfo.fifoEnd,
gc->cmdTransportInfo.fifoSize,
gc->cmdTransportInfo.fifoRoom,
gc->cmdTransportInfo.roomToReadPtr, gc->cmdTransportInfo.roomToEnd,
HW_FIFO_PTR(FXTRUE), gc->cmdTransportInfo.fifoRead,
GR_GET(hw->cmdFifoDepth), GR_GET(hw->cmdFifoHoles), GR_GET(hw->cmdFifoBase),
GR_GET(hw->status));
#if !GLIDE_INIT_HAL
if (gc->scanline_interleaved) {
SstRegs* slaveHw = (SstRegs*)gc->slave_ptr;
slaveHw = slaveHw; // FIXME: Below might not exist. *sigh*
GDBG_INFO_MORE(gc->myLevel, "\tsli: 0x%X : (0x%X : 0x%X : 0x%X)\n",
HW_FIFO_PTR(FXFALSE),
GR_GET(slaveHw->cmdFifoDepth),
GR_GET(slaveHw->cmdFifoHoles),
GR_GET(slaveHw->status));
}
#endif /* !GLIDE_INIT_HAL */
#if GLIDE_USE_SHADOW_FIFO
if (gc->cmdTransportInfo.fifoShadowBase != NULL) {
const FxU32* fifoPtr = gc->cmdTransportInfo.fifoShadowBase;
GDBG_PRINTF("Shadow Fifo: 0x%X\n", gc->cmdTransportInfo.fifoShadowPtr);
#if 0
while(fifoPtr != gc->cmdTransportInfo.fifoShadowPtr) GDBG_PRINTF("0x%X\n", *fifoPtr++);
GDBG_PRINTF("\n");
GDBG_PRINTF("Up to fifo wrap: \n");
while(fifoPtr < gc->cmdTransportInfo.fifoShadowBase + (kDebugFifoSize >> 2))
GDBG_PRINTF("0x%X\n", *fifoPtr++);
#endif
free(gc->cmdTransportInfo.fifoShadowBase);
}
#endif /* GLIDE_USE_SHADOW_FIFO */
}
#endif /* (GLIDE_PLATFORM & GLIDE_HW_CVG) && USE_PACKET_FIFO */
gdbg_printf("ABNORMAL TERMINATION\n");
exit(-1);
} /* _grAssert */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,78 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.1.1.1.2.1 2004/12/12 15:29:44 koolsmoky
** cosmetics
**
** Revision 1.1.1.1 1999/12/07 21:49:10 joseph
** Initial checkin into SourceForge.
**
*/
#define OFFICIAL 1
#define FINAL 1
#include <fxver.h>
#include "rcver.h"
//#include "fxbldno.h"
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
#ifndef GLIDE3
#define VERSIONNAME "glide2x.dll\0"
#else
#define VERSIONNAME "glide3x.dll\0"
#endif
VS_VERSION_INFO VERSIONINFO
FILEVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER
PRODUCTVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER
FILEFLAGSMASK 0x0030003FL
FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG)
FILEOS VOS_DOS_WINDOWS32
FILETYPE VFT_DRV
FILESUBTYPE VFT2_DRV_INSTALLABLE
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", "3Dfx Interactive, Inc.\0"
VALUE "FileDescription", "3Dfx Interactive, Inc. Glide DLL\0"
VALUE "FileVersion", VERSIONSTR
VALUE "InternalName", VERSIONNAME
VALUE "LegalCopyright", "Copyright \251 3Dfx Interactive, Inc. 2004\0"
VALUE "OriginalFilename", VERSIONNAME
VALUE "ProductName", PRODNAME
VALUE "ProductVersion", VERSIONSTR
VALUE "Graphics Subsystem", HWSTR
VALUE "Contact", "The Glide Open Source Project http://glide.sourceforge.net/"
END
END
BLOCK "VarFileInfo"
BEGIN
/* the following line should be extended for localized versions */
VALUE "Translation", 0x409, 1252
END
END

View File

@@ -1,131 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*
* 10 12/09/97 12:20p Peter
* mac glide port
*
* 9 11/04/97 4:00p Dow
* Banshee Mods
*
* 8 8/18/97 3:52p Peter
* pre-hw arrival fixes/cleanup
*
* 7 6/02/97 4:09p Peter
* Compile w/ gcc for Dural
*
* 6 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 5 5/21/97 6:05a Peter
*/
#ifndef __GLIDESYS_H__
#define __GLIDESYS_H__
/*
n** -----------------------------------------------------------------------
** COMPILER/ENVIRONMENT CONFIGURATION
** -----------------------------------------------------------------------
*/
/* Endianness is stored in bits [30:31] */
#define GLIDE_ENDIAN_SHIFT 30
#define GLIDE_ENDIAN_LITTLE (0x1 << GLIDE_ENDIAN_SHIFT)
#define GLIDE_ENDIAN_BIG (0x2 << GLIDE_ENDIAN_SHIFT)
/* OS is stored in bits [0:6] */
#define GLIDE_OS_SHIFT 0
#define GLIDE_OS_UNIX 0x1
#define GLIDE_OS_DOS32 0x2
#define GLIDE_OS_WIN32 0x4
#define GLIDE_OS_MACOS 0x8
#define GLIDE_OS_OS2 0x10
#define GLIDE_OS_OTHER 0x40 /* For Proprietary Arcade HW */
#define GLIDE_SST_SHIFT 7
#define GLIDE_SST_HW (0x2 << GLIDE_SST_SHIFT)
/* Hardware Type is stored in bits [9:13] */
#define GLIDE_HW_SHIFT 9
#define GLIDE_HW_SST1 (0x1 << GLIDE_HW_SHIFT)
#define GLIDE_HW_SST96 (0x2 << GLIDE_HW_SHIFT)
#define GLIDE_HW_H3 (0x4 << GLIDE_HW_SHIFT)
#define GLIDE_HW_CVG (0x10 << GLIDE_HW_SHIFT)
/*
** Make sure we handle all instances of WIN32
*/
#ifndef __WIN32__
# if defined (_WIN32) || defined (WIN32) || defined(__NT__)
# define __WIN32__
# endif
#endif
/* We need two checks on the OS: one for endian, the other for OS */
/* Check for endianness */
#if defined(__IRIX__) || defined(__sparc__) || defined(MACOS)
# define GLIDE_ENDIAN GLIDE_ENDIAN_BIG
#else
# define GLIDE_ENDIAN GLIDE_ENDIAN_LITTLE
#endif
/* Check for OS */
#if defined(__IRIX__) || defined(__sparc__) || defined(__linux__)
# define GLIDE_OS GLIDE_OS_UNIX
#elif defined(__DOS__)
# define GLIDE_OS GLIDE_OS_DOS32
#elif defined(__WIN32__)
# define GLIDE_OS GLIDE_OS_WIN32
#elif defined(macintosh)
# define GLIDE_OS GLIDE_OS_MACOS
#else
#error "Unknown OS"
#endif
#define GLIDE_SST GLIDE_SST_HW
/* Check for type of hardware */
#ifdef SST96
# define GLIDE_HW GLIDE_HW_SST96
#elif defined(H3)
# define GLIDE_HW GLIDE_HW_H3
#elif defined(CVG)
# define GLIDE_HW GLIDE_HW_CVG
#else /* Default to SST1 */
# define GLIDE_HW GLIDE_HW_SST1
#endif
#define GLIDE_PLATFORM (GLIDE_ENDIAN | GLIDE_OS | GLIDE_SST | GLIDE_HW)
/*
** Control the number of TMUs
*/
#ifndef GLIDE_NUM_TMU
# define GLIDE_NUM_TMU 2
#endif
#if ((GLIDE_NUM_TMU < 0) && (GLIDE_NUM_TMU > 3))
# error "GLIDE_NUM_TMU set to an invalid value"
#endif
#endif /* __GLIDESYS_H__ */

View File

@@ -1,186 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*
* 11 1/07/98 11:18a Atai
* remove GrMipMapInfo and GrGC.mm_table in glide3
*
* 10 1/06/98 6:47p Atai
* undo grSplash and remove gu routines
*
* 9 1/05/98 6:04p Atai
* move 3df gu related data structure from glide.h to glideutl.h
*
* 8 12/18/97 2:13p Peter
* fogTable cataclysm
*
* 7 12/15/97 5:52p Atai
* disable obsolete glide2 api for glide3
*
* 6 8/14/97 5:32p Pgj
* remove dead code per GMT
*
* 5 6/12/97 5:19p Pgj
* Fix bug 578
*
* 4 3/05/97 9:36p Jdt
* Removed guFbWriteRegion added guEncodeRLE16
*
* 3 1/16/97 3:45p Dow
* Embedded fn protos in ifndef FX_GLIDE_NO_FUNC_PROTO
*/
/* Glide Utility routines */
#ifndef __GLIDEUTL_H__
#define __GLIDEUTL_H__
#ifdef __cplusplus
extern "C" {
#endif
#if defined(GLIDE3) && defined(GLIDE3_ALPHA)
/*
** 3DF texture file structs
*/
typedef struct
{
FxU32 width, height;
int small_lod, large_lod;
GrAspectRatio_t aspect_ratio;
GrTextureFormat_t format;
} Gu3dfHeader;
typedef struct
{
FxU8 yRGB[16];
FxI16 iRGB[4][3];
FxI16 qRGB[4][3];
FxU32 packed_data[12];
} GuNccTable;
typedef struct {
FxU32 data[256];
} GuTexPalette;
typedef union {
GuNccTable nccTable;
GuTexPalette palette;
} GuTexTable;
typedef struct
{
Gu3dfHeader header;
GuTexTable table;
void *data;
FxU32 mem_required; /* memory required for mip map in bytes. */
} Gu3dfInfo;
#endif
#ifndef FX_GLIDE_NO_FUNC_PROTO
/*
** rendering functions
*/
#ifndef GLIDE3_ALPHA
FX_ENTRY void FX_CALL
guAADrawTriangleWithClip( const GrVertex *a, const GrVertex
*b, const GrVertex *c);
FX_ENTRY void FX_CALL
guDrawTriangleWithClip(
const GrVertex *a,
const GrVertex *b,
const GrVertex *c
);
FX_ENTRY void FX_CALL
guDrawPolygonVertexListWithClip( int nverts, const GrVertex vlist[] );
/*
** hi-level rendering utility functions
*/
FX_ENTRY void FX_CALL
guAlphaSource( GrAlphaSource_t mode );
FX_ENTRY void FX_CALL
guColorCombineFunction( GrColorCombineFnc_t fnc );
FX_ENTRY int FX_CALL
guEncodeRLE16( void *dst,
void *src,
FxU32 width,
FxU32 height );
FX_ENTRY FxU16 * FX_CALL
guTexCreateColorMipMap( void );
#endif /* !GLIDE3_ALPHA */
#ifdef GLIDE3
FX_ENTRY void FX_CALL
guGammaCorrectionRGB( FxFloat red, FxFloat green, FxFloat blue );
#endif
/*
** fog stuff
*/
FX_ENTRY float FX_CALL
guFogTableIndexToW( int i );
FX_ENTRY void FX_CALL
guFogGenerateExp( GrFog_t fogtable[], float density );
FX_ENTRY void FX_CALL
guFogGenerateExp2( GrFog_t fogtable[], float density );
FX_ENTRY void FX_CALL
guFogGenerateLinear(GrFog_t fogtable[],
float nearZ, float farZ );
/*
** endian stuff
*/
#ifndef GLIDE3_ALPHA
FX_ENTRY FxU32 FX_CALL
guEndianSwapWords( FxU32 value );
FX_ENTRY FxU16 FX_CALL
guEndianSwapBytes( FxU16 value );
#endif /* !GLIDE3_ALPHA */
/*
** hi-level texture manipulation tools.
*/
FX_ENTRY FxBool FX_CALL
gu3dfGetInfo( const char *filename, Gu3dfInfo *info );
FX_ENTRY FxBool FX_CALL
gu3dfLoad( const char *filename, Gu3dfInfo *data );
#endif /* FX_GLIDE_NO_FUNC_PROTO */
#ifdef __cplusplus
}
#endif
#endif /* __GLIDEUTL_H__ */

View File

@@ -1,56 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*
* 6 8/30/97 5:59p Tarolli
* cleanups
*
* 5 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 4 5/21/97 6:05a Peter
*
* 3 3/09/97 10:31a Dow
* Added GR_DIENTRY for di glide functions
**
*/
#include <string.h>
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
GR_DIENTRY(guMovieStart, void, ( void ))
{
GrErrorCallback( "guMovieStart: unsupported", FXFALSE );
}
GR_DIENTRY(guMovieStop, void, ( void ))
{
GrErrorCallback( "guMovieStop: unsupported", FXFALSE );
}
GR_DIENTRY(guMovieSetName, void, ( const char *name ))
{
GrErrorCallback( "guMovieSetName: unsupported", FXFALSE );
}

View File

@@ -1,832 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.1.1.1.2.7 2005/04/25 23:58:41 koolsmoky
** Fix _texDownloadProcs comma separator.
** Thanks to Ozkan Sezer <sezeroz@gmail.com>.
**
** Revision 1.1.1.1.2.6 2005/01/22 14:52:02 koolsmoky
** enabled packed argb for cmd packet type 3
**
** Revision 1.1.1.1.2.5 2005/01/13 16:09:05 koolsmoky
** Restict calls to pciOpen() pciClose() when compiled with DIRECTX option. this fixes problems with the win32 miniport opened in exclusive mode.
**
** Revision 1.1.1.1.2.4 2005/01/02 04:15:53 koolsmoky
** disabled mtrr's on sli slave devices
**
** Revision 1.1.1.1.2.3 2004/12/27 20:46:37 koolsmoky
** added dll entry point to call grGlideShutdown when a process is detached
**
** Revision 1.1.1.1.2.2 2004/12/23 20:45:56 koolsmoky
** converted to nasm syntax
** added x86 asm, 3dnow! triangle and mmx, 3dnow! texture download optimizations
**
** Revision 1.1.1.1.2.1 2004/12/12 15:27:47 koolsmoky
** changes to support new cpuid
** set default to disable alpha dither subtraction
**
** Revision 1.1.1.1 1999/12/07 21:49:10 joseph
** Initial checkin into SourceForge.
**
**
** 110 6/30/98 6:08p Jeske
** fixed bug where we tried to setup MTRRs on old (<p6) systems which
** didn't have them.
**
** 109 5/21/98 5:52p Peter
** mismatched pairs
**
** 108 5/20/98 3:51p Peter
** no fifo glide
**
** 107 5/18/98 12:15p Peter
** better point code
**
** 106 4/21/98 5:53p Peter
** slidetect vs hw pointers
**
** 105 4/08/98 3:52p Peter
** point coordinate truncation
**
** 104 4/06/98 9:55a Peter
** sli slave detection for oem dll
**
** 103 3/17/98 6:50p Peter
** sli paired vs active
**
** 102 3/17/98 3:00p Peter
** removed unused stats
**
** 101 3/13/98 5:08p Peter
** doh, got it backwards
**
** 100 3/13/98 3:39p Peter
** voodoo1.5 silliness
**
** 99 2/20/98 9:05a Peter
** removed remnants of comdex grot
**
** 98 2/11/98 5:25p Peter
** detection dialog fixes
**
** 97 1/30/98 4:51p Peter
** fixed sli-detect for multiple pairs
**
** 96 1/30/98 4:27p Peter
** no uswc for sli slave
**
** 95 1/24/98 12:29p Peter
** more caching fun
**
** 94 1/20/98 11:03a Peter
** env var to force triple buffering
*
* 93 1/16/98 5:41p Peter
* fixed sense of lod_dither
*
* 92 1/14/98 10:22a Peter
* no more hacks
*
* 91 1/08/98 7:09p Peter
* real hw stuff modulo makefile change
*
* 90 1/07/98 11:18a Atai
* remove GrMipMapInfo and GrGC.mm_table in glide3
*
* 89 1/07/98 10:22a Peter
* lod dithering env var
*
* 88 12/17/97 10:08a Peter
* fast system comdex twiddling
*
* 87 12/09/97 4:20p Peter
* 0x100 fbiRev ofset for v2
*
* 86 12/09/97 12:20p Peter
* mac glide port
*
* 85 12/05/97 4:26p Peter
* watcom warnings
*
* 84 12/03/97 2:36p Peter
* upped comdex reset defaults
*
* 83 12/02/97 9:48a Dow
* Removed some spurious code I inadvertantly added.
*
* 82 11/21/97 6:24p Dow
* Banshee Lying about being Rush stuf
*
* 81 11/21/97 11:19a Dow
* Made Banshee report Voodoo2
*
* 80 11/20/97 6:39p Peter
* fixed direct_exec w/ csim
*
* 79 11/19/97 2:49p Peter
* env vars in registry for win32
*
* 78 11/17/97 4:55p Peter
* watcom warnings/chipfield stuff
*
* 77 11/15/97 7:43p Peter
* more comdex silliness
*
* 76 11/14/97 11:10p Peter
* open vs hw init confusion
*
* 75 11/14/97 5:02p Peter
* more comdex stuff
*
* 74 11/14/97 12:09a Peter
* comdex thing and some other stuff
*
* 73 11/12/97 9:54p Peter
* fixed all the muckage from new config
*
* 72 11/12/97 9:37p Dow
* Textures on Banshee half work
*
* 71 11/12/97 9:22a Dow
* h3 mods
*
* 70 11/08/97 3:34p Peter
* fixed stupid gdbg_info crasher
*
* 69 11/04/97 4:00p Dow
* Banshee Mods
*
* 68 11/03/97 3:43p Peter
* h3/cvg cataclysm
*
* 67 11/01/97 12:11p Pgj
* glide.dll ---> glide2x.dll
*
* 66 10/31/97 8:53a Peter
* last lying change, really
*
* 65 10/30/97 3:42p Peter
* protected the last bit of nonsense
*
* 64 10/30/97 3:37p Peter
* spoof sst1
*
* 63 10/29/97 2:45p Peter
* C version of Taco's packing code
*
* 62 10/23/97 5:28p Peter
* sli fifo thing
*
* 61 9/15/97 7:31p Peter
* more cmdfifo cleanup, fixed normal buffer clear, banner in the right
* place, lfb's are on, Hmmmm.. probably more
*
* 60 9/10/97 10:13p Peter
* fifo logic from GaryT, non-normalized fp first cut
*
* 59 9/05/97 5:29p Peter
* changes for direct hw
*
* 58 9/01/97 3:18p Peter
* correct integer rounding for pts
*
* 57 8/30/97 5:59p Tarolli
* init and hal fixups
*
* 56 8/30/97 1:19p Peter
* first cut at using blit to clear, more to come to do inner rects
*
* 55 8/18/97 3:52p Peter
* pre-hw arrival fixes/cleanup
*
* 54 7/30/97 2:42p Peter
* shared and sanitized
*
* 53 7/28/97 2:41p Peter
* turned sli code back on for cvg, but waiting for hal
*
* 52 7/25/97 11:40a Peter
* removed dHalf, change field name to match real use for cvg
*
* 51 7/08/97 2:47p Peter
* fixed merge stupidity from last checkin
*
* 50 7/02/97 12:28p Peter
* removed spurious NOP, tex dl
*
* 49 6/24/97 4:02p Peter
* proper cmd fifo placement
*
* 48 6/23/97 4:46p Peter
* fixed my ,uckage
* 47 6/23/97 4:43p Peter
* cleaned up #defines etc for a nicer tree
**
*/
#include <stdio.h>
#include <string.h>
#include <3dfx.h>
#include <glidesys.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
#if GLIDE_DISPATCH_SETUP
/* Collection of all of the known procs for a given system */
#if GLIDE_PACKED_RGB
static GrTriSetupProc _triSetupProcs[][3][2] =
#else /* !GLIDE_PACKED_RGB */
static GrTriSetupProc _triSetupProcs[][1][2] =
#endif /* !GLIDE_PACKED_RGB */
{
/* Default Procs */
{
{_trisetup, _trisetup_cull}
#if GLIDE_PACKED_RGB
,{_trisetup_rgb, _trisetup_cull_rgb},
{_trisetup_argb, _trisetup_cull_argb}
#endif /* GLIDE_PACKED_RGB */
},
#if GL_AMD3D
/* 3DNow!(tm) Procs */
{
{_trisetup_3DNow, _trisetup_cull_3DNow}
#if GLIDE_PACKED_RGB
,{_trisetup_rgb_3DNow, _trisetup_cull_rgb_3DNow},
{_trisetup_argb_3DNow, _trisetup_cull_argb_3DNow}
#endif /* GLIDE_PACKED_RGB */
},
#endif /* GL_AMD3D */
};
#endif /* GLIDE_DISPATCH_SETUP */
#if GLIDE_DISPATCH_DOWNLOAD
static GrTexDownloadProc _texDownloadProcs[][2][4] =
{
/* Default Procs */
{
{
_grTexDownload_Default_8_1,
_grTexDownload_Default_8_2,
_grTexDownload_Default_8_4,
_grTexDownload_Default_8_WideS
},
{
_grTexDownload_Default_16_1,
_grTexDownload_Default_16_2,
_grTexDownload_Default_16_WideS,
_grTexDownload_Default_16_WideS
}
},
#if GL_AMD3D
{
{
_grTexDownload_Default_8_1,
_grTexDownload_Default_8_2,
_grTexDownload_Default_8_4,
_grTexDownload_3DNow_MMX,
},
{
_grTexDownload_Default_16_1,
_grTexDownload_Default_16_2,
_grTexDownload_3DNow_MMX,
_grTexDownload_3DNow_MMX,
}
},
#endif /* GL_AMD3D */
#if GL_MMX
{
{
_grTexDownload_Default_8_1,
_grTexDownload_Default_8_2,
_grTexDownload_Default_8_4,
_grTexDownload_MMX,
},
{
_grTexDownload_Default_16_1,
_grTexDownload_Default_16_2,
_grTexDownload_MMX,
_grTexDownload_MMX,
}
},
#endif /* GL_MMX */
};
#endif /* GLIDE_DISPATCH_DOWNLOAD */
#if (GLIDE_PLATFORM & GLIDE_OS_WIN32)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
BOOL WINAPI
DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
switch( ul_reason_for_call ) {
case DLL_PROCESS_DETACH:
GDBG_INFO(80, "DllMain: DLL_PROCESS_DETACH\n");
grGlideShutdown();
pciClose();
break;
case DLL_PROCESS_ATTACH:
if (!pciOpen()) {
GDBG_INFO(80, "pci bus could not be opened\n");
return FALSE;
}
GDBG_INFO(80, "DllMain: DLL_PROCESS_ATTACH\n");
break;
case DLL_THREAD_ATTACH:
GDBG_INFO(80, "DllMain: DLL_THREAD_ATTACH\n");
break;
case DLL_THREAD_DETACH:
GDBG_INFO(80, "DllMain: DLL_THREAD_DETACH\n");
break;
default:
GDBG_INFO(80, "DllMain: Unhandled message.\n");
break;
}
return TRUE;
} /* DllMain */
#endif
/*-------------------------------------------------------------------
Function: _grSstDetectResources
Date: --
Implementor(s): Dow, Gmt, Jdt
Library: Glide
Description:
Discover devices on the PCI bus.
Discover configuration of detected devices.
Initialize all Glide GC's
Recognized devices depend upon compile time flags
This code should NOT initialize the hardware
any more than is necessary for discovery of
configuration
Arguments: none
Return:
FXTRUE - at least one device was detected
FXFALSE - no devices were detected.
-------------------------------------------------------------------*/
FxBool
_grSstDetectResources(void)
{
static FxBool calledP = FXFALSE;
FxBool rv = FXFALSE;
FxU32 ctx, device;
GDBG_INFO(280, "_grSstDetectResources()\n");
#if (GLIDE_PLATFORM & GLIDE_HW_CVG)
{
#if GLIDE_INIT_HAL
HalInfo* halInfo = fxHalInit(0);
if (halInfo == NULL) goto __errExit;
#else /* !GLIDE_INIT_HAL */
FxDeviceInfo dummyDevInfo;
#endif /* !GLIDE_INIT_HAL */
/* The first time through the init code we need to map
* all of the boards. Future calls can just grab this
* info out of the halInfo that we have here.
*/
if (!calledP) {
FxU32 count = HAL_MAX_BOARDS;
FxBool inSliPairP = FXFALSE;
GrHwConfiguration* hwConfig = &_GlideRoot.hwConfig;
/* NB: The hw will initially return fbiRevision == 2, but
* the init code does some more dorking w/ stuff and detects
* if it is really a CVG and sets it to 4.
*/
const FxU32 hwRevNum = ((GETENV("FX_GLIDE_HW_REV") == NULL)
? 4
: atol(GETENV("FX_GLIDE_HW_REV")));
for(ctx = device = 0; device < count; device++) {
const FxDeviceInfo* curDev = NULL;
FxBool regInitP = FXFALSE;
SstRegs* devRegs;
#if GLIDE_INIT_HAL
devRegs = fxHalMapBoard(device);
curDev = halInfo->boardInfo + device;
#else /* !GLIDE_INIT_HAL */
devRegs = (SstRegs*)sst1InitMapBoard(device);
if (devRegs != NULL) {
if (sst1InitGetDeviceInfo((FxU32*)devRegs, &dummyDevInfo)) {
dummyDevInfo.virtAddr[0] = devRegs;
curDev = &dummyDevInfo;
}
}
#endif /* !GLIDE_INIT_HAL */
if ((devRegs != NULL) &&
(curDev != NULL) &&
(curDev->fbiRevision >= hwRevNum)) {
const FxU32 curSstNum = hwConfig->num_sst;
FxU32 i;
#if (GLIDE_PLATFORM & GLIDE_HW_CVG)
/* Internally we always keep the real type. */
hwConfig->SSTs[ctx].type = GR_SSTTYPE_Voodoo2;
#else
#error "What do you think you're doing?"
#endif
#if GLIDE_INIT_HAL
if (!fxHalInitRegisters(curDev->virtAddr[0])) goto __errRegFailure;
#else /* !GLIDE_INIT_HAL */
/* dpc - 23 jan 1998 - FixMe!
* We set up the caching characteristics here so that we
* mimic the actions of the nt driver, where everything is
* happy, in win95. However, if this is the slave of an sli
* pair then we don't want to waste mtrr's that we're never
* really going to write to.
*/
if (!inSliPairP/* && (_GlideRoot.CPUType.family >= 6)*/) {
sst1InitCaching((FxU32*)devRegs, FXTRUE);
}
if (!sst1InitRegisters((FxU32*)devRegs) ||
!sst1InitGetDeviceInfo((FxU32*)devRegs, &dummyDevInfo)) goto __errRegFailure;
curDev = &dummyDevInfo;
#endif /* !GLIDE_INIT_HAL */
/* Set up pointers to the various address spaces within the hw */
_GlideRoot.GCs[ctx].base_ptr = (FxU32*)HW_BASE_PTR(devRegs);
_GlideRoot.GCs[ctx].reg_ptr = (FxU32*)HW_REG_PTR(devRegs);
_GlideRoot.GCs[ctx].lfb_ptr = (FxU32*)HW_LFB_PTR(devRegs);
_GlideRoot.GCs[ctx].tex_ptr = (FxU32*)HW_TEX_PTR(devRegs);
/* Video parameters */
_GlideRoot.GCs[ctx].grSstRez = GR_RESOLUTION_NONE;
_GlideRoot.GCs[ctx].grSstRefresh = curDev->fbiVideoRefresh;
/* Chip configuration */
_GlideRoot.GCs[ctx].num_tmu = curDev->numberTmus;
_GlideRoot.GCs[ctx].fbuf_size = hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.fbRam;
/* Independet board or physical sli master */
if (!inSliPairP) {
_GlideRoot.gcMap[curSstNum] = _GlideRoot.gcNum;
/* Voodoo^2 glide2x returns that it is an sst1, but the
* revision is bumped so that developers can really tell.
* Additionally, we now have the fun on Voodoo^1.5 which is
* just a Voodoo^2 in a 2200 configuration.
*/
hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.fbiRev = (curDev->fbiRevision +
((curDev->numberTmus == 1)
? 0x080
: 0x100));
hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.fbRam = curDev->fbiMemSize;
hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.nTexelfx = curDev->numberTmus;
hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.sliDetect = curDev->sliDetected;
for(i = 0; i < curDev->numberTmus; i++) {
const FxU32 curTmuMemSize = curDev->tmuMemSize[i];
hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.tmuConfig[i].tmuRev = curDev->tmuRevision;
hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.tmuConfig[i].tmuRam = curTmuMemSize;
}
hwConfig->num_sst++;
}
/* Clear the tmu state */
for(i = 0; i < curDev->numberTmus; i++) {
const FxU32 curTmuMemSize = curDev->tmuMemSize[i];
memset(&_GlideRoot.GCs[ctx].tmu_state[i], 0, sizeof(_GlideRoot.GCs[ctx].tmu_state[i]));
_GlideRoot.GCs[ctx].tmu_state[i].total_mem = (curTmuMemSize << 20);
_GlideRoot.GCs[ctx].tmu_state[i].ncc_mmids[0] =
_GlideRoot.GCs[ctx].tmu_state[i].ncc_mmids[1] = GR_NULL_MIPMAP_HANDLE;
}
/* sst1GetDeviceInfo will not return any pairing information
* until after the boards are paired w/ sst1InitSli which we
* have not yet done. Currently we assume that the next
* discovered board will be the slave.
*/
_GlideRoot.GCs[ctx].scanline_interleaved = curDev->sliDetected;
_GlideRoot.GCs[ctx].sliPairP = curDev->sliPaired;
_GlideRoot.GCs[ctx].slave_ptr = NULL;
/* Are we currenly mapping a physcial sli-slave? */
if (curDev->sliDetected && inSliPairP) {
_GlideRoot.GCs[ctx - 1].slave_ptr = _GlideRoot.GCs[ctx].base_ptr;
/* Report the minimum of the two boards' memory if they
* are different. The hw does not care becuase it is just
* not going to access the memory.
*/
{
const FxU32 curSstNum = hwConfig->num_sst - 1;
GrTMUConfig_t* tmuConfig = hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.tmuConfig;
/* Fbi memory */
if ((FxU32)hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.fbRam != curDev->fbiMemSize) {
hwConfig->SSTs[curSstNum].sstBoard.Voodoo2Config.fbRam = curDev->fbiMemSize;
}
/* Tmu memory */
for(i = 0; i < curDev->numberTmus; i++) {
if ((FxU32)tmuConfig[i].tmuRam != curDev->tmuMemSize[i]) {
tmuConfig[i].tmuRam = MIN((FxU32)tmuConfig[i].tmuRam, curDev->tmuMemSize[i]);
}
}
}
}
/* On an sli system the boards cannot be addressed
* separately so pairing and detection are different things,
* and we need to keep track of these paired boards as an
* atomic unit.
*/
inSliPairP = (curDev->sliPaired ? !inSliPairP : FXFALSE);
/* This device is ready to go. */
regInitP = FXTRUE;
_GlideRoot.gcNum++;
_GlideRoot.GCs[ctx].hwInitP = FXTRUE;
rv = FXTRUE;
ctx++;
__errRegFailure:
/* For some reason we failed to init the board that we just mapped. */
if (!regInitP && (devRegs != NULL)) {
#if GLIDE_INIT_HAL
fxHalShutdown(devRegs);
#else /* !GLIDE_INIT_HAL */
/*if (_GlideRoot.CPUType.family >= 6) {*/
sst1InitCaching((FxU32*)devRegs, FXFALSE);
/*}*/
pciUnmapPhysical((FxU32)devRegs, 0x1000000UL);
#endif /* !GLIDE_INIT_HAL */
}
}
}
/* Done setting up. Don't do the silly mapping thing again. */
calledP = FXTRUE;
} else {
/* Did we previously find boards? */
rv = (_GlideRoot.hwConfig.num_sst != 0);
}
goto __errExit; /* Keep warnings happy */
__errExit:
;
}
#else
# error "Write code for this chip"
#endif
return rv;
} /* _grSstDetectResources */
static void
displayBoardInfo(int i, GrHwConfiguration *hwc)
{
if ((hwc->SSTs[i].type == GR_SSTTYPE_VOODOO) ||
(hwc->SSTs[i].type == GR_SSTTYPE_Voodoo2)) {
int tmuNum;
GDBG_INFO(80,"SST board %d: 3Dfx Voodoo%s\n",
i, ((hwc->SSTs[i].type == GR_SSTTYPE_VOODOO) ? " Graphics" : "^2"));
if (hwc->SSTs[i].sstBoard.VoodooConfig.sliDetect) {
GDBG_INFO(80,"\tScanline Interleaved\n");
}
GDBG_INFO(80,"\tPixelfx rev 0x%lX with %d MB Frame Buffer\n",
hwc->SSTs[i].sstBoard.VoodooConfig.fbiRev,
hwc->SSTs[i].sstBoard.VoodooConfig.fbRam);
GDBG_INFO(80,"\t%d Texelfx chips:\n",
hwc->SSTs[i].sstBoard.VoodooConfig.nTexelfx);
for (tmuNum = 0;
tmuNum < hwc->SSTs[i].sstBoard.VoodooConfig.nTexelfx;
tmuNum++) {
GDBG_INFO(80,"\t\tTexelfx %d: Rev 0x%lX, %d MB Texture\n", tmuNum,
hwc->SSTs[i].sstBoard.VoodooConfig.tmuConfig[tmuNum].tmuRev,
hwc->SSTs[i].sstBoard.VoodooConfig.tmuConfig[tmuNum].tmuRam);
}
} else if (hwc->SSTs[i].type == GR_SSTTYPE_SST96) {
GDBG_INFO(80,"SST board %d: 3Dfx Voodoo Rush\n", i);
GDBG_INFO(80,"\tFBI Jr. with %d MB Frame Buffer\n",
hwc->SSTs[i].sstBoard.SST96Config.fbRam);
GDBG_INFO(80,"\tTexelfx chips: 1\n");
} else {
GDBG_INFO(80,"error: SSTs %d: unknown type\n",i);
}
} /* displayBoardInfo */
#if defined(FX_DLL_ENABLE) && (GLIDE_PLATFORM & GLIDE_OS_WIN32)
#include <windows.h>
#endif
void
_GlideInitEnvironment(void)
{
#define FN_NAME "_GlideInitEnvironment"
int i;
if (_GlideRoot.initialized) /* only execute once */
return;
GDBG_INIT(); /* init the GDEBUG libraray */
GDBG_INFO(80,"%s()\n", FN_NAME);
#ifdef __WIN32__
grErrorSetCallback(_grErrorWindowsCallback);
#else
grErrorSetCallback(_grErrorDefaultCallback);
#endif /* __WIN32__ */
#ifdef GLIDE_DEBUG
GDBG_INFO(0,"GLIDE DEBUG LIBRARY\n"); /* unconditional display */
#endif
#if defined(FX_DLL_ENABLE) && (GLIDE_PLATFORM & GLIDE_OS_WIN32)
{ /* GMT: display the DLL pathname for sanity checking */
char buf[132];
if (GetModuleFileName(GetModuleHandle("glide2x.dll"), buf, sizeof(buf))) {
#ifdef GLIDE_DEBUG
GDBG_INFO(0,"DLL path: %s\n",buf); /* unconditional display */
#else
GDBG_INFO(80,"DLL path: %s\n",buf);
#endif
} /* silent failure */
}
#endif
/* Get CPU Info */
_cpuid(&_GlideRoot.CPUType);
/* Check for vendor specific optimization cases */
GDBG_INFO( 0," CPU Vendor: %s\n", _GlideRoot.CPUType.v_name);
GDBG_INFO(80," MMX Support: %c\n", _GlideRoot.CPUType.os_support&_CPU_FEATURE_MMX ? 'Y' : 'N');
GDBG_INFO(80," SSE Support: %c\n", _GlideRoot.CPUType.os_support&_CPU_FEATURE_SSE ? 'Y' : 'N');
GDBG_INFO(80," SSE2 Support: %c\n", _GlideRoot.CPUType.os_support&_CPU_FEATURE_SSE2 ? 'Y' : 'N');
GDBG_INFO(80," 3DNow Support: %c\n", _GlideRoot.CPUType.os_support&_CPU_FEATURE_3DNOW ? 'Y' : 'N');
GDBG_INFO(80," MMX+ Support: %c\n", _GlideRoot.CPUType.os_support&_CPU_FEATURE_MMXPLUS ? 'Y' : 'N');
GDBG_INFO(80,"3DNow+ Support: %c\n", _GlideRoot.CPUType.os_support&_CPU_FEATURE_3DNOWPLUS ? 'Y' : 'N');
/* No CPU Extensions Allowed */
if (GETENV("FX_GLIDE_NO_CPU_EXTENSIONS"))
{
_GlideRoot.CPUType.feature = _GlideRoot.CPUType.os_support = 0;
GDBG_INFO(0,"CPU Extensions disabled\n");
}
#if GLIDE_DISPATCH_SETUP || GLIDE_DISPATCH_DOWNLOAD
/* Default case */
#if GLIDE_DISPATCH_SETUP
_GlideRoot.deviceArchProcs.curTriProcs = _triSetupProcs + 0;
#endif /* GLIDE_DISPATCH_SETUP */
#if GLIDE_DISPATCH_DOWNLOAD
_GlideRoot.deviceArchProcs.curTexProcs = _texDownloadProcs + 0;
#endif /* GLIDE_DISPATCH_DOWNLOAD */
/* Check for vendor specific optimization cases */
#ifdef GL_MMX
if (_GlideRoot.CPUType.os_support & _CPU_FEATURE_MMX) {
#if GLIDE_DISPATCH_DOWNLOAD
_GlideRoot.deviceArchProcs.curTexProcs = _texDownloadProcs + 2;
#endif /* GLIDE_DISPATCH_DOWNLOAD */
}
#endif /* GL_MMX */
#ifdef GL_AMD3D
if (_GlideRoot.CPUType.os_support & _CPU_FEATURE_3DNOW) {
#if GLIDE_DISPATCH_SETUP
_GlideRoot.deviceArchProcs.curTriProcs = _triSetupProcs + 1;
#endif /* GLIDE_DISPATCH_SETUP */
#if GLIDE_DISPATCH_DOWNLOAD
_GlideRoot.deviceArchProcs.curTexProcs = _texDownloadProcs + 1;
#endif /* GLIDE_DISPATCH_DOWNLOAD */
}
#endif /* GL_AMD3D */
#endif /* GLIDE_DISPATCH_SETUP || GLIDE_DISPATCH_DOWNLOAD */
/* Check for user environment tweaks */
{
const char* envStr;
#define GLIDE_GETENV(__envVar, __defVal) \
(((envStr = GETENV(__envVar)) == NULL) ? (__defVal) : atol(envStr))
_GlideRoot.environment.triBoundsCheck = (GETENV("FX_GLIDE_BOUNDS_CHECK") != NULL);
_GlideRoot.environment.noSplash = (GETENV("FX_GLIDE_NO_SPLASH") != NULL);
_GlideRoot.environment.shamelessPlug = (GETENV("FX_GLIDE_SHAMELESS_PLUG") != NULL);
_GlideRoot.environment.ignoreReopen = (GETENV("FX_GLIDE_IGNORE_REOPEN") != NULL);
_GlideRoot.environment.texLodDither = ((GETENV("FX_GLIDE_LOD_DITHER") == NULL)
? 0x00UL
: SST_TLODDITHER);
_GlideRoot.environment.nColorBuffer = GLIDE_GETENV("FX_GLIDE_ALLOC_COLOR", -1L);
_GlideRoot.environment.nAuxBuffer = GLIDE_GETENV("FX_GLIDE_ALLOC_AUX", -1L);
_GlideRoot.environment.swFifoLWM = GLIDE_GETENV("FX_GLIDE_LWM", -1L);
_GlideRoot.environment.swapInterval = GLIDE_GETENV("FX_GLIDE_SWAPINTERVAL", -1L);
if ((envStr != NULL) && (_GlideRoot.environment.swapInterval < 0)) {
_GlideRoot.environment.swapInterval = 0;
}
_GlideRoot.environment.snapshot = GLIDE_GETENV("FX_SNAPSHOT", 0);
/* set default to disable alpha dither subtraction */
switch(GLIDE_GETENV("SSTH3_ALPHADITHERMODE", 1L)) {
default:
case 1: /* Or Automatic? */
case 2:
_GlideRoot.environment.disableDitherSub = FXTRUE;
break;
case 3:
_GlideRoot.environment.disableDitherSub = FXFALSE;
break;
}
GDBG_INFO(80," disableDitherSub: %d\n",_GlideRoot.environment.disableDitherSub);
GDBG_INFO(80," triBoundsCheck: %d\n",_GlideRoot.environment.triBoundsCheck);
GDBG_INFO(80," swapInterval: %d\n",_GlideRoot.environment.swapInterval);
GDBG_INFO(80," noSplash: %d\n",_GlideRoot.environment.noSplash);
GDBG_INFO(80," shamelessPlug: %d\n",_GlideRoot.environment.shamelessPlug);
/*GDBG_INFO(80," cpu: %d\n",_GlideRoot.CPUType);*/
GDBG_INFO(80," snapshot: %d\n",_GlideRoot.environment.snapshot);
GDBG_INFO(80," disableDitherSub: %d\n",_GlideRoot.environment.disableDitherSub);
}
/* constant pool */
_GlideRoot.pool.f0 = 0.0F;
_GlideRoot.pool.fHalf= 0.5F;
_GlideRoot.pool.f1 = 1.0F;
_GlideRoot.pool.f255 = 255.0F;
#if GLIDE_PACKED_RGB
_GlideRoot.pool.fBiasHi = (float)(0x01 << 15);
_GlideRoot.pool.fBiasLo = (float)(0x01 << 23);
#endif /* GLIDE_PACKED_RGB */
_GlideRoot.current_sst = 0; /* make sure there's a valid GC */
_GlideRoot.curGC = &_GlideRoot.GCs[0]; /* just for 'booting' the library */
{
const FxBool hwDetectP = _grSstDetectResources();
if (!hwDetectP) {
char s[128];
const char* errStr = s;
if (pciGetErrorCode() == PCI_ERR_NOERR) {
#ifndef __linux__
sprintf(s, "%s: glide2x.dll expected %s, none detected\n",
FN_NAME, GLIDE_DRIVER_NAME);
#else
sprintf(s, "%s: libglide2x.so expected %s, none detected\n",
FN_NAME, GLIDE_DRIVER_NAME);
#endif
} else {
errStr = pciGetErrorString();
}
GrErrorCallback(errStr, FXTRUE);
}
/* GMT: this isn't really necessary since GlideRoot is static */
for (i = 0; i < _GlideRoot.hwConfig.num_sst; i++) {
_GlideRoot.GCs[i].mm_table.free_mmid = 0;
displayBoardInfo(i, &_GlideRoot.hwConfig);
}
_grMipMapInit();
_GlideRoot.initialized = hwDetectP; /* save this for the end */
}
} /* _GlideInitEnvironment */

View File

@@ -1,958 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.1.1.1 1999/12/07 21:49:11 joseph
** Initial checkin into SourceForge.
**
**
** 26 2/20/98 11:00a Peter
** removed glide3 from glid2 tree
**
** 25 2/17/98 3:21p Peter
** no splash w/o deepth buffer
**
** 24 1/28/98 1:12p Peter
** Stupid swap state form gratuitous splash screen
*
* 23 1/09/98 6:48p Atai
* grTexInfo, GR_LOD_* and GR_ASPECT_*
*
* 21 1/06/98 6:47p Atai
* undo grSplash and remove gu routines
*
* 20 12/18/97 2:13p Peter
* fogTable cataclysm
*
* 19 12/15/97 5:52p Atai
* disable obsolete glide2 api for glide3
*
* 18 12/09/97 10:20a Peter
* removed extraneous cruft
*
* 17 11/14/97 5:03p Peter
* picking up the torch... removed #!@#$% c++ comments
*
* 16 10/23/97 5:30p Peter
* packed rgb happiness
*
* 15 7/31/97 11:14a Peter
* merge w/ sst1 glide tree, hopefully
*
* 13 7/07/97 3:05p Dow
* Moved fouled clears
*
* 12 3/18/97 9:07p Dow
* Got rid of #$#%#$ // comments
*
* 11 3/16/97 12:42a Jdt
* Removed watcom warning
*
* 10 3/13/97 10:53p Jdt
* Rewrote with simple optimizations. Changed prototype for
* multi-resolution, and running as a better shameless plug.
*
* 9 3/13/97 2:52a Jdt
* Added arguments to splash.
*
* 8 3/09/97 10:31a Dow
* Added GR_DIENTRY for di glide functions
*
* 7 3/01/97 6:24p Jdt
* Made splash force yorigin.
*
* 6 1/02/97 1:06p Dow
* Fixed state bug
*
* 3 11/17/96 11:16p Garymct
* Updated grSplash code to set all of the necessary state itself rather
* than expecting the caller to do so.
*/
#include <math.h>
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
#include "fxinline.h"
/*-----------------------------
Constants
-----------------------------*/
#define MAX_NUM_VERTS 2556
#define FADEIN_END_PERCENT (0.3f)
#define FADEOUT_BEGIN_PERCENT (0.8f)
#define SPIN_FRAMES 25
#define SPIN_START 26
#define NO_TABLE ((GrTexTable_t)(~0))
/*-----------------------------
Macros
-----------------------------*/
#define SNAP_BIAS ((float)(3<<18))
#define SNAP_COORD(X) ((X)+SNAP_BIAS)
/*-----------------------------
Types
-----------------------------*/
typedef struct {
float x, y, z; /* object space coordinates */
float nx, ny, nz; /* object space vertex normal for lighting */
float s, t; /* pre-glide-ified texture coordinates */
} Vert;
typedef struct {
int v[3]; /* vertex indices into array of vertes for face */
int mat_index; /* material index */
int aa_edge_flags;
} Face;
typedef float Vector[3];
typedef float Matrix[16];
typedef FxU32 Palette[256];
typedef struct {
FxU8 yRGB[16];
FxI16 iRGB[4][3];
FxI16 qRGB[4][3];
FxU32 packed_data[12];
} NCCTable;
typedef union {
Palette palette;
NCCTable nccTable;
} TextureTable;
/*-----------------------------
Globals
-----------------------------*/
/* xScale, xOffset, yScale, yOffset */
static float viewPort[4] = {
480.0f, 320.0f,
480.0f, 240.0f
};
typedef struct {
GrTexInfo info;
FxU32 addr;
GrTexTable_t tableType;
TextureTable tableData;
} Texture;
static int do_phong = 0;
static int pass;
static int fog;
static int useTextures;
static Vector light = { -0.57735f, -0.57735f, -0.57735f };
static Vector transformed_verts[MAX_NUM_VERTS];
static Vector transformed_norms[MAX_NUM_VERTS];
#include "splshdat.c"
static Texture textImage;
static Texture hiliteImage;
static Texture shadowImage;
static FxU32 nextFreeBase;
/*-----------------------------
Privates
-----------------------------*/
static void
sourceTexture(Texture *texture)
{
static Texture *lastTexture;
if (texture != lastTexture && useTextures) {
grTexSource(GR_TMU0,
texture->addr,
GR_MIPMAPLEVELMASK_BOTH,
&texture->info);
if (texture->tableType != NO_TABLE) {
grTexDownloadTable(GR_TMU0,
texture->tableType,
&texture->tableData);
}
lastTexture = texture;
}
}
static GrTexTable_t
texTableType(GrTextureFormat_t format)
{
GrTexTable_t rv = (GrTexTable_t)NO_TABLE;
switch(format) {
case GR_TEXFMT_YIQ_422:
case GR_TEXFMT_AYIQ_8422:
rv = GR_TEXTABLE_NCC0;
break;
case GR_TEXFMT_P_8:
case GR_TEXFMT_AP_88:
rv = GR_TEXTABLE_PALETTE;
break;
}
return rv;
}
static void
downloadTexture(Texture *texture, Gu3dfInfo *info)
{
texture->info.data = info->data;
texture->info.smallLod = info->header.small_lod;
texture->info.largeLod = info->header.large_lod;
texture->info.aspectRatio = info->header.aspect_ratio;
texture->info.format = info->header.format;
texture->addr = nextFreeBase;
nextFreeBase += grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH,
&texture->info);
grTexDownloadMipMap(GR_TMU0,
texture->addr,
GR_MIPMAPLEVELMASK_BOTH,
&texture->info);
texture->tableType = texTableType(info->header.format);
switch(texture->tableType) {
case GR_TEXTABLE_NCC0:
case GR_TEXTABLE_NCC1:
case GR_TEXTABLE_PALETTE:
texture->tableData = *(TextureTable*)(&info->table);
break;
default:
break;
}
}
static void
createTextures(void)
{
Gu3dfInfo *info;
/* Download the texture for the "3D" part of the model. */
info = (Gu3dfInfo*)&text_3dfinfo;
info->data = (void *)text_3dfinfo_image;
downloadTexture(&textImage, info);
/* Download the texture for the specular highlight. */
info = (Gu3dfInfo *)&hilite_3dfinfo;
info->data = (void *)hilite_3dfinfo_image;
downloadTexture(&hiliteImage, info);
/* Download the texture for the shadow. */
info = (Gu3dfInfo *)&shadow_3dfinfo;
info->data = (void *)shadow_3dfinfo_image;
downloadTexture(&shadowImage, info);
}
static void
vecMatMult(float *dstVec, float *srcVec, float *matrix)
{
dstVec[0] = (srcVec[0] * matrix[0] +
srcVec[1] * matrix[4] +
srcVec[2] * matrix[8] +
matrix[12]);
dstVec[1] = (srcVec[0] * matrix[1] +
srcVec[1] * matrix[5] +
srcVec[2] * matrix[9] +
matrix[13]);
dstVec[2] = (srcVec[0] * matrix[2] +
srcVec[1] * matrix[6] +
srcVec[2] * matrix[10] +
matrix[14]);
}
static void
normMatMult(float *dstVec, float *srcVec, float *matrix)
{
dstVec[0] = (srcVec[0] * matrix[0] +
srcVec[1] * matrix[4] +
srcVec[2] * matrix[8]);
dstVec[1] = (srcVec[0] * matrix[1] +
srcVec[1] * matrix[5] +
srcVec[2] * matrix[9]);
dstVec[2] = (srcVec[0] * matrix[2] +
srcVec[1] * matrix[6] +
srcVec[2] * matrix[10]);
}
static void
xfAndProj(int frame, int obj)
{
int vertex;
float *matrix;
matrix = &mat[frame][obj][0];
for(vertex = 0; vertex < num_verts[obj]; vertex++) {
float *srcVec;
float *dstVec;
float oow;
/* transform point */
srcVec = (float*)&(vert[obj][vertex].x);
dstVec = (float*)transformed_verts[vertex];
vecMatMult(dstVec, srcVec, matrix);
/* project point */
oow = 1.0f / dstVec[2];
dstVec[0] = dstVec[0] * oow * viewPort[0] + viewPort[1] + SNAP_BIAS;
dstVec[1] = dstVec[1] * oow * viewPort[2] + viewPort[3] + SNAP_BIAS;
/* transform normal */
srcVec = (float*)&(vert[obj][vertex].nx);
dstVec = (float*)transformed_norms[vertex];
normMatMult(dstVec, srcVec, matrix);
}
}
static void
setupMaterial(int material_index)
{
switch(material_index) {
case 0: /* 3d */
if(pass == 1) {
sourceTexture(&textImage);
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_LOCAL,
GR_COMBINE_LOCAL_ITERATED,
GR_COMBINE_OTHER_TEXTURE,
FXFALSE);
do_phong = 1;
} else if (pass == 0xbeef) {
/* Pantone 320C - 3D Green */
grConstantColorValue(0x00989100);
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_LOCAL,
GR_COMBINE_LOCAL_CONSTANT,
GR_COMBINE_OTHER_ITERATED,
FXFALSE);
} else {
sourceTexture(&hiliteImage);
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_ONE,
GR_COMBINE_LOCAL_NONE,
GR_COMBINE_OTHER_TEXTURE,
FXFALSE);
}
break;
case 1: /* fx */
if (pass == 0xbeef) {
/* Black - fx */
grConstantColorValue(0x00);
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_LOCAL,
GR_COMBINE_LOCAL_CONSTANT,
GR_COMBINE_OTHER_ITERATED,
FXFALSE);
do_phong = 1;
} else {
sourceTexture(&hiliteImage);
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_ONE,
GR_COMBINE_LOCAL_NONE,
GR_COMBINE_OTHER_TEXTURE,
FXFALSE);
do_phong = 1;
}
break;
case 2:
case 3:
case 4:
grColorCombine(GR_COMBINE_FUNCTION_LOCAL,
GR_COMBINE_FACTOR_NONE,
GR_COMBINE_LOCAL_ITERATED,
GR_COMBINE_OTHER_NONE,
FXFALSE);
do_phong = 0;
break;
}
}
static void
calculateIntensity(int material_index,
Vector intensity_factor,
int frame)
{
switch(material_index) {
case 0:
/* 3d */
intensity_factor[0] = 1.0f;
intensity_factor[1] = 1.0f;
intensity_factor[2] = 1.0f;
break;
case 1:
/* fx */
intensity_factor[0] = 0.125f;
intensity_factor[1] = 0.125f;
intensity_factor[2] = 0.125f;
break;
case 2:
/* cyan */
intensity_factor[0] = (10.0f / 255.0f);
intensity_factor[1] = (75.0f / 255.0f);
intensity_factor[2] = (120.0f / 255.0f);
break;
case 3:
/* white */
intensity_factor[0] = 1.0f;
intensity_factor[1] = 1.0f;
intensity_factor[2] = 1.0f;
break;
case 4:
/* yellow */
intensity_factor[0] = (248.0f / 255.0f);
intensity_factor[1] = (204.0f / 255.0f);
intensity_factor[2] = 0.0f;
break;
}
}
static void
drawFaces(int frame, int objnum)
{
int facenum;
int material_index;
float intensity_factor[3];
GrVertex gvert[3];
static int prev_mat_index = 0xffff;
int i;
FxBool aa_a, aa_b, aa_c;
for(facenum = 0; facenum < num_faces[objnum]; facenum++) {
material_index = face[objnum][facenum].mat_index;
if(material_index != prev_mat_index) {
setupMaterial(material_index);
calculateIntensity(material_index,
intensity_factor, frame);
prev_mat_index = material_index;
}
if((material_index != 0) && (pass == 2))
continue;
aa_a = aa_b = aa_c = FXFALSE;
if(face[objnum][facenum].aa_edge_flags & 4)
aa_a = FXTRUE;
if(face[objnum][facenum].aa_edge_flags & 2)
aa_b = FXTRUE;
if(face[objnum][facenum].aa_edge_flags & 1)
aa_c = FXTRUE;
for(i = 0; i < 3; i++) {
float *transformed_vert, *transformed_norm;
Vert *v;
int vertnum;
float factor;
vertnum = face[objnum][facenum].v[i];
transformed_vert = transformed_verts[vertnum];
transformed_norm = transformed_norms[vertnum];
v = &vert[objnum][vertnum];
gvert[i].x = transformed_vert[0];
gvert[i].y = transformed_vert[1];
gvert[i].oow = 1.0f / transformed_vert[2];
gvert[i].tmuvtx[0].oow = gvert[i].oow;
gvert[i].tmuvtx[0].sow = v->s * gvert[i].oow;
gvert[i].tmuvtx[0].tow = v->t * gvert[i].oow;
factor = ((light[0] * transformed_norm[0] +
light[1] * transformed_norm[1] +
light[2] * transformed_norm[2])+ 1.0f) * 127.5f;
gvert[i].r = factor * intensity_factor[0];
gvert[i].g = factor * intensity_factor[1];
gvert[i].b = factor * intensity_factor[2];
gvert[i].a = 255.0f;
}
if(pass == 2) {
for(i = 0; i < 3; i++) {
float *transformed_norm;
transformed_norm =
transformed_norms[face[objnum][facenum].v[i]];
gvert[i].tmuvtx[0].sow = gvert[i].oow *
(128.0f + transformed_norm[0] * 128.0f);
gvert[i].tmuvtx[0].tow = gvert[i].oow *
(128.0f + transformed_norm[1] * 128.0f);
gvert[i].r = intensity_factor[0] * 255.0f;
gvert[i].g = intensity_factor[1] * 255.0f;
gvert[i].b = intensity_factor[2] * 255.0f;
}
grDrawTriangle(&gvert[0], &gvert[1], &gvert[2]);
continue;
}
grAlphaBlendFunction(GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA,
GR_BLEND_ONE, GR_BLEND_ZERO);
/* Do this if 3D. */
if(material_index == 0) {
/*
* Draw the textured 3D without specular.
*/
sourceTexture(&textImage);
#if 0
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_LOCAL,
GR_COMBINE_LOCAL_ITERATED,
GR_COMBINE_OTHER_TEXTURE,
FXFALSE);
#endif
grAADrawTriangle(&gvert[0], &gvert[1], &gvert[2],
aa_a, aa_b, aa_c);
} else if(material_index != 1) {
/*
* Just go ahead and draw for things that don't
* have specular highlights.
*/
grAADrawTriangle(&gvert[0], &gvert[1], &gvert[2],
aa_a, aa_b, aa_c);
}
if(do_phong && (material_index != 0)) {
/*
* figure out texture coords in [0..255.0f] based on the normal
* the specular highlight.
*/
for(i = 0; i < 3; i++) {
float *transformed_norm;
transformed_norm =
transformed_norms[face[objnum][facenum].v[i]];
gvert[i].tmuvtx[0].sow = gvert[i].oow *
(128.0f + transformed_norm[0] * 128.0f);
gvert[i].tmuvtx[0].tow = gvert[i].oow *
(128.0f + transformed_norm[1] * 128.0f);
gvert[i].r = intensity_factor[0] * 255.0f;
gvert[i].g = intensity_factor[1] * 255.0f;
gvert[i].b = intensity_factor[2] * 255.0f;
}
grAADrawTriangle(&gvert[0], &gvert[1], &gvert[2],
aa_a, aa_b, aa_c);
}
}
}
static void
intersectLineWithZPlane(Vector result, Vector p1,
Vector p2, float z)
{
float t;
t = (z - p1[2]) / (p2[2] - p1[2]);
result[0] = p1[0] + (p2[0] - p1[0]) * t;
result[1] = p1[1] + (p2[1] - p1[1]) * t;
result[2] = z;
}
static float
vectorMag(float *v)
{
return (float)sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
}
static void
drawShadow(int frame, int shadow_object_index,
int receiver_object_index, Vector light_position)
{
float *shadow_object_matrix;
float *receiver_object_matrix;
Vector view_verts[4];
Vector projected_view_verts[4];
int i;
Vector local_verts[4] = {
{ -280.0f, 0.0f, -160.0f },
{ -280.0f, 0.0f, 150.0f },
{ 280.0f, 0.0f, 150.0f },
{ 280.0f, 0.0f, -160.0f }
};
float texcoords[4][2] = {
{ 10.5f, 127.5f },
{ 10.5f, 0.5f },
{ 255.0f, 0.5f },
{ 255.0f, 127.5f }
};
GrVertex gvert[4];
GrVertex projected_gvert[4];
GrVertex light_gvert;
/*
* The point relative to the back part of the shield that
* the shadow is going to be projected onto.
*/
Vector shadow_light;
shadow_light[0] = light_position[0];
shadow_light[1] = light_position[1];
shadow_light[2] = light_position[2];
shadow_object_matrix = &mat[frame][shadow_object_index][0];
receiver_object_matrix = &mat[frame][receiver_object_index][0];
/*
* Offset the light by the Z position of
* the backplane that we are projected
* onto.
*/
shadow_light[2] += receiver_object_matrix[14];
for(i = 0; i < 4; i++) {
vecMatMult(view_verts[i], local_verts[i], shadow_object_matrix);
/*
* project . . .
*/
gvert[i].oow = 1.0f / view_verts[i][2];
gvert[i].x =
view_verts[i][0] * gvert[i].oow * viewPort[0] +
viewPort[1] + SNAP_BIAS;
gvert[i].y =
view_verts[i][1] * gvert[i].oow * viewPort[2] +
viewPort[3] + SNAP_BIAS;
/*
* Set up texture coordinates.
*/
gvert[i].tmuvtx[0].sow = texcoords[i][0] * gvert[i].oow;
gvert[i].tmuvtx[0].tow = texcoords[i][1] * gvert[i].oow;
}
/*
* Intersect each line formed by the light source and a
* particular corner of the shadow object with the
* plane which the texture is to be projected onto.
*/
for(i = 0; i < 4; i++) {
Vector tmpvect;
float q;
#if GLIDE_PACKED_RGB
/* dpc - 22 oct 1997 - FixMe!
* These are left uninitialized, yet they are being sent to the
* hw, probably because some other state is not being correctly
* setup. This doesn't seem to affect the 'correctness' of the
* splash screen so I'm not investigating it any more.
*/
projected_gvert[i].r =
projected_gvert[i].g =
projected_gvert[i].b =
projected_gvert[i].a = 0.0f;
#endif /* GLIDE_PACKED_RGB */
intersectLineWithZPlane(projected_view_verts[i],
shadow_light,
view_verts[i],
receiver_object_matrix[14] - 26.0f);
projected_gvert[i].oow = 1.0f / projected_view_verts[i][2];
projected_gvert[i].x = (projected_view_verts[i][0] * projected_gvert[i].oow * viewPort[0] +
viewPort[1] + SNAP_BIAS);
projected_gvert[i].y = (projected_view_verts[i][1] * projected_gvert[i].oow * viewPort[2] +
viewPort[3] + SNAP_BIAS);
tmpvect[0] = projected_view_verts[i][0] - shadow_light[0];
tmpvect[1] = projected_view_verts[i][1] - shadow_light[1];
tmpvect[2] = projected_view_verts[i][2] - shadow_light[2];
q = vectorMag(tmpvect);
/*
* Set up texture coordinates.
*/
projected_gvert[i].tmuvtx[0].oow = projected_gvert[i].oow * q;
projected_gvert[i].tmuvtx[0].sow = texcoords[i][0] * projected_gvert[i].oow;
projected_gvert[i].tmuvtx[0].tow = texcoords[i][1] * projected_gvert[i].oow;
}
light_gvert.oow = 1.0f / shadow_light[2];
light_gvert.x = shadow_light[0] * light_gvert.oow * viewPort[0] + viewPort[1] + SNAP_BIAS;
light_gvert.y = shadow_light[1] * light_gvert.oow * viewPort[2] + viewPort[3] + SNAP_BIAS;
/*
* Draw a segment between the light and the point which hits
* the surface that the light is being projected onto.
*/
grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_ONE,
GR_COMBINE_LOCAL_NONE,
GR_COMBINE_OTHER_TEXTURE,
FXFALSE);
sourceTexture(&shadowImage);
grAlphaBlendFunction(GR_BLEND_DST_COLOR, GR_BLEND_ZERO,
GR_BLEND_ONE, GR_BLEND_ZERO);
grDrawTriangle(&projected_gvert[0],
&projected_gvert[1],
&projected_gvert[2]);
grDrawTriangle(&projected_gvert[0],
&projected_gvert[2],
&projected_gvert[3]);
grDrawTriangle(&projected_gvert[0],
&projected_gvert[2],
&projected_gvert[1]);
grDrawTriangle(&projected_gvert[0],
&projected_gvert[3],
&projected_gvert[2]);
grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO,
GR_BLEND_ONE, GR_BLEND_ZERO);
}
/*-------------------------------------------------------------------
Function: grSplash
Date: 3/13
Implementor(s): GaryMcT
Library: Glide
Description:
Render the opening splash screen animation, or render
a single frame of the splash screen.
Arguments:
x, y - upper left hand coord of window
w, h - width and height of window to render
_frame - frame number to render (~0 to render all frames)
Return:
none
-------------------------------------------------------------------*/
GR_DIENTRY(grSplash,void,(float x,float y,float w,float h,FxU32 _frame))
{
GrState oldState;
int frame;
Vector lights[] = {
{ 5.0f, 300.0f, -1500.0f },
{ 5.0f, 150.0f, -1000.0f },
{ -30.0f, 150.0f, -1000.0f },
{ -30.0f, 100.0f, -1000.0f },
{ 30.0f, 70.0f, -1000.0f },
};
GrFog_t fogTable[kInternalFogTableEntryCount];
int fadeInFrames, fadeOutFrames;
GR_BEGIN_NOFIFOCHECK("grSplash", 85);
GDBG_INFO_MORE(gc->myLevel,"(%f,%f,%f,%f,%d)\n", x, y, w, h, _frame);
/* Check Screen Dimensions and Check Avail of Depth Buffer */
if ((x > gc->state.screen_width) ||
((x+w) > gc->state.screen_width) ||
(y > gc->state.screen_height) ||
((y+h) > gc->state.screen_height))
return;
if (gc->state.screen_height == 640) {
if (gc->fbuf_size == 1) {
return;
}
} else if (gc->state.screen_width == 800) {
if ((gc->fbuf_size == 1) ||
(gc->fbuf_size == 2)) {
return;
}
}
if (gc->grAuxBuf == 0) return;
if (!(gc->state.fbi_config.fbzMode & SST_YORIGIN)) {
y = ((gc->state.screen_height - 1.0f) - (h-1.0f)) - y;
}
viewPort[0] = w * (480.0f / 640.0f);
viewPort[1] = x + (w / 2.0f);
viewPort[2] = h;
viewPort[3] = y + (h / 2.0f);
grGlideGetState(&oldState);
grSstOrigin(GR_ORIGIN_LOWER_LEFT);
if (_frame == 0) {
createTextures();
useTextures = 1;
} else {
useTextures = 0;
}
grAlphaTestFunction(GR_CMP_ALWAYS);
grChromakeyMode(GR_CHROMAKEY_DISABLE);
grConstantColorValue(0xffffffff);
grDepthBufferMode(GR_DEPTHBUFFER_WBUFFER);
grDepthMask(FXTRUE);
grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL,
GR_COMBINE_FACTOR_NONE,
GR_COMBINE_LOCAL_ITERATED,
GR_COMBINE_OTHER_NONE,
FXFALSE);
grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO,
GR_BLEND_ONE, GR_BLEND_ZERO);
if (useTextures)
grTexCombine(GR_TMU0,
GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE,
GR_COMBINE_FUNCTION_NONE, GR_COMBINE_FACTOR_NONE,
FXFALSE, FXFALSE);
else
grTexCombine(GR_TMU0,
GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE,
GR_COMBINE_FUNCTION_NONE, GR_COMBINE_FACTOR_NONE,
FXTRUE, FXFALSE);
grTexMipMapMode(GR_TMU0,
GR_MIPMAP_NEAREST,
FXFALSE);
grTexFilterMode(GR_TMU0,
GR_TEXTUREFILTER_BILINEAR,
GR_TEXTUREFILTER_BILINEAR);
grDepthBufferFunction(GR_CMP_LEQUAL);
grCullMode(GR_CULL_NEGATIVE);
/* grClipWindow((int)x, (int)y, (int)(x+w), (int)(y+h)); */
grFogColorValue(0x0);
fadeInFrames = (int)(((float)total_num_frames) * FADEIN_END_PERCENT);
fadeOutFrames = (int)(((float)total_num_frames) *
(1.0f - FADEOUT_BEGIN_PERCENT));
if (_frame == 0) { /* Render Whole Animation */
for(frame = 1; frame < total_num_frames; frame++) {
int i;
/* Set Fog Value For This Frame */
if(frame < fadeInFrames) {
unsigned char fval = (((unsigned char)0xFF) -
((unsigned char)(255.0f * (float)(frame + 1) / (float)fadeInFrames)));
for(i = 0; i < kInternalFogTableEntryCount; i++) fogTable[i] = fval;
grFogMode(GR_FOG_WITH_TABLE);
grFogTable(fogTable);
fog = 1;
} else if(frame > total_num_frames-fadeOutFrames) {
unsigned char fval = (((unsigned char)0xFF) -
(unsigned char)(255.0f* ((float)(total_num_frames - frame))/
((float)fadeOutFrames)));
for(i = 0; i < kInternalFogTableEntryCount; i++)
fogTable[i] = fval;
grFogMode(GR_FOG_WITH_TABLE);
grFogTable(fogTable);
fog = 1;
} else {
grFogMode(GR_FOG_DISABLE);
fog = 0;
}
grBufferClear(0x00000000, 0, GR_WDEPTHVALUE_FARTHEST);
pass = 1;
/*
* Avoid Z-aliasing between the shield and the 3dfx by
* not writing Z for the shield.
*/
grDepthMask(FXFALSE);
/* cyan part of shield */
xfAndProj(frame, 2);
drawFaces(frame, 2);
/* yellow and white part of shield. */
xfAndProj(frame, 0);
drawFaces(frame, 0);
/*
* Reanable writes to the depth-buffer.
*/
grDepthMask(FXTRUE);
/*
* Draw the shadow projected from the 3Dfx logo onto
* the rest of the powershield.
*/
grDepthBufferFunction(GR_CMP_ALWAYS);
grFogMode(GR_FOG_DISABLE);
drawShadow(frame, 1, 0, lights[0]);
if (fog) grFogMode(GR_FOG_WITH_TABLE); /* hack around mp fog */
grDepthBufferFunction(GR_CMP_LEQUAL);
/* 3Dfx logo */
xfAndProj(frame, 1);
drawFaces(frame, 1);
grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ONE,
GR_BLEND_ONE, GR_BLEND_ZERO);
pass = 2;
drawFaces(frame, 1);
pass = 1;
grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO,
GR_BLEND_ONE, GR_BLEND_ZERO);
grBufferSwap(2);
}
} else { /* Render One Frame */
frame = ((_frame>>1) % SPIN_FRAMES)+SPIN_START;
grColorMask(FXFALSE, FXFALSE);
grBufferClear(0x00000000, 0, GR_WDEPTHVALUE_FARTHEST);
grColorMask(FXTRUE, FXFALSE);
pass = 0xbeef;
/* 3Dfx logo */
xfAndProj(frame, 1);
drawFaces(frame, 1);
}
/* Get rid of the remnants on teh screen just in case
* the app (like PowerRender) doesn't do it itself yet
* assumes that the screen is clear.
*/
if (frame == 0) {
int i;
for(i = 0; i < gc->grColBuf; i++) {
grBufferClear(0x00000000, 0, GR_WDEPTHVALUE_FARTHEST);
grBufferSwap(0);
}
}
/*
* Clean up after yourself!
*/
grGlideSetState(&oldState);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,241 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*
* 4 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 3 5/21/97 6:05a Peter
**
*/
#ifndef __GSSTDEF_H__
#define __GSSTDEF_H__
#if (GLIDE_PLATFORM & GLIDE_HW_CVG)
#include <cvg.h>
#else
#include <sst.h>
#endif
/*----------------- SST chip layout -----------------------*/
typedef enum
{
SSTR_STATUS,
SSTR_RESERVED0,
SSTR_VAX,
SSTR_VAY,
SSTR_VBX,
SSTR_VBY,
SSTR_VCX,
SSTR_VCY,
#ifdef GLIDE_USE_ALT_REGMAP
SSTR_R,
SSTR_DRDX,
SSTR_DRDY,
SSTR_G,
SSTR_DGDX,
SSTR_DGDY,
SSTR_B,
SSTR_DBDX,
SSTR_DBDY,
SSTR_Z,
SSTR_DZDX,
SSTR_DZDY,
SSTR_A,
SSTR_DADX,
SSTR_DADY,
SSTR_S,
SSTR_DSDX,
SSTR_DSDY,
SSTR_T,
SSTR_DTDX,
SSTR_DTDY,
SSTR_W,
SSTR_DWDX,
SSTR_DWDY,
#else
SSTR_R,
SSTR_G,
SSTR_B,
SSTR_Z,
SSTR_A,
SSTR_S,
SSTR_T,
SSTR_W,
SSTR_DRDX,
SSTR_DGDX,
SSTR_DBDX,
SSTR_DZDX,
SSTR_DADX,
SSTR_DSDX,
SSTR_DTDX,
SSTR_DWDX,
SSTR_DRDY,
SSTR_DGDY,
SSTR_DBDY,
SSTR_DZDY,
SSTR_DADY,
SSTR_DSDY,
SSTR_DTDY,
SSTR_DWDY,
#endif
SSTR_TRIANGLECMD,
SSTR_RESERVED1,
SSTR_FVAX,
SSTR_FVAY,
SSTR_FVBX,
SSTR_FVBY,
SSTR_FVCX,
SSTR_FVCY,
#ifdef GLIDE_USE_ALT_REGMAP
SSTR_FR,
SSTR_FDRDX,
SSTR_FDRDY,
SSTR_FG,
SSTR_FDGDX,
SSTR_FDGDY,
SSTR_FB,
SSTR_FDBDX,
SSTR_FDBDY,
SSTR_FZ,
SSTR_FDZDX,
SSTR_FDZDY,
SSTR_FA,
SSTR_FDADX,
SSTR_FDADY,
SSTR_FS,
SSTR_FDSDX,
SSTR_FDSDY,
SSTR_FT,
SSTR_FDTDX,
SSTR_FDTDY,
SSTR_FW,
SSTR_FDWDX,
SSTR_FDWDY,
#else
SSTR_FR,
SSTR_FG,
SSTR_FB,
SSTR_FZ,
SSTR_FA,
SSTR_FS,
SSTR_FT,
SSTR_FW,
SSTR_FDRDX,
SSTR_FDGDX,
SSTR_FDBDX,
SSTR_FDZDX,
SSTR_FDADX,
SSTR_FDSDX,
SSTR_FDTDX,
SSTR_FDWDX,
SSTR_FDRDY,
SSTR_FDGDY,
SSTR_FDBDY,
SSTR_FDZDY,
SSTR_FDADY,
SSTR_FDSDY,
SSTR_FDTDY,
SSTR_FDWDY,
#endif
SSTR_FTRIANGLECMD,
SSTR_FBZCOLORPATH,
SSTR_FOGMODE,
SSTR_ALPHAMODE,
SSTR_FBZMODE,
SSTR_LFBMODE,
SSTR_CLIPLEFTRIGHT,
SSTR_CLIPBOTTOMTOP,
SSTR_NOPCMD,
SSTR_FASTFILLCMD,
SSTR_SWAPBUFFERCMD,
SSTR_FOGCOLOR,
SSTR_ZACOLOR,
SSTR_CHROMAKEY,
SSTR_RESERVED2,
SSTR_RESERVED3,
SSTR_STIPPLE,
SSTR_C0,
SSTR_C1,
SSTR_FBIPIXELSIN,
SSTR_FBICHROMAFAIL,
SSTR_FBIZFUNCFAIL,
SSTR_FBIAFUNCFAIL,
SSTR_FBIPIXELSOUT,
SSTR_FOGTABLE,
SSTR_RESERVED8 = SSTR_FOGTABLE + 32,
SSTR_FBIINIT4 = SSTR_RESERVED8 + 8,
SSTR_VRETRACE,
SSTR_BACKPORCH,
SSTR_VIDEODIMENSIONS,
SSTR_FBIINIT0,
SSTR_FBIINIT1,
SSTR_FBIINIT2,
SSTR_FBIINIT3,
SSTR_HSYNC,
SSTR_VSYNC,
SSTR_CLUTDATA,
SSTR_DACDATA,
SSTR_MAX_RGB_DELTA,
SSTR_RESERVED51,
SSTR_TEXTUREMODE = SSTR_RESERVED51 + 51,
SSTR_TLOD,
SSTR_TDETAIL,
SSTR_TEXBASEADDR,
SSTR_TEXBASEADDR1,
SSTR_TEXBASEADDR2,
SSTR_TEXBASEADDR38,
SSTR_TEXINIT0,
SSTR_TEXINIT1,
SSTR_NCCTABLE0,
SSTR_NCCTABLE1 = SSTR_NCCTABLE0 + 12,
SSTR_END_OF_REGISTER_SET
} GrSstRegister;
#endif /* __GSSTDEF_H__ */

View File

@@ -1,302 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*
* 19 12/12/97 12:43p Atai
* move i and dateElem into the set up loop
*
* 17 12/08/97 10:38a Atai
* added grDrawVertexArrayLinear()
*
* 16 11/21/97 6:05p Atai
* use one datalist (tsuDataList) in glide3
*
* 15 11/06/97 6:10p Atai
* update GrState size
* rename grDrawArray to grDrawVertexArray
* update _grDrawPoint and _grDrawVertexList
*
* 14 11/04/97 6:35p Atai
* 1. sync with data structure changes
* 2. break up aa triangle routine
*
* 13 11/04/97 4:57p Atai
* use byte offset
*
* 12 11/03/97 3:43p Peter
* h3/cvg cataclysm
*
* 11 10/17/97 2:11p Atai
* added grContinueArray. We only support non aa mode for now.
*
* 10 10/16/97 1:50p Atai
* fix drawarray bugs
*
* 9 10/14/97 6:16p Atai
* reverse triangle order in _grAADrawVertexList
*
* 8 10/14/97 5:41p Atai
* added _grAADrawVertexList()
*
* 7 10/14/97 4:57p Dow
* Clamping
*
* 6 10/09/97 8:02p Dow
* State Monster 1st Cut
*
* 5 10/08/97 11:32a Peter
* pre-computed packet headers for packet 3
*
* 4 9/29/97 1:26p Dow
* Fixed packed color strips/fans
*
* 3 9/26/97 10:24a Dow
* Fixed state Muckage in Glide3 parameter data
*
* 2 9/23/97 2:35p Dow
* One less loop
*
* 1 9/23/97 2:04p Dow
* DD code for strips
**
*/
#ifdef GLIDE3
#include <3dfx.h>
#include <glidesys.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
/*-------------------------------------------------------------------
Function: _grDrawVertexList
Date: 18-Sep-97
Implementor(s): dow
Description:
Sends a triangle strip to CVG.
Arguments:
Return:
-------------------------------------------------------------------*/
void FX_CSTYLE
_grDrawVertexList(FxU32 type, FxI32 mode, FxI32 count, void *pointers)
{
#define FN_NAME "_grDrawVertexList"
/*
** simplified code
*/
FxU32
vNum = 0,
vSize;
float
**lPtrs = (float **) pointers;
FxI32 stride = mode;
FxU32
sCount = count, set = 0, pktype = SSTCP_PKT3_BDDDDD;
GR_BEGIN_NOFIFOCHECK(FN_NAME, 90);
GDBG_INFO_MORE(gc->myLevel, "(type = 0x%x, count = %d, pointers = 0x%x)\n",
type, count, pointers);
GR_FLUSH_STATE();
vSize = gc->state.vData.vSize;
if (stride == 0)
stride = gc->state.vData.vStride;
/* Draw the first (or possibly only) set. This is necessary because
the packet is 3_BDDDDDD, and in the next set, the packet is
3_DDDDDD */
/*
** We try to make tstrip code simple to read. We combine the original code
** into a single loop by adding an extra packet type assignment at the end of the loop.
** Also, the debugging code are removed temporarily.
*/
if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS) {
while (count > 0) {
FxI32 k, vcount = count >= 15 ? 15 : count;
GR_SET_EXPECTED_SIZE(vcount * vSize, 1);
TRI_STRIP_BEGIN(type, vcount, vSize, pktype);
/*
** If we use a while loop, the compiler will increment vNum and store the value back
** to the memory at every loop. In a for loop, vNum data are kept in a register.
** After the loop complete, the vNum data are written back to memory.
*/
for (k = 0; k < vcount; k++) {
FxU32 i, dataElem;
float *vPtr;
vPtr = pointers;
if (mode)
vPtr = *(float **)vPtr;
(float *)pointers += stride;
TRI_SETF(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2));
dataElem = 0;
TRI_SETF(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2));
i = gc->tsuDataList[dataElem];
while (i != GR_DLIST_END) {
TRI_SETF(FARRAY(vPtr, i));
dataElem++;
i = gc->tsuDataList[dataElem];
}
}
TRI_END;
GR_CHECK_SIZE();
count -= 15;
pktype = SSTCP_PKT3_DDDDDD;
}
}
else {
/*
* first cut of clip space coordinate code, no optimization.
*/
float oow;
while (count > 0) {
FxI32 k, vcount = count >= 15 ? 15 : count;
GR_SET_EXPECTED_SIZE(vcount * vSize, 1);
TRI_STRIP_BEGIN(type, vcount, vSize, pktype);
for (k = 0; k < vcount; k++) {
float *vPtr;
vPtr = pointers;
if (mode)
vPtr = *(float **)vPtr;
oow = 1.0f / FARRAY(vPtr, gc->state.vData.wInfo.offset);
/* x, y */
TRI_SETF(FARRAY(vPtr, GR_VERTEX_X_OFFSET << 2)
*oow*gc->state.Viewport.hwidth + gc->state.Viewport.ox);
TRI_SETF(FARRAY(vPtr, GR_VERTEX_Y_OFFSET << 2)
*oow*gc->state.Viewport.hheight + gc->state.Viewport.oy);
(float *)pointers += stride;
TRI_VP_SETFS(vPtr, oow);
}
TRI_END;
GR_CHECK_SIZE();
count -= 15;
pktype = SSTCP_PKT3_DDDDDD;
}
}
#undef FN_NAME
} /* _grDrawVertexList */
/*-------------------------------------------------------------------
Function: _grAADrawVertexList
Date: 14-Oct-97
Implementor(s): atai
Description:
Sends an aa triangle strip/fan to CVG.
Arguments:
Return:
-------------------------------------------------------------------*/
void FX_CSTYLE
_grAADrawVertexList(FxU32 type, FxI32 mode, FxI32 count, void *pointers)
{
#define FN_NAME "_grAADrawVertexList"
GR_DCL_GC;
FxU32 vNum = 0;
FxU32 sCount = count;
float
**lPtrs = (float **) pointers;
float *v[3];
FxBool flip = FXFALSE;
FxU32 fbzModeOld; /* Squirrel away current fbzMode */
FxI32 stride = mode;
if (sCount <= 2) return;
_grDrawVertexList(type, mode, count, pointers);
fbzModeOld = gc->state.fbi_config.fbzMode;
gc->state.fbi_config.fbzMode &= ~(SST_ZAWRMASK);
/* gc->state.invalid |= fbzModeBIT; */
GR_FLUSH_STATE();
if (stride == 0)
stride = gc->state.vData.vStride;
sCount-=2;
if (type == kSetupFan) {
v[0] = (mode == 0) ? pointers : *(float **)pointers;
while (sCount--) {
(float *)pointers += stride;
if (mode) {
v[1] = *(float **)pointers;
v[2] = *((float **)pointers+1);
} else {
v[1] = pointers;
v[2] = (float *)pointers+stride;
}
if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS)
_grAADrawTriangles(1, type, 3, v);
else
_grAAVpDrawTriangles(1, type, 3, v);
}
}
else if (type == kSetupStrip){
while (sCount--) {
if (flip) {
if (mode) {
v[0] = *((float **)pointers+1);
v[1] = *(float **)pointers;
v[2] = *((float **)pointers+2);
} else {
v[0] = (float *)pointers+stride;
v[1] = pointers;
v[2] = (float *)pointers+(stride<<1);
}
}
else {
if (mode) {
v[0] = *(float **)pointers;
v[1] = *((float **)pointers+1);
v[2] = *((float **)pointers+2);
} else {
v[0] = pointers;
v[1] = (float *)pointers+stride;
v[2] = (float *)pointers+(stride<<1);
}
}
if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS)
_grAADrawTriangles(1, type, 3, v);
else
_grAAVpDrawTriangles(1, type, 3, v);
(float *)pointers += stride;
flip = ~flip;
}
flip = ~flip;
}
gc->state.fbi_config.fbzMode = fbzModeOld;
gc->state.invalid |= fbzModeBIT;
GR_FLUSH_STATE();
#undef FN_NAME
} /* _grAADrawVertexList */
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,895 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.2.2.2 2005/01/22 14:52:02 koolsmoky
** enabled packed argb for cmd packet type 3
**
** Revision 1.2.2.1 2004/12/23 20:45:56 koolsmoky
** converted to nasm syntax
** added x86 asm, 3dnow! triangle and mmx, 3dnow! texture download optimizations
**
** Revision 1.2 2000/10/03 18:28:33 mercury
** 003-clean_up_cvg-000, cvg tree cleanup.
**
** Revision 1.1.1.1 1999/12/07 21:49:11 joseph
** Initial checkin into SourceForge.
**
**
** 61 5/18/98 12:11p Peter
** removed unnecesasry fencing
**
** 60 4/29/98 2:32p Peter
** fixed texture palette broadcast
**
** 59 3/30/98 2:46p Peter
** fixed texture download muckage
**
** 58 3/29/98 10:54p Jdt
** Unset GLIDE_POINTCAST_PALETTE
**
** 57 2/20/98 5:31p Peter
** crybaby glide
**
** 56 2/20/98 11:00a Peter
** removed glide3 from glid2 tree
**
** 55 2/02/98 2:14p Atai
** fixed palette broadcasts in _grTexDownloadNccTable and
** _grTexDownloadPalette
*
* 54 1/09/98 6:48p Atai
* grTexInfo, GR_LOD_* and GR_ASPECT_*
*
* 53 1/08/98 7:09p Peter
* real hw stuff modulo makefile change
*
* 52 1/08/98 4:58p Atai
* tex table broadcast, grVertexLayout enable/disable, stq, and some
* defines
*
* 51 1/08/98 11:06a Dow
* Set palette downloads to broadcast.
*
* 50 12/11/97 4:15p Peter
* fixed assertions
*
* 49 12/09/97 12:20p Peter
* mac glide port
*
* 48 12/05/97 4:26p Peter
* watcom warnings
*
* 47 12/02/97 9:48a Dow
* Got rid of Texelfx rev 0 warning
*
* 46 11/21/97 1:03p Peter
* small texture download problem
*
* 45 11/20/97 6:57p Dow
* Texture Downloads for Banshee
*
* 44 11/18/97 4:36p Peter
* chipfield stuff cleanup and w/ direct writes
*
* 43 11/17/97 4:55p Peter
* watcom warnings/chipfield stuff
*
* 42 11/14/97 12:09a Peter
* comdex thing and some other stuff
*
* 41 11/12/97 11:16a Peter
* cleaned up assertions
*
* 40 11/05/97 1:50p Peter
* fixed partial palette downloads
*
* 39 11/03/97 3:43p Peter
* h3/cvg cataclysm
*
* 38 10/08/97 11:33a Peter
* reg group for palette download
*
* 37 9/15/97 7:31p Peter
* more cmdfifo cleanup, fixed normal buffer clear, banner in the right
* place, lfb's are on, Hmmmm.. probably more
*
* 36 9/04/97 3:32p Peter
* starting grouping serial reg writes
*
* 35 8/18/97 3:52p Peter
* pre-hw arrival fixes/cleanup
*
* 34 7/26/97 5:18p Peter
* fixed macro muckage
*
* 33 7/08/97 2:49p Peter
*
* 32 7/02/97 12:28p Peter
* removed spurious NOP, tex dl
*
* 31 6/30/97 3:22p Peter
* cmd fifo sanity
*
**
*/
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
/* externals from gtex.c */
extern FxU32 _gr_aspect_xlate_table[];
extern FxU32 _gr_evenOdd_xlate_table[];
extern const int _grMipMapHostWH[GR_ASPECT_1x8 + 1][GR_LOD_1 + 1][2];
/*---------------------------------------------------------------------------
** _grTexDownloadNccTable
**
** Downloads an ncctable to the specified _physical_ TMU(s). This
** function is called internally by Glide and should not be executed
** by an application.
*/
GR_DDFUNC(_grTexDownloadNccTable,
void,
(GrChipID_t tmu, FxU32 which, const GuNccTable *table, int start, int end))
{
#define FN_NAME "_grTexDownloadNccTable"
GR_BEGIN_NOFIFOCHECK(FN_NAME,89);
GDBG_INFO_MORE(gc->myLevel,"(%d,%d, 0x%x, %d,%d)\n",tmu,which,table,start,end);
GR_ASSERT(start==0);
GR_ASSERT(end==11);
/* check for null pointer */
if (table == NULL) return;
_GlideRoot.stats.palDownloads++;
_GlideRoot.stats.palBytes += (end-start+1)<<2;
if (gc->tmu_state[tmu].ncc_table[which] != table) {
SstRegs* texHW;
int i;
#ifdef GLIDE_POINTCAST_PALETTE
texHW = SST_TMU(hw,tmu);
#else
texHW = SST_CHIP(hw,0xe);
#endif
if (which == 0) {
#ifdef GLIDE_POINTCAST_PALETTE
REG_GROUP_BEGIN((0x02UL << tmu), nccTable0, 12, 0x0FFF);
#else
REG_GROUP_BEGIN(0x0EUL, nccTable0, 12, 0x0FFF);
#endif
for (i = 0; i < 12; i++) REG_GROUP_SET(texHW, nccTable0[i], table->packed_data[i]);
REG_GROUP_END();
} else {
#ifdef GLIDE_POINTCAST_PALETTE
REG_GROUP_BEGIN((0x02UL << tmu), nccTable1, 12, 0x0FFF);
#else
REG_GROUP_BEGIN(0x0EUL, nccTable1, 12, 0x0FFF);
#endif
for (i = 0; i < 12; i++) REG_GROUP_SET(texHW, nccTable1[i], table->packed_data[i]);
REG_GROUP_END();
}
gc->tmu_state[tmu].ncc_table[which] = table;
}
GR_END();
#undef FN_NAME
} /* _grTexDownloadNccTable */
/*-------------------------------------------------------------------
Function: _grTexDownloadPalette
Date: 6/9
Implementor(s): jdt
Library: Glide
Description:
Private function to download a palette to the specified tmu
Arguments:
tmu - which tmu to download the palette to
pal - the pallete data
start - beginning index to download
end - ending index to download
Return:
none
-------------------------------------------------------------------*/
GR_DDFUNC(_grTexDownloadPalette,
void,
(GrChipID_t tmu, GuTexPalette *pal, int start, int end))
{
#define FN_NAME "_grTexDownloadPalette"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 89);
GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d)\n",tmu,pal,start,end);
GR_CHECK_F(FN_NAME, pal == NULL, "pal invalid");
GR_CHECK_F(FN_NAME, start < 0, "invalid start index");
GR_CHECK_F(FN_NAME, end > 255, "invalid end index");
/* NOTE:
**
** This code broadcasts the palette because in the future, we will
** only support one global texture palette no matter how many TMUs
** there are. This is fallout from the fact that future hardware
** has a unified memory architecture.
**
** Source licensees (meaning arcade or LBE vendors that) require the
** one palette/tmu mode should define GLIDE_POINTCAST_PALETTE on
** the command line for this file. Understand, however, that this
** will not work on future hardware.
*/
#ifdef GLIDE_POINTCAST_PALETTE
/*
** FURTHER NOTE:
** There is a sublety (nice way of saying BUG) here.
** If TMU0 is specified, then the palette will be broadcast to all
** TMUS. So, if the user downloads TMU1's palette, then TMU0's
** palette, TMU0's palette will be on *both* TMUs. This is a
** pretty strong indicator that no one is using separate palettes
** on different TMUs.
*/
hw = SST_TMU(hw,tmu);
#else
hw = SST_CHIP(hw,0xE);
#endif
_GlideRoot.stats.palDownloads++;
_GlideRoot.stats.palBytes += ((end - start + 1) << 2);
/* We divide the writes into 3 chunks trying to group things into
* complete 8 word grouped packets to fit the nccTable palette
* format: stuff before the 8 word alignment, aligned writes, and
* stuff after the 8 word alignment to the end. The slop regions
* are one packet apiece.
*/
{
#ifdef GLIDE_POINTCAST_PALETTE
const FifoChipField chipId = (FifoChipField)(0x02UL << tmu);
#else
const FifoChipField chipId = (FifoChipField)0x0EUL;
#endif
const int endSlop = (end & ~0x07);
const int startSlop = MIN(((start + 8) & ~0x07) - 1, end);
int i = start;
/* Is the start of the palette range unaligned or is the end of
* the range less than a completely aligned range?
*/
if (((start & 0x07) != 0) || (end < ((start + 8) & ~0x07))) {
const FxI32 slopCount = startSlop - start + 1;
GR_ASSERT((slopCount > 0) && (slopCount <= 8));
REG_GROUP_BEGIN(chipId, nccTable0[4 + (start & 0x07)],
slopCount, (0xFF >> (8 - slopCount)));
while(i < start + slopCount) {
REG_GROUP_SET(hw, nccTable0[4 + (i & 0x07)],
(0x80000000 | ((i & 0xFE) << 23) | (pal->data[i] & 0xFFFFFF)));
i++;
}
REG_GROUP_END();
}
/* Do all of the aligned palette ranges. */
while(i < endSlop) {
const int endIndex = i + 8;
REG_GROUP_BEGIN(chipId, nccTable0[4], 8, 0xFF);
while(i < endIndex) {
REG_GROUP_SET(hw, nccTable0[4 + (i & 0x07)],
(0x80000000 | ((i & 0xFE) << 23) | (pal->data[i] & 0xFFFFFF)));
i++;
}
REG_GROUP_END();
}
/* Do we have any more slop at the end of the ragne? */
if (i <= end) {
const FxU32 slopCount = end - endSlop + 1;
REG_GROUP_BEGIN(chipId, nccTable0[4],
slopCount, (0xFF >> (8 - slopCount)));
while(i <= end) {
REG_GROUP_SET(hw, nccTable0[4 + (i & 0x07)],
(0x80000000 | ((i & 0xFE) << 23) | (pal->data[i] & 0xFFFFFF)));
i++;
}
REG_GROUP_END();
}
}
GR_END();
#undef FN_NAME
} /* _grTexDownloadPalette */
/*-------------------------------------------------------------------
Function: grTexDownloadTable
Date: 6/3
Implementor(s): jdt, GaryMcT
Library: glide
Description:
download look up table data to a tmu
Arguments:
tmu - which tmu
type - what type of table to download
One of:
GR_TEXTABLE_NCC0
GR_TEXTABLE_NCC1
GR_TEXTABLE_PALETTE
void *data - pointer to table data
Return:
none
-------------------------------------------------------------------*/
GR_ENTRY(grTexDownloadTable,
void,
(GrChipID_t tmu, GrTexTable_t type, void *data))
{
#define FN_NAME "grTexDownloadTable"
GR_BEGIN_NOFIFOCHECK("grTexDownloadTable",89);
GDBG_INFO_MORE(gc->myLevel,"(%d,%d,0x%x)\n",tmu,type,data);
GR_CHECK_TMU(FN_NAME,tmu);
GR_CHECK_F(FN_NAME, type > GR_TEXTABLE_PALETTE, "invalid table specified");
GR_CHECK_F(FN_NAME, !data, "invalid data pointer");
if (type == GR_TEXTABLE_PALETTE) /* Need Palette Download Code */
_grTexDownloadPalette(tmu, (GuTexPalette *)data, 0, 255);
else { /* Type is an ncc table */
_grTexDownloadNccTable(tmu, type, (GuNccTable*)data, 0, 11);
/* _grTexDownloadNccTable(tmu, type, (GuNccTable*)data, 0, 11); */
}
GR_END();
#undef FN_NAME
} /* grTexDownloadTable */
/*-------------------------------------------------------------------
Function: grTexDownloadMipMapLevelPartial
Date: 6/2
Implementor(s): GaryMcT, Jdt
Library: glide
Description:
Downloads a mipmap level to the specified tmu at the given
texture start address
Arguments:
tmu - which tmu
startAddress - starting address for texture download,
this should be some value between grTexMinAddress()
and grTexMaxAddress()
thisLod - lod constant that describes the mipmap level
to be downloaded
largeLod - largest level of detail in complete mipmap to
be downloaded at startAddress of which level to
be downloaded is a part
aspectRatio - aspect ratio of this mipmap
format - format of mipmap image data
evenOdd - which set of mipmap levels have been downloaded for
the selected texture
One of:
GR_MIPMAPLEVELMASK_EVEN
GR_MIPMAPLEVELMASK_ODD
GR_MIPMAPLEVELMASK_BOTH
data - pointer to mipmap data
Return:
none
-------------------------------------------------------------------*/
GR_ENTRY(grTexDownloadMipMapLevelPartial,
void,
(GrChipID_t tmu, FxU32 startAddress,
GrLOD_t thisLod, GrLOD_t largeLod, GrAspectRatio_t aspectRatio,
GrTextureFormat_t format, FxU32 evenOdd, void *data, int t, int max_t))
{
const FifoChipField chipId = (FifoChipField)(0x02UL << tmu);
FxI32 sh;
#if !GLIDE_DISPATCH_DOWNLOAD
FxU32 max_s, width, tmu_baseaddress;
#endif
#define FN_NAME "grTexDownloadMipMapLevelPartial"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 89);
GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x, %d,%d)\n",
tmu,startAddress,thisLod,largeLod,aspectRatio,
format,evenOdd,data,t,max_t);
/* Check fo silly things */
{
const FxU32 size = _grTexTextureMemRequired(thisLod, thisLod,
aspectRatio, format, evenOdd);
GR_CHECK_TMU(FN_NAME, tmu);
GR_CHECK_COMPATABILITY(FN_NAME,
startAddress + size > gc->tmu_state[tmu].total_mem,
"insufficient texture ram at startAddress");
GR_CHECK_COMPATABILITY(FN_NAME,
startAddress & 0x7,
"unaligned startAddress");
GR_CHECK_F(FN_NAME, thisLod > GR_LOD_1,
"thisLod invalid");
GR_CHECK_F(FN_NAME, largeLod > GR_LOD_1,
"largeLod invalid");
GR_CHECK_F(FN_NAME, thisLod < largeLod,
"thisLod may not be larger than largeLod");
GR_CHECK_F(FN_NAME, aspectRatio > GR_ASPECT_1x8 ||
aspectRatio < GR_ASPECT_8x1,
"aspectRatio invalid");
GR_CHECK_F(FN_NAME, evenOdd > 0x3 || evenOdd == 0,
"evenOdd mask invalid");
GR_CHECK_F(FN_NAME, !data,
"invalid data pointer");
GR_CHECK_F(FN_NAME, max_t >= _grMipMapHostWH[aspectRatio][thisLod][1],
"invalid end row");
if ((startAddress < 0x200000) && (startAddress + size > 0x200000))
GrErrorCallback("grTexDownloadMipMapLevelPartial: mipmap level cannot span 2 Mbyte boundary",
FXTRUE);
}
/*------------------------------------------------------------
Skip this level entirely if not in odd/even mask
------------------------------------------------------------*/
if (!(evenOdd & (thisLod & 0x1 ? GR_MIPMAPLEVELMASK_ODD:GR_MIPMAPLEVELMASK_EVEN)))
goto all_done;
{
/*------------------------------------------------------------
Compute Base Address Given Start Address Offset
------------------------------------------------------------*/
const FxU32 baseAddress = _grTexCalcBaseAddress(startAddress,
largeLod,
aspectRatio,
format,
evenOdd) >> 3;
/*------------------------------------------------------------
Compute pertinant contents of tLOD and texMode registers
------------------------------------------------------------*/
FxU32 tLod = SST_TLOD_MINMAX_INT(largeLod, GR_LOD_1);
FxU32 texMode = format << SST_TFORMAT_SHIFT;
tLod |= _gr_evenOdd_xlate_table[evenOdd];
tLod |= _gr_aspect_xlate_table[aspectRatio];
if (gc->state.tmu_config[tmu].textureMode & SST_SEQ_8_DOWNLD) {
sh = 2;
texMode |= SST_SEQ_8_DOWNLD;
} else {
sh = 3;
}
/*------------------------------------------------------------
Update TLOD, texMode, baseAddress
------------------------------------------------------------*/
hw = SST_TMU(hw,tmu);
REG_GROUP_BEGIN(chipId, textureMode, 3, 0x0B);
{
REG_GROUP_SET(hw, textureMode, texMode);
REG_GROUP_SET(hw, tLOD, tLod);
REG_GROUP_SET(hw, texBaseAddr, baseAddress);
}
REG_GROUP_END();
}
#if GLIDE_DISPATCH_DOWNLOAD
/* Do the download */
{
const FxU32
width = _grMipMapHostWH[aspectRatio][thisLod][0],
formatSel = (format >= GR_TEXFMT_16BIT),
tmuBaseAddr = ((FxU32)gc->tex_ptr +
(((FxU32)tmu) << 21UL) +
(((FxU32)thisLod) << 17UL));
FxU32
widthSel = (width >> 0x01UL),
max_s = width >> (formatSel
? 1 /* 16-bit texture */
: 2); /* 8-bit texture */
if (max_s <= 0) max_s = 1;
if (widthSel > 2) widthSel = 3;
_GlideRoot.stats.texBytes += max_s * (max_t - t + 1) * 4;
if ((sh == 3) && !formatSel && (width > 4)) {
/* 8-bit >4xN texture with Old revision TMUs (GR_SSTTYPE_VOODOO) */
const FxU8* src8 = (const FxU8*)data;
/* Compute Physical Write Pointer */
const FxU32
tmu_baseaddress = (FxU32)gc->tex_ptr +
(((FxU32)tmu) << 21) + (((FxU32)thisLod) << 17);
for (; t <= max_t; t++) {
FxU32
s,
tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t);
LINEAR_WRITE_BEGIN(max_s, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
for (s = 0; s < max_s; s+=2) {
const FxU32 t0 = *(const FxU32*)(src8 );
const FxU32 t1 = *(const FxU32*)(src8 + sizeof(FxU32));
LINEAR_WRITE_SET_8(tex_address , t0);
LINEAR_WRITE_SET_8(tex_address + sizeof(FxU32), t1);
tex_address += 16;
src8 += (sizeof(FxU32) << 1);
}
LINEAR_WRITE_END();
}
} else {
/* GR_SSTTYPE_Voodoo2 all go through here */
(*((*_GlideRoot.deviceArchProcs.curTexProcs)[formatSel][widthSel]))(gc,
tmuBaseAddr,
max_s, t, max_t,
data);
}
}
#else
/*------------------------------------------------------------
Determine max_s
------------------------------------------------------------*/
width = _grMipMapHostWH[aspectRatio][thisLod][0];
max_s = width >> ((format < GR_TEXFMT_16BIT)
? 2 /* 8-bit texture */
: 1); /* 16-bit texture */
if (max_s <= 0) max_s = 1;
_GlideRoot.stats.texBytes += max_s * (max_t - t + 1) * 4;
/*------------------------------------------------------------
Compute Physical Write Pointer
------------------------------------------------------------*/
tmu_baseaddress = (FxU32)gc->tex_ptr;
tmu_baseaddress += (((FxU32)tmu) << 21) + (((FxU32)thisLod) << 17);
/*------------------------------------------------------------
Handle 8-bit Textures
------------------------------------------------------------*/
if (format < GR_TEXFMT_16BIT) { /* 8 bit textures */
/* Hoisted initialization */
FxU32 tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t);
const FxU8* src8 = (const FxU8*)data;
switch(width) {
case 1:
for (; t <= max_t; t++) {
LINEAR_WRITE_BEGIN(1, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
LINEAR_WRITE_SET_8(tex_address, (const FxU32)*(const FxU8*)src8);
LINEAR_WRITE_END();
src8 += width;
tex_address += TEX_ROW_ADDR_INCR(1);
}
break;
case 2:
for (; t <= max_t; t++) {
LINEAR_WRITE_BEGIN(1, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
LINEAR_WRITE_SET_8(tex_address, (const FxU32)*(const FxU16*)src8);
LINEAR_WRITE_END();
src8 += width;
tex_address += TEX_ROW_ADDR_INCR(1);
}
break;
case 4:
for (; t <= max_t; t++) {
LINEAR_WRITE_BEGIN(1, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
LINEAR_WRITE_SET_8(tex_address, *(const FxU32*)src8);
LINEAR_WRITE_END();
src8 += width;
tex_address += TEX_ROW_ADDR_INCR(1);
}
break;
default: { /* >4xN texture */
const FxU32 texAddrInc = ((sh == 3)
? 16 /* Old TMUs */
: 8);/* New TMUs */
for (; t <= max_t; t++) {
FxU32 s;
tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t);
LINEAR_WRITE_BEGIN(max_s, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
for (s = 0; s < max_s; s+=2) {
const FxU32 t0 = *(const FxU32*)(src8 );
const FxU32 t1 = *(const FxU32*)(src8 + sizeof(FxU32));
LINEAR_WRITE_SET_8(tex_address , t0);
LINEAR_WRITE_SET_8(tex_address + sizeof(FxU32), t1);
tex_address += texAddrInc;
src8 += (sizeof(FxU32) << 1);
}
LINEAR_WRITE_END();
}
break;
}
}
} else { /* 16-bit Textures */
/* Hoisted initialization */
FxU32 tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t);
const FxU16* src16 = (const FxU16*)data;
/* Cases 1, 2 don't need inner loops for s */
switch(width) {
case 1:
for (; t <= max_t; t++) {
LINEAR_WRITE_BEGIN(1, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
LINEAR_WRITE_SET_16(tex_address, (const FxU32)*(const FxU16*)src16);
LINEAR_WRITE_END();
src16 += width;
tex_address += TEX_ROW_ADDR_INCR(1);
}
break;
case 2:
for (; t <= max_t; t++) {
LINEAR_WRITE_BEGIN(1, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
LINEAR_WRITE_SET_16(tex_address, *(const FxU32*)src16);
LINEAR_WRITE_END();
src16 += width;
tex_address += TEX_ROW_ADDR_INCR(1);
}
break;
default:
for (; t <= max_t; t++) {
FxU32 s;
tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t);
/* Loop unrolled to process 2 dwords per iteration */
LINEAR_WRITE_BEGIN(max_s, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
for (s = 0; s < max_s; s += 2) {
const FxU32 t0 = *(const FxU32*)(src16 );
const FxU32 t1 = *(const FxU32*)(src16 + 2);
GDBG_INFO(195, "s = %d, t= %d, address = 0x%x\n",
s, t, (FxU32) tex_address - (FxU32) gc->tex_ptr + 0x200000);
LINEAR_WRITE_SET_16(tex_address , t0);
LINEAR_WRITE_SET_16(tex_address + 4, t1);
tex_address += 8;
src16 += 4;
}
LINEAR_WRITE_END();
}
break;
}
}
#endif
/*------------------------------------------------------------
Restore TLOD, texMode, baseAddress
------------------------------------------------------------*/
REG_GROUP_BEGIN(chipId, textureMode, 3, 0x0B);
{
REG_GROUP_SET(hw, textureMode, gc->state.tmu_config[tmu].textureMode);
REG_GROUP_SET(hw, tLOD, gc->state.tmu_config[tmu].tLOD);
REG_GROUP_SET(hw, texBaseAddr, gc->state.tmu_config[tmu].texBaseAddr);
}
REG_GROUP_END();
all_done:
_GlideRoot.stats.texDownloads++;
#undef FN_NAME
} /* grTexDownloadMipmapLevelPartial */
/*
Let me take this opportunity to register my formal opposition to
this function. Either we do this or we don't. Let's not hack like
this.
CHD
*/
GR_ENTRY(ConvertAndDownloadRle,
void,
(GrChipID_t tmu, FxU32 startAddress,
GrLOD_t thisLod, GrLOD_t largeLod, GrAspectRatio_t aspectRatio,
GrTextureFormat_t format, FxU32 evenOdd,
FxU8 *bm_data, long bm_h,
FxU32 u0, FxU32 v0,
FxU32 width, FxU32 height, FxU32 dest_width, FxU32 dest_height, FxU16 *tlut))
{
const FifoChipField chipId = (FifoChipField)(0x02UL << tmu);
FxI32 sh;
FxU32 max_s,s,t,max_t,tex_address, tmu_baseaddress;
FxU32 tLod, texMode, baseAddress,size;
FxU32 offset,expected_size;
unsigned long i;
FxU16 *src;
extern FxU16 rle_line[256]; /* diTex.c */
extern FxU16 *rle_line_end; /* ditex.c */
#define FN_NAME "ConvertAndDownloadRLE"
GR_BEGIN_NOFIFOCHECK(FN_NAME, 89);
/* make sure even number */
width&=0xFFFFFFFE;
max_s=width>>1;
max_t=height;
GDBG_INFO_MORE(gc->myLevel,"(%d,0x%x, %d,%d,%d, %d,%d 0x%x, %d)\n",
tmu,startAddress,thisLod,largeLod,aspectRatio,
format,evenOdd,bm_data,max_t);
size = _grTexTextureMemRequired(thisLod, thisLod, aspectRatio, format, evenOdd);
GR_CHECK_TMU(FN_NAME, tmu);
GR_CHECK_F(FN_NAME, startAddress + size > gc->tmu_state[tmu].total_mem,
"insufficient texture ram at startAddress");
GR_CHECK_F(FN_NAME, startAddress & 0x7, "unaligned startAddress");
GR_CHECK_F(FN_NAME, thisLod > GR_LOD_1, "thisLod invalid");
GR_CHECK_F(FN_NAME, largeLod > GR_LOD_1, "largeLod invalid");
GR_CHECK_F(FN_NAME, thisLod < largeLod, "thisLod may not be larger than largeLod");
GR_CHECK_F(FN_NAME, aspectRatio > GR_ASPECT_1x8 ||
aspectRatio < GR_ASPECT_8x1,
"aspectRatio invalid");
GR_CHECK_F(FN_NAME, evenOdd > 0x3 || evenOdd == 0, "evenOdd mask invalid");
GR_CHECK_F(FN_NAME, !bm_data, "invalid data pointer");
GR_CHECK_F(FN_NAME, (dest_height-1) >= (FxU32)_grMipMapHostWH[aspectRatio][thisLod][1],
"invalid end row");
if ((startAddress < 0x200000) && (startAddress + size > 0x200000))
GrErrorCallback("grTexDownloadMipMapLevelPartial: mipmap level cannot span 2 Mbyte boundary",
FXTRUE);
/*------------------------------------------------------------
Skip this level entirely if not in odd/even mask
------------------------------------------------------------*/
if (!(evenOdd & (thisLod & 0x1 ? GR_MIPMAPLEVELMASK_ODD:GR_MIPMAPLEVELMASK_EVEN)))
goto all_done;
/*------------------------------------------------------------
Compute Base Address Given Start Address Offset
------------------------------------------------------------*/
baseAddress = _grTexCalcBaseAddress(startAddress,
largeLod,
aspectRatio,
format,
evenOdd);
baseAddress >>= 3;
#if H3
baseAddress = ((baseAddress << 3) & ~0x0F);
#endif
/*------------------------------------------------------------
Compute Physical Write Pointer
------------------------------------------------------------*/
tmu_baseaddress = (FxU32)gc->tex_ptr;
tmu_baseaddress += (((FxU32)tmu)<<21) + (((FxU32)thisLod)<<17);
/*------------------------------------------------------------
Compute pertinant contents of tLOD and texMode registers
------------------------------------------------------------*/
tLod = SST_TLOD_MINMAX_INT(largeLod, GR_LOD_1);
tLod |= _gr_evenOdd_xlate_table[evenOdd];
tLod |= _gr_aspect_xlate_table[aspectRatio];
texMode = format << SST_TFORMAT_SHIFT;
if (gc->state.tmu_config[tmu].textureMode & SST_SEQ_8_DOWNLD) {
sh = 2;
texMode |= SST_SEQ_8_DOWNLD;
} else {
sh = 3;
}
/*------------------------------------------------------------
Update TLOD, texMode, baseAddress
------------------------------------------------------------*/
hw = SST_TMU(hw,tmu);
REG_GROUP_BEGIN(chipId, textureMode, 3, 0x0B);
{
REG_GROUP_SET(hw, textureMode, texMode);
REG_GROUP_SET(hw, tLOD, tLod);
REG_GROUP_SET(hw, texBaseAddr, baseAddress);
}
REG_GROUP_END();
_GlideRoot.stats.texBytes += dest_width * (dest_height) * 2;
/* here I can do my writes and conversion and I will be so happy */
offset=4+bm_h;
for (i=0; i<v0; i++)
offset += bm_data[4+i];
max_s=dest_width>>1;
expected_size=max_s*5;
rle_line_end=rle_line+width+u0;
for(t=0;t<max_t;t++) {
tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t);
src = rle_line + u0;
rle_decode_line_asm(tlut,&bm_data[offset],rle_line);
LINEAR_WRITE_BEGIN(max_s, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
for(s = 0; s < max_s; s++) {
LINEAR_WRITE_SET(tex_address + (s << 2), *(FxU32 *) src);
src += 2;
}
LINEAR_WRITE_END();
offset+=bm_data[4+i++];
}
if (dest_height>height) {
tex_address = tmu_baseaddress + TEX_ROW_ADDR_INCR(t);
src=rle_line+u0;
LINEAR_WRITE_BEGIN(max_s, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
for(s = 0; s < max_s; s++) {
LINEAR_WRITE_SET(tex_address + (s << 2), *(FxU32 *) src);
src += 2;
}
LINEAR_WRITE_END();
}
/*------------------------------------------------------------
Restore TLOD, texMode, baseAddress
------------------------------------------------------------*/
REG_GROUP_BEGIN(chipId, textureMode, 3, 0x0B);
{
REG_GROUP_SET(hw, textureMode, gc->state.tmu_config[tmu].textureMode);
REG_GROUP_SET(hw, tLOD, gc->state.tmu_config[tmu].tLOD);
REG_GROUP_SET(hw, texBaseAddr, gc->state.tmu_config[tmu].texBaseAddr);
}
REG_GROUP_END();
all_done:
_GlideRoot.stats.texDownloads++;
#undef FN_NAME
}

View File

@@ -1,449 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*
* 14 12/18/97 2:13p Peter
* fogTable cataclysm
*
* 13 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 12 5/21/97 6:05a Peter
*
* 11 3/09/97 10:31a Dow
* Added GR_DIENTRY for di glide functions
*
* 10 3/05/97 9:36p Jdt
* Added guEncodeRLE16
*
* 9 12/23/96 1:37p Dow
* chagnes for multiplatform glide
**
*/
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
#if ( (GLIDE_PLATFORM & GLIDE_SST_HW) && (GLIDE_PLATFORM & GLIDE_HW_SST1) )
#include <sst1init.h>
#endif
#include "fxinline.h"
/*---------------------------------------------------------------------------
** guAlphaSource
*/
GR_DIENTRY(guAlphaSource, void, ( GrAlphaSource_t mode ))
{
GDBG_INFO(99,"guAlphaSource(%d)\n",mode);
switch ( mode ) {
case GR_ALPHASOURCE_CC_ALPHA:
grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL,
GR_COMBINE_FACTOR_NONE,
GR_COMBINE_LOCAL_CONSTANT,
GR_COMBINE_OTHER_NONE,
FXFALSE );
break;
case GR_ALPHASOURCE_ITERATED_ALPHA:
grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL,
GR_COMBINE_FACTOR_NONE,
GR_COMBINE_LOCAL_ITERATED,
GR_COMBINE_OTHER_NONE,
FXFALSE );
break;
case GR_ALPHASOURCE_TEXTURE_ALPHA:
grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_ONE,
GR_COMBINE_LOCAL_NONE,
GR_COMBINE_OTHER_TEXTURE,
FXFALSE );
break;
case GR_ALPHASOURCE_TEXTURE_ALPHA_TIMES_ITERATED_ALPHA:
grAlphaCombine( GR_COMBINE_FUNCTION_SCALE_OTHER,
GR_COMBINE_FACTOR_LOCAL,
GR_COMBINE_LOCAL_ITERATED,
GR_COMBINE_OTHER_TEXTURE,
FXFALSE );
break;
default:
GR_CHECK_F("grAlphaSource", 1, "unknown alpha source mode");
break;
}
/* xxx not needed at the moment, should update grFogxxx
_grVerifyNeedForITAlpha();
*/
} /* guAlphaSource */
/*---------------------------------------------------------------------------
** guColorCombineFunction
*/
GR_DIENTRY(guColorCombineFunction, void, ( GrColorCombineFnc_t fnc ))
{
GDBG_INFO(99,"guColorCombineFunction(%d)\n",fnc);
/* gross hack to get ITRGB_DELTA0 modes working */
_grColorCombineDelta0Mode( FXFALSE );
switch ( fnc )
{
case GR_COLORCOMBINE_ZERO:
grColorCombine( GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, FXFALSE );
break;
case GR_COLORCOMBINE_CCRGB:
grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, FXFALSE );
break;
case GR_COLORCOMBINE_ITRGB_DELTA0:
_grColorCombineDelta0Mode( FXTRUE );
/* FALL THRU */
case GR_COLORCOMBINE_ITRGB:
grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_NONE, FXFALSE );
break;
case GR_COLORCOMBINE_DECAL_TEXTURE:
grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE );
break;
case GR_COLORCOMBINE_TEXTURE_TIMES_CCRGB:
grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_TEXTURE, FXFALSE );
break;
case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_DELTA0:
_grColorCombineDelta0Mode( FXTRUE );
/* FALL THRU */
case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB:
grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE );
break;
case GR_COLORCOMBINE_TEXTURE_TIMES_ITRGB_ADD_ALPHA:
grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE );
break;
case GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA:
grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_TEXTURE, FXFALSE );
break;
case GR_COLORCOMBINE_TEXTURE_TIMES_ALPHA_ADD_ITRGB:
grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE );
break;
case GR_COLORCOMBINE_TEXTURE_ADD_ITRGB:
grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE );
break;
case GR_COLORCOMBINE_TEXTURE_SUB_ITRGB:
grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL, GR_COMBINE_FACTOR_ONE, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE );
break;
case GR_COLORCOMBINE_CCRGB_BLEND_ITRGB_ON_TEXALPHA:
grColorCombine( GR_COMBINE_FUNCTION_BLEND, GR_COMBINE_FACTOR_TEXTURE_ALPHA, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_ITERATED, FXFALSE );
break;
case GR_COLORCOMBINE_DIFF_SPEC_A:
grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, GR_COMBINE_FACTOR_LOCAL_ALPHA, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE );
break;
case GR_COLORCOMBINE_DIFF_SPEC_B:
grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA, GR_COMBINE_FACTOR_LOCAL, GR_COMBINE_LOCAL_ITERATED, GR_COMBINE_OTHER_TEXTURE, FXFALSE );
break;
case GR_COLORCOMBINE_ONE:
grColorCombine( GR_COMBINE_FUNCTION_ZERO, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_NONE, GR_COMBINE_OTHER_NONE, FXTRUE );
break;
default:
GR_CHECK_F("grColorCombineFunction", 1, "unsupported color combine function");
break;
}
} /* guColorCombineFunction */
/*---------------------------------------------------------------------------
** guEndianSwapWords
*/
GR_DIENTRY(guEndianSwapWords, FxU32, ( FxU32 value ))
{
return ( ( value & 0xFFFF0000 ) >> 16 ) | ( value << 16 );
}
/*---------------------------------------------------------------------------
** guEndianSwapBytes
*/
GR_DIENTRY(guEndianSwapBytes, FxU16, ( FxU16 value ))
{
return ( ( value & 0xFF00 ) >> 8 ) | ( value << 8 );
}
/*---------------------------------------------------------------------------
** guFogTableIndexToW
*/
GR_DIENTRY(guFogTableIndexToW, float, ( int i ))
{
return (float)pow(2.0,3.0+(double)(i>>2)) / (8-(i&3));
}
/*---------------------------------------------------------------------------
** guFogGenerateExp
*/
GR_DIENTRY(guFogGenerateExp, void,
( GrFog_t fogtable[], float density ))
{
int i;
float f;
float scale;
float dp;
GDBG_INFO(99,"guFogGenerateExp(0x%x,%g)\n",fogtable,density);
dp = density * guFogTableIndexToW( kInternalFogTableEntryCount - 1 );
scale = 1.0F / ( 1.0F - ( float ) exp( -dp ) );
for ( i = 0; i < kInternalFogTableEntryCount; i++ ) {
dp = density * guFogTableIndexToW( i );
f = ( 1.0F - ( float ) exp( -dp ) ) * scale;
if ( f > 1.0F )
f = 1.0F;
else if ( f < 0.0F )
f = 0.0F;
f *= 255.0F;
fogtable[i] = ( GrFog_t ) f;
}
} /* guFogGenerateExp */
/*---------------------------------------------------------------------------
** guFogGenerateExp2
*/
GR_DIENTRY(guFogGenerateExp2, void,
( GrFog_t fogtable[], float density ))
{
int i;
float f;
float scale;
float dp;
GDBG_INFO(99,"guFogGenerateExp2(0x%x,%g)\n",fogtable,density);
dp = density * guFogTableIndexToW( kInternalFogTableEntryCount - 1 );
scale = 1.0F / ( 1.0F - ( float ) exp( -( dp * dp ) ) );
for ( i = 0; i < kInternalFogTableEntryCount; i++ ) {
dp = density * guFogTableIndexToW( i );
f = ( 1.0F - ( float ) exp( -( dp * dp ) ) ) * scale;
if ( f > 1.0F )
f = 1.0F;
else if ( f < 0.0F )
f = 0.0F;
f *= 255.0F;
fogtable[i] = ( GrFog_t ) f;
}
} /* guFogGenerateExp2 */
/*---------------------------------------------------------------------------
** guFogGenerateLinear
*/
GR_DIENTRY(guFogGenerateLinear, void,
( GrFog_t fogtable[kInternalFogTableEntryCount],
float nearZ, float farZ ))
{
int i;
float world_w;
float f;
GDBG_INFO(99,"guFogGenerateLinear(0x%x,%g,%g)\n",fogtable,nearZ,farZ);
for ( i = 0; i < kInternalFogTableEntryCount; i++ ) {
world_w = guFogTableIndexToW( i );
if ( world_w > 65535.0F )
world_w = 65535.0F;
f = ( world_w - nearZ ) / ( farZ - nearZ );
if ( f > 1.0F )
f = 1.0F;
else if ( f < 0.0F )
f = 0.0F;
f *= 255.0F;
fogtable[i] = ( GrFog_t ) f;
}
} /* guFogGenerateLinear */
/*
** setlevel
*/
static void
setlevel( FxU16 *data, FxU16 color, int width, int height )
{
int s, t;
for ( t = 0; t < height; t++ )
{
for ( s = 0; s < width; s++ )
{
*data = color;
data++;
}
}
} /* setlevel */
/*---------------------------------------------------------------------------
** guTexCreateColorMipMap
*/
GR_DIENTRY(guTexCreateColorMipMap, FxU16 *, ( void ))
{
FxU32 memrequired;
FxU16 *data;
FxU16 *start;
GDBG_INFO(99,"guTexCreateColorMipMap()\n");
memrequired = 2 * ( 256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2 + 1 * 1 );
start = data = malloc( memrequired );
if ( !data )
return 0;
setlevel( data, 0xF800, 256, 256 );
setlevel( data += 256*256, 0x07e0, 128, 128 );
setlevel( data += 128*128, 0x001F, 64, 64 );
setlevel( data += 64*64, 0xFFFF, 32, 32);
setlevel( data += 32*32, 0x0000, 16, 16 );
setlevel( data += 16*16, 0xF800, 8, 8);
setlevel( data += 8*8, 0x07e0, 4, 4 );
setlevel( data += 4*4, 0x001f, 2, 2 );
setlevel( data += 2*2, 0xFFFF, 1, 1 );
return start;
} /* guTexCreateColoMipMap */
/* GMT: this code used to be in the code above but I removed it for
readability, the first section was case(1) the second section
was a replacement for the simple 32-bit copy loop
*/
#if 0
/* GMT: from what I can tell its not bad to perform unaligned DWORD
loads on a P5, so we use the case 2) all the time
in fact, its twice as fast as doing aligned short copies
*/
if ((dstX ^ (((FxU32)src)>>1)) & 1) {
/* case 1) a simple 16-bit copy loop */
for (x=0; x < w; x++) {
GR_SET16(lfbPtr[x], ((FxU16 *)src)[x]);
}
}
#endif
#if 0
/* GMT: I tried to unroll the loop but for some reason the
code scheduling was such that it was slower
I think it had to do with the way the 2 mov instructions paired
Perhaps they were unaligned in the cache?
*/
FxU32 a,b;
FxU32 *s = (FxU32 *)src;
FxU32 *d = lfbPtr;
while (d < &lfbPtr[w-1]) {
a = s[0];
b = s[1];
GR_SET(d[0], a);
GR_SET(d[1], b);
s += 2;
d += 2;
}
if (w & 1) {
GR_SET(d[0], s[0]);
}
#endif
/*-------------------------------------------------------------------
Function: guEncodeRle
Date: 3/5/96
Implementor(s): jdt
Library: Glide Utilities
Description:
Encode an RGB565 image into RLE16 format
Arguments:
dst - destination rle image data ( NULL for bytecount only )
src - source rgb565 image data
width - width of source data
height - height of source data
Return:
number of bytes in encoded rle image
-------------------------------------------------------------------*/
GR_ENTRY( guEncodeRLE16, int, ( void *dst, void *src, FxU32 width, FxU32 height ))
{
int byteCount = 0;
int sourceImageSizeInWords;
FxU16 *srcPixels;
FxU32 *dstPixels;
sourceImageSizeInWords = width * height;
srcPixels = src;
if ( dst ) {
dstPixels = dst;
while( sourceImageSizeInWords-- ) {
short length = 1;
short color = *srcPixels;
int lookAhead = 1;
while( (sourceImageSizeInWords-length)&&
(color == srcPixels[lookAhead]) ) {
length++;
lookAhead++;
}
*dstPixels = ((((FxU32)length)<<16) | ((FxU32)color));
dstPixels++;
byteCount+=4;
srcPixels+=length;
sourceImageSizeInWords-=length;
}
} else {
while( sourceImageSizeInWords-- ) {
short length = 1;
short color = *srcPixels;
int lookAhead = 1;
while( (sourceImageSizeInWords-length)&&
(color == srcPixels[lookAhead]) ) {
length++;
lookAhead++;
}
byteCount+=4;
srcPixels+=length;
sourceImageSizeInWords-=length;
}
}
return byteCount;
}

View File

@@ -1,450 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.1.1.1.2.1 2005/01/22 14:52:02 koolsmoky
** enabled packed argb for cmd packet type 3
**
** Revision 1.1.1.1 1999/12/07 21:49:11 joseph
** Initial checkin into SourceForge.
**
*
* 12 12/15/97 5:52p Atai
* disable obsolete glide2 api for glide3
*
* 11 12/09/97 12:20p Peter
* mac glide port
*
* 10 12/08/97 12:06p Atai
* change prototype for grDrawPoint, grDrawLine, grDrawTriangel
*
* 9 8/18/97 3:52p Peter
* pre-hw arrival fixes/cleanup
*
* 8 7/31/97 11:14a Peter
* merge w/ sst1 glide tree, hopefully
*
* 5 6/27/97 4:16p Atai
* fixed guDrawTriangleWithClip bug (#484) by removing +1.0F and -1.0F in
* intersectTop(), intersectBottom(), intersectLeft(), and
* intersectRight() routine
*
* 4 3/09/97 10:31a Dow
* Added GR_DIENTRY for di glide functions
**
*/
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
/* Moved per GMT cleanup */
#define GU_PRIM_MAX_VERTICES 100
static void
calcParams(const GrVertex *a, const GrVertex *b, GrVertex *isect, float d)
{
GR_DCL_GC;
if (gc->state.paramIndex & STATE_REQUIRES_IT_DRGB) {
isect->r = a->r + d * ( b->r - a->r );
isect->g = a->g + d * ( b->g - a->g );
isect->b = a->b + d * ( b->b - a->b );
}
if (gc->state.paramIndex & STATE_REQUIRES_IT_ALPHA) {
isect->a = a->a + d * ( b->a - a->a );
}
if (gc->state.paramIndex & STATE_REQUIRES_OOZ) {
isect->ooz = a->ooz + d * ( b->ooz - a->ooz );
}
if (gc->state.paramIndex & STATE_REQUIRES_OOW_FBI) {
isect->oow = a->oow + d * ( b->oow - a->oow);
}
if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU0) {
isect->tmuvtx[0].oow =
a->tmuvtx[0].oow + d * ( b->tmuvtx[0].oow - a->tmuvtx[0].oow );
isect->tmuvtx[0].sow =
a->tmuvtx[0].sow + d * ( b->tmuvtx[0].sow - a->tmuvtx[0].sow );
isect->tmuvtx[0].tow =
a->tmuvtx[0].tow + d * ( b->tmuvtx[0].tow - a->tmuvtx[0].tow );
}
if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU1) {
isect->tmuvtx[1].oow =
a->tmuvtx[1].oow + d * ( b->tmuvtx[1].oow - a->tmuvtx[1].oow );
isect->tmuvtx[1].sow =
a->tmuvtx[1].sow + d * ( b->tmuvtx[1].sow - a->tmuvtx[1].sow );
isect->tmuvtx[1].tow =
a->tmuvtx[1].tow + d * ( b->tmuvtx[1].tow - a->tmuvtx[1].tow );
}
#if (GLIDE_NUM_TMU > 2)
if (gc->state.paramIndex & STATE_REQUIRES_ST_TMU2) {
isect->tmuvtx[2].oow =
a->tmuvtx[2].oow + d * ( b->tmuvtx[2].oow - a->tmuvtx[2].oow );
isect->tmuvtx[2].sow =
a->tmuvtx[2].sow + d * ( b->tmuvtx[2].sow - a->tmuvtx[2].sow );
isect->tmuvtx[2].tow =
a->tmuvtx[2].tow + d * ( b->tmuvtx[2].tow - a->tmuvtx[2].tow );
}
#endif
} /* calcParams */
static void
intersectTop( const GrVertex *a, const GrVertex *b, GrVertex *intersect )
{
GR_DCL_GC;
float
d = ( gc->state.clipwindowf_ymin - a->y ) / ( b->y - a->y );
intersect->x = a->x + d * ( b->x - a->x );
intersect->y = gc->state.clipwindowf_ymin;
calcParams(a, b, intersect, d);
} /* intersectTop */
static void
intersectBottom( const GrVertex *a, const GrVertex *b, GrVertex *intersect )
{
GR_DCL_GC;
float
d = ( gc->state.clipwindowf_ymax - a->y ) / ( b->y - a->y );
intersect->x = a->x + d * ( b->x - a->x );
intersect->y = gc->state.clipwindowf_ymax;
calcParams(a, b, intersect, d);
} /* intersectBottom */
static void
intersectRight( const GrVertex *a, const GrVertex *b, GrVertex *intersect )
{
GR_DCL_GC;
float
d = ( gc->state.clipwindowf_xmax - a->x ) / ( b->x - a->x );
intersect->x = gc->state.clipwindowf_xmax;
intersect->y = a->y + d * ( b->y - a->y );
calcParams(a, b, intersect, d);
} /* intersectRight */
static void
intersectLeft( const GrVertex *a, const GrVertex *b, GrVertex *intersect )
{
GR_DCL_GC;
float
d = ( gc->state.clipwindowf_xmin - a->x ) / ( b->x - a->x );
intersect->x = gc->state.clipwindowf_xmin;
intersect->y = a->y + d * ( b->y - a->y );
calcParams(a, b, intersect, d);
} /* intersectLeft */
static FxBool
aboveYMin(const GrVertex *p)
{
GR_DCL_GC;
return (( p->y > gc->state.clipwindowf_ymin ) ? FXTRUE : FXFALSE);
} /* aboveYMin */
static FxBool
belowYMax(const GrVertex *p)
{
GR_DCL_GC;
return (( p->y < gc->state.clipwindowf_ymax ) ? FXTRUE : FXFALSE);
} /* belowYMax */
static FxBool
aboveXMin(const GrVertex *p)
{
GR_DCL_GC;
return (( p->x > gc->state.clipwindowf_xmin ) ? FXTRUE : FXFALSE );
} /* aboveXMin */
static FxBool
belowXMax(const GrVertex *p)
{
GR_DCL_GC;
return (( p->x < gc->state.clipwindowf_xmax ) ? FXTRUE : FXFALSE );
} /* belowXMax */
/*
** shClipPolygon
*/
static void
shClipPolygon(
const GrVertex invertexarray[],
GrVertex outvertexarray[],
int inlength, int *outlength,
FxBool (*inside)(const GrVertex *p),
void (*intersect)(
const GrVertex *a,
const GrVertex *b,
GrVertex *intersect )
)
{
GrVertex
s, p /*, intersection */;
int
j;
*outlength = 0;
s = invertexarray[inlength-1];
for ( j = 0; j < inlength; j++ ) {
p = invertexarray[j];
if ( inside( &p ) ) {
if ( inside( &s ) ) {
outvertexarray[*outlength] = p;
(*outlength)++;
}else {
#if 0
intersect( &s, &p, &intersection );
outvertexarray[*outlength] = intersection;
#else
intersect( &s, &p, &outvertexarray[*outlength] );
#endif
(*outlength)++;
outvertexarray[*outlength] = p;
(*outlength)++;
}
} else {
if ( inside( &s ) ) {
#if 0
intersect( &s, &p, &intersection );
outvertexarray[*outlength] = intersection;
#else
intersect( &s, &p, &outvertexarray[*outlength] );
#endif
(*outlength)++;
}
}
s = p;
}
} /* shClipPolygon */
#ifndef GLIDE3_ALPHA
/*---------------------------------------------------------------------------
** guDrawTriangleWithClip
**
** NOTE: This routine snaps vertices by adding a large number then
** subtracting that same number again. In order for this to work
** you MUST set up the FPU to work in single precision mode. Code
** to perform this is listed in the Appendix to the Glide Programmer's
** Guide.
*/
static const float vertex_snap_constant = ( float ) ( 1L << 19 );
GR_DIENTRY(guDrawTriangleWithClip, void,
(const GrVertex *a, const GrVertex *b, const GrVertex *c ))
{
GR_DCL_GC;
GrVertex
output_array[8],
output_array2[8],
input_array[3];
int
i,
outlength;
GDBG_INFO_MORE(99,"guDrawTriangleWithClip(0x%x,0x%x,0x%x)\n",a,b,c);
/*
** perform trivial accept
*/
if (
( a->x >= gc->state.clipwindowf_xmin) &&
( a->x < gc->state.clipwindowf_xmax ) &&
( a->y >= gc->state.clipwindowf_ymin ) &&
( a->y < gc->state.clipwindowf_ymax ) &&
( b->x >= gc->state.clipwindowf_xmin ) &&
( b->x < gc->state.clipwindowf_xmax ) &&
( b->y >= gc->state.clipwindowf_ymin ) &&
( b->y < gc->state.clipwindowf_ymax ) &&
( c->x >= gc->state.clipwindowf_xmin ) &&
( c->x < gc->state.clipwindowf_xmax ) &&
( c->y >= gc->state.clipwindowf_ymin ) &&
( c->y < gc->state.clipwindowf_ymax )
)
{
#ifdef GLIDE3
grDrawTriangle( (void *)a, (void *)b, (void *)c );
#else
grDrawTriangle( a, b, c );
#endif
return;
}
/*
** go ahead and clip and render
*/
input_array[0] = *a;
input_array[1] = *b;
input_array[2] = *c;
shClipPolygon( input_array, output_array, 3, &outlength, belowXMax, intersectRight );
shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom );
shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft );
shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop );
/*
** snap vertices then decompose the n-gon into triangles
*/
#if defined ( __WATCOMC__ ) || defined ( __MSC__ ) || defined(__DJGPP__) || \
defined(__GNUC__) || defined(__MWERKS__)
for ( i = 0; i < outlength; i++ ) {
output_array2[i].x += vertex_snap_constant;
output_array2[i].x -= vertex_snap_constant;
output_array2[i].y += vertex_snap_constant;
output_array2[i].y -= vertex_snap_constant;
}
#else
# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER
#endif
grDrawPolygonVertexList( outlength, output_array2 );
} /* guDrawTriangleWithClip */
/*---------------------------------------------------------------------------
** guAADrawTriangleWithClip
*/
GR_DIENTRY(guAADrawTriangleWithClip, void,
(const GrVertex *a, const GrVertex *b, const GrVertex *c ))
{
GR_DCL_GC;
GrVertex
output_array[8],
output_array2[8],
input_array[3];
int
i,
ilist[10],
outlength;
GDBG_INFO_MORE(99,"guAADrawTriangleWithClip(0x%x,0x%x,0x%x)\n",a,b,c);
/*
** perform trivial accept
*/
if (
( a->x >= gc->state.clipwindowf_xmin) &&
( a->x < gc->state.clipwindowf_xmax ) &&
( a->y >= gc->state.clipwindowf_ymin ) &&
( a->y < gc->state.clipwindowf_ymax ) &&
( b->x >= gc->state.clipwindowf_xmin ) &&
( b->x < gc->state.clipwindowf_xmax ) &&
( b->y >= gc->state.clipwindowf_ymin ) &&
( b->y < gc->state.clipwindowf_ymax ) &&
( c->x >= gc->state.clipwindowf_xmin ) &&
( c->x < gc->state.clipwindowf_xmax ) &&
( c->y >= gc->state.clipwindowf_ymin ) &&
( c->y < gc->state.clipwindowf_ymax )
)
{
grAADrawTriangle( a, b, c, FXTRUE, FXTRUE, FXTRUE );
return;
}
/*
** go ahead and clip and render
*/
input_array[0] = *a;
input_array[1] = *b;
input_array[2] = *c;
shClipPolygon( input_array, output_array, 3, &outlength, belowXMax, intersectRight );
shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom );
shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft );
shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop );
/*
** snap vertices then decompose the n-gon into triangles
*/
#if defined(__WATCOMC__) || defined(__MSC__) || defined (__DJGPP__) || \
defined(__GNUC__) || defined(__MWERKS__)
for ( i = 0; i < outlength; i++ ) {
output_array2[i].x += vertex_snap_constant;
output_array2[i].x -= vertex_snap_constant;
output_array2[i].y += vertex_snap_constant;
output_array2[i].y -= vertex_snap_constant;
ilist[i] = i;
}
ilist[outlength] = 0;
#else
# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER
#endif
grAADrawPolygon( outlength, ilist, output_array2 );
} /* guAADrawTriangleWithClip */
/*---------------------------------------------------------------------------
** guDrawPolygonVertexListWithClip
*/
GR_DIENTRY(guDrawPolygonVertexListWithClip, void,
( int nverts, const GrVertex vlist[] ))
{
GrVertex
output_array[GU_PRIM_MAX_VERTICES+8],
output_array2[GU_PRIM_MAX_VERTICES+8];
int
i,
outlength;
GDBG_INFO_MORE(99,"guDrawPolygonVertexListWithClip(%d,0x%x)\n",nverts,vlist);
/*
** go ahead and clip and render
*/
shClipPolygon( vlist, output_array, nverts, &outlength, belowXMax, intersectRight );
shClipPolygon( output_array, output_array2, outlength, &outlength, belowYMax, intersectBottom );
shClipPolygon( output_array2, output_array, outlength, &outlength, aboveXMin, intersectLeft );
shClipPolygon( output_array, output_array2, outlength, &outlength, aboveYMin, intersectTop );
/*
** snap vertices then decompose the n-gon into triangles
*/
#if defined(__WATCOMC__) || defined(__MSC__) || defined(__DJGPP__) || \
defined(__GNUC__) || defined(__MWERKS__)
for ( i = 0; i < outlength; i++ ) {
output_array2[i].x += vertex_snap_constant;
output_array2[i].x -= vertex_snap_constant;
output_array2[i].y += vertex_snap_constant;
output_array2[i].y -= vertex_snap_constant;
}
#else
# error VERTEX SNAPPING MUST BE IMPLEMENTED FOR THIS COMPILER
#endif
grDrawPolygonVertexList( outlength, output_array2 );
} /* guDrawPolygonVertexListWithClip */
#endif /* !GLIDE3_ALPHA */

View File

@@ -1,105 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
*
* 10 12/09/97 12:20p Peter
* mac glide port
*
* 9 11/12/97 5:12p Pgj
* stubs for evil guFb{Read|Write}Region() calls
*
* 8 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 7 5/21/97 6:05a Peter
*
* 6 3/09/97 10:31a Dow
* Added GR_DIENTRY for di glide functions
*
* 5 12/23/96 1:37p Dow
* chagnes for multiplatform glide
**
*/
/* Implements multipass drawing */
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
#include "gump.h"
/* CHD BUG this belongs in fxglide.h */
void FX_CSTYLE
_gumpTexCombineFunction( int virtual_tmu );
GrMPState _gumpState;
GR_DIENTRY(guMPInit, void, ( void ))
{
int i;
GDBG_INFO(98,"guMPInit()\n");
for (i = 0; i < GLIDE_NUM_VIRTUAL_TMU; i += 1)
{
_gumpState.mmid[i] = (GrMipMapId_t) GR_NULL_MIPMAP_HANDLE;
}
_gumpState.tc_fnc = GR_MPTEXTURECOMBINE_ADD;
}
GR_DIENTRY(guMPTexCombineFunction, void,
( GrMPTextureCombineFnc_t tc_fnc ))
{
GDBG_INFO(98,"guMPTexCombineFunction(%d)\n",tc_fnc);
_gumpState.tc_fnc = tc_fnc;
}
GR_DIENTRY(guMPTexSource, void,
( GrChipID_t virtual_tmu, GrMipMapId_t mmid ))
{
GR_DCL_GC;
FXUNUSED( gc );
GDBG_INFO(98,"guMPTexSource(%d,%d)\n",virtual_tmu,mmid);
GR_CHECK_TMU("guMPTexSource",virtual_tmu);
_gumpState.mmid[virtual_tmu] = mmid;
}
extern FX_ENTRY void FX_CALL
guFbReadRegion( const int srcX, const int srcY, const int w, const int h, const void *dst, const int strideInBytes );
extern FX_ENTRY void FX_CALL
guFbWriteRegion( const int dstX, const int dstY, const int w, const int h, const void *src, const int strideInBytes);
/*---------------------------------------------------------------------------
** guFbReadRegion XXX obsolete
*/
GR_ENTRY(guFbReadRegion, void, ( const int srcX, const int srcY, const int w, const int h, const void *dst, const int strideInBytes ) )
{
}
/*---------------------------------------------------------------------------
** guFbWriteRegion XXX obsolete
*/
GR_ENTRY(guFbWriteRegion, void, ( const int dstX, const int dstY, const int w, const int h, const void *src, const int strideInBytes))
{
}

View File

@@ -1,59 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
**
*/
/* Multipass drawing */
#ifndef __GUMP_H__
#define __GUMP_H__
#ifdef __cplusplus
extern "C" {
#endif
#define GLIDE_NUM_VIRTUAL_TMU 2 /* Number of virtual TMUs */
typedef FxU32 GrMPTextureCombineFnc_t;
#define GR_MPTEXTURECOMBINE_ADD 0x0 /* */
#define GR_MPTEXTURECOMBINE_MULTIPLY 0x1 /* */
#define GR_MPTEXTURECOMBINE_DETAIL0 0x2 /* */
#define GR_MPTEXTURECOMBINE_DETAIL1 0x3 /* */
#define GR_MPTEXTURECOMBINE_TRILINEAR0 0x4 /* */
#define GR_MPTEXTURECOMBINE_TRILINEAR1 0x5 /* */
#define GR_MPTEXTURECOMBINE_SUBTRACT 0x6 /* */
typedef struct {
GrMipMapId_t mmid[GLIDE_NUM_VIRTUAL_TMU];
GrMPTextureCombineFnc_t tc_fnc;
} GrMPState;
FX_ENTRY void FX_CALL guMPInit( void );
FX_ENTRY void FX_CALL guMPTexCombineFunction( GrMPTextureCombineFnc_t tc );
FX_ENTRY void FX_CALL guMPTexSource( GrChipID_t virtual_tmu, GrMipMapId_t mmid );
FX_ENTRY void FX_CALL guMPDrawTriangle( const GrVertex *a, const GrVertex *b, const GrVertex *c );
#ifdef __cplusplus
}
#endif
#endif /* __GUMP_H__ */

View File

@@ -1,211 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
**
** 22 2/20/98 5:31p Peter
** crybaby glide
**
** 21 2/20/98 11:00a Peter
** removed glide3 from glid2 tree
*
* 20 1/07/98 10:22a Peter
* lod dithering env var
*
* 19 1/06/98 6:47p Atai
* undo grSplash and remove gu routines
*
* 18 12/17/97 4:45p Peter
* groundwork for CrybabyGlide
*
* 17 12/02/97 9:49a Dow
* rid the world of the "Setting the same state twice" message
*
* 16 11/20/97 6:59p Dow
* Fixed baseAddress for Banshee (the Devil's Own Test still uses guTex
* Stuff).
*
* 15 11/18/97 4:36p Peter
* chipfield stuff cleanup and w/ direct writes
*
* 14 11/17/97 4:55p Peter
* watcom warnings/chipfield stuff
*
* 13 11/03/97 3:43p Peter
* h3/cvg cataclysm
*
* 12 9/15/97 7:31p Peter
* more cmdfifo cleanup, fixed normal buffer clear, banner in the right
* place, lfb's are on, Hmmmm.. probably more
*
* 11 9/04/97 3:32p Peter
* starting grouping serial reg writes
*
* 10 6/06/97 10:47a Peter
* texture downloading, fixed 640x480 dimension, changed cvg dep to be the
* same as sst1
*
* 9 5/27/97 1:16p Peter
* Basic cvg, w/o cmd fifo stuff.
*
* 8 5/21/97 6:05a Peter
*
* 7 3/04/97 9:08p Dow
*
* 6 12/23/96 1:37p Dow
* chagnes for multiplatform glide
*
* 5 11/18/96 9:14a Sellers
* added checking for crossing of 2 MByte texture boundry
**
*/
#include <string.h>
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
/* externals from gtex.c and gtexdl.c */
extern FxU32 _grMipMapHostSize[][16];
extern FxU32 _gr_aspect_index_table[];
extern FxU32 _gr_aspect_xlate_table[];
extern FxU32 _gr_evenOdd_xlate_table[];
/*---------------------------------------------------------------------------
** guTexSource
*/
GR_ENTRY(guTexSource, void, (GrMipMapId_t mmid))
{
#define FN_NAME "guTexSource"
FxU32 texMode, tLod;
FxU32 oldtexMode;
FxU32 baseAddress;
int tmu;
const GrMipMapInfo *mminfo;
GR_BEGIN_NOFIFOCHECK("guTexSource",99);
GDBG_INFO_MORE(gc->myLevel,"(%d)\n",mmid);
/* Make sure that mmid is not NULL */
if (mmid == GR_NULL_MIPMAP_HANDLE) return;
/* get a pointer to the relevant GrMipMapInfo struct */
mminfo = &gc->mm_table.data[mmid];
tmu = mminfo->tmu;
GR_CHECK_TMU(FN_NAME, tmu);
gc->state.current_mm[tmu] = mmid;
/* Set up new glide state for this mmid */
gc->state.tmu_config[tmu].mmMode = mminfo->mipmap_mode;
gc->state.tmu_config[tmu].smallLod = mminfo->lod_min;
gc->state.tmu_config[tmu].largeLod = mminfo->lod_max;
gc->state.tmu_config[tmu].evenOdd = mminfo->odd_even_mask;
gc->state.tmu_config[tmu].nccTable = 0;
/* Set up base address, texMode, and tLod registers */
#if (GLIDE_PLATFORM & GLIDE_HW_H3)
baseAddress = mminfo->tmu_base_address + 0x200000;
#else
baseAddress = mminfo->tmu_base_address >> 3;
#endif
texMode = mminfo->tTextureMode;
tLod = mminfo->tLOD;
oldtexMode = gc->state.tmu_config[tmu].textureMode;
oldtexMode &= ~(SST_TFORMAT | SST_TCLAMPT |
SST_TCLAMPS | SST_TNCCSELECT |
SST_TLODDITHER | SST_TCLAMPW |
SST_TMAGFILTER | SST_TMINFILTER |
SST_TRILINEAR);
texMode |= oldtexMode;
if (!gc->state.allowLODdither) texMode &= ~SST_TLODDITHER;
/* Download the NCC table, if needed. */
if ((mminfo->format == GR_TEXFMT_YIQ_422) ||
(mminfo->format == GR_TEXFMT_AYIQ_8422)) {
int table; /* ncc table we'll use */
/* See if it's already down there */
if (gc->tmu_state[tmu].ncc_mmids[0] == mmid) {
/* Table 0 has what we need, so make it current */
table = 0;
} else if (gc->tmu_state[tmu].ncc_mmids[1] == mmid) {
/* Table 1 has what we need, so make it current */
table = 1;
} else {
/*
** it's not down there, so we need to pick the table and
** download it
*/
/* Which table should we use? */
table = gc->tmu_state[tmu].next_ncc_table;
/* Download NCC table */
_grTexDownloadNccTable(tmu, table, &mminfo->ncc_table, 0, 11);
/* Set the mmid so we known it's down there */
gc->tmu_state[tmu].ncc_mmids[table] = mmid;
/* Set the state to know which table was the LRA */
gc->tmu_state[tmu].next_ncc_table = (table == 0 ? 1 : 0);
} /* we had to download it */
/*
** Setting the TNCCSelect bit to 0 selects table 0, setting it to 1
** selects table 1
*/
if (table == 0)
texMode &= ~(SST_TNCCSELECT);
else
texMode |= SST_TNCCSELECT;
} /* if it's an NCC texture */
/* Force LOD dithering if the user asked for it.
*
* NB: There is a performance hit for this, but it does
* look better.
*/
texMode |= _GlideRoot.environment.texLodDither;
/* Write relevant registers out to hardware */
hw = SST_TMU(hw, tmu);
REG_GROUP_BEGIN((0x02UL << tmu), textureMode, 3, 0x0B);
{
REG_GROUP_SET(hw, textureMode, texMode);
REG_GROUP_SET(hw, tLOD, tLod);
REG_GROUP_SET(hw, texBaseAddr, baseAddress);
}
REG_GROUP_END();
/* update shadows */
gc->state.tmu_config[tmu].texBaseAddr = baseAddress;
gc->state.tmu_config[tmu].textureMode = texMode;
gc->state.tmu_config[tmu].tLOD = tLod;
GR_END();
#undef FN_NAME
} /* guTexSource */

View File

@@ -1,590 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.1.1.1.2.1 2005/01/22 14:52:02 koolsmoky
** enabled packed argb for cmd packet type 3
**
** Revision 1.1.1.1 1999/12/07 21:49:11 joseph
** Initial checkin into SourceForge.
**
**
** 61 3/17/98 3:00p Peter
** removed vertex sorting
*
* 60 12/01/97 6:13p Peter
* non-packet3 tsu triangles ooz vs z
*
* 59 11/21/97 3:20p Peter
* direct writes tsu registers
*
* 58 11/18/97 4:36p Peter
* chipfield stuff cleanup and w/ direct writes
*
* 57 11/17/97 4:55p Peter
* watcom warnings/chipfield stuff
*
* 56 11/12/97 9:54p Peter
* fixed all the muckage from new config
*
* 55 11/03/97 4:38p Peter
* yapc fix
*
* 54 11/01/97 10:01a Peter
* tri dispatch stuff
*
* 53 10/29/97 2:45p Peter
* C version of Taco's packing code
*
* 52 10/27/97 5:59p Peter
* removed some debugging code
*
* 51 10/21/97 3:22p Peter
* hand pack rgb
*
* 50 10/19/97 12:51p Peter
* no tsu happiness
*
* 49 10/19/97 10:59a Peter
* fixed p1 tsu writes
*
* 48 10/17/97 3:15p Peter
* removed unused addr field from datalist
*
* 47 10/17/97 10:15a Peter
* packed rgb state cleanup
*
* 46 10/16/97 5:33p Peter
* argb != rgba
*
* 45 10/16/97 3:40p Peter
* packed rgb
*
* 44 10/16/97 10:31a Peter
* fixed hoopti tsu-subtractor unsorted
*
* 43 10/15/97 5:53p Peter
* hoopti tri compare code
*
* 42 10/10/97 4:33p Peter
* non-packet3 tsu triangles
*
* 41 10/08/97 5:19p Peter
* optinally clamp only texture params
*
* 40 10/08/97 11:32a Peter
* pre-computed packet headers for packet 3
*
* 39 9/20/97 4:42p Peter
* tri_setf fixup/big fifo
*
* 38 9/16/97 2:50p Peter
* fixed watcom unhappiness w/ static initializers
*
* 37 9/15/97 7:31p Peter
* more cmdfifo cleanup, fixed normal buffer clear, banner in the right
* place, lfb's are on, Hmmmm.. probably more
*
* 36 9/10/97 10:13p Peter
* fifo logic from GaryT, non-normalized fp first cut
*
* 35 9/03/97 2:11p Peter
* start gdbg_info cleanup, fixed zero area no-tsu triangle muckage
*
* 34 9/01/97 3:19p Peter
* no-tsu w from vertex not tmuvtx
*
* 33 8/31/97 4:06p Peter
* no tsu fix
*
* 32 8/31/97 12:04p Peter
* hacked no-tsu code
*
* 31 7/25/97 11:40a Peter
* removed dHalf, change field name to match real use for cvg
*
* 30 6/30/97 3:22p Peter
* cmd fifo sanity
*
* 29 6/24/97 4:02p Peter
* proper cmd fifo placement
*
* 28 6/23/97 4:43p Peter
* cleaned up #defines etc for a nicer tree
**
*/
#include <3dfx.h>
#include <glidesys.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
#ifdef GDBG_INFO_ON
/* Some debugging information */
static char *indexNames[] = {
"GR_VERTEX_X_OFFSET", /* 0 */
"GR_VERTEX_Y_OFFSET", /* 1 */
"GR_VERTEX_Z_OFFSET", /* 2 */
"GR_VERTEX_R_OFFSET", /* 3 */
"GR_VERTEX_G_OFFSET", /* 4 */
"GR_VERTEX_B_OFFSET", /* 5 */
"GR_VERTEX_OOZ_OFFSET", /* 6 */
"GR_VERTEX_A_OFFSET", /* 7 */
"GR_VERTEX_OOW_OFFSET", /* 8 */
"GR_VERTEX_SOW_TMU0_OFFSET", /* 9 */
"GR_VERTEX_TOW_TMU0_OFFSET", /* 10 */
"GR_VERTEX_OOW_TMU0_OFFSET", /* 11 */
"GR_VERTEX_SOW_TMU1_OFFSET", /* 12 */
"GR_VERTEX_TOW_TMU1_OFFSET", /* 13 */
"GR_VERTEX_OOW_TMU1_OFFSET" /* 14 */
};
#endif
/*
** _trisetup_nogradients
**
** This routine does all the setup needed for drawing a triangle. It
** is intended to be an exact specification for the mechanisim used
** to pass vertices to the assembly language triangle setup code, and
** as such has no optimizations at all. Whenever a 'shortcut'
** routine to draw triangles (such as for antialiasing, fast lines,
** fast spans, polygons, etc) is needed, this code should be used as
** the starting point.
**
*/
GR_DDFUNC(_trisetup_nogradients,
FxI32,
(const GrVertex *va, const GrVertex *vb, const GrVertex *vc))
{
#define FN_NAME "_trisetup_nogradients"
GR_DCL_GC;
_GlideRoot.stats.trisProcessed++;
#if GLIDE_TRI_CULLING
{
const float *fa = &va->x;
const float *fb = &vb->x;
const float *fc = &vc->x;
float dxAB, dxBC, dyAB, dyBC;
/* Compute Area */
dxAB = fa[GR_VERTEX_X_OFFSET] - fb[GR_VERTEX_X_OFFSET];
dxBC = fb[GR_VERTEX_X_OFFSET] - fc[GR_VERTEX_X_OFFSET];
dyAB = fa[GR_VERTEX_Y_OFFSET] - fb[GR_VERTEX_Y_OFFSET];
dyBC = fb[GR_VERTEX_Y_OFFSET] - fc[GR_VERTEX_Y_OFFSET];
/* Stash the area in the float pool for easy access */
_GlideRoot.pool.ftemp1 = dxAB * dyBC - dxBC * dyAB;
#define FloatVal(__f) (((__f) < 786432.875) ? (__f) : ((__f) - 786432.875))
{
const FxI32 j = *(FxI32*)&_GlideRoot.pool.ftemp1;
const FxU32 culltest = (gc->state.cull_mode << 31UL);
/* Zero-area triangles are BAD!! */
if ((j & 0x7FFFFFFF) == 0) {
GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n",
FloatVal(fa[0]), FloatVal(fa[1]),
FloatVal(fb[0]), FloatVal(fb[1]),
FloatVal(fc[0]), FloatVal(fc[1]),
_GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest);
return 0;
}
/* Backface culling, use sign bit as test */
if ((gc->state.cull_mode != GR_CULL_DISABLE) && (((FxI32)(j ^ culltest)) >= 0)) {
GDBG_INFO(291, FN_NAME": Culling (%g %g) (%g %g) (%g %g) : (%g : 0x%X : 0x%X)\n",
FloatVal(fa[0]), FloatVal(fa[1]),
FloatVal(fb[0]), FloatVal(fb[1]),
FloatVal(fc[0]), FloatVal(fc[1]),
_GlideRoot.pool.ftemp1, gc->state.cull_mode, culltest);
return -1;
}
}
}
#endif /* GLIDE_TRI_CULLING */
/* Stuff for using hw tsu */
#if GLIDE_HW_TRI_SETUP
{
const float* vectorArray[3];
/* Load up the real vertices */
vectorArray[0] = &va->x;
vectorArray[1] = &vb->x;
vectorArray[2] = &vc->x;
#if GLIDE_PACKET3_TRI_SETUP
GR_SET_EXPECTED_SIZE(_GlideRoot.curTriSize, 1);
TRI_BEGIN();
{
int vectorIndex;
for(vectorIndex = 0; vectorIndex < sizeof(vectorArray) / sizeof(float*); vectorIndex++) {
const float* const vector = vectorArray[vectorIndex];
/* Triangle vertex coordinages (x, y) */
TRI_SETF(vector[GR_VERTEX_X_OFFSET]);
TRI_SETF(vector[GR_VERTEX_Y_OFFSET]);
/* Other triangle parameters */
{
const int* dataList = gc->tsuDataList;
#if GLIDE_PACKED_RGB
if ((gc->cmdTransportInfo.paramMask & SSTCP_PKT3_PACKEDCOLOR) != 0)
{
FxBool doColorP = FXFALSE;
FxU32 packedColor = 0x00;
if (*dataList == (GR_VERTEX_R_OFFSET << 2)) {
packedColor = (RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_B_OFFSET << 2)), B) |
RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_G_OFFSET << 2)), G) |
RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_R_OFFSET << 2)), R));
dataList++;
doColorP = FXTRUE;
}
if (*dataList == (GR_VERTEX_A_OFFSET << 2)) {
packedColor |= RGBA_COMP_CLAMP(FARRAY(vector, (GR_VERTEX_A_OFFSET << 2)), A);
dataList++;
doColorP = FXTRUE;
}
if (doColorP) TRI_SET(packedColor);
}
#endif /* GLIDE_PACKED_RGB */
#if GLIDE_FP_CLAMP_TEX
while(*dataList != 0) {
TRI_SETF(FARRAY(vector, *dataList));
dataList++;
}
dataList++;
#endif /* GLIDE_FP_CLAMP_TEX */
while(*dataList != 0) {
TRI_SETF_CLAMP(FARRAY(vector, *dataList));
dataList++;
}
}
}
}
TRI_END;
GR_CHECK_SIZE();
#else /* !GLIDE_PACKET3_TRI_SETUP */
{
GR_DCL_HW;
int vectorIndex;
FxU32 sMode = (gc->cmdTransportInfo.paramMask >> SSTCP_PKT3_PMASK_SHIFT);
FxU32 paramMask = (sMode & 0xFF);
FxU32 paramCount;
/* Convert packet 3 paramMask into sMode format */
sMode = (paramMask | ((sMode & 0xF000) << 4));
{
const FxBool hasColor = ((sMode & 0x01) != 0);
const FxBool hasAlpha = ((sMode & 0x02) != 0);
const FxBool hasZ = ((sMode & 0x04) != 0);
const FxBool hasWb = ((sMode & 0x08) != 0);
const FxBool hasW0 = ((sMode & 0x10) != 0);
const FxBool hasST0 = ((sMode & 0x20) != 0);
const FxBool hasW1 = ((sMode & 0x40) != 0);
const FxBool hasST1 = ((sMode & 0x80) != 0);
/* We always send vertex XY */
paramCount = 2;
paramMask = 0x03;
/* Build parameter data for reg group packet */
#if GLIDE_PACKED_RGB
if (hasColor || hasAlpha) {
paramCount += 1;
paramMask |= 0x04;
}
#else /* !GLIDE_PACKED_RGB */
if (hasColor) {
paramCount += 3;
paramMask |= 0x38;
}
if (hasAlpha) {
paramCount += 1;
paramMask |= 0x40;
}
#endif /* !GLIDE_PACKED_RGB */
if (hasZ) {
paramCount += 1;
paramMask |= 0x80;
}
if (hasWb) {
paramCount += 1;
paramMask |= 0x100;
}
if (hasW0) {
paramCount += 1;
paramMask |= 0x200;
}
if (hasST0) {
paramCount += 2;
paramMask |= 0xC00;
}
if (hasW1) {
paramCount += 1;
paramMask |= 0x1000;
}
if (hasST1) {
paramCount += 2;
paramMask |= 0x6000;
}
/* Set mode once for teh whole triangle */
GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1);
GR_SET(BROADCAST_ID, hw, sSetupMode, sMode);
GR_CHECK_SIZE();
for(vectorIndex = 0; vectorIndex < sizeof(vectorArray) / sizeof(float*); vectorIndex++) {
const GrVertex* curVertex = (const GrVertex*)vectorArray[vectorIndex];
REG_GROUP_BEGIN(BROADCAST_ID, sVx, paramCount, paramMask);
{
REG_GROUP_SETF(hw, sVx, curVertex->x);
REG_GROUP_SETF(hw, sVy, curVertex->y);
#if GLIDE_PACKED_RGB
if (hasColor || hasAlpha) {
FxU32 packedVal = 0x00;
if (hasColor) packedVal = ((RGBA_COMP_CLAMP(curVertex->b, B) << 0UL) |
(RGBA_COMP_CLAMP(curVertex->g, G) << 8UL) |
(RGBA_COMP_CLAMP(curVertex->r, R) << 16UL));
if (hasAlpha) packedVal |= (RGBA_COMP_CLAMP(curVertex->a, A) << 24UL);
REG_GROUP_SET(hw, sARGB, packedVal);
}
#else /* !GLIDE_PACKED_RGB */
if (hasColor) {
REG_GROUP_SETF(hw, sRed, curVertex->r);
REG_GROUP_SETF(hw, sGreen, curVertex->g);
REG_GROUP_SETF(hw, sBlue, curVertex->b);
}
if (hasAlpha) REG_GROUP_SETF(hw, sAlpha, curVertex->a);
#endif /* !GLIDE_PACKED_RGB */
if (hasZ) REG_GROUP_SETF(hw, sVz, curVertex->ooz);
if (hasWb) REG_GROUP_SETF(hw, sOowfbi, curVertex->oow);
/* TMU0 */
if (hasW0) REG_GROUP_SETF(hw, sOow0, curVertex->tmuvtx[0].oow);
if (hasST0) {
REG_GROUP_SETF(hw, sSow0, curVertex->tmuvtx[0].sow);
REG_GROUP_SETF(hw, sTow0, curVertex->tmuvtx[0].tow);
}
/* TMU1 */
if (hasW1) REG_GROUP_SETF(hw, sOow1, curVertex->tmuvtx[1].oow);
if (hasST1) {
REG_GROUP_SETF(hw, sSow1, curVertex->tmuvtx[1].sow);
REG_GROUP_SETF(hw, sTow1, curVertex->tmuvtx[1].tow);
}
}
REG_GROUP_END();
GR_SET_EXPECTED_SIZE(sizeof(FxU32), 1);
if (vectorIndex == 0) {
GR_SET(BROADCAST_ID, hw, sBeginTriCMD, 0);
} else {
GR_SET(BROADCAST_ID, hw, sDrawTriCMD, 0);
}
GR_CHECK_SIZE();
}
}
}
#endif /* !GLIDE_PACKET3_TRI_SETUP */
goto __triDrawn;
}
#endif /* GLIDE_HW_TRI_SETUP */
#if !GLIDE_HW_TRI_SETUP
#if !defined(GLIDE_TRI_CULLING) || !GLIDE_TRI_CULLING
#error "GLIDE_TRI_CULLING must be enabled to sort vertices"
#endif
{
GR_DCL_HW;
TRI_NO_TSU_BEGIN(FXTRUE);
{
const float ooa = _GlideRoot.pool.f1 / _GlideRoot.pool.ftemp1;
volatile FxU32* hwAddr = &hw->FvA.x;
/* Divide the deltas by the area for gradient calculation. */
dxBC *= ooa;
dyAB *= ooa;
dxAB *= ooa;
dyBC *= ooa;
GDBG_INFO(85, FN_NAME": No-TSU Triangle area: (%g %g) : (%g %g %g %g)\n",
_GlideRoot.pool.ftemp1, ooa,
dxAB, dxBC, dyAB, dyBC);
/* write out X & Y for vertex A */
TRI_NO_TSU_SETF(hwAddr++, fa[GR_VERTEX_X_OFFSET]);
TRI_NO_TSU_SETF(hwAddr++, fa[GR_VERTEX_Y_OFFSET]);
/* write out X & Y for vertex B */
TRI_NO_TSU_SETF(hwAddr++, fb[GR_VERTEX_X_OFFSET]);
TRI_NO_TSU_SETF(hwAddr++, fb[GR_VERTEX_Y_OFFSET]);
/* write out X & Y for vertex C */
TRI_NO_TSU_SETF(hwAddr++, fc[GR_VERTEX_X_OFFSET]);
TRI_NO_TSU_SETF(hwAddr++, fc[GR_VERTEX_Y_OFFSET]);
/* Send down the starting parameter values, these come from
* the sorted vertex A.
*/
{
int i = GR_VERTEX_R_OFFSET;
while(i < GR_VERTEX_OOW_OFFSET) {
TRI_NO_TSU_SETF(hwAddr++, fa[i++]);
}
/* Skip fbi oow */
i++;
/* FixMe? We currently only do one tmu. */
while(i < GR_VERTEX_OOW_TMU0_OFFSET) {
TRI_NO_TSU_SETF(hwAddr++, fa[i]);
i++;
}
TRI_NO_TSU_SETF(hwAddr++, fa[GR_VERTEX_OOW_OFFSET]);
}
/* Send the x gradients */
{
int i = GR_VERTEX_R_OFFSET;
while(i < GR_VERTEX_OOW_OFFSET) {
const float curGrad = (((fa[i] - fb[i]) * dyBC) -
((fb[i] - fc[i]) * dyAB));
GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n",
((FxU32)hwAddr - (FxU32)hw) >> 2,
fa[i], fb[i], fc[i], curGrad);
TRI_NO_TSU_SETF(hwAddr++, curGrad);
i++;
}
/* Skip fbi oow */
i++;
/* FixMe? We currently only do one tmu. */
while(i < GR_VERTEX_OOW_TMU0_OFFSET) {
const float curGrad = (((fa[i] - fb[i]) * dyBC) -
((fb[i] - fc[i]) * dyAB));
GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n",
((FxU32)hwAddr - (FxU32)hw) >> 2,
fa[i], fb[i], fc[i], curGrad);
TRI_NO_TSU_SETF(hwAddr++, curGrad);
i++;
}
{
const float curGrad = (((fa[GR_VERTEX_OOW_OFFSET] - fb[GR_VERTEX_OOW_OFFSET]) * dyBC) -
((fb[GR_VERTEX_OOW_OFFSET] - fc[GR_VERTEX_OOW_OFFSET]) * dyAB));
TRI_NO_TSU_SETF(hwAddr++, curGrad);
}
}
/* Send the y gradients */
{
int i = GR_VERTEX_R_OFFSET;
while(i < GR_VERTEX_OOW_OFFSET) {
const float curGrad = (((fb[i] - fc[i]) * dxAB) -
((fa[i] - fb[i]) * dxBC));
GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n",
((FxU32)hwAddr - (FxU32)hw) >> 2,
fa[i], fb[i], fc[i], curGrad);
TRI_NO_TSU_SETF(hwAddr++, curGrad);
i++;
}
/* Skip fbi oow */
i++;
/* FixMe? We currently only do one tmu. */
while(i < GR_VERTEX_OOW_TMU0_OFFSET) {
const float curGrad = (((fb[i] - fc[i]) * dxAB) -
((fa[i] - fb[i]) * dxBC));
GDBG_INFO(285, FN_NAME": Gradient 0x%X : %g %g %g : %g\n",
((FxU32)hwAddr - (FxU32)hw) >> 2,
fa[i], fb[i], fc[i], curGrad);
TRI_NO_TSU_SETF(hwAddr++, curGrad);
i++;
}
{
const float curGrad = (((fb[GR_VERTEX_OOW_OFFSET] - fc[GR_VERTEX_OOW_OFFSET]) * dxAB) -
((fa[GR_VERTEX_OOW_OFFSET] - fb[GR_VERTEX_OOW_OFFSET]) * dxBC));
TRI_NO_TSU_SETF(hwAddr++, curGrad);
}
}
/* Draw the triangle by writing the area to the triangleCMD register */
TRI_NO_TSU_SETF(hwAddr, _GlideRoot.pool.ftemp1);
_GlideRoot.stats.trisDrawn++;
}
TRI_NO_TSU_END();
}
goto __triDrawn;
#endif /* !GLIDE_HW_TRI_SETUP */
__triDrawn:
/* If we made it this far then we drew the triangle */
_GlideRoot.stats.trisDrawn++;
GR_CHECK_SIZE();
return 1;
#undef FN_NAME
} /* _trisetup_nogradients */

View File

@@ -1,314 +0,0 @@
#
# THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
# PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
# TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
# INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
# DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
# THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
# EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
# FULL TEXT OF THE NON-WARRANTY PROVISIONS.
#
# USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
# RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
# TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
# AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
# SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
# THE UNITED STATES.
#
# COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
TAG_REGEXP = $(BUILD_ROOT)\$(FX_GLIDE_HW)\glide\src\glide.rx
# Compile for specific hardware
!if "$(FX_GLIDE_HW)" == "cvg"
FX_GLIDE_REAL_HW= 1
!if "$(FX_GLIDE_CTRISETUP)" == ""
FX_GLIDE_CTRISETUP = 0
!endif
HWSPEC = fifo.c
LCDEFS = $(LCDEFS) -DCVG \
-DGLIDE_CHIP_BROADCAST=1 -DGLIDE_DEFAULT_GAMMA=1.3f
LCDEFS = $(LCDEFS) \
-DGLIDE_BLIT_CLEAR=1 \
!else if "$(FX_GLIDE_HW)" == "h3"
FX_GLIDE_REAL_HW= 1
FX_GLIDE_NO_FIFO= 1
FX_GLIDE_CTRISETUP = 1
HWSPEC = fifo.c
LCDEFS = $(LCDEFS) -DH3 \
-DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=0
!else
!error "FX_GLIDE_HW == unknown value (h3|cvg)"
!endif
!if "$(FX_GLIDE_VTUNE)"!=""
OTSOPTS = /Zi
LLDOPTS = /DEBUG
!endif
!if "$(DEBUG)" == "1"
DBGOPTS = -DGLIDE_DEBUG -DGDBG_INFO_ON
GLIDE_SANITY_ALL = 1
!endif
!if "$(FX_COMPILER)" == "MICROSOFT"
DBGOPTS = $(DBGOPTS) /WX
!endif
!if "$(FX_GLIDE_HW)" == ""
!error "FX_GLIDE_HW not defined"
!endif
# Display Options
DSPOPTS =
SUBLIBRARIES =
!if ("$(HAL_HW)" != "")
DSPOPTS = $(DSPOPTS) -DHAL_HW=1
SUBLIBRARIES = $(SUBLIBRARIES) $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\sst1init.lib
!endif
!if !defined(DSPOPTS)
!error "Unknown HAL_* configuration"
!endif
# GLIDE_HW_TRI_SETUP: Use the hw TSU for triangle rendering.
!if "$(FX_GLIDE_SW_SETUP)" == "1"
LCDEFS = $(LCDEFS) -DGLIDE_HW_TRI_SETUP=0 -DGLIDE_TRI_CULLING=1
FX_GLIDE_CTRISETUP = 1
!else # HW Setup
# Do culling test in sw for independent triangles
CULL_MODE = -DGLIDE_TRI_CULLING=0
!if "$(FX_GLIDE_HW_CULL)" != "1"
CULL_MODE = -DGLIDE_TRI_CULLING=1
!endif
DSPOPTS = $(DSPOPTS) $(CULL_MODE)
# Send a single DWORD ARGB rather than 4 fp values, at
# the cost of doing the conversion.
!if "$(FX_GLIDE_PACK_RGB)" == "1"
LCDEFS = $(LCDEFS) -DGLIDE_PACKED_RGB=1
!endif
!endif # HW Tri Setup
!if "$(FX_GLIDE_NO_FIFO)" != "1"
FIFODEFS = -DUSE_PACKET_FIFO=1 \
-DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKET3_TRI_SETUP=1 \
!if "$(FX_GLIDE_DEBUG_FIFO)" == "1"
# GLIDE_USE_DEBUG_FIFO: Run w/ the small fifo to cause me/glide more stress
# FIFO_ASSERT_FULL: Check hw depth/fifo a lot (slow)
LCDEFS = $(LCDEFS) \
-DGLIDE_USE_DEBUG_FIFO=1 -DFIFO_ASSERT_FULL=1 \
-DASSERT_FAULT=0 #-DGLIDE_SANITY_SIZE=1
!endif # FX_GLIDE_DEBUG_FIFO
!else # FX_GLIDE_NO_FIFO == 1
FX_GLIDE_CTRISETUP = 1
FIFODEFS = -DGLIDE_HW_TRI_SETUP=1
!endif
# Optimization Options
# This is for turning on and off algorithmic optimizations,
# not flags to the C compiler. Usually this involves
# enabling/disabling assembly language code, but it can also
# change the way C code works, or how C code generates data to be
# used by various pieces of code.
# Usually these are set with environment variables or arguments to
# nmake.
#
# Turn on/off assembly language trisetup code.
# (C on is Assembly off) (A ssembly T ri S etup OPTS)
!if "$(FX_GLIDE_CTRISETUP)" == "1"
ASMTRISETUP =
ATSOPTS = -DGLIDE_USE_C_TRISETUP
CFILES = gxdraw.c
!else
ASMTRISETUP = xdraw2.asm
DSPOPTS = $(DSPOPTS) -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_PACKED_RGB=0
!endif
OPTOPTS = $(GRMOPTS) $(OTSOPTS) $(ATSOPTS)
# local defines, begin with basics and then add on
LCDEFS = $(LCDEFS) -DGLIDE_LIB
!if "$(FX_GLIDE_CRYBABY)" == "1"
LCDEFS = $(LCDEFS) -DGLIDE_CHECK_COMPATABILITY=1
!endif
# Turn Off/On compilation of shameless plug
!if "$(FX_GLIDE_NO_PLUG)" == "1"
!else
LCDEFS = $(LCDEFS) -DGLIDE_PLUG
!endif
# Turn Off/On splash screen
!if "$(FX_GLIDE_NO_SPLASH)" == "1"
!else
LCDEFS = $(LCDEFS) -DGLIDE_SPLASH
!endif
!if "$(FX_PCI_TARGET)" == "NT"
LCDEFS = $(LCDEFS) -DNT_BUILD
!endif
#Glide 3 Stuff, for migration all
!if "$(FX_GLIDE3)" != ""
LCDEFS = $(LCDEFS) -DGLIDE3
GLIDE3FILES = gstrip.c distrip.c distate.c diget.c
!endif
#Glide 3. remove migration stuff
!if "$(FX_GLIDE3_ALPHA)" != ""
LCDEFS = $(LCDEFS) -DGLIDE3_ALPHA
GLIDE3FILES = gstrip.c distrip.c distate.c diget.c
!endif
!if defined(GLIDE_SANITY_ALL) || defined(GLIDE_SANITY_SIZE)
LCDEFS = $(LCDEFS) -DGLIDE_SANITY_SIZE
!endif
!if defined(GLIDE_SANITY_ALL) || defined(GLIDE_SANITY_ASSERT)
LCDEFS = $(LCDEFS) -DGLIDE_SANITY_ASSERT
!endif
# Local Defs, Includes, and Options (C)
LCINCS = $(LCINCS) -I$(BUILD_ROOT)\$(FX_GLIDE_HW)\include
LCOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS)
# Local Defs, Includes, and Options (ASM)
LADEFS = $(LADEFS) $(ASM_REGMAP_DEFS)
LAINCS = -I$(BUILD_ROOT)\$(FX_GLIDE_HW)\include
LAOPTS = $(DBGOPTS) $(DSPOPTS) $(OPTOPTS) /Fl /Sa
AFILES = $(ASMTRISETUP) cpudtect.asm
# sources
HEADERS = glide.h gump.h glidesys.h glideutl.h
PRIVATE_HEADERS = fxglide.h gsstdef.h fxinline.h
INSTALL_DESTINATION = $(BUILD_ROOT)\$(FX_GLIDE_HW)
CFILES = $(CFILES) gsplash.c g3df.c gu.c guclip.c gpci.c gump.c\
diglide.c disst.c ditex.c gbanner.c gerror.c\
gmovie.c digutex.c ddgump.c gaa.c gdraw.c\
gglide.c glfb.c gsst.c gtex.c gtexdl.c\
gutex.c $(HWSPEC) $(GLIDE3FILES)
OFILES = $(CFILES:.c=.obj)
OTHER_CFILES = fxgasm.c fxbldno.c fxinline.h
CODFILES = $(CFILES:.c=.cod)
# targets
LDIRT = fxgasm.obj fxgasm.exe fxgasm.h fxinline.h fxbldno.obj fxbldno.exe fxbldno.h
!if "$(FX_GLIDE3)" == "1"
LIBRARIES = glide3x.lib
!else
LIBRARIES = glide2x.lib
!endif
RCFILE = glide.rc
# Make a static link library for things like the diags.
!if "$(FX_DLL_BUILD)" == "1"
FX_DLL_LIBRARY = 1
!else
LCDEFS = $(LCDEFS) -DFX_STATIC_BUILD
!endif
LCDEFS = $(LCDEFS) $(FIFODEFS)
!include $(BUILD_ROOT)\swlibs/include/nmake/3dfx.mak
codfiles: $(CODFILES)
xdraw2.obj : xdraw2.asm xdraw2.inc fxgasm.h fxinline.h
ctags: $(CFILES)
ctags $(CFILES)
gbanner.obj : banner.inc
gsplash.obj : splshdat.c
!if "$(FX_TARGET)" == "WIN32"
!if "$(FX_DLL_BUILD)" != ""
glide2x.dll:
del fxbldno.h
!endif
!endif
!if "$(FX_TARGET)" == "DOS"
!if "$(FX_DLL_BUILD)" != ""
glimport.obj: glimport.asm
IMPORT_DEPS = $(BUILD_ROOT)\swlibs\lib\dllload.lib \
$(DLLLOADS) glimport.obj
glide2x.lib: $(IMPORT_DEPS)
if exist glide2x.lib del glide2x.lib
wlib glide2x.lib +$(BUILD_ROOT)\swlibs\lib\dllload.lib +glimport.obj
!if "$(FX_WATCOM_REG_CALL)" != "1"
wlib glide2x.lib +$(BUILD_ROOT)\swlibs\lib\dllloads.obj
!endif
if exist $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib attrib -r $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib
if exist $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib del $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib
xcopy /d /k /r /i /s /q glide2x.lib $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib
attrib +r $(BUILD_ROOT)\$(FX_GLIDE_HW)\lib\glide2x.lib
!endif
!endif
!if "$(FX_COMPILER)" == "WATCOM"
#------------------------------------------------------------
# special rul for makeing glideapi.obj under WATCOM
#
glideapi.obj : glideapi.c
set $(CC_ENV_VAR)=-d2 $(GCFLAGS) $(LCFLAGS) $(VCFLAGS)
$(CC) glideapi.c
!endif
#--------------------------------------------------------------------------
# special rules for making FXGASM.H
#
fxgasm.exe: fxgasm.c $(HEADERS) gsstdef.h fxglide.h Makefile
!if "$(FX_COMPILER)" == "MICROSOFT"
$(CC) -o $@ fxgasm.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) \
-I$(BUILD_ROOT)\$(FX_GLIDE_HW)\include -I$(BUILD_ROOT)\swlibs\include $(LDFLAGS)
!else if "$(FX_COMPILER)" == "WATCOM"
set WCC386=$(CFLAGS)
wcl386 fxgasm.c
!endif
fxgasm.h: fxgasm.exe
fxgasm -hex > fxgasm.h
fxinline.h: fxgasm.exe
fxgasm -inline > fxinline.h
#--------------------------------------------------------------------------
# special rules for making FXBLDNO.H
#
fxbldno.exe: fxbldno.c $(HEADERS) $(PRIVATE_HEADERS)
!if "$(FX_COMPILER)" == "MICROSOFT"
$(CC) -o $@ fxbldno.c $(GCDEFS) $(LCDEFS) $(VCDEFS) $(LCOPTS) $(LDFLAGS)
!else if "$(FX_COMPILER)" == "WATCOM"
set WCC386=$(CFLAGS)
wcl386 fxbldno.c
!endif
fxbldno.h: fxbldno.exe
fxbldno > fxbldno.h
glide.res: rcver.h fxbldno.h
gglide.obj: rcver.h
!if "$(FX_GLIDE_CTRISETUP)" != "1"
gdraw.obj: fxinline.h
!endif

View File

@@ -1,335 +0,0 @@
# Linux makefile for Glide2/CVG
# This makefile MUST be processed by GNU make!!!
#
# $Id$
#
# Copyright (c) 2004 - Daniel Borca
# Email : dborca@users.sourceforge.net
# Web : http://www.geocities.com/dborca
#
# Copyright (c) 2004 - Hiroshi Morii
# Email : koolsmoky@users.sourceforge.net
# Web : http://www.3dfxzone.it/koolsmoky
#
# Copyright (c) 2006 - Guillem Jover <guillem@hadrons.org>
#
#
# Available options:
#
# Environment variables:
# FX_GLIDE_HW build for the given ASIC (cvg).
# default = cvg
# CPU optimize for the given processor.
# default = 6 (PentiumPro)
# DEBUG=1 disable optimizations and build for debug.
# default = no
# USE_X86=1 use assembler triangle specializations; req by CVG
# default = yes
# USE_3DNOW=1 allow 3DNow! specializations. However, the true CPU
# capabilities are still checked at run-time to avoid
# crashes.
# default = no
# USE_MMX=1 allow MMX specializations.
# default = no
# FXOEM2X=1 build fxoem2x.so
# default = no
#
# Targets:
# all: build everything
# glide2x: build Glide2x lib
# clean: remove object files
# realclean: remove all generated files
#
.PHONY: all glide2x clean realclean
.INTERMEDIATE: fxgasm
.SUFFIXES: .lo
export PATH := $(PATH):.
###############################################################################
# general defines (user settable?)
###############################################################################
GLIDE_VERSION_MAJOR = 2
GLIDE_VERSION_MINOR = 53
GLIDE_LIB = libglide.a
GLIDE_SO = libglide.so
GLIDE_SONAME = $(GLIDE_SO).$(GLIDE_VERSION_MAJOR)
GLIDE_SHARED = $(GLIDE_SONAME).$(GLIDE_VERSION_MINOR)
FX_GLIDE_HW ?= cvg
FX_GLIDE_SW = ../../../swlibs
GLIDE_LIBDIR = ../../lib
###############################################################################
# tools
###############################################################################
CC = gcc
AS = nasm
AR = ar
CP = cp
###############################################################################
# defines
###############################################################################
# platform
CDEFS = -DINIT_LINUX -D__3Dfx_PCI_CFG__
LDLIBS = -lm
# general
CDEFS += -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKED_RGB=0 -DGLIDE_TRI_CULLING=1 -DGLIDE_DEFAULT_GAMMA=1.3f -DGLIDE_LIB=1
#CDEFS += -DGLIDE3 -DGLIDE3_ALPHA -DGLIDE3_SCALER
# special sli buffer clears
CDEFS += -DGLIDE_BLIT_CLEAR=1
# workaround for CVGs with broken tsus which cannot send commands to multiple
# tmus using chipfield. chipfield will always be set to 0xf
CDEFS += -DGLIDE_CHIP_BROADCAST=1
# subsystem
CDEFS += -DCVG
# debug
ifdef DEBUG
CDEFS += -DGDBG_INFO_ON -DGLIDE_DEBUG -DGLIDE_SANITY_ASSERT -DGLIDE_SANITY_SIZE
endif
override USE_FIFO = 1
#override USE_X86 = 1
ifeq ($(USE_X86),1)
CDEFS += -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_DISPATCH_DOWNLOAD=1
override USE_FIFO = 1
CDEFS += -DHAVE_XDRAWTRI_ASM=1
override USE_DRAWTRI_ASM = 1
else
CDEFS += -DGLIDE_USE_C_TRISETUP=1
endif
# fifo
ifeq ($(USE_FIFO),1)
CDEFS += -DUSE_PACKET_FIFO=1 -DGLIDE_PACKET3_TRI_SETUP=1
endif
# other
CDEFS += -DGLIDE_PLUG -DGLIDE_SPLASH
###############################################################################
# flags
###############################################################################
# librarian
ARFLAGS = rus
# assembler
ASFLAGS = -O6 -felf -D__linux__
ASFLAGS += $(CDEFS)
# compiler
CFLAGS = -Wall -W
CFLAGS += -I. -I../../incsrc -I../../init
CFLAGS += -I$(FX_GLIDE_SW)/fxmisc -I$(FX_GLIDE_SW)/newpci/pcilib -I$(FX_GLIDE_SW)/fxmemmap
CFLAGS += $(CDEFS)
# cpu optimized triangle
ifeq ($(USE_MMX),1)
CFLAGS += -DGL_MMX
override USE_X86 = 1
endif
ifeq ($(USE_3DNOW),1)
CFLAGS += -DGL_AMD3D
override USE_X86 = 1
endif
ifeq ($(USE_X86),1)
CFLAGS += -DGL_X86 -DBIG_OPT
OPTFLAGS ?= -O6 -march=pentium2 -mtune=pentium3 -fomit-frame-pointer -funroll-loops \
-fexpensive-optimizations -ffast-math -Wno-unused
else
CFLAGS += -DGLIDE_USE_C_TRISETUP
OPTFLAGS ?= -O6 -march=pentium2 -mtune=pentium3 -ffast-math -Wno-unused
endif
# optflags
CFLAGS += $(OPTFLAGS)
###############################################################################
# objects
###############################################################################
GLIDE_OBJECTS = \
fifo.o \
gsplash.o \
g3df.o \
gu.o \
guclip.o \
gpci.o \
gump.o \
diglide.o \
disst.o \
ditex.o \
gbanner.o \
gerror.o \
gmovie.o \
digutex.o \
ddgump.o \
gaa.o \
gdraw.o \
gglide.o \
glfb.o \
gsst.o \
gtex.o \
gtexdl.o \
gutex.o \
cpuid.o \
fpu.o \
xtexdl_def.o
ifeq ($(USE_DRAWTRI_ASM),1)
GLIDE_OBJECTS += xdrawtri.o
endif
ifeq ($(USE_X86),1)
GLIDE_OBJECTS += \
xdraw2_def.o
ifeq ($(USE_MMX),1)
GLIDE_OBJECTS += \
xtexdl_mmx.o
endif
ifeq ($(USE_3DNOW),1)
GLIDE_OBJECTS += \
xdraw2_3dnow.o \
xtexdl_3dnow.o
endif
else
GLIDE_OBJECTS += \
gxdraw.o
endif
GLIDE_OBJECTS += \
$(FX_GLIDE_SW)/newpci/pcilib/fxpci.o \
$(FX_GLIDE_SW)/newpci/pcilib/fxlinux.o \
$(FX_GLIDE_SW)/newpci/pcilib/fxmsr.o \
../../init/canopus.o \
../../init/dac.o \
../../init/gamma.o \
../../init/gdebug.o \
../../init/info.o \
../../init/parse.o \
../../init/print.o \
../../init/sli.o \
../../init/sst1init.o \
../../init/util.o \
../../init/video.o
# FIXME: needed for now to match the old library signature, should be checked
# if it's really needed.
GLIDE_OBJECTS += \
$(FX_GLIDE_SW)/fxmisc/fxos.o \
$(FX_GLIDE_SW)/fxmisc/fximg.o
###############################################################################
# rules
###############################################################################
.c.o:
$(CC) -o $@ $(CFLAGS) -c $<
.c.lo:
$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -c $<
###############################################################################
# main
###############################################################################
all: glide2x fxoem2x
glide2x: $(GLIDE_LIBDIR)/$(GLIDE_LIB) $(GLIDE_LIBDIR)/$(GLIDE_SO)
$(GLIDE_LIBDIR)/$(GLIDE_LIB): $(GLIDE_OBJECTS)
$(AR) $(ARFLAGS) $@ $^
$(GLIDE_LIBDIR)/$(GLIDE_SO): $(GLIDE_LIBDIR)/$(GLIDE_SHARED)
ln -fs $(GLIDE_SHARED) $(GLIDE_LIBDIR)/$(GLIDE_SO)
$(GLIDE_LIBDIR)/$(GLIDE_SHARED): $(GLIDE_OBJECTS:.o=.lo)
$(CC) -o $@ -shared -Wl,-soname,$(GLIDE_SONAME) $^ $(LDFLAGS) $(LDLIBS)
ifeq ($(FXOEM2X),1)
$(GLIDE_LIBDIR)/libfxoem2x.so: ../oem/oeminit.o
# $(LD) -o $@ $(LDFLAGS) ../oem/oeminit.o $(LDLIBS)
else
$(GLIDE_LIBDIR)/libfxoem2x.so:
# $(warning FxOem2x not enabled... Skipping libfxoem2x.so)
endif
fxoem2x: $(GLIDE_LIBDIR)/libfxoem2x.so
###############################################################################
# rules(2)
###############################################################################
#cpuid.o: cpudtect.asm
# $(AS) -o $@ $(ASFLAGS) $<
xdraw2_def.o: xdraw2.asm
$(AS) -o $@ $(ASFLAGS) $<
xtexdl_def.o: xtexdl.c
$(CC) -o $@ $(CFLAGS) -c $<
xtexdl_mmx.o: xtexdl.asm
$(AS) -o $@ $(ASFLAGS) -DGL_MMX=1 $<
xdraw2_3dnow.o: xdraw2.asm
$(AS) -o $@ $(ASFLAGS) -DGL_AMD3D=1 $<
xtexdl_3dnow.o: xtexdl.asm
$(AS) -o $@ $(ASFLAGS) -DGL_AMD3D=1 $<
xdrawtri.o: xdrawtri.asm
$(AS) -o $@ $(ASFLAGS) $<
#cpuid.lo: cpuid.o
# $(CP) $< $@
xdraw2_def.lo: xdraw2_def.o
$(CP) $< $@
xtexdl_def.lo: xtexdl_def.o
$(CP) $< $@
xtexdl_mmx.lo: xtexdl_mmx.o
$(CP) $< $@
xdraw2_3dnow.lo: xdraw2_3dnow.o
$(CP) $< $@
xtexdl_3dnow.lo: xtexdl_3dnow.o
$(CP) $< $@
xdrawtri.lo: xdrawtri.o
$(CP) $< $@
$(GLIDE_OBJECTS): fxinline.h fxgasm.h
fxinline.h: fxgasm
./$< -inline > $@
fxgasm.h: fxgasm
./$< -hex > $@
fxgasm: fxgasm.c
$(CC) -o $@ $(CFLAGS) $<
###############################################################################
# clean, realclean
###############################################################################
clean:
-$(RM) *.o *.lo
-$(RM) ../../init/*.o ../../init/*.lo
-$(RM) $(FX_GLIDE_SW)/newpci/pcilib/*.o $(FX_GLIDE_SW)/newpci/pcilib/*.lo
-$(RM) fxinline.h
-$(RM) fxgasm.h
realclean: clean
-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_LIB)
-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_SHARED)
-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_SO)

View File

@@ -1,34 +0,0 @@
/*#include "fxbldno.h"*/
#define MANVERSION 2
#define MANREVISION 56
#define BUILD_NUMBER 40405
#ifndef GLIDE3
#define VERSIONSTR "2.56\0"
#else
#define VERSIONSTR "3.0\0"
#endif
#if defined(CVG) || defined(VOODOO2)
# define HWSTR " Voodoo(tm)\0" /* [koolsmoky] NB do not change. Required
* by Metabyte WickedGL to detect V2.
*/
# ifdef NT_BUILD
# define PRODNAME "Glide(tm) for Voodoo^2\251 and Windows\256 NT\0"
# else
# define PRODNAME "Glide(tm) for Voodoo^2\251 and Windows\256 95/98\0"
# endif /* NT_BUILD */
#elif defined(H3)
# define HWSTR " Banshee(tm)\0"
# ifdef NT_BUILD
# define PRODNAME "Glide(tm) for Banshee\251 and Windows\256 NT\0"
# else
# define PRODNAME "Glide(tm) for Banshee\251 and Windows\256 95/98\0"
# endif /* NT_BUILD */
#else
# define PRODNAME "Something really, really important\0"
# define HWSTR "Unknown Chip\0"
#endif

View File

@@ -1,41 +0,0 @@
GDEBUG levels:
Level Description
----- ------------------------------------------------
80 init routines
81 gu3df*
82 grLfb*
83 grSst*
84 grSstStatus, grSstIsBusy, grSstVideoLine
85 gr* misc state routines
86 grBuffer*
87 grDisableAllEffects, grGlide?etState
88 grTex* attribute routines
89 grTex* download routines
90 grDrawPoint
91 grDrawLine
92 grDrawTriangle
93 grDrawPolygon*
94 grDrawAAPoint
95 grDrawAALine
96 grDrawAATriangle
97 grDrawAAPolygon*
98 guMP* routines
99 gu* misc. routines
280 internal init routines
281 routine exit traces
282 dataList values
GLIDE_PLATFORM:
GLIDE_HARDWARE:
Defined if GLIDE should use the actual SST hardware.
GLIDE_HW_*:
GLIDE_HW_SST1:
This macro is for compiling
GLIDE_HW_SST96:
This macro is for compiling Glide for SST96
GLIDE_HW_H3:
This macro is for compiling Glide for H3

File diff suppressed because it is too large Load Diff

View File

@@ -1,259 +0,0 @@
## THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
## PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
## TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
## INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
## DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
## THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
## EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
## FULL TEXT OF THE NON-WARRANTY PROVISIONS.
##
## USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
## RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
## TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
## AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
## SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
## THE UNITED STATES.
##
## COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
##
## $Header$
## $Revision$
## $Log$
## Revision 1.2 1999/12/11 00:42:21 joseph
## Changed \(.data) to .section .data to fix build errors with binutils 2.9.5.
##
## Revision 1.1.1.1 1999/12/07 21:49:13 joseph
## Initial checkin into SourceForge.
##
##
##
## 7 5/18/98 12:16p Peter
## culling enabling
#
# 6 1/15/98 1:12p Peter
# dispatch w/o packing
#
# 5 11/06/97 3:47p Peter
#
# 4 11/04/97 5:04p Peter
# cataclysm part deux
#
# 3 11/01/97 10:01a Peter
# tri dispatch stuff
#
# 2 10/30/97 6:53p Peter
# first real cut at tri asm
#
# 1 10/30/97 4:29p Peter
# asm tri code
#
# 2 7/07/97 2:14p Jdt
# assembly now on par with C code.
#
# 1 7/07/97 8:37a Jdt
# B4 Chip field fix.
##
.file "xdraw2.s"
#OPTION OLDSTRUCTS
# 586P
# This was xdraw2.s but I renamed it for now to work with the shared
# swlibs. It hasn't changed to the format used in the .S files for
# the Voodoo3 Glide soruces.
# some useful floating load and store macros <ala gmt>
#flds TEXTEQU <fld DWORD PTR>
#fsubs TEXTEQU <fsub DWORD PTR>
#fmuls TEXTEQU <fmul DWORD PTR>
.align 4
.section .data
One .DATA 0x03f800000
Area .DATA 0
dxAB .DATA 0
dxBC .DATA 0
dyAB .DATA 0
dyBC .DATA 0
culltest .DATA 0
## Extra junk to pad out to the next cache line.
bias0 .DATA 0
pad1 .DATA 0
pad2 .DATA 0
pad3 .DATA 0
pad4 .DATA 0
pad5 .DATA 0
pad6 .DATA 0
pad7 .DATA 0
bias1 .DATA 0
# _DATA ENDS
# Ugly, but seems to workaround the problem with locally defined
# data segment globals not getting relocated properly when using
# djgpp.
zArea .EQU One+0x04
zdxAB .EQU One+0x08
zdxBC .EQU One+0x0c
zdyAB .EQU One+0x10
zdyBC .EQU One+0x14
zculltest .EQU One+0x18
### Definitions of cvg regs and glide root structures.
.INCLUDE "fxgasm.h"
## enables/disables trisProcessed and trisDrawn counters
STATS .ASSIGNA 1
#--------------------------------------------------------------------------
# Arguments : STKOFF = 16 from 4 pushes
#.AIF \&GLIDE_DEBUG EQ 1
#STKOFF .EQU 20
#.AELSE
STKOFF .EQU 16
#.AENDI
_va$ .EQU 4 + STKOFF
_vb$ .EQU 8 + STKOFF
_vc$ .EQU 12 + STKOFF
X .EQU 0
Y .EQU 4
# edx is used as index, loading from *src
gc .REG (%esi) # points to graphics context
.text
.align 4
.globl _trisetup_cull
.type _trisetup_cull, @function
_trisetup_cull:
# .code
.MACRO SYMNAME prefix
.LCULL\prefix:
.ENDM
.MACRO SYMNAMEOP op prefix
\op .LCULL\prefix
.ENDM
GLIDE_CULLING .ASSIGNA 1
GLIDE_PACK_RGB .ASSIGNA 0
GLIDE_PACK_ALPHA .ASSIGNA 0
GLIDE_GENERIC_SETUP .ASSIGNA 0
.INCLUDE "xdraw2.inc.S"
GLIDE_GENERIC_SETUP .ASSIGNA 0
GLIDE_PACK_ALPHA .ASSIGNA 0
GLIDE_PACK_RGB .ASSIGNA 0
GLIDE_CULLING .ASSIGNA 0
.L_end_trisetup_cull:
.size _trisetup_cull,.L_end_trisetup_cull-_trisetup_cull
.MACRO SYMNAME prefix
.LNOCULL\prefix:
.ENDM
.MACRO SYMNAMEOP op prefix
\op .LNOCULL\prefix
.ENDM
.AIF \&GLIDE_PACKED_RGB EQ 1
.align 4
.globl _trisetup_cull_rgb
.type _trisetup_cull_rgb, @function
_trisetup_cull_rgb:
# .code
GLIDE_CULLING .ASSIGNA 1
GLIDE_PACK_RGB .ASSIGNA 1
GLIDE_PACK_ALPHA .ASSIGNA 0
GLIDE_GENERIC_SETUP .ASSIGNA 0
.INCLUDE "xdraw2.inc.S"
GLIDE_GENERIC_SETUP .ASSIGNA 0
GLIDE_PACK_ALPHA .ASSIGNA 0
GLIDE_PACK_RGB .ASSIGNA 0
GLIDE_CULLING .ASSIGNA 0
.L_end_trisetup_cull_rgb:
.size _trisetup_cull_rgb,.L_end_trisetup_cull_rgb-_trisetup_cull_rgb
.align 4
.globl _trisetup_cull_argb
.type _trisetup_cull_argb, @function
_trisetup_cull_argb:
# .code
GLIDE_CULLING .ASSIGNA 1
GLIDE_PACK_RGB .ASSIGNA 1
GLIDE_PACK_ALPHA .ASSIGNA 1
GLIDE_GENERIC_SETUP .ASSIGNA 0
.INCLUDE "xdraw2.inc.S"
GLIDE_GENERIC_SETUP .ASSIGNA 0
GLIDE_PACK_ALPHA .ASSIGNA 0
GLIDE_PACK_RGB .ASSIGNA 0
GLIDE_CULLING .ASSIGNA 0
.L_end_trisetup_cull_argb:
.size _trisetup_cull_argb,.L_end_trisetup_cull_argb-_trisetup_cull_argb
.AENDI
.align 4
.global _trisetup
.type _trisetup, @function
_trisetup:
# .code
GLIDE_CULLING .ASSIGNA 0
GLIDE_PACK_RGB .ASSIGNA 0
GLIDE_PACK_ALPHA .ASSIGNA 0
GLIDE_GENERIC_SETUP .ASSIGNA 0
.INCLUDE "xdraw2.inc.S"
GLIDE_GENERIC_SETUP .ASSIGNA 0
GLIDE_PACK_ALPHA .ASSIGNA 0
GLIDE_PACK_RGB .ASSIGNA 0
GLIDE_CULLING .ASSIGNA 0
.L_end_trisetup:
.size _trisetup,.L_end_trisetup-_trisetup
.AIF \&GLIDE_PACKED_RGB EQ 1
.align 4
.globl _trisetup_rgb
.type _trisetup_rgb, @function
_trisetup_rgb:
# .code
GLIDE_CULLING .ASSIGNA 0
GLIDE_PACK_RGB .ASSIGNA 1
GLIDE_PACK_ALPHA .ASSIGNA 0
GLIDE_GENERIC_SETUP .ASSIGNA 0
.INCLUDE "xdraw2.inc.S"
GLIDE_GENERIC_SETUP .ASSIGNA 0
GLIDE_PACK_ALPHA .ASSIGNA 0
GLIDE_PACK_RGB .ASSIGNA 0
GLIDE_CULLING .ASSIGNA 0
.L_end_trisetup_rgb:
.size _trisetup_rgb,.L_end_trisetup_rgb-_trisetup_rgb
.align 4
.globl _trisetup_argb
.type _trisetup_argb, @function
_trisetup_argb:
# .code
GLIDE_CULLING .ASSIGNA 0
GLIDE_PACK_RGB .ASSIGNA 1
GLIDE_PACK_ALPHA .ASSIGNA 1
GLIDE_GENERIC_SETUP .ASSIGNA 0
INCLUDE xdraw2.inc
GLIDE_GENERIC_SETUP .ASSIGNA 0
GLIDE_PACK_ALPHA .ASSIGNA 0
GLIDE_PACK_RGB .ASSIGNA 0
GLIDE_CULLING .ASSIGNA 0
.L_end_trisetup_argb:
.size _trisetup_argb,.L_end_trisetup_argb-_trisetup_argb
.AENDI
#_TEXT ENDS
.END

View File

@@ -1,225 +0,0 @@
;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
;; FULL TEXT OF THE NON-WARRANTY PROVISIONS.
;;
;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
;; THE UNITED STATES.
;;
;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
;;
;; $Header$
;; $Revision$
;; $Log$
;; Revision 1.1.1.1.2.3 2005/01/22 14:52:02 koolsmoky
;; enabled packed argb for cmd packet type 3
;;
;; Revision 1.1.1.1.2.2 2005/01/13 16:11:39 koolsmoky
;; prepare for packed rgb
;;
;; Revision 1.1.1.1.2.1 2004/12/23 20:45:56 koolsmoky
;; converted to nasm syntax
;; added x86 asm, 3dnow! triangle and mmx, 3dnow! texture download optimizations
;;
;; Revision 1.1.1.1 1999/12/07 21:49:13 joseph
;; Initial checkin into SourceForge.
;;
;;
;; 7 5/18/98 12:16p Peter
;; culling enabling
;
; 6 1/15/98 1:12p Peter
; dispatch w/o packing
;
; 5 11/06/97 3:47p Peter
;
; 4 11/04/97 5:04p Peter
; cataclysm part deux
;
; 3 11/01/97 10:01a Peter
; tri dispatch stuff
;
; 2 10/30/97 6:53p Peter
; first real cut at tri asm
;
; 1 10/30/97 4:29p Peter
; asm tri code
;
; 2 7/07/97 2:14p Jdt
; assembly now on par with C code.
;
; 1 7/07/97 8:37a Jdt
; B4 Chip field fix.
;;
%include "xos.inc"
;;; Definitions of cvg regs and glide root structures.
%include "fxgasm.h"
extrn _GlideRoot
extrn _FifoMakeRoom, 12
%MACRO GR_FIFO_WRITE 3
mov [%1 + %2], %3
%ENDMACRO ; GR_FIFO_WRITE
%MACRO WRITE_MM1_FIFO_ALIGNED 0
%ifdef GL_AMD3D
movq [fifo], mm1 ; store current param | previous param
%else
;;
%endif
%ENDMACRO ; WRITE_MM1_FIFO_ALIGNED
%MACRO WRITE_MM1LOW_FIFO 0
%ifdef GL_AMD3D
movd [fifo], mm1 ; store current param | previous param
%else
;;
%endif
%ENDMACRO ; WRITE_MM1LOW_FIFO
segment DATA
One DD 1.0
Area DD 0
%IF GLIDE_PACKED_RGB
bias0 DD 0
bias1 DD 0
%ENDIF
segment CONST
$T2003 DD 12288.0
$T2005 DD 1.0
$T2006 DD 256.0
;;; Arguments (STKOFF = 16 from 4 pushes)
STKOFF equ 16
_va$ equ 4 + STKOFF
_vb$ equ 8 + STKOFF
_vc$ equ 12 + STKOFF
;; coordinate offsets into vertex.
;; NB: These are constants and are not
;; user settable like the rest of the
;; parameter offset. Weird.
X equ 0
Y equ 4
%MACRO PROC_TYPE 1
%ifdef GL_AMD3D
proc %1_3DNow, 12
%else
proc %1, 12
%endif
%ENDMACRO ; PROC_TYPE
;; enables/disables trisProcessed and trisDrawn counters
%define STATS 1
segment TEXT
ALIGN 32
PROC_TYPE _trisetup_cull
%define GLIDE_CULLING 1
%define GLIDE_PACK_RGB 0
%define GLIDE_PACK_ALPHA 0
%define GLIDE_GENERIC_SETUP 0
%INCLUDE "xdraw2.inc"
%undef GLIDE_GENERIC_SETUP
%undef GLIDE_PACK_ALPHA
%undef GLIDE_PACK_RGB
%undef GLIDE_CULLING
endp
%IF GLIDE_PACKED_RGB
ALIGN 32
PROC_TYPE _trisetup_cull_rgb
%define GLIDE_CULLING 1
%define GLIDE_PACK_RGB 1
%define GLIDE_PACK_ALPHA 0
%define GLIDE_GENERIC_SETUP 0
%INCLUDE "xdraw2.inc"
%undef GLIDE_GENERIC_SETUP
%undef GLIDE_PACK_ALPHA
%undef GLIDE_PACK_RGB
%undef GLIDE_CULLING
endp
ALIGN 32
PROC_TYPE _trisetup_cull_argb
%define GLIDE_CULLING 1
%define GLIDE_PACK_RGB 1
%define GLIDE_PACK_ALPHA 1
%define GLIDE_GENERIC_SETUP 0
%INCLUDE "xdraw2.inc"
%undef GLIDE_GENERIC_SETUP
%undef GLIDE_PACK_ALPHA
%undef GLIDE_PACK_RGB
%undef GLIDE_CULLING
endp
%ENDIF ; GLIDE_PACKED_RGB
ALIGN 32
PROC_TYPE _trisetup
%define GLIDE_CULLING 0
%define GLIDE_PACK_RGB 0
%define GLIDE_PACK_ALPHA 0
%define GLIDE_GENERIC_SETUP 0
%INCLUDE "xdraw2.inc"
%undef GLIDE_GENERIC_SETUP
%undef GLIDE_PACK_ALPHA
%undef GLIDE_PACK_RGB
%undef GLIDE_CULLING
endp
%IF GLIDE_PACKED_RGB
ALIGN 32
PROC_TYPE _trisetup_rgb
%define GLIDE_CULLING 0
%define GLIDE_PACK_RGB 1
%define GLIDE_PACK_ALPHA 0
%define GLIDE_GENERIC_SETUP 0
%INCLUDE "xdraw2.inc"
%undef GLIDE_GENERIC_SETUP
%undef GLIDE_PACK_ALPHA
%undef GLIDE_PACK_RGB
%undef GLIDE_CULLING
endp
ALIGN 32
PROC_TYPE _trisetup_argb
%define GLIDE_CULLING 0
%define GLIDE_PACK_RGB 1
%define GLIDE_PACK_ALPHA 1
%define GLIDE_GENERIC_SETUP 0
%INCLUDE "xdraw2.inc"
%undef GLIDE_GENERIC_SETUP
%undef GLIDE_PACK_ALPHA
%undef GLIDE_PACK_RGB
%undef GLIDE_CULLING
endp
%ENDIF ; GLIDE_PACKED_RGB

File diff suppressed because it is too large Load Diff

View File

@@ -1,315 +0,0 @@
## -*-asm-*-
## THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
## PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
## TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
## INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
## DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
## THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
## EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
## FULL TEXT OF THE NON-WARRANTY PROVISIONS.
##
## USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
## RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
## TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
## AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
## SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
## THE UNITED STATES.
##
## COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
##
## $Header$
## $Revision$
## $Log$
## Revision 1.1.1.1 1999/12/07 21:49:13 joseph
## Initial checkin into SourceForge.
##
#
# 2 10/30/97 6:53p Peter
# first real cut at tri asm
#
# 1 10/30/97 4:29p Peter
# asm tri code
#
# 2 7/07/97 2:14p Jdt
# assembly now on par with C code.
#
# 1 7/07/97 8:37a Jdt
# B4 Chip field fix.
##
.file "xdraw2.inc.s"
#.586P
#EXTRN _GlideRoot:DWORD
#EXTRN _FifoMakeRoom:NEAR
# Ugly, but seems to workaround the problem with locally defined
# data segment globals not getting relocated properly when using
# djgpp.
#zArea .EQU One+4
#zdxAB .EQU One+8
#zdxBC .EQU One+12
#zdyAB .EQU One+16
#zdyBC .EQU One+20
#zculltest .EQU One+24
gc .REG (%esi) # points to graphics context
## Prologue stuff
push %esi
push %edi
push %ebx
push %ebp
mov (_GlideRoot + curGC), gc ## GR_DCL_GC
.align 4
.AIF \&GLIDE_CULLING EQ 1
fa .REG (%eax) # vtx a from caller
fb .REG (%ebx) # vtx b from caller
fc .REG (%ecx) # vtx c from caller
cull .REG (%edx)
intArea .REG (%ebp) # temp Y storage
## Pre-load the current culling mode before all of the
## floating point area stuff.
mov cull_mode(gc), cull
mov _va$(%esp), fa
mov _vb$(%esp), fb
mov _vc$(%esp), fc
shl $31, cull
SYMNAME Area_Computation
# 47-3
# jmp ret_pop0f
flds X(fa) # xa
fsubs X(fb) # dxAB
flds X(fb) # | xb
fsubs X(fc) # | dxBC
flds Y(fb) # | | yb
fsubs Y(fc) # | | dyBC
flds Y(fa) # | | | ya
fsubs Y(fb) # | | | dyAB
fld %st(3) # | | | | dxAB
fmul %st(2), %st # | | | | t0 t0=dxAB*dyBC
fld %st(3) # | | | | | dxBC
fmul %st(2), %st # | | | | | t1 t1=dxBC*dyAB
fsubrp %st, %st(1) # | | | | area
fsts zArea # | | | | area
## Pop temp things from the sw culling off the fp stack
fstp %st # 4
fstp %st # 3
fstp %st # 2
fstp %st # 1
fstp %st # 0
mov zArea, intArea # j = *(long *)&area
xor %eax, %eax # Clear the returnv value (0 == culled)
# Zero Area Triangle Check
and $0x7fffffff, intArea # if ((j & 0x7FFFFFFF) == 0)
SYMNAMEOP jz, __triDone
## Triangle area check vs culling mode
mov zArea, intArea
xor cull, intArea
SYMNAMEOP jge, __triDone
.AENDI
.align 4
## Check to make sure that we have enough room for
## the complete triangle packet.
mov (_GlideRoot + curTriSize), %eax
mov fifoRoom(gc), %ebx
add $4, %eax
cmp %eax, %ebx
SYMNAMEOP jge, __triBegin
push $0
push $0
push %eax
call _FifoMakeRoom
add $12, %esp
## Send triangle parameters
dlp .REG (%ebx) # points to dataList structure
fifo .REG (%ebp) # points to next entry in fifo
vertex .REG (%edx) # the current vertex
vOffset .REG (%ecx) # Current vertex offset
packCol .REG (%edi)
tempVal .REG (%edi)
.MACRO GR_FIFO_WRITE __addr __offset __data
mov \__data, \__offset(\__addr)
.ENDM # GR_FIFO_WRITE
.align 4
SYMNAME __triBegin
mov fifoPtr(gc), fifo # Fetch Fifo Ptr
mov $4, vOffset # Starting vertex
mov triPacketHdr(gc), %eax # Packet 3 header
nop
# Write packet header to fifo
GR_FIFO_WRITE fifo, 0, %eax
add $4, fifo # Advance fifo for hdr & x/y coordinate
.align 4
SYMNAME __vertexStart
mov STKOFF(%esp,vOffset), vertex # Current vertex
add $8, fifo
nop # Avoid p5 agi w/ load of vertex ptr
nop
movl X(vertex), %eax # X
lea tsuDataList(gc), dlp # Reset the dataList
# PCI write X
GR_FIFO_WRITE fifo, -8, %eax
movl Y(vertex), %eax # Y
xor packCol, packCol # Clear packed color
# PCI write Y
GR_FIFO_WRITE fifo, -4, %eax
.AIF \&GLIDE_PACK_RGB EQ 1
fldl b(vertex) # B
faddl (_GlideRoot + fBiasLo) # BC GC
fldl g(vertex) # G B
faddl (_GlideRoot + fBiasHi) # GC B
fldl r(vertex) # R GC BC
faddl (_GlideRoot + fBiasHi) # RC GC BC
fxch %st(2) # BC GC RC
fstpl bias0 # GC RC
fstpl bias1 # RC
movl bias0, packCol # B + bias
fstpl bias0
movl bias1, %eax # G + bias
.AIF \&GLIDE_PACK_ALPHA EQ 1
fldl a(vertex)
faddl (_GlideRoot + fBiasHi)
and $0x00FF, packCol # B color component
and $0x0000FF00, %eax # G component << 8
add $8, dlp # Packed RGB + A dataList entry
nop
or %eax, packCol # 0000GGBB
nop
fstpl bias1
movl bias0, %eax # R + bias
movl bias1, %esi # A + bias
and $0x0000FF00, %eax # R component << 8
and $0x0FFFFFF00, %esi # A component << 8
shl $8, eax # R << 16
or %eax, packCol # 00RRGGBB
shl $16, %esi # A << 16
or %esi, packCol # AARRGGBB
nop
.AELSE # !GLIDE_PACK_ALPHA
and $0x00FF, packCol # B color component
and $0x0000FF00, %eax # G component << 8
add $4, dlp # Next dataList item
or %eax, packCol
movl bias0, %eax # R + bias
and $0x0000FF00, %eax # R component << 8
shl $8, eax # R << 16
or %eax, packCol # 00RRGGBB
.AENDI # !GLIDE_PACK_ALPHA
# PCI write packed color value
GR_FIFO_WRITE fifo, 0, packCol
add $4, fifo
.AENDI # GLIDE_PACK_RGB
SYMNAME __doParams
movl (dlp), %eax # Get first offset from the data list
add $4, dlp # dlp++
cmp $0, %eax # Are we done?
SYMNAMEOP je, __nextVertex
## Not using align directive here because it sometimes
## introduces an agi for the eax use below.
nop
nop
SYMNAME __paramLoop
movl (%eax, vertex), tempVal
add $4, fifo
movl (dlp), %eax
add $4, dlp
cmp $0, %eax
GR_FIFO_WRITE fifo, -4, tempVal
SYMNAMEOP jne, __paramLoop
.align 4
SYMNAME __nextVertex
## On to the next vertex
add $4, vOffset
mov (_GlideRoot + curGC), gc # Reload gc incase we trashed it as a temp
cmp $16, vOffset # Offset of one past last vertex?
SYMNAMEOP jne, __vertexStart
## Update gc->fifoPtr and gc->fifoRoom
mov fifo, %eax
mov fifoPtr(gc), %ebx
mov fifo, fifoPtr(gc)
sub %ebx, %eax
mov (_GlideRoot + trisDrawn), %ebx
sub %eax, fifoRoom(gc)
add $1, %ebx
mov %ebx, (_GlideRoot + trisDrawn)
## return 1 (triangle drawn)
mov $1, %eax
SYMNAME __triDone
## Restore trashed registers
mov (_GlideRoot + trisProcessed), %esi
pop %ebp
add $1, %esi
pop %ebx
pop %edi
mov %esi, (_GlideRoot + trisProcessed)
pop %esi
ret

View File

@@ -1,46 +0,0 @@
;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
;; FULL TEXT OF THE NON-WARRANTY PROVISIONS.
;;
;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
;; THE UNITED STATES.
;;
;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
;; Adapted from gdraw.c:grDrawTriangle() for nasm
%include "xos.inc"
%include "fxgasm.h"
extrn _GlideRoot
segment SEG_TEXT
align 16
proc grDrawTriangle, 12
;;mov edx, dword [_GlideRoot+curGC]
;;mov eax, dword [edx+kTriProcOffset]
mov eax, dword [_GlideRoot+curGC]
jmp [eax + kTriProcOffset]
endp
align 16
%if XOS == XOS_WIN32
%ifdef __MINGW32__
; GNU LD fails with '_' prefix
export grDrawTriangle@12
%else
export _grDrawTriangle@12
%endif
%endif ; _WIN32

View File

@@ -1,161 +0,0 @@
;
; compulsory header for glide3/xdraw* assembly specializations (NASM)
;
; $Header$
; $Log$
; Revision 1.1.2.3 2004/10/04 08:57:52 dborca
; supporting DOS/OpenWatcom in Assembly files
;
;
; Revision 1.1.2.1 2003/06/07 09:53:25 dborca
; initial checkin for NASM sources
;
;---------------------------------------
; platform defines
;---------------------------------------
%define XOS_DJGPP 1
%define XOS_LINUX 2
%define XOS_WIN32 4
%define XOS_WATCD 8
%define STDCALL 0
%define ELFTYPE 0
;---------------------------------------
; pick up the right OS
;---------------------------------------
%ifdef __DJGPP__
%define XOS XOS_DJGPP
%elifdef __linux__
%define XOS XOS_LINUX
%define ELFTYPE 1
%elifdef __WIN32__
%define XOS XOS_WIN32
%define STDCALL 1
%elifdef __WATCOMD__
%define XOS XOS_WATCD
%define STDCALL 1
%else
%error Unknown OS
%endif
;---------------------------------------
; general purpose macros
;---------------------------------------
%macro extrn 1-2 0
%if STDCALL && (%2 > 0)
%define %1 %1@%2
%endif
extern %1
%endmacro
%macro globl 1-2 0
%if STDCALL && (%2 > 0)
%define %1 %1@%2
%endif
global %1
%endmacro
%macro proc 1-2 0
%push proc
%if STDCALL && (%2 > 0)
%define %$ret RET %2
%else
%define %$ret RET
%endif
%if ELFTYPE
globl %1:function, %2
%else
globl %1, %2
%endif
%1:
%endmacro
%macro endp 0
%ifnctx proc
%error Mismatched `endp'/`proc'
%else
%pop
%endif
%endmacro
%macro ret 0
%ifnctx proc
RET
%else
%$ret
%endif
%endmacro
%macro invoke 1-*
%rep %0 - 1
%rotate -1
push %1
%endrep
%rotate -1
call %1
%if (STDCALL == 0) && (%0 > 1)
add esp, 4 * (%0 - 1)
%endif
%endmacro
;---------------------------------------
; Windows
;---------------------------------------
%if XOS == XOS_WIN32
%define TEXT .text align=32
%define DATA .data align=32
%define CONST .rdata align=32
%macro GET_GC 0
mov gc, [_GlideRoot + curGC]
%endmacro
%endif
;---------------------------------------
; DJGPP
;---------------------------------------
%if XOS == XOS_DJGPP
%define TEXT .text
%define DATA .data
%define CONST .rodata
%macro GET_GC 0
mov gc, [_GlideRoot + curGC]
%endmacro
%endif
;---------------------------------------
; Linux
;---------------------------------------
%if XOS == XOS_LINUX
%define TEXT .text align=32
%define DATA .data align=32
%define CONST .rodata align=32
%macro GET_GC 0
mov gc, [_GlideRoot + curGC]
%endmacro
%endif
;---------------------------------------
; WATCOM/DOS
;---------------------------------------
%if XOS == XOS_WATCD
%define TEXT _TEXT align=1 public use32 class=CODE FLAT
%define DATA _DATA align=4 public use32 class=DATA FLAT
%define CONST CONST2 align=4 public use32 class=DATA FLAT
%macro GET_GC 0
mov gc, [_GlideRoot + curGC]
%endmacro
%endif

View File

@@ -1,333 +0,0 @@
;; THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
;; PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
;; TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
;; INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
;; DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
;; THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
;; EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
;; FULL TEXT OF THE NON-WARRANTY PROVISIONS.
;;
;; USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
;; RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
;; TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
;; AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
;; SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
;; THE UNITED STATES.
;;
;; COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
;;
;; $Header$
;; $Revision$
;; $Log$
;; Revision 1.1.2.2 2005/04/23 18:36:36 koolsmoky
;; fixed 3dnow! and mmx optimizations
;;
;; Revision 1.1.2.1 2004/12/23 20:45:56 koolsmoky
;; converted to nasm syntax
;; added x86 asm, 3dnow! triangle and mmx, 3dnow! texture download optimizations
;;
;; Revision 1.1.1.1.8.1 2003/11/03 13:34:30 dborca
;; Voodoo2 happiness (DJGPP & Linux)
;;
;; Revision 1.1.8.7 2003/09/12 05:08:35 koolsmoky
;; preparing for graphic context checks
;;
;; Revision 1.1.8.6 2003/07/07 23:29:06 koolsmoky
;; cleaned logs
;;
;;
;; Revision 1.1 2000/06/15 00:27:43 joseph
;; Initial checkin into SourceForge.
;;
;; 10 8/17/99 6:35p Atai
;; fixed amd debug mode
;;
;; 9 4/08/99 1:22p Atai
;; added contect check for _grTexDownload_3DNow_MMX
;;
;; 8 3/19/99 11:26a Peter
;; expose direct fifo for gl
;;
;; 7 2/02/99 4:36p Peter
;; download through lfb rather than texture port
;;
;; 6 12/17/98 2:36p Atai
;; check in Norbert's fix for texture download width correction
;;
;; 5 12/07/98 11:33a Peter
;; norbert's re-fixes of my merge
;;
;; 4 11/02/98 5:34p Atai
;; merge direct i/o code
;;
;; 3 10/20/98 5:34p Atai
;; added #ifdefs for hwc
;;
;; 2 10/14/98 12:05p Peter
;; fixed my effed up assumption about non-volatile regs
;;
;; 1 10/09/98 6:48p Peter
;; 3DNow!(tm) version of wide texture downloads
;;
;; 3 10/07/98 9:43p Peter
;; triangle procs for 3DNow!(tm)
;;
;; 2 10/05/98 7:43p Peter
;; 3DNow!(tm) happiness everywhere
;;
;; 1 10/05/98 6:01p Peter
;; mmx stuff for 3DNow!(tm) capable processors
;;
%include "xos.inc"
extrn _FifoMakeRoom, 12
%MACRO _grCommandTransportMakeRoom 3
push %3
push %2
push %1
call _FifoMakeRoom
add esp, 12
%ENDMACRO ; _grCommandTransportMakeRoom
;;; Definitions of cvg regs and glide root structures.
%INCLUDE "fxgasm.h"
; Arguments (STKOFF = 16 from 4 dword pushes)
STACKOFFSET equ 16
_gc$ equ 4 + STACKOFFSET
_baseAddr$ equ 8 + STACKOFFSET
_maxS$ equ 12 + STACKOFFSET
_minT$ equ 16 + STACKOFFSET
_maxT$ equ 20 + STACKOFFSET
_texData$ equ 24 + STACKOFFSET
;; NB: The first set of registers (eax, ecx, and edx) are volatile across
;; function calls. The remaining registers are supposedly non-volatile
;; so they only store things that are non-volatile across the call.
%define fifo ebp ; fifo ptr in inner loop
%define gc esi ; graphics context
%define dataPtr edi ; pointer to exture data to be downloaded
%define curT ebx ; counter for texture scan lines (t-coordinate)
%define curS ecx ; texture s-coordinate
%define fRoom edx ; room available in fifo (in bytes)
;--------------------------------------------------------------------------
;
; GL_AMD3D, GL_MMX
;
;--------------------------------------------------------------------------
segment TEXT
ALIGN 32
%IFDEF GL_AMD3D
proc _grTexDownload_3DNow_MMX, 24
%ENDIF
%IFDEF GL_MMX
proc _grTexDownload_MMX, 24
%ENDIF
push ebx ; save caller's register variable
mov curT, [esp + _maxT$ - 12] ; curT = maxT
push esi ; save caller's register variable
mov eax, [esp + _minT$ - 8] ; minT
push edi ; save caller's register variable
mov gc, [esp + _gc$ - 4] ; gc
push ebp ; save caller's register variable
mov dataPtr, [esp + _texData$]; dataPtr
%IFDEF GLIDE_ALT_TAB
test gc, gc
je .dlDone
; mov edx, [gc + windowed]
; test edx, 1
; jnz .pastContextTest
mov edx, DWORD [gc+lostContext]
mov ecx, [edx]
test ecx, 1
jnz .dlDone
;.pastContextTest:
%ENDIF
sub curT, eax ; curT = maxT - minT
mov fifo, [gc + fifoPtr] ; fifoPtr
mov curS, [esp + _maxS$] ; curS = maxS = scanline width in DWORDs
add curT, 1 ; curT = maxT - minT + 1
%IFDEF GL_AMD3D
femms ; we'll use MMX/3DNow!, make sure FPU register cleared
%ENDIF
%IFDEF GL_MMX
emms ; we'll use MMX
%ENDIF
movd mm3, [esp + _baseAddr$] ; 0 | address of texture to download
add curS, curS ;
add curS, curS ; scan line width (in bytes)
mov eax, [esp + _minT$] ; 0 | minT
mov [esp + _maxS$], curS ; save scan line width (in bytes)
mov edx, curS ;
add edx, edx ; packetHdr<21:3> = maxS = scanline width in DWORDs
or edx, 0xc0000005 ; packetHdr<31:30> = texture port
; packetHdr<21:3> = maxS
; packetHdr<2:0> = packetType 5
movd mm1, edx ; 0 | packetHdr
movd mm2, eax ; 0 | minT
psllq mm2, 9 ; 0 | TEX_ROW_ADDR_INCR(minT) = minT << 9
paddd mm3, mm2 ; 0 | texAddr = texBaseAddr + TEX_ROW_ADDR_INCR(minT)
movd mm2, [gc + tex_ptr] ; 0 | gc->tex_ptr
psubd mm3, mm2 ; 0 | texAddr - gc->tex_ptr
mov eax, 0x200 ; TEX_ROW_ADDR_INCR(1) = 1 << 9
movd mm2, eax ; 0 | TEX_ROW_ADDR_INCR(1)
psllq mm2, 32 ; TEX_ROW_ADDR_INCR(1) | 0
mov fRoom, [gc + fifoRoom] ; get available fifoRoom (in bytes)
punpckldq mm1, mm3 ; hdr2 = texAddr - gc->tex_ptr | hdr1 = packetHdr
;; ebx = curT, edi = dataPtr, esi = gc, ebp = fifo, ecx = curS = maxS
;; edx = fifoRoom, mm1 = texAddr-gc->tex_ptr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0
test fifo, 4 ; is fifo QWORD aligned ?
jz .startDownload ; yup, start texture download
cmp fRoom, 4 ; enough room for NULL packet in fifo?
jge .mmxAlignFifo ; yes, write NULL packet to align fifo
%ifdef USE_PACKET_FIFO
_grCommandTransportMakeRoom 4, 0, __LINE__; make fifo room
%endif
mov fifo, [gc + fifoPtr] ; fifoPtr modified by _grCommandTransportMakeRoom, reload
mov fRoom, [gc + fifoRoom] ; fifoRoom modified by _grCommandTransportMakeRoom, reload
mov curS, [esp + _maxS$] ; reload maxS (destroyed by call to _grCommandTransportMakeRoom)
test fifo, 4 ; new fifoPtr QWORD aligned ?
jz .startDownload ; yup, start texture download
.mmxAlignFifo:
mov DWORD [fifo], 0 ; write NULL packet
sub fRoom, 4 ; fifoRoom -= 4
mov [gc + fifoRoom], fRoom ; store new fifoRoom
add fifo, 4 ; fifoPtr += 4
%IFDEF GLIDE_DEBUG
mov [gc + checkPtr], fifo ; checkPtr
%ENDIF
mov [gc + fifoPtr], fifo ; store new fifoPtr
jmp .startDownload ; fifo aligned, download texture now
ALIGN 32
;; ebx = curT, edi = dataPtr, esi = gc, ebp = fifo, ecx = maxS = curS
;; edx=fifoRoom, mm1 = texAddr-gc->tex_ptr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0
.loopT:
%IFDEF GLIDE_DEBUG
;; Make sure that we have a QWORD aligned fifoPtr; force GP if not aligned
test fifo, 4 ; is fifoPtr QWORD aligned ?
jz .alignmentOK ; yup, continue
xor eax, eax ; create 0
mov [eax], eax ; move to DS:[0] forces GP
.alignmentOK:
%ENDIF ; GLIDE_DEBUG
;; Compute packet header words
;; hdr1: downloadSpace[31:30] numWords[21:3] packetType[2:0]
;; hdr2: download address[29:0]
movq [fifo], mm1 ; store hdr2 | hdr1
add fifo, 8 ; increment fifo ptr (hdr1 + hdr2)
;; S coordinate inner loop unrolled for 8 texels a write
.loopS:
movq mm0, [dataPtr] ; load 64 bit data (8 texels)
add fifo, 8 ; pre-increment fifoPtr += 2 * sizeof(FxU32)
add dataPtr, 8 ; dataPtr += 2 * sizeof(FxU32)
sub curS, 8 ; curS -= 2 * sizeof(FxU32)
movq [fifo - 8], mm0 ; *fifoPtr = texelData[64 bits]
jnz .loopS ; loop while curS > 0
mov ecx, [gc + fifoPtr] ; old fifo ptr
nop ; filler
mov eax, fifo ; new fifo ptr
mov [gc + fifoPtr], fifo ; save new fifo ptr
%IFDEF GLIDE_DEBUG
mov [gc + checkPtr], fifo ; checkPtr
%ENDIF
sub eax, ecx ; new fifo ptr - old fifo ptr = fifo space used up
mov curS, [esp + _maxS$] ; curS = maxS = width of scanline (bytes)
sub fRoom, eax ; new fifo space available = old fifo space available - fifo space used up = new fifo space available
sub curT, 1 ; curT--
mov [gc + fifoRoom], fRoom ; save new fifo space available
jz .dlDone ; loop while curT > 0
;; Check for room to write the next texture scanline
;; ebx = curT, edi = dataPtr, esi = gc, ebp = fifo
;; edx = fifoRoom, mm1 = texAddr|packetHdr, mm2 = TEX_ROW_ADDR_INCR(1)|0
paddd mm1, mm2 ; texAddr+=TEX_ROW_ADDR_INCR(1) | packetHdr
mov esp, esp ; filler
.startDownload:
lea eax, [curS+8] ; fifo space needed = scan line width + header size
cmp fRoom, eax ; fifo space available >= fifo space required ?
jge .loopT ; yup, write next scan line
%ifdef USE_PACKET_FIFO
_grCommandTransportMakeRoom eax, 0, __LINE__; make fifo room (if fifoPtr QWORD aligned before
%endif
mov fifo, [gc + fifoPtr] ; fifoPtr was modified by _grCommandTransportMakeRoom, reload
mov fRoom, [gc + fifoRoom] ; fifoRoom was modified by _grCommandTransportMakeRoom, reload
mov curS, [esp + _maxS$] ; curS = maxS = width of scanline (bytes)
jmp .loopT ; we now have enough fifo room, write next scanline
.dlDone:
%IFDEF GL_AMD3D
femms ; exit 3DNow!(tm) state
%ENDIF
%IFDEF GL_MMX
emms ; exit MMX state
%ENDIF
pop ebp ; restore caller's register variable
pop edi ; restore caller's register variable
pop esi ; restore caller's register variable
pop ebx ; restore caller's register variable
ret ; pop 6 DWORD parameters and return
endp

View File

@@ -1,242 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
** $Header$
** $Log$
** Revision 1.1.1.1 1999/12/07 21:42:38 joseph
** Initial checkin into SourceForge.
**
**
** 1 10/08/98 11:30a Brent
**
** 2 10/05/98 7:43p Peter
** 3DNow!(tm) happiness everywhere
**
** 1 10/03/98 3:37p Peter
** Texture download vectors
**
*/
#include <3dfx.h>
#define FX_DLL_DEFINITION
#include <fxdll.h>
#include <glide.h>
#include "fxglide.h"
void FX_CSTYLE
_grTexDownload_Default_8_1(struct GrGC_s* gc, const FxU32 tmuBaseAddr,
const FxU32 maxS, const FxU32 minT, const FxU32 maxT,
void* texData)
{
#define FN_NAME "_grTexDownload_Default_8_1"
FxU32
t = minT,
tex_address = tmuBaseAddr + TEX_ROW_ADDR_INCR(t);
const FxU8
*src8 = (const FxU8*)texData;
for (; t <= maxT; t++) {
LINEAR_WRITE_BEGIN(1, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
LINEAR_WRITE_SET_8(tex_address, (const FxU32)*(const FxU8*)src8);
LINEAR_WRITE_END();
src8 += 1;
tex_address += TEX_ROW_ADDR_INCR(1);
}
#undef FN_NAME
}
void FX_CSTYLE
_grTexDownload_Default_8_2(struct GrGC_s* gc, const FxU32 tmuBaseAddr,
const FxU32 maxS, const FxU32 minT, const FxU32 maxT,
void* texData)
{
#define FN_NAME "_grTexDownload_Default_8_2"
FxU32
t = minT,
tex_address = tmuBaseAddr + TEX_ROW_ADDR_INCR(t);
const FxU8
*src8 = (const FxU8*)texData;
for (; t <= maxT; t++) {
LINEAR_WRITE_BEGIN(1, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
LINEAR_WRITE_SET_8(tex_address, (const FxU32)*(const FxU16*)src8);
LINEAR_WRITE_END();
src8 += 2;
tex_address += TEX_ROW_ADDR_INCR(1);
}
#undef FN_NAME
}
void FX_CSTYLE
_grTexDownload_Default_8_4(struct GrGC_s* gc, const FxU32 tmuBaseAddr,
const FxU32 maxS, const FxU32 minT, const FxU32 maxT,
void* texData)
{
#define FN_NAME "_grTexDownload_Default_8_4"
FxU32
t = minT,
tex_address = tmuBaseAddr + TEX_ROW_ADDR_INCR(t);
const FxU8
*src8 = (const FxU8*)texData;
for (; t <= maxT; t++) {
LINEAR_WRITE_BEGIN(1, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
LINEAR_WRITE_SET_8(tex_address, *(const FxU32*)src8);
LINEAR_WRITE_END();
src8 += 4;
tex_address += TEX_ROW_ADDR_INCR(1);
}
#undef FN_NAME
}
void FX_CSTYLE
_grTexDownload_Default_8_WideS(struct GrGC_s* gc, const FxU32 tmuBaseAddr,
const FxU32 maxS, const FxU32 minT, const FxU32 maxT,
void* texData)
{
#define FN_NAME "_grTexDownload_Default_8_WideS"
FxU32
t = minT,
tex_address;
const FxU8
*src8 = (const FxU8*)texData;
for (; t <= maxT; t++) {
tex_address = tmuBaseAddr + TEX_ROW_ADDR_INCR(t);
LINEAR_WRITE_BEGIN(maxS, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
{
FxU32 s;
for (s = 0; s < maxS; s += 2) {
const FxU32 t0 = *(const FxU32*)(src8 );
const FxU32 t1 = *(const FxU32*)(src8 + sizeof(FxU32));
LINEAR_WRITE_SET_8(tex_address , t0);
LINEAR_WRITE_SET_8(tex_address + sizeof(FxU32), t1);
src8 += 8;
tex_address += (sizeof(FxU32) << 1);
}
}
LINEAR_WRITE_END();
}
#undef FN_NAME
}
extern void FX_CSTYLE
_grTexDownload_Default_16_1(struct GrGC_s* gc, const FxU32 tmuBaseAddr,
const FxU32 maxS, const FxU32 minT, const FxU32 maxT,
void* texData)
{
#define FN_NAME "_grTexDownload_Default_16_1"
FxU32
t = minT,
tex_address = tmuBaseAddr + TEX_ROW_ADDR_INCR(t);
const FxU16
*src16 = (const FxU16*)texData;
for (; t <= maxT; t++) {
LINEAR_WRITE_BEGIN(1, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
LINEAR_WRITE_SET_16(tex_address, (const FxU32)*(const FxU16*)src16);
LINEAR_WRITE_END();
src16 += 1;
tex_address += TEX_ROW_ADDR_INCR(1);
}
#undef FN_NAME
}
extern void FX_CSTYLE
_grTexDownload_Default_16_2(struct GrGC_s* gc, const FxU32 tmuBaseAddr,
const FxU32 maxS, const FxU32 minT, const FxU32 maxT,
void* texData)
{
#define FN_NAME "_grTexDownload_Default_16_2"
FxU32
t = minT,
tex_address = tmuBaseAddr + TEX_ROW_ADDR_INCR(t);
const FxU16
*src16 = (const FxU16*)texData;
for (; t <= maxT; t++) {
LINEAR_WRITE_BEGIN(1, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
LINEAR_WRITE_SET_16(tex_address, *(const FxU32*)src16);
LINEAR_WRITE_END();
src16 += 2;
tex_address += TEX_ROW_ADDR_INCR(1);
}
#undef FN_NAME
}
extern void FX_CSTYLE
_grTexDownload_Default_16_WideS(struct GrGC_s* gc, const FxU32 tmuBaseAddr,
const FxU32 maxS, const FxU32 minT, const FxU32 maxT,
void* texData)
{
#define FN_NAME "_grTexDownload_Default_16_WideS"
FxU32
t = minT,
tex_address;
const FxU16
*src16 = (const FxU16*)texData;
for (; t <= maxT; t++) {
tex_address = tmuBaseAddr + TEX_ROW_ADDR_INCR(t);
/* Loop unrolled to process 2 dwords per iteration */
LINEAR_WRITE_BEGIN(maxS, kLinearWriteTex,
(FxU32)tex_address - (FxU32)gc->tex_ptr,
0x00UL, 0x00UL);
{
FxU32 s;
for (s = 0; s < maxS; s += 2) {
const FxU32 t0 = *(const FxU32*)(src16 );
const FxU32 t1 = *(const FxU32*)(src16 + 2);
GDBG_INFO(195, "s = %d, t= %d, address = 0x%x\n",
s, t, (FxU32) tex_address - (FxU32) gc->tex_ptr + 0x200000);
LINEAR_WRITE_SET_16(tex_address , t0);
LINEAR_WRITE_SET_16(tex_address + 4, t1);
tex_address += 8;
src16 += 4;
}
}
LINEAR_WRITE_END();
}
#undef FN_NAME
}

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,65 +0,0 @@
@echo off
REM
REM if FX_GLIDE_TEST_SRCIMG is not initiated, the default directory is
REM \3dfx\devel\sst1\glide\images
REM if FX_GLIDE_TEST_DSTIMG is not initiated, the default directory is
REM \3dfx\devel\sst1\glide\images
REM if FX_GLIDE_TEST_DIFFIMG is not initiated, the default directory is
REM \3dfx\devel\sst1\glide\images
REM
if [%FX_GLIDE_TEST_DIFFIMG%]==[] goto Default1
goto Output1
:Default1
set FX_GLIDE_TEST_DIFFIMG=%BUILD_ROOT_SST1%\glide\images
:Output1
set ddir=%FX_GLIDE_TEST_DIFFIMG%
if [%FX_GLIDE_TEST_SRCIMG%]==[] goto Default2
goto Output2
:Default2
set FX_GLIDE_TEST_SRCIMG=%BUILD_ROOT_SST1%\glide\images
:Output2
set sdir=%FX_GLIDE_TEST_SRCIMG%
if [%FX_GLIDE_TEST_DSTIMG%]==[] goto Default3
goto Output3
:Default3
set FX_GLIDE_TEST_DSTIMG=%BUILD_ROOT_SST1%\glide\images
:Output3
set tdir=%FX_GLIDE_TEST_DSTIMG%
@echo on
isub -v %sdir%\test00.vgm %tdir%\test00.tst %ddir%\test00.tga
isub -v %sdir%\test01.vgm %tdir%\test01.tst %ddir%\test01.tga
isub -v %sdir%\test02.vgm %tdir%\test02.tst %ddir%\test02.tga
isub -v %sdir%\test03.vgm %tdir%\test03.tst %ddir%\test03.tga
isub -v %sdir%\test04.vgm %tdir%\test04.tst %ddir%\test04.tga
isub -v %sdir%\test05.vgm %tdir%\test05.tst %ddir%\test05.tga
isub -v %sdir%\test06.vgm %tdir%\test06.tst %ddir%\test06.tga
isub -v %sdir%\test07.vgm %tdir%\test07.tst %ddir%\test07.tga
isub -v %sdir%\test08.vgm %tdir%\test08.tst %ddir%\test08.tga
isub -v %sdir%\test09_0.vgm %tdir%\test09_0.tst %ddir%\test09_0.tga
isub -v %sdir%\test09_1.vgm %tdir%\test09_1.tst %ddir%\test09_1.tga
isub -v %sdir%\test10_0.vgm %tdir%\test10_0.tst %ddir%\test10_0.tga
isub -v %sdir%\test10_1.vgm %tdir%\test10_1.tst %ddir%\test10_1.tga
isub -v %sdir%\test13.vgm %tdir%\test13.tst %ddir%\test13.tga
isub -v %sdir%\test16.vgm %tdir%\test16.tst %ddir%\test16.tga
isub -v %sdir%\test17_0.vgm %tdir%\test17_0.tst %ddir%\test17_0.tga
isub -v %sdir%\test17_1.vgm %tdir%\test17_1.tst %ddir%\test17_1.tga
isub -v %sdir%\test17_2.vgm %tdir%\test17_2.tst %ddir%\test17_2.tga
isub -v %sdir%\test17_3.vgm %tdir%\test17_3.tst %ddir%\test17_3.tga
isub -v %sdir%\test17_4.vgm %tdir%\test17_4.tst %ddir%\test17_4.tga
isub -v %sdir%\test18.vgm %tdir%\test18.tst %ddir%\test18.tga
isub -v %sdir%\test19_0.vgm %tdir%\test19_0.tst %ddir%\test19_0.tga
isub -v %sdir%\test19_1.vgm %tdir%\test19_1.tst %ddir%\test19_1.tga
isub -v %sdir%\test19_2.vgm %tdir%\test19_2.tst %ddir%\test19_2.tga
isub -v %sdir%\test19_3.vgm %tdir%\test19_3.tst %ddir%\test19_3.tga

Binary file not shown.

View File

@@ -1,441 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
*/
#include <stdlib.h>
#include <stdio.h>
#ifndef __linux__
#include <conio.h>
#endif
#include <assert.h>
#include <string.h>
#include <glide.h>
#include "tlib.h"
typedef struct {
FxU32 signature;
FxU16 width;
FxU16 height;
FxU8 depth;
FxU8 type;
void *data;
} LFB_Img;
GrHwConfiguration hwconfig;
static char version[80];
static const char name[] = "display";
static const char purpose[] = "display a 16 bit frame buffer (565 format) dump out";
static const char usage[] = "-n <frames> -r <res> -s srcimage -t testimage";
static const char *sourceFormatString[] = {
"GR_LFB_SRC_FMT_565 ",
"GR_LFB_SRC_FMT_555 ",
"GR_LFB_SRC_FMT_1555 ",
"INVALID FORMAT ",
"GR_LFB_SRC_FMT_888 ",
"GR_LFB_SRC_FMT_8888 ",
"INVALID FORMAT ",
"INVALID FORMAT ",
"INVALID FORMAT ",
"INVALID FORMAT ",
"INVALID FORMAT ",
"INVALID FORMAT ",
"GR_LFB_SRC_FMT_565_DEPTH ",
"GR_LFB_SRC_FMT_555_DEPTH ",
"GR_LFB_SRC_FMT_1555_DEPTH",
"GR_LFB_SRC_FMT_ZA16 "
};
static void imageConvert( void *dst,
void *src,
GrLfbSrcFmt_t format,
FxU32 *bpp );
int main( int argc, char **argv)
{
char match;
char **remArgs;
int rv;
GrScreenResolution_t resolution = GR_RESOLUTION_640x480;
float scrWidth = 640.0f;
float scrHeight = 480.0f;
int frames = -1;
char srcfname[80], dstfname[80];
FILE *fp;
void *mem;
FxU32 filesize;
LFB_Img src, dst, diff;
FxBool txtdisplay = FXTRUE;
void *image = NULL;
FxU32 bpp;
GrLfbSrcFmt_t sourceFormat;
static FxU32 imageWidth;
static FxU32 imageHeight;
srcfname[0] = 0;
dstfname[0] = 0;
/* Process Command Line Arguments */
while( (rv = tlGetOpt( argc, argv, "nrst", &match, &remArgs )) ) {
if ( rv == -1 ) {
printf( "Unrecognized command line argument\n" );
printf( "%s %s\n", name, usage );
printf( "Available resolutions:\n%s\n",
tlGetResolutionList() );
exit(1);
}
switch( match ) {
case 'n':
frames = atoi( remArgs[0] );
break;
case 'r':
resolution = tlGetResolutionConstant( remArgs[0],
&scrWidth,
&scrHeight );
break;
case 's':
strcpy(srcfname, remArgs[0]);
break;
case 't':
strcpy(dstfname, remArgs[0]);
break;
}
}
tlSetScreen( scrWidth, scrHeight );
grGlideGetVersion( version );
printf( "%s:\n%s\n", name, purpose );
printf( "%s\n", version );
printf( "Resolution: %s\n", tlGetResolutionString( resolution ) );
if ( frames == -1 ) {
printf( "Press A Key To Begin Test.\n" );
tlGetCH();
}
/* Initialize Glide */
grGlideInit();
assert( grSstQueryHardware( &hwconfig ) );
grSstSelect( 0 );
assert( grSstWinOpen( 0,
resolution,
GR_REFRESH_60Hz,
GR_COLORFORMAT_ABGR,
GR_ORIGIN_UPPER_LEFT,
2, 1 ) );
tlConSet( 0.0f, 0.0f, 1.0f, 1.0f,
60, 30, 0xffffff );
/* Set up Render State - disable dithering */
grDitherMode( GR_DITHER_DISABLE );
/* Load src image from disk */
if (srcfname[0]) {
fp = fopen(srcfname, "rb");
if (fp == NULL)
srcfname[0] = 0;
else {
fseek(fp, 0, SEEK_END);
filesize = ftell(fp);
rewind(fp);
/* readng the LFB file header */
fread(&src.signature, 4, 1, fp);
if (src.signature != IMAGE_SRLE) {
printf("%s file type incorrect\n", srcfname);
exit(1);
}
fread(&src.width, 2, 1, fp);
fread(&src.height, 2, 1, fp);
fread(&src.depth, 1, 1, fp);
fread(&src.type, 1, 1, fp);
mem = malloc(filesize-6);
src.data = malloc(src.width*src.height*(src.depth/8));
/* reading the LFB data */
fread(mem, filesize-6, 1, fp);
/* Simple16BitDecode(src.width,src.height,mem,src.data); */
SimpleRleDecode(src.width,src.height,2,mem,src.data);
free(mem);
fclose(fp);
}
}
/* Load dst image from disk */
if (dstfname[0]) {
fp = fopen(dstfname, "rb");
if (fp == NULL)
dstfname[0] = 0;
else {
fseek(fp, 0, SEEK_END);
filesize = ftell(fp);
rewind(fp);
/* readng the LFB file header */
fread(&dst.signature, 4, 1, fp);
if (dst.signature != IMAGE_SRLE) {
printf("%s file type incorrect\n", dstfname);
exit(1);
}
fread(&dst.width, 2, 1, fp);
fread(&dst.height, 2, 1, fp);
fread(&dst.depth, 1, 1, fp);
fread(&dst.type, 1, 1, fp);
mem = malloc(filesize-6);
dst.data = malloc(dst.width*dst.height*(dst.depth/8));
/* reading the LFB data */
fread(mem, filesize-6, 1, fp);
SimpleRleDecode(dst.width,dst.height,2,mem,dst.data);
free(mem);
fclose(fp);
}
}
diff.width = 0;
diff.height = 0;
if (srcfname[0] && dstfname[0]) {
FxU32 count;
FxU16 *srcptr, *dstptr, *difptr;
if ((src.width == dst.width) && (src.height == dst.height)) {
diff.width = src.width;
diff.height = src.height;
diff.depth = src.depth;
diff.data = malloc(diff.width*diff.height*(diff.depth/8));
count = diff.width * diff.height;
srcptr = src.data;
dstptr = dst.data;
difptr = diff.data;
while (count) {
if (*srcptr == *dstptr)
*difptr = 0;
else
*difptr = *srcptr ^ *dstptr;
srcptr++; dstptr++; difptr++;
count--;
}
}
}
sourceFormat = GR_LFB_SRC_FMT_565;
if (srcfname[0]) {
imageWidth = src.width;
imageHeight = src.height;
image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) );
imageConvert( image, src.data, sourceFormat, &bpp );
}
else if (dstfname[0]) {
imageWidth = dst.width;
imageHeight = dst.height;
image = calloc( imageWidth * imageHeight, sizeof( FxU32 ) );
imageConvert( image, dst.data, sourceFormat, &bpp );
}
if ( ( imageWidth > (FxU32)scrWidth ) ||
( imageHeight > (FxU32)scrHeight ) )
exit(1);
while( frames-- ) {
grBufferClear( 0x00303030, 0, 0 );
grLfbWriteRegion( GR_BUFFER_BACKBUFFER,
0, 0, sourceFormat,
imageWidth, imageHeight, imageWidth*bpp, image );
tlConClear();
if (txtdisplay) {
tlConOutput("1 - lfb source format (%s)\n",
sourceFormatString[sourceFormat] );
if (srcfname[0])
tlConOutput("s - display source image\n");
else
tlConOutput("no source image\n");
if (dstfname[0])
tlConOutput("t - display test image\n");
else
tlConOutput("no test image\n");
if (srcfname[0] && dstfname[0]) {
if (diff.width > 0)
tlConOutput("d - display differences\n");
else
tlConOutput("source and test image size are not the same\n");
}
tlConOutput("space - turn on/off text display\n");
tlConOutput("any other key to quit\n\n");
}
/*
tlConOutput( "1 - lfb source format (%s)\n"
"+/- - change width of source image copied\n"
"s - display source image\n"
"t - display test image\n"
"d - display differences\n"
"any other key to quit\n\n",
sourceFormatString[sourceFormat] );
*/
tlConRender();
grBufferSwap( 1 );
while( tlKbHit() ) {
switch( tlGetCH() ) {
case '1':
break;
case '+':
break;
case '-':
break;
case 's':
if (srcfname[0]) {
imageWidth = src.width;
imageHeight = src.height;
imageConvert( image, src.data, sourceFormat, &bpp );
}
break;
case 't':
if (dstfname[0]) {
imageWidth = dst.width;
imageHeight = dst.height;
imageConvert( image, dst.data, sourceFormat, &bpp );
}
break;
case 'd':
if (diff.width > 0)
imageConvert( image, diff.data, sourceFormat, &bpp );
break;
case ' ':
txtdisplay = !txtdisplay;
break;
default:
frames = 0;
break;
}
}
}
grGlideShutdown();
if (srcfname[0])
free(src.data);
if (dstfname[0])
free(dst.data);
if (srcfname[0] && dstfname[0])
free(diff.data);
free(image);
exit(0);
}
static void imageConvert( void *dst, void *src,
GrLfbSrcFmt_t format, FxU32 *bpp ) {
FxU32 x, y;
FxU32 *longData = dst;
FxU16 *shortData = dst;
FxU16 *srcData = src;
FxU32 longStride = 640;
FxU32 shortStride = 640;
FxU32 longColor;
FxU16 shortColor;
switch( format ) {
case GR_LFB_SRC_FMT_565:
case GR_LFB_SRC_FMT_555:
case GR_LFB_SRC_FMT_1555:
*bpp = 2;
break;
case GR_LFB_SRC_FMT_888:
case GR_LFB_SRC_FMT_8888:
case GR_LFB_SRC_FMT_565_DEPTH:
case GR_LFB_SRC_FMT_1555_DEPTH:
case GR_LFB_SRC_FMT_555_DEPTH:
*bpp = 4;
break;
}
for( y = 0; y < 480; y++ ) {
for( x = 0; x < 640; x++ ) {
switch( format ) {
case GR_LFB_SRC_FMT_565:
shortData[y*shortStride+x] =
srcData[y*640+x];
break;
case GR_LFB_SRC_FMT_555:
case GR_LFB_SRC_FMT_1555:
shortColor = srcData[y*640+x];
shortColor =
(0x8000) | // Alpha == 1
((shortColor >> 1) & 0x7C00) |
((shortColor >> 1) & 0x03E0) |
((shortColor) & 0x1f);
shortData[y*shortStride+x] =
shortColor;
break;
case GR_LFB_SRC_FMT_888:
case GR_LFB_SRC_FMT_8888:
longColor = srcData[y*640+x];
longColor =
(0xFF000000) |
((longColor<<8)&0x00F80000) |
((longColor<<5)&0x0000FC00) |
((longColor<<3)&0x000000F8);
longData[y*longStride+x] = longColor;
break;
case GR_LFB_SRC_FMT_565_DEPTH:
longColor = srcData[y*640+x];
longData[y*longStride+x] = longColor;
break;
case GR_LFB_SRC_FMT_1555_DEPTH:
case GR_LFB_SRC_FMT_555_DEPTH:
longColor = srcData[y*640+x];
longColor =
(0x00008000) |
((longColor>>1) & 0x00007C00) |
((longColor>>1) & 0x000003E0) |
((longColor ) & 0x0000001f);
longData[y*longStride+x] = longColor;
default:
break;
}
}
}
return;
}

View File

@@ -1,200 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
*/
#ifndef __linux__
#include <windows.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifndef __linux__
#include <conio.h>
#endif
#include <assert.h>
#include <time.h>
#include <glide.h>
#include "tlib.h"
#define H3D_RED 0x000000ff
#define H3D_GREEN 0x0000ff00
#define H3D_YELLOW 0x0000ffff
#define H3D_BLACK 0x00000000
GrHwConfiguration hwconfig;
static char version[80];
static int scrWidth, scrHeight, boxwidth, boxheight, origin;
void init(void) {
GrState state;
grGlideGetState(&state);
grColorCombine( GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE,
GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, FXFALSE );
grColorMask(FXTRUE,0); // make sure color buf is on
grDepthBufferFunction( GR_CMP_ALWAYS );
grBufferClear( 0x00, 0, GR_ZDEPTHVALUE_FARTHEST );
grGlideSetState(&state);
}
void drawBoxes(int w, int h, unsigned long c1, unsigned long c2) {
GrVertex p1,p2,p3,p4;
p1.x = 1.f;
p1.y = 1.f;
p2.x = (float)w;
p2.y = 1.f;
p3.x = 1.f;
p3.y = (float)h;
p4.x = (float)w;
p4.y = (float)h;
grConstantColorValue( c1 );
grDrawLine(&p1,&p2);
grDrawLine(&p1,&p3);
grDrawLine(&p3,&p4);
grDrawLine(&p2,&p4);
grDrawLine(&p1,&p4);
grDrawLine(&p2,&p3);
p1.y += origin;
p2.y += origin;
p3.y += origin;
p4.y += origin;
grConstantColorValue( c2 );
grDrawLine(&p1,&p2);
grDrawLine(&p1,&p3);
grDrawLine(&p3,&p4);
grDrawLine(&p2,&p4);
grDrawLine(&p1,&p4);
grDrawLine(&p2,&p3);
}
int main( int argc, char **argv) {
int keepworking = 1;
GrScreenResolution_t resolution;
int redraw = 1;
int redrawPattern = 0;
int patternon = 1;
#ifdef H3D
resolution = GR_RESOLUTION_640x240_AUTOFLIPPED;
#else
resolution = GR_RESOLUTION_640x480;
#endif
/* Initialize Glide */
grGlideInit();
grGlideGetVersion( version );
grSstQueryHardware( &hwconfig );
grSstSelect( 0 );
if ( grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, GR_ORIGIN_UPPER_LEFT, 2,1 ) ) {
grColorCombine( GR_COMBINE_FUNCTION_LOCAL,
GR_COMBINE_FACTOR_NONE,
GR_COMBINE_LOCAL_CONSTANT,
GR_COMBINE_OTHER_NONE,
FXFALSE );
} else {
keepworking = 0;
}
grRenderBuffer( GR_BUFFER_BACKBUFFER );
scrWidth = grSstScreenWidth();
scrHeight = grSstScreenHeight();
origin = (int)scrHeight-240; // top of right eye buffer
boxheight = (int)240;
boxwidth = (int)scrWidth;
while( keepworking) {
while( tlKbHit() ) {
switch( tlGetCH() ) {
case '=' :
case '+' :
// move origin of 2nd page causes both box heights to resize
if (origin < (scrHeight-1.f))
{
origin++;
boxheight--;
redraw = 1;
}
break;
case '_':
case '-' :
if (origin > ((scrHeight/2)-1.f))
{
origin--;
boxheight++;
redraw = 1;
}
break;
case '.' :
// move origin of 2nd page causes both box heights to resize
if (origin < (scrHeight-1.f))
{
origin++;
boxheight--;
}
break;
case ',' :
if (origin > ((scrHeight/2)-1.f))
{
origin--;
boxheight++;
}
break;
case 'p':
patternon ^= 1;
redrawPattern = 1;
break;
case 'q':
keepworking = 0;
break;
case ' ':
redraw = 1;
default:
break;
}
}
if (redraw) {
grColorMask(FXTRUE,0);
grBufferClear( 0, 0, 0 );
drawBoxes(boxwidth,boxheight,H3D_RED,H3D_YELLOW);
redraw = 0;
grBufferSwap( 1 );
} else if (redrawPattern) {
#ifdef H3D
grHints(GR_HINT_H3DENABLE,patternon); // set the pattern on or off
#endif
redrawPattern = 0;
}
}
grGlideShutdown();
exit(0);
}

View File

@@ -1,292 +0,0 @@
/*
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
**
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
** THE UNITED STATES.
**
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
**
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifndef __linux__
#include <conio.h>
#endif
#include <assert.h>
#include <glide.h>
#include "tlib.h"
GrHwConfiguration hwconfig;
static char version[80];
static const char name[] = "test24";
static const char purpose[] = "anti-aliased lines test";
static const char usage[] = "-n <frames> -r <res>";
static int rRandom(int s, int e);
static unsigned int iRandom (unsigned int maxr);
typedef enum { NORMAL, ANTIALIASED } Mode;
int main( int argc, char **argv) {
char match;
char **remArgs;
int rv;
#ifdef H3D
GrScreenResolution_t resolution = GR_RESOLUTION_640x240_AUTOFLIPPED;
float scrWidth = 640.0f;
float scrHeight = 240.0f;
#else
GrScreenResolution_t resolution = GR_RESOLUTION_640x480;
float scrWidth = 640.0f;
float scrHeight = 480.0f;
#endif
int frames = -1;
Mode mode;
int i;
#ifdef H3D
int eye,offset;
#endif
static TlVertex3D srcVerts[100];
float angle;
// GrFog_t fogtable[GR_FOG_TABLE_SIZE];
/* Process Command Line Arguments */
while( (rv = tlGetOpt( argc, argv, "nr", &match, &remArgs )) ) {
if ( rv == -1 ) {
printf( "Unrecognized command line argument\n" );
printf( "%s %s\n", name, usage );
printf( "Available resolutions:\n%s\n",
tlGetResolutionList() );
exit(1);
}
switch( match ) {
case 'n':
frames = atoi( remArgs[0] );
break;
case 'r':
resolution = tlGetResolutionConstant( remArgs[0],
&scrWidth,
&scrHeight );
break;
}
}
tlSetScreen( scrWidth, scrHeight );
grGlideGetVersion( version );
printf( "%s:\n%s\n", name, purpose );
printf( "%s\n", version );
printf( "Resolution: %s\n", tlGetResolutionString( resolution ) );
if ( frames == -1 ) {
printf( "Press A Key To Begin Test.\n" );
tlGetCH();
}
/* Initialize Glide */
grGlideInit();
assert( grSstQueryHardware( &hwconfig ) );
grSstSelect( 0 );
assert( grSstWinOpen( 0,
resolution,
GR_REFRESH_60Hz,
GR_COLORFORMAT_ABGR,
GR_ORIGIN_LOWER_LEFT,
2, 1 ) );
tlConSet( 0.0f, 0.0f, 1.0f, 0.5f,
60, 15, 0xffffff );
/* Set up Render State - flat shading - alpha blending */
grColorCombine( GR_COMBINE_FUNCTION_LOCAL,
GR_COMBINE_FACTOR_NONE,
GR_COMBINE_LOCAL_CONSTANT,
GR_COMBINE_OTHER_NONE,
FXFALSE );
grAlphaCombine( GR_COMBINE_FUNCTION_LOCAL,
GR_COMBINE_FACTOR_NONE,
GR_COMBINE_LOCAL_ITERATED,
GR_COMBINE_OTHER_NONE,
FXFALSE );
grAlphaBlendFunction( GR_BLEND_SRC_ALPHA, GR_BLEND_ONE_MINUS_SRC_ALPHA,
GR_BLEND_ZERO, GR_BLEND_ZERO );
/* Initialize Source 3D data - One Hundred Random Points within
a 1x1 box */
for( i = 0; i < 100; i++ ) {
srcVerts[i].x = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f;
srcVerts[i].y = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f;
srcVerts[i].z = (((float)rRandom( 0, 100 )) / 100.0f ) - 0.5f;
srcVerts[i].w = 1.0f;
}
#define RED 0x000000ff
#define BLUE 0x00ff0000
angle = 0.0f;
mode = ANTIALIASED;
tlConOutput( "a - toggles anti-aliasing\n" );
tlConOutput( "Press any key to quit\n\n" );
while( frames-- && tlOkToRender()) {
GrVertex vtxA, vtxB;
static TlVertex3D xfVerts[100];
static TlVertex3D prjVerts[100];
// if (hwconfig.SSTs[0].type == GR_SSTTYPE_SST96) {
tlGetDimsByConst(resolution,
&scrWidth,
&scrHeight );
#ifdef H3D
grClipWindow(0, 0, grSstScreenWidth(), grSstScreenHeight());
#else
grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight);
#endif
// }
grBufferClear( 0x0, 0, GR_ZDEPTHVALUE_FARTHEST );
/* 3D Transformations */
angle += 1.0f;
if ( angle > 359.0f ) angle = 0.0f;
tlSetMatrix( tlIdentity() );
tlMultMatrix( tlYRotation( angle ) );
tlMultMatrix( tlTranslation( 0.0f, 0.0f, 1.3f ) );
tlTransformVertices( xfVerts, srcVerts, 100 );
tlProjectVertices( prjVerts, xfVerts, 100 );
grConstantColorValue( 0xffffffff );
switch( mode ) {
case NORMAL:
tlConOutput( "NORMAL LINES \r" );
break;
case ANTIALIASED:
tlConOutput( "ANTIALIASED LINES \r" );
break;
}
#define SNAP_BIAS ((float)(3<<18))
#ifdef H3D
for( eye = 0; eye < 2; eye++) {
offset = (int)(eye * (grSstScreenHeight() - scrHeight)); // y offset for right eye
grClipWindow(0, offset, (FxU32) scrWidth, (FxU32) scrHeight + offset);
for( i = 0; i < 100; i+=2 ) {
vtxA.oow = 1.0f / prjVerts[i].w;
vtxA.x = (tlScaleX( prjVerts[i].x ) + (((eye*2)-1)*(vtxA.oow-.5f)*16));
vtxA.x += SNAP_BIAS;
vtxA.y = tlScaleY( prjVerts[i].y ) + offset;
vtxA.y += SNAP_BIAS;
vtxA.a = 255.0f;
vtxB.oow = 1.0f / prjVerts[i+1].w;
vtxB.x = SNAP_BIAS + (tlScaleX( prjVerts[i+1].x ) + (((eye*2)-1)*(vtxB.oow-.5f)*16));
vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y ) + offset;
vtxB.a = 255.0f;
switch( mode ) {
case NORMAL:
grDrawLine( &vtxA, &vtxB );
break;
case ANTIALIASED:
grAADrawLine( &vtxA, &vtxB );
break;
}
}
}
#else
for( i = 0; i < 100; i+=2 ) {
vtxA.x = SNAP_BIAS+tlScaleX( prjVerts[i].x );
vtxA.y = SNAP_BIAS+tlScaleY( prjVerts[i].y );
vtxA.oow = 1.0f / prjVerts[i].w;
vtxA.a = 255.0f;
vtxB.x = SNAP_BIAS+tlScaleX( prjVerts[i+1].x );
vtxB.y = SNAP_BIAS+tlScaleY( prjVerts[i+1].y );
vtxB.oow = 1.0f / prjVerts[i+1].w;
vtxB.a = 255.0f;
switch( mode ) {
case NORMAL:
grDrawLine( &vtxA, &vtxB );
break;
case ANTIALIASED:
grAADrawLine( &vtxA, &vtxB );
break;
}
}
#endif
grBufferSwap( 1 );
grSstIdle();
while( tlKbHit() ) {
switch( tlGetCH() ) {
case 'a':
case 'A':
mode++;
mode%=2;
break;
default:
frames = 0;
break;
}
}
}
grGlideShutdown();
exit(0);
}
static unsigned long randx = 1;
static unsigned int iRandom (unsigned int maxr)
{
unsigned int n,retval;
if (maxr > 0xFFFFFFF) {
do {
retval = iRandom(0xFFFFFFF);
retval |= iRandom(maxr>>28)<<28;
} while (retval > maxr);
return retval;
}
for (n=1; n<32; n++)
if (((unsigned)1 << n) > maxr) break;
do {
randx = randx*1103515245 + 12345;
retval = (randx & 0x7fffffff) >> (31-n);
} while (retval > maxr);
return retval;
}
static int rRandom(int s, int e)
{
return s + iRandom(e-s);
}

Binary file not shown.

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More